~ Tamaño del paquete Android rendimiento de optimización optimización de combate

contorno

Normalmente, los usuarios no están dispuestos a descargar un programa más amplio, especialmente en el caso de no WIFI. Si el paquete es pequeño, los usuarios todavía están dispuestos a descargar e instalar experiencia bajo. Ahora disponible en App cumplir con ciertos requisitos por lo general tienen una gran cantidad de dinero, la forma en que los usuarios puedan descargar su aplicación dispuesta a la experiencia? El paquete de instalación más pequeña, en el caso de WIFI, la velocidad de descarga de instalación, se inicia la experiencia. En el caso de las redes móviles, el tamaño de paquete más pequeño, mayor será la posibilidad de que el usuario instala. Por lo tanto, el tamaño del paquete de instalación tiene un gran impacto en la tasa de conversión del usuario. A continuación, y compartir algunas de mis experiencias en el tamaño del paquete de trabajo de optimización en la práctica.

estructura de archivos APK

Dado que es para optimizar el tamaño del archivo de instalación Android APK, la necesidad primordial para comprender la estructura bajo el archivo APK. El archivo APK arrastró Android Studio puede ver claramente los componentes de archivos APK. APK se compone principalmente de los siguientes componentes:

  • INF-META / : La carpeta principal archivo contiene archivos CERT.SF y CERT.RSA de la firma, así como el archivo de manifiesto MANIFIEST.MF
  • Activos / : Esta carpeta contiene el activo principal en el archivo de aplicación, por AssetManager objetos en el programa para obtener
  • RES / : La carpeta principal no contiene archivos se compilan en resources.arsc
  • lib / : Esta carpeta de modo biblioteca contiene algunas plataformas, como armeabi, armeabi-v7a, arm64- V8A, x86, x86_64 y MIPS.
  • resources.arsc : Este archivo se mantiene principalmente los recursos compilados. El almacenamiento principal de los contenidos del archivo en el directorio res / valores, la herramienta de empaquetado para extraer el contenido XML del directorio (cadena, estilo) se compila en un formato binario.
  • classes.dex : archivos de clase Este archivo contiene principalmente se pueden entender formato DEX Dalvik / ART máquina virtual
  • AndroidManifest.xml : El núcleo principal del archivo de documento de manifiesto de Android usando formato XML binario Android.

métodos de optimización

De hecho, APK en dos de contenido básico, fotos y recursos de código. Por lo tanto, el volumen de la optimización de paquetes en gran medida a partir de dos aspectos. Como la comprobación de assetssi hay directorio de recursos no utilizados. En general rara vez poner un poco de directorio de recursos inútiles en activos, principalmente integrar SDK de terceros (tales como el alto alemán, mapas de Baidu, etc.) cuando la necesidad de poner algunos recursos en ella, tales como imágenes, archivos de audio, etc. Con iteración del proyecto, el estilo de interfaz de la interfaz de usuario que nunca antes experimentado cambios grandes, por lo que muchas fotos antes de que el recurso no estarán disponibles, por lo que respodría no existir una gran cantidad de imágenes del directorio, lo que no hicimos la limpieza el uso importante la mayor parte de los recursos de una carpeta. Además de la imagen, luego de que classes.dexel archivo, y el programa general de nuestro propio código de negocio no tiene un gran impacto en el tamaño del paquete, principalmente el uso de un gran número de bibliotecas de terceros, y algunos integra módulos otro equipo de la compañía, podrían éstos módulo contiene mucho menos que se utilizó código o recursos.

Antes de la optimización, el tamaño del paquete de instalación abajo para ver mi proyecto es hacer 73437KB (71.7MB), es volver a hacer el bien y para optimizar el contraste, vistazo a la optimización específica de la amplitud.

Retire los recursos no utilizados por Android Studio

eliminar manualmente los recursos son dos ventajas: una es reducir el volumen del paquete de instalación, el otro es para reducir el volumen del código fuente.

Hay dos maneras de ayudar a encontrar los recursos no utilizados en Android Studio en:

  • La Analizar -> Código Inspeccionar , de hecho, por las herramientas de pelusa para ayudarnos a encontrar los recursos no utilizados, además de fotografías de los recursos, sino que también me ayudan a encontrar problemas potenciales que existen en el código, ejecute los resultados como se muestra a continuación:

    inspeccionar Código

  • Haga doble clic en el Shift , introduzca Retire los recursos no utilizados, y luego pulse Intro. Debido al enfoque anterior no sólo para identificar los recursos no utilizados, sino también código de detección, por lo que la operación que consume tiempo. Si lo que desea es encontrar los recursos no utilizados, puede usar doble clic en cambiar la forma en que detectan el resultado es el mismo.

La herramienta anterior tiene dos pozos en el uso del proceso:

  • El uso de los recursos, todavía se informó que no hubo referencias. Algunos recursos, como archivos XML dibujable

  • También elimina una gran cantidad de la Identificación del diseño, si el proyecto utiliza butterknife, R2 es aplicada por el ello, la herramienta no puede detectar este

Por lo tanto, para los recursos en el directorio dibujable podemos GIT a revertirse, ya que rara vez se pone el directorio icono estirable. Para el diseño se retira la declaración de identificación, podemos distribución elementos revierten.

Por la operación anterior, la reducción del volumen de paquetes con éxito 2,3 M:

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)

En la extracción manual de los recursos no utilizados en el proceso, descubrimos otro problema. Ahora estamos proyecto modular, tenemos docenas de proyectos de módulo, el módulo contiene necesariamente una gran cantidad de icono por defecto del sistema ic_launcher, el nuevo módulo generado por defecto, y el icono cambiado al nombre de nuestro proyecto app_icon, que está dentro del ic_launcher no es utilizado. Debajo de cada módulo sobre ic_launcher en 8 carpetas:

drawable
    -> ic_launcher_background.xml

drawable-v24
    -> ic_launcher_foreground.xml

mipmap-anydpi-v26
    -> ic_launcher.xml
    -> ic_launcher_round.xml

mipmap-hdpi
    -> ic_launcher.png
    -> ic_launcher_round.png

mipmap-mdpi
    -> ic_launcher.png
    -> ic_launcher_round.png

mipmap-xhdpi
    -> ic_launcher.png
    -> ic_launcher_round.png

mipmap-xxhdpi
    -> ic_launcher.png
    -> ic_launcher_round.png

mipmap-xxxhdpi
    -> ic_launcher.png
    -> ic_launcher_round.png

A veces, el módulo puede ser necesaria lanzador, aunque no necesidad en el momento de la publicación, pero puede que tenga que ejecutar los componentes separados, generalmente tienen un manifiesto depurar y liberar manifiesto, y luego ser juzgado por una marca o una aplicación de biblioteca. De hecho, también se puede utilizar de otras maneras a la consecución de esta depuración y liberación de (la capa de lata módulo de una capa de proyecto de ingeniería, el proyecto incluye este módulo, se puede ejecutar como una aplicación). De esta manera, el módulo no necesita la presencia de la aplicación, que no requiere un icono lanzador.

De hecho, este es también el desarrollador es muy fácil ignorar el problema, por ejemplo, contamos con una gran cantidad de otros departamentos dentro de la biblioteca, por el Ctrl + Shift + R Busca ic_launcher, encontrará una gran cantidad AAR hay recursos de lanzamiento. E incluso algunas bibliotecas de código de terceros no estándar abierto también a estos problemas.

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB

¿Por qué tantos lanzador elimina la imagen, ¿por qué apk tamaño solamente se reduce 19KB? (Lo menos lugares específicos, pueden ser comparados por comparación con la función APK anterior).

Desde el momento de la APK última generación, utilice únicamente un archivo de recursos del mismo nombre, es decir, habrá sólo uno, así optimizar modesta (alrededor de los múltiples caminos mismo módulo existen del mismo nombre, será el paquete de prioridad, puede consultar la documentación oficial ). Pero tenemos que limpiar algunos recursos de proyectos de basura.

recursos retráctil abierto

De hecho, en nuestro recurso contracción aplicación del proyecto / build.gradle configurado a la intemperie:

minifyEnabled true
shrinkResources true

Utilizamos el nombre del icono del programa no está utilizando ic_launcher, pero app_icon, pasamos nuestra APK APK análisis también encontró recursos ic_launcher, en nombre del icono ic_launcher no se deben utilizar en el programa Analizar, ¿por qué no reducir su tamaño? Hay dos posibilidades:

  • Se esconden en algún lugar de archivos usos ic_launcher.
  • se encoge en vigor

Vamos a echar un psiquiatra proyecto no ha entrado en vigor. Pongo un nuevo recurso (abc.webp) al proyecto en marcha, a continuación, vuelva a embalar, si el archivo se describe contracción contracción está en vigor (también describe los procedimientos utilizados indirectamente en algún lugar del ic_launcher), si no se encogimiento de configuración se explica más arriba no lo hace encogerse en efecto, se puede encontrar una manera de dejar que tome efecto.

La nueva generación APK archivos APK Analizar abierta y ha encontrado los recién añadidos abc.webpaún existen archivos:

abc.webp

Descripción encogimiento ningún efecto. Obviamente se ha configurado minifyEnabled, shrinkResources, ¿Por qué no está en vigor todavía.

Después de una búsqueda, el original se ha configurado para no reducir el tamaño de archivo de Proguard:

-dontshrink

Esta línea comentarios y, a continuación, reenvasado y encontraron reducidos 3.37MB

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB
ShrinkResources 67576KB (65.9MB) 3459KB (3.37M)

shrinkMode son principalmente dos: el modo por defecto de seguridad, el estricto es seguro.

Usted puede estar res/raw/keep.xmlconfigurado shrinkMode archivo:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="safe"/>

Si abre el recurso de contracción, cuando shrinkMode = seguro, tiempo lleno tomará la iniciativa para encontrar aquellos recursos que se puede hacer referencia, como por ejemplo a través del acceso a los recursos resources.getIdentifier (), no se reducirá el recurso, cuando shrinkMode = modo estricto estricta no se reducirán los recursos.

Que estaba haciendo experimentos, se encontró que si un recurso es reducir el tamaño, y puede que aún APK, pero el volumen de los recursos se hace muy pequeña.

Si se establece el seguro shrinkMode, puede que no se han utilizado también para ser conservado, ya que la detección puede no ser tan precisa.

Puede shrinkMode conjunto a la estricta, esta vez lo que necesita para obtener a través resources.getIdentifier (a) ¿Cómo mantener los recursos arriba. Puede configurar los archivos que tener en keep.xml en:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict"
	tools:keep="@drawable/ic_get_by_identifier"/>

Más confusión sobre el conocimiento relevante, puede ver AndroidAll

png a su vez en webp

Android4.0 comenzó a webp apoyo, pero sólo es compatible con la transparencia en Android4.3, webp sin pérdidas. Así que si su aplicación es compatible con un mínimo de 4.3, se puede utilizar en lugar de webp png.

En Android Studio un soporte clave en la conversión, puede seleccionar la relación de masa de transcodificación, también se puede optar por activar a si en lugar de webp más grande que el PNG original, se pueden saltar.

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB
ShrinkResources 67576KB (65.9MB) 3459KB (3.37M)
Png2webp 64505KB (62.9M) 3071KB (3M)

Habilitar R8

Porque antes de que R8 no es muy estable, por lo que se cerrará. Ahora Android Studio 3.6, que se abrirá:

android.enableR8=true

Aunque la web oficial de dicho soporte R8 ProGuard todavía algunos problemas archivos de reglas existentes, pero en el uso real, resolver el problema de una cierta configuración confusión, otra vez jugando un paquete de versión y se encontró reducido 0,9 M:

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB
ShrinkResources 67576KB (65.9MB) 3459KB (3.37M)
Png2webp 64505KB (62.9M) 3071KB (3M)
R8 63506KB (62M) 999kb (0.97m)

Lo anterior es el modo normal R8, R8, así como el modo completo, sino también hacer alguna operación de optimización adicional, el modo completamente abierta R8, pero sigue siendo la naturaleza experimental:

android.enableR8.fullMode=true

Está jugando un paquete de liberación y encontrado reducida 0,16 M:

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB
ShrinkResources 67576KB (65.9MB) 3459KB (3.37M)
Png2webp 64505KB (62.9M) 3071KB (3M)
R8 63506KB (62M) 999kb (0.97m)
R8 FullMode 63333KB (61.8M) 173KB (0,16 M)

En lugar del icono por encargo Ver

También podemos reemplazar algunos iconos de estado, tales como el estado del pedido, estado de su reembolso por la costumbre Vista. De la siguiente manera:

Aquí Insertar imagen Descripción

Estos iconos son similares puede hacerse usando una vista personalizada, puede reducir una gran cantidad de imágenes recursos. Si el estado de una gran cantidad, se necesita una gran cantidad de icono de estado, si el apoyo internacional, sino que también necesita generar un icono de estado correspondiente para cada país.

Después de la sustitución del estado de vistas personalizadas icono, paquete de reducción del tamaño de 0.366M:

operativo volumen reducción
hace optimización 73437KB (71.7MB) -
inspeccionar Código 71054KB (69.3MB) 2383KB (2,3 M)
Retire Launcher 71035KB (69.3MB) 19KB
ShrinkResources 67576KB (65.9MB) 3459KB (3.37M)
Png2webp 64505KB (62.9M) 3071KB (3M)
R8 63506KB (62M) 999kb (0.97m)
R8 FullMode 63333KB (61.8M) 173KB (0,16 M)
Vista personalizada 62958KB (61.4M) 173KB (0.36m)

uso AndResGuard

el uso de micro-canales AndResGuard puede haber confusión acerca de los recursos en la ruta del recurso y el nombre del recurso, el recurso cambio de nombre para ser como abc todo el camino. Se puede reducir considerablemente el espacio ocupado por el nombre del personaje.

Sobre todo después de los recursos modulares con el fin de evitar que el mismo nombre, añadiremos los recursos del módulo de prefijo, lo que conduce al nombre del recurso incluso más tiempo. Al utilizar AndResGuard, los recursos de los programas disponibles a través de getIdentifier manera, asegúrese de lista blanca, esto puede ser búsqueda global en el programa.

通过 AndResGuard 混淆后,包体积减少了 3.54M:

操作 体积 减少
优化前 73437KB(71.7MB) -
Inspect Code 71054KB(69.3MB) 2383KB(2.3M)
Remove Launcher 71035KB(69.3MB) 19KB
ShrinkResources 67576KB(65.9MB) 3459KB(3.37M)
Png2webp 64505KB(62.9M) 3071KB(3M)
R8 63506KB(62M) 999KB(0.97M)
R8 FullMode 63333KB(61.8M) 173KB(0.16M)
CustomView 62958KB(61.4M) 173KB(0.36M)
AndResGuard 59323KB(57.9M) 3635KB(3.54M)

so 文件

在主流的手机CPU架构都是 ARM,基本上只要支持这一种架构就可以了。更多关于这方面的知识可以查看 Android NDK ~ 基础入门指南

我们来看下市面上主流的 app 支付宝和微信的 CPU 架构:

alipay-brazo

Weixin-brazo

armeabi-v7a 是向下兼容 armeabi,arm64-v8a 能兼容 armeabi-v7a 和 armeabi

我们项目中也是只支持一种 armeabi-v7a 架构,减少 so 文件体积大小

release {
    ndk {
        abiFilters 'armeabi-v7a'
    }
    //...
}

小结

到此,就介绍完了我这次包体积优化相关内容了,差不多了减少了 20% 的包体积大小。当然优化是无止尽的,除了上面的一些优化手段还有 app Bundles 的方式(需要结合 Google Play 一起);还可以考虑通过 BackgroundLibrary 替换程序中大量的 shape、selector 文件,减少包体积,但是该库对性能有一定的影响,所以我还没有使用,后面可以考虑是否还有更好的方案;还可以找出程序中重复的图片(图片内容一致,名字不同);当然还有插件化,插件也需要瘦身,减少下发消耗的流量。

Otro artículo fuente involucrada en mi AndroidAll GitHub repositorio. Además del almacén 性能优化, así como los programadores de Android necesitan dominar la pila de la tecnología, tales como: la arquitectura de aplicaciones, patrones de diseño, optimización del rendimiento, estructuras de datos, algoritmos, Kotlin, trémolo, NDK, y un marco de código abierto populares router, RxJava, Glide, LeakCanary, Dagger2, reequipamiento, OkHttp, butterknife, los principios del análisis del router , etc., continuamente actualizada, dio la bienvenida a la estrella.

Publicados 168 artículos originales · ganado elogios 1161 · Vistas 1,28 millones +

Supongo que te gusta

Origin blog.csdn.net/johnny901114/article/details/105189854
Recomendado
Clasificación