Daniel tomó un año: la exploración en profundidad de la optimización del volumen de paquete de Android, en un total de 30.000 palabras de recogida recomendada

Como el artículo particularmente largo, se recomienda la recolección y re-lectura.

Entre la optimización del rendimiento de Android del conocimiento, el volumen de paquetes de optimización ha sido clasificado de forma prioritaria posición relativamente baja, lo que lleva a muchos estudiantes a desarrollar sus propias aplicaciones no entren en prestar atención al tamaño. En el curso del desarrollo del proyecto, en general se puede dividir en las siguientes tres etapas:
la puesta en marcha => crecimiento => madurar
Generalmente, cuando la aplicación está en la última etapa del periodo de crecimiento, el volumen del paquete se consideran sistemas hacen optimización, por tanto, sólo en esta etapa y después de los beneficios de optimización de volumen paquete provocó es considerable.

Por lo tanto, lo que la optimización del tamaño del paquete puede traer beneficios para nosotros? Cómo paquete completo para el volumen de aplicaciones de análisis de sistemas y optimización específica que? En este artículo, vamos a realizar un análisis en profundidad y juntos exploración.

1, la optimización fina y programa de análisis introdujeron Apk
1, la ventaja de la pérdida de peso

Empezamos con un vistazo a por qué tenemos que hacer la optimización de APK para bajar de peso?

Hay tres razones:

tasa de conversión (1) de descarga

  • APK optimización fina en la prioridad real del proyecto es relativamente baja, porque después de hacer sus beneficios no son tan evidentes, sobre todo los que tienen fase aún no estable del proyecto, todos sabemos, el desarrollo de aplicaciones es desde el proyecto inicial = > crecimiento => estable, ya que en la etapa de crecimiento inicial de desarrollo y proyectos, podría no comenzar a optimizar, optimizar el Caton, pero por lo general no hacen optimización de pérdida de peso, la optimización de los más importantes beneficios de la pérdida de peso tasa de conversión de descarga de aplicaciones impacto, es un indicador importante de las operaciones de negocio de las aplicaciones, el funcionamiento refinado en la fase de proyecto es muy importante.

  • Porque si su volumen App Apk sea más pequeño en comparación con otros del mismo tipo de aplicaciones, entonces su tasa de descarga de la aplicación puede ser mayor. Por otra parte, el tamaño de paquete más pequeño, la descarga el tiempo de espera será más corta, por lo que la tasa de éxito de la descarga de conversión más elevado. Por lo tanto, la relación entre el tamaño del paquete de instalación a la conversión de descarga es sustancialmente inversamente proporcional, es decir, cuanto mayor es el paquete de instalación, menor tasa de conversión de descarga.

  • Una aplicación de 80 MB, incluso si un usuario descarga un punto, también puede ser debido a que la red es lenta, de repente volver a la descarga falla. Porque después de una aplicación de 20 MB, el usuario apunta la descarga, no dude en estar en el tiempo puede haber sido descargado más.

  • Y ahora muchos de gran aplicación en general tendrá una versión Lite de la aplicación, esto es por razones de tasa de conversión descarga.

2 mercado de aplicaciones

  • Google mercado de aplicación Play aplicación obligatoria puede utilizar más de 100 MB de archivos de expansión APK carga. Al utilizar archivos de expansión APK carga, Google Play se logró extensiones para nuestro archivo de la aplicación, y proporciona de forma gratuita al dispositivo.

  • archivo extendido se guarda en una ubicación de almacenamiento compartido del dispositivo (tarjeta SD o partición montable USB; también conocida como memoria "externa"), en el que la aplicación pueda acceder a ellos. En la mayoría de los dispositivos, Google Play descargar archivos de expansión APK descargado mismo tiempo, por lo que la primera vez que un usuario abre la aplicación tendrá todo lo que necesita.

  • Sin embargo, en algunos casos, nuestra aplicación debe descargar archivos desde Google Play cuando se inicia la aplicación. Si desea evitar el uso de extensiones de archivo, y desea descargar el tamaño de la aplicación es mayor que 100 MB, se debe utilizar el Android App paquetes de cargar la aplicación, a continuación, la aplicación puede proporcionar hasta 150 MB de tamaño de descarga comprimido.

  • Android App de paquetes es el paquete de aplicaciones de Android, que permite la aplicación para añadir dinámico comportamiento de los módulos funcionales para resolver el tamaño APK problema mayor. A continuación, es Android App Bundle APK por un módulo básico dinámico y dos módulos funcionales de estructura composición fig:

3, los socios de canal requisitos

  • Además, hay una razón, después de nuestra aplicación más grande, puede que tenga que cooperar con los diferentes fabricantes de teléfonos móviles pre-instalados, estos socios de canal Cámara de Comercio de aplicaciones para sus requisitos detallados, y sólo después de cumplir con los requisitos correspondientes de la aplicación Permite pre anexado al teléfono. Por otra parte, cuanto mayor sea el App su coste unitario será mayor. Así, después de un gran problema de la pérdida de peso es también una cierta experiencia de nuestro proyecto.

  • Efecto sobre el volumen es demasiado grande el rendimiento de aplicaciones
    otra parte, además de afectar el volumen del paquete a descargar una aplicación distinta de la tasa de conversión, habrá algún impacto importante en el rendimiento de los tres aspectos de la aplicación, de la siguiente manera:

1) Instalación Tiempo: como la copia de archivos, Biblioteca descomprime y, en ODEX tiempo de compilación, especialmente para Android 5.0 y 6.0 sistemas, relativamente largo de tiempo, y con la mezcla después de la compilación de Android 7.0, también es aceptable . Por último, la aplicación se hace grande, que aumenta el tiempo de verificación de firmas.

2) la memoria en tiempo de ejecución: recursos Recursos, Biblioteca y Dex cargador de clases ocuparán parte de las aplicaciones de memoria.

3) el espacio ROM: Si el tamaño del paquete de instalación de la aplicación es de 50 MB, a continuación, después de comenzar la descompresión es probable que hayan superado el 100 MB. Y, si el espacio de la memoria flash es insuficiente, el caso es probable que aparezca "amplificación de escritura", que es la memoria flash y disco de estado sólido (SSD) en una mala fenómeno, la memoria flash debe ser borrado antes de que pueda ser re-escritura de datos, borrado las operaciones de escritura y granularidad mucho más baja que la operación, estas operaciones se moverán varias veces (o volver a escribir) los datos del usuario y metadatos.

En consecuencia, los datos se sobrescriban, es necesario leer ciertas porciones de la memoria flash se ha utilizado, actualizarlos, y se escribe en una nueva posición si la nueva posición se ha utilizado antes, junto con la necesidad de borrar, porque este flash tipos de trabajo, vuelven a escribir en la memoria flash debe ser borrado mucho mayor parte de los nuevos datos realmente necesarios. Que eventualmente podría conducir a la cantidad de datos realmente escritos a la cantidad física de los datos se escriben en muchas ocasiones.

2, la composición APK

Como todos sabemos, Android finalmente se compila en un proyecto .apk sufijo de archivo, de hecho, es un paquete comprimido. Por lo tanto, dentro de ella hay muchos tipos diferentes de documentos, que, según su tamaño, se divide en las categorías siguientes:

1) Código relacionado: classes.dex, que en el proyecto preparado por los archivos de Java, compilado después de un archivo .class se genera, y estos archivos .class que todo, con el tiempo pasar por dx herramienta para generar una compilación classes.dex .

2) relacionada con los recursos: res, los activos, los archivos de recursos compilado binario resources.arsc y la lista de documentos y así sucesivamente. Res y en el que los diferentes activos res archivos en el directorio generarán un identificador de recurso correspondiente en el archivo .R, pero no genera automáticamente los correspondientes activos identificación, pero es adquirida por la clase de interfaz AssetManager. Además, cada vez que un archivo de descentralización en la res carpeta, aapt generará automáticamente el ID correspondiente y se guarda en el archivo .R, pero el archivo .R sólo para asegurarse de que el compilador no se queja, de hecho, se ejecuta la aplicación, el sistema de acuerdo para encontrar los recursos correspondientes a la ID de ruta, en lugar de archivos resources.arsc se utiliza para registrar el archivo y el ID de archivo de recursos de la correspondencia posicional.

3) Así relacionadas: archivo en el directorio lib, espacio optimizado este documento es en realidad muy grande.

Además, META-INF, que almacenan las aplicaciones de información de firma, de los cuales hay tres archivos, como sigue:

MANIFEST.MF: en la que cada archivo tiene un recurso correspondiente SHA256 de digerir (SHA1) la firma, archivo SHA256 MANIFEST.MF (Shal) a través de resultado CERT.SF es la codificación base64 de la SHA256 (SHA1) - valor de resumen del manifiesto.

CERT.SF: adición (SHA1) -Digest Manifiesto-valor SHA256 definido al principio, el valor es un valor del archivo MANIFEST.MF varios de nuevo cada SHA256 (Shal) después de la codificación Base64.

CERT.RSA: contiene información sobre el algoritmo de cifrado de clave pública. En primer lugar, el anterior paso MANIFIEST.MF generado utilizando SHA256 (SHA1) -RSA algoritmo, con promotores privados firma. Luego, utilizando la clave pública descifra en la instalación. Por último, se compara con la información de resumen no cifrado (archivo MANIFEST.MF). Si coinciden, esto indica que el contenido no se han modificado.

programa de pérdida de peso para explorar el código

Antes de explicar cómo optimizar Dex, Dex puede tener una gran cantidad de estudiantes no tienen suficiente conocimiento de donde primero comprender en detalle en Dex.

1, Dex de Quest
1) Sistema de Dex Android archivo ejecutable, toda la instrucción de la operación que comprende datos de aplicación y tiempo de ejecución. Debido a Dalvik es un dispositivo diseñado específicamente para la máquina virtual de Java incorporado, por lo que los archivos de Dex con archivos de clase estándar son esencialmente diferentes en el diseño estructural.

2) Cuando un programa Java se compila en archivos de clase, es necesario utilizar la herramienta dx para integrar todos los archivos de clase en un archivo DEX así archivo Dex van a presentar el original de cada clase tiene una síntesis total de la integración de la información, por lo el objetivo es asegurar que cada clase que son capaces de compartir datos, lo que reduce la redundancia en cierta medida, pero también hace que el documento sea más compacto.

En comparación con el archivo jar tradicional, el tamaño del archivo Dex puede reducir alrededor del 50%. resultados de la comparación figura en los archivos de archivos Dex clase es la siguiente:

Si desea que la comprensión en profundidad de formato de archivo Dex, se puede ver tutorial oficial de Google - Formato de Dex.

Dex en el paquete de la aplicación normalmente ocupan mucho volumen proporción, y cuanto mayor sea el número de Dex, el tiempo de instalación de aplicaciones será más largo. Por lo tanto, se puede decir para optimizar el más importante. Aquí, nos fijamos en las formas en que para optimizar esta parte del volumen de Dex.

2, ProGuard
confundir no entra en aquí, debemos estar más familiarizado con el original, una descripción más detallada.

3, D8 y R8 optimización
de optimización D8
resultados de optimización se pueden atribuir a D8, en general, los siguientes cuatro puntos:

tiempo de compilación Dex más cortos.
dex archivos más pequeños.
.dex archivo compilado D8 tiene un mejor rendimiento en tiempo de ejecución.
Incluye el procesamiento de apoyo lenguaje Java 8.
Es necesario tomar la iniciativa en gradle.properties nuevo archivo en Android Studio 3.0:

= True android.enableD8
Android Studio versión 3.1 o posterior D8 será Dex como el compilador por defecto.

R8 optimización
documento oficial R8 (fuente abierta)

https://r8.googlesource.com/r8

R8 es la sección de compresión y optimización de alternativas Proguard, y se sigue utilizando Proguard mantener las mismas reglas. Si sólo queremos utilizar Android Estudio en R8, cuando abrimos la confusión en build.gradle en el tiempo, R8 se ha integrado en forma predeterminada en el complemento Android Gradle.
Si está usando actualmente Android Studio 3.4 o Android 3.4.0 Gradle plugins y más tarde, R8 se utilizará como el compilador por defecto. De lo contrario, hay que configurar el código siguiente en gradle.properties confundir la aplicación vamos a ir apoyo R8, de la siguiente manera:

android.enableR8=true
android.enableR8.libraries=true

Por lo tanto, donde R8 ventajas en comparación con la confusión en ella?

  • ProGuard y R8 se aplican confusión de nombres básica: todos ellos utilizan un corto, nombres sin sentido cambiar el nombre de las clases, campos y métodos. También pueden quitar el atributo de depuración.
    Sin embargo, R8 es más eficaz clase de contenedor en línea en línea, y la clase es más agresivo en los campos no utilizados y los métodos de eliminación. Por ejemplo, R8 sí mismo está integrado en la versión ProGuard V6.1.1, el tamaño de compresión en el apk, en comparación con 8,5% ProGuard usando R8 tamaño apk se reduce en aproximadamente 10%. Y, con la Kotlin ahora convertido en la primera lengua de Android, R8 ha sido particularmente optimizar algunos de Kotlin ProGuard aún no disponible.

  • En la superficie, ProGuard y R8 son muy similares. Todos ellos utilizan la misma configuración, por lo que la conmutación entre ellos fácilmente. Una vista ampliada, a continuación, también hay algunas diferencias entre ellos. R8 contenedores mejor línea, evitando así la asignación de objetos. PROGUARD pero también tiene sus propias ventajas, en particular, los siguientes puntos:

1), ProGuard en el número entero tipo enumerado reducido a los términos originales será más potente. También pasó un método parámetro constante, que suele ser común para las bibliotecas en la configuración específicas de la aplicación de uso de los llamados útil.

ProGuard atravesar múltiples optimización general, se puede producir una serie de optimización. Por ejemplo, una primera pasada puede pasar parámetros de método constante, de modo que la siguiente pasada se puede eliminar y en relación con el valor del parámetro. Cuando se elimina un código de diario, varias pasadas del efecto es particularmente evidente. ProGuard más eficaz para eliminar todo rastro (incluyendo la composición de las operaciones de cadena mensaje de registro) de aspecto.

2), ProGuard aplica en algoritmo de coincidencia de patrones para identificar y reemplazar secuencias de instrucciones cortas, lo que mejora la eficiencia del código y es más oportunidad de optimizar la abertura. Con el fin de optimizar el recorrido, en especial las operaciones matemáticas y de cadena pueden beneficiarse de ella.

3, por último, el ProGuard tiene la capacidad única para optimizar el uso GSON serialización de objetos biblioteca o código de deserialización a JSON. La biblioteca se basa en gran medida de la reflexión, que es muy conveniente, pero ineficiente. ProGuard y optimizaciones pueden ser más eficientes, acceso directo puede ser sustituido por ello.

R8 optimización real
A continuación, vamos a ver el uso impresionante WanAndroid-R8, APK cambio de volumen, como se muestra a continuación:

  • Se puede ver en comparación con el APK sólo después de la confusión, el tamaño reducido de 0,1 MB, para optimizar el efecto de Dex parte de aproximadamente el 5% de la compresión APK general hay alrededor de 1,5%.

  • A pesar de la reducción del tamaño del punto de vista, poco 0.1MB APK, pero la relación no es pequeña, si usted es responsable como una carta micro, Taobao escala de aplicación, sus volúmenes son generalmente cerca de 100 MB, R8 después de su uso puede reducirse el tamaño de 1,5 MB.

  • D8 y efecto R8 es muy potente, pero Jake Wharton Gran Dios Conocimiento años recientes también D8 y R8, si quieres D8 y R8 son detalles de implementación para aprender más sobre, puedes echar un vistazo a su blog personal.

4, eliminar la información de la información de depuración y el número de línea
en la explicación de lo que es la información deubg y la información de número de línea antes, tenemos que entender un poco de conocimiento de Dex.

Todos sabemos que la carga de archivos en tiempo de ejecución de JVM .class, y Android con el fin de hacer que el tamaño del paquete es la operación más compacto, más eficiente con la invención de la máquina virtual Dalvik y ART ambas máquinas virtuales se están ejecutando archivo .dex, de ART curso máquinas virtuales también pueden ejecutar archivos de avena al mismo tiempo.

Así documentos Dex información en el contenido de la información y los archivos de clase contienen es el mismo, excepto que la información del archivo Dex clase se hace a peso, un Dex contiene una gran cantidad de documentos de clase, y hay relativamente grandes diferencias en la estructura , la clase es la estructura del flujo, una estructura de partición de Dex, el índice de cada uno de los bloques por el desplazamiento entre el interior de Dex.

Con el fin de aplicar cuando surgen problemas, somos capaces de mostrar la información de depuración adecuado o informar del accidente o cuando la iniciativa para conseguir la llamada pila puede debugItem cuando se depura para obtener el número de línea correspondiente, añadiremos la siguiente regla en la configuración de la confusión :

-keepattributes SourceFile, LineNumberTable
de modo que permanecerá depuración Dex y el número de línea de información en este caso es un diagrama de configuración de Dex como sigue:

Daniel tomó un año: la exploración en profundidad de la optimización del volumen de paquete de Android, en un total de 30.000 palabras de recogida recomendada
se puede ver en la figura, la estructura de archivos Dex se divide en cuatro bloques: área de cabecera, el índice de área, área de datos, del mapa . Nuestra información de depuración y el número de línea se almacena en el área de debugItems área de datos.

Y debug_items que contiene principalmente dos tipos de información, de la siguiente manera:

La información de depuración: Contiene todos los parámetros y variables locales de la función.
La información de solución de problemas: contiene la correspondencia entre el número de línea del conjunto de instrucciones de los números de línea del archivo de origen.
De acuerdo con los datos oficiales de Google, debugItem Dex por lo general representa aproximadamente el 5% de la proporción, si podemos eliminar la información de depuración y la línea número, se puede bajar de peso aún más a Dex, pero pierden la capacidad de información de depuración, entonces, ¿qué maneras eliminar debugItem, al tiempo que permite informes de bloqueo sólo fue capaz de obtener el número de línea correcta es?

Podemos tratar de modificar directamente el archivo Dex, conserva una pequeña debugItem, que el sistema encuentre el número de línea cuando la instrucción establece el número de línea y el archivo fuente de número de línea es consistente, para que los números de línea del monitor se presentan directamente en el conjunto de instrucciones de los números de línea.

Cada método tendrá un debugInfoItem, cada uno de los cuales tiene un mapeo del conjunto de instrucciones debuginfoItem entre el archivo de origen y número de línea recta numérica, que dirigimos el exceso debugInfoItem toda eliminado, dejando sólo un debugInfoItem, por lo que todos los métodos apuntará a la misma debugInfoItem, conjunto de instrucciones y el número de línea número de línea y el archivo de origen en este debugInfoItem consistente, así que no importa qué forma de encontrar el número de línea para obtener los números de línea son el conjunto de instrucciones.

Tenga en cuenta que, utilizando este programa necesidad de encontrar formas compatibles con todas las máquinas virtuales y así retener sólo debugInfoItem no es suficiente, necesitamos partición debugInfoItem, y mesa debugInfoItem no puede ser demasiado grande.

La información de depuración sobre cómo eliminar el Dex redex por el StripDebugInfoPass al completo, el cual está configurado de la siguiente manera:

{
    "redex" : {
        "passes" : [
            "StripDebugInfoPass",
            "RegAllocPass"
        ]
    },
    "StripDebugInfoPass" : {
        "drop_all_dbg_info" : false,
        "drop_local_variables" : true,
        "drop_line_numbers" : false,
        "drop_src_files" : false,
        "use_whitelist" : false,
        "cls_whitelist" : [],
        "method_whitelist" : [],
        "drop_prologue_end" : true,
        "drop_epilogue_begin" : true,
        "drop_all_dbg_info_if_empty" : true
    },
    "RegAllocPass" : {
        "live_range_splitting": false
    }
}

Sobre debuginfo combate comenzará inmediatamente debajo de nosotros, antes de eso, vamos a hablar de otro punto de subcontratistas Dex optimización.

5, Dex subcontratistas optimización
Dex subcontratistas optimización principio
cuando APK es demasiado grande, el número de formas Dex será más de 65.536, por lo tanto, debemos mutildex subcontratación, pero esta vez Dex podríamos llamar entre sí a Dex el método, denominado a esta cruz-Dex forma causará una gran cantidad de información redundante, específicamente los dos puntos siguientes:

Identificación del método adicional: Cross-Dex reservas dex llamada hace que el método actual se llama Identificación del dex de esta redundancia conducirá cada Dex se pueden almacenar en la clase se reduce, finalmente, que dará lugar a un aumento en el número de dex compilado, y datos de aumento dex agravarán aún más el problema.
Otro redundancia de la información resultante de la llamada cruz-DEX: además del método multi-grabación de Identificación se invoca, la necesidad de registrar más de lo que pertenece a la información de definición de clase y el método actual, que puede causar string_ids, type_ids, proto_ids información redundante en estas partes Yu.
Con el fin de reducir el caso de llamadas entre Dex, hay que tratar de tener las llamadas de clase y método se asignan a la misma relación de Dex. Pero la relación entre las diversas clases de llamar entre sí es muy complejo, es difícil conseguir las condiciones óptimas.

Afortunadamente, Redex del análisis de clase CrossDexDefMinimizer de la relación entre la clase llamando y utilizar un algoritmo voraz para calcular (un cierto equilibrio entre el efecto y la optimización del compilador efecto Dex) solución óptima local.

https://github.com/facebook/redex/blob/master/opt/interdex/CrossDexRefMinimizer.cpp

El uso de elementos de configuración "InterDexPass" puede hacer referencia a uno al otro en la misma clase tanto como sea posible una Dex, aumento de la clase de la validez de verificar, con el fin de mejorar las aplicaciones de velocidad de arranque en frío.

Dex en la sub-optimización a través de Redex información de la llamada dex redundante causada por el código de configuración es la siguiente:

{
    "redex" : {
        "passes" : [
            "InterDexPass",
            "RegAllocPass"
        ]
    },
    "InterDexPass" : {
        "minimize_cross_dex_refs": true,
        "minimize_cross_dex_refs_method_ref_weight": 100,
        "minimize_cross_dex_refs_field_ref_weight": 90,
        "minimize_cross_dex_refs_type_ref_weight": 100,
        "minimize_cross_dex_refs_string_ref_weight": 90
    },
    "RegAllocPass" : {
        "live_range_splitting": false
    },
    "string_sort_mode" : "class_order",
    "bytecode_sort_mode" : "class_order"
}

Para medir el efecto de optimización, podemos utilizar esta información de manera eficiente indicador de Dex, la fórmula es la siguiente:

git clone https://github.com/facebook/redex.git
cd redex

Si la eficiencia Dex por encima del 80%, que significa básicamente cualificado.

Uso redex subcontratación optimización, la eliminación de la información de depuración y la información de número de línea

Aquí, utilizamos el Redex para optimizar aún más la aplicación de liberación-proguardwithr8.apk generado en el paso anterior. (Entorno de bajo MacOS)

https://fbredex.com/docs/installation

1, en primer lugar, tenemos que introducir el siguiente comando una y otra vez para instalar Xcode herramienta de línea de comandos
Xcode --install la Seleccionar-
2, y luego, utilizando el proyecto de instalación redex homebrew utilizar las dependencias de bibliotecas

ANDROID_SDK=/Users/quchao/Library/Android/sdk redex --sign -s wan-android-key.jks -a wanandroid -p wanandroid -c ~/Desktop/interdex_stripdebuginfo.config -P app/proguard-rules.pro -o ~/Desktop/app-release-proguardwithr8-stripdebuginfo-interdex.apk ~/Desktop/app-release-proguardwithr8.apk

Tenga en cuenta que la versión correcta, impulso de febrero de 2020 10 redex necesidad de código fuente versión v1.71 y superiores, cuando se utiliza la infusión instalar impulso impulso instalado puede llegar al impulso será inferior a la versión v1.71, este cuando la cerveza puede ser necesaria para actualizar la versión, el uso de actualización de cerveza a un almacén versión cerveza más reciente o desde la página oficial impulso para descargar la última impulso a la fuente directamente en / usr / / bodega / directorio local, que actualmente utilizan un código fuente de impulso v1.7.2 descarga boost_1_72_0.zip dirección.

https://dl.bintray.com/boostorg/release/1.72.0/source/

Se menciona de exploración en profundidad comenzó cuando Android optimizado clases Redex optimización reordenamiento, fue atrapado en este paso, por lo que no podía realmente completo clase de optimización de reordenamiento.

3, a continuación, a partir de la fuente adquirida redex Github y cambie al directorio REDEX
Git clon https://github.com/facebook/redex.git
CD REDEX
. 4, el siguiente paso, y hacer uso autoconf para construir redex

Si se está empleando gcc, el uso gcc-5

IVF ./configure && && la marca la autoreconf -j4
la sudo la marca de la instalación
. 5 y, a continuación, la configuración de los códigos de Redex de configuración
, se agrega en tiempo de ejecución de acuerdo Redex redex / config / default.config el archivo de configuración pasa diferentes canales optimizado para artículos de proceso de APK de Dex, podemos hacer referencia a redex / config / default.config esta configuración predeterminada, que pasa a los diferentes elementos de configuración tienen optimizaciones específicas.

Aplicación Para optimizar el tamaño del paquete, y añadimos interdex_stripdebuginfo.config elemento de configuración para borrar situación debuginfo y reducir las llamadas cruzadas-Dex, el código de configuración interdex_stripdebuginfo.config final es como sigue:

{
    "redex" : {
        "passes" : [
            "StripDebugInfoPass",
            "InterDexPass",
            "RegAllocPass"
        ]
    },
    "StripDebugInfoPass" : {
        "drop_all_dbg_info" : false,
        "drop_local_variables" : true,
        "drop_line_numbers" : false,
        "drop_src_files" : false,
        "use_whitelist" : false,
        "cls_whitelist" : [],
        "method_whitelist" : [],
        "drop_prologue_end" : true,
        "drop_epilogue_begin" : true,
        "drop_all_dbg_info_if_empty" : true
    },
    "InterDexPass" : {
        "minimize_cross_dex_refs": true,
        "minimize_cross_dex_refs_method_ref_weight": 100,
        "minimize_cross_dex_refs_field_ref_weight": 90,
        "minimize_cross_dex_refs_type_ref_weight": 100,
        "minimize_cross_dex_refs_string_ref_weight": 90
    },
    "RegAllocPass" : {
        "live_range_splitting": false
    },
    "string_sort_mode" : "class_order",
    "bytecode_sort_mode" : "class_order"
}

6, por último, realizar la optimización correspondiente redex comando
Aquí se utiliza el comando app_release-proguardwithr8.apk Redex en un Dex Dex fue sometido a optimización y optimización de sub debuginfo retira, se utiliza de manera codicioso tal solución óptima local para reducir la redundancia de la información resultante de llamadas entre Dex, los comandos son los siguientes (Tenga en cuenta que puede que tenga que agregar la ruta frente a redex Android SDK, porque redex utiliza para herramienta zipalign bajo SDK):

ANDROID_SDK=/Users/quchao/Library/Android/sdk redex --sign -s wan-android-key.jks -a wanandroid -p wanandroid -c ~/Desktop/interdex_stripdebuginfo.config -P app/proguard-rules.pro -o ~/Desktop/app-release-proguardwithr8-stripdebuginfo-interdex.apk ~/Desktop/app-release-proguardwithr8.apk

Los parámetros clave definidos anteriormente comando redex es el siguiente:

--sign: apk generada para su firma.
-s: archivo de firma para configurar la aplicación.
-a: configurar los key_alias solicitud firmada.
-p: Configurar la aplicación firmada key_password.
-c: necesidades de archivo de configuración basado config para especificar redex fueron DEX tratamiento.
-o: Especifica la plena APK de generación de ruta.
Usando el comando anterior podemos redex APK optimizado para volver a firmar y confusión Espere un momento (si el número de Dex y el tamaño del archivo APK es grande, puede ser relativamente largo), generará APK optimizado: app-release-proguardwithr8-stripdebuginfo- interdex.apk, como se muestra a continuación:

Daniel tomó un año: la exploración en profundidad de la optimización del volumen de paquete de Android, en un total de 30.000 palabras de recogida recomendadas
puede verse, el tamaño de nuestra APK casi ningún cambio, ya que el APK actual sólo un Dex, Dex y el primer defecto no lo hace se optimizado. Para poder ver realmente la optimización redex efecto, se utiliza un nuevo proyecto para llevar a cabo el experimento, las direcciones del proyecto lo siguiente:

proyecto aborda la optimización redex Apk

https://github.com/AndroidAdvanceWithGeektime/Chapter22

En primer lugar, la introducción de una gran cantidad de librerías de código abierto, trate de cambiar el número de Dex un poco más. AssembleDebug puede entonces directamente compilado por. Además, con el fin de ser más claramente el proceso, podemos entrar exportación línea TRACE = 2 de manera que sea de salida en el redex registro de comandos. Por último, entramos en el siguiente comando para Dex redex de eliminación en el caso de la cruz-Dex debuginfo y reducir la llamada de la siguiente manera:

redex --sign -s ReDexSample/keystore/debug.keystore -a androiddebugkey -p android -c redex-test/interdex_stripdebuginfo.config -P ReDexSample/proguard-rules.pro  -o redex-test/strip_output.apk ReDexSample/build/outputs/apk/debug/ReDexSample-debug.apk

Finalmente, vemos ilustrado en la figura volumen APK antes y después de la comparación de los siguientes:

Se puede ver, el tamaño reducido de APK 14.2MB a 12.8MB, el efecto de optimización de alrededor del 10%, el efecto es bastante obvio. Además, si usted es mayor el número de Aplicación Dex, a continuación, optimizar el efecto será.

6, la biblioteca proceso tripartito

  • El proceso de desarrollo real, vamos a utilizar una variedad de biblioteca tripartito. Especialmente cuando el proyecto es grande, muchos desarrolladores, por lo que la introducción de la biblioteca tripartita será mucho, por ejemplo, fue la introducción de una galería Fresco, entonces puede que no esté familiarizado con esta biblioteca, se puede introducir un deslizamiento, y otra persona bien puede ser introducido a su galeria familiarizado Picasso, por lo que el proyecto puede ser múltiple funcionalidad idéntica SDK tripartita, esta será la presencia de proyectos a gran escala que.

  • Por lo tanto, hacemos la pérdida de peso cuando el código debe ser unificada biblioteca tripartita, por ejemplo, la imagen se carga bibliotecas, redes de bibliotecas, bases de datos, y otra biblioteca básica unificada, retire las bibliotecas redundantes.

  • Mientras tanto, en la elección del SDK de terceros, podemos elegir una de tamaño de paquete como un indicador, hay que elegir las bibliotecas más pequeñas tanto como sea posible para lograr la misma funcionalidad.
    Por ejemplo, para la función de la carga de imágenes para, Picasso, Glide, Fresco que se puede lograr, pero entonces Fresco dará lugar a la introducción del tamaño del paquete aumentado mucho, y Picasso se incrementaron sólo menos de 100kb, por lo que la introducción de un SDK diferente para el tamaño del paquete tripartita el impacto no es el mismo.

  • Aquí, podemos utilizar el conde como plug Métodos para Android, después de la instalación, se mostrará automáticamente el número de maneras en que la biblioteca tripartita introdujo en el archivo build.gradle.

  • Por último, si introducimos la biblioteca tripartita, puede requerir la introducción de sólo una parte del código, en lugar de todo el paquete son la introducción del código en.

  • Muchas bibliotecas tienen diseño de la estructura de código es mejor, como Fresco, cargará las imágenes de diversas funciones, tales como webp, fueron despojados funciones gif, que están en una sola biblioteca de ellos. Si sólo tenemos que la función de webp Fresco, entonces podemos ser, además de otras bibliotecas webp dio eliminados, por lo que se introduce la biblioteca tripartita es muy pequeño, el tamaño del paquete de descender. Como se muestra en la figura, que sólo conservó la función Fresco webp, la otra dependencia se puede quitar.

Si se introduce una biblioteca estructura tripartita no ha sido despojado, tenemos que modificar el código fuente para extraer sólo las características que necesita para salir.

7, eliminar el código muerto
, a menudo nos encontramos los dos problemas siguientes al quitar el código muerto:

código de negocio sólo para levantarse.
Código es demasiado miedo de borrar.
En este caso, hay una manera buena para determinar con precisión a qué categoría el entorno en línea sin duda no utilice el usuario. AOP manera que podemos hacer por la actividad, de hecho, muy simple, sólo tenemos que añadir a las estadísticas onCreate entre cada actividad, y más tarde a la línea, si se cuenta la actividad, lo muestra todavía se está utilizando.

Para los que no la clase de actividad, podemos utilizar AOP para cortar su constructor, una clase si se utiliza, y que su constructor sin duda será llamado a. Por ejemplo, la siguiente se basa en el uso de cierta sección AspectJ paquete de código constructor:

@After("execution(org.jay.launchstarter.Task.new(..)")
public void newObject(JoinPoint point) {
    LogHelper.i(" new " + point.getTarget().getClass().getSimpleName());
}

En donde, representa un nuevo constructor new se corta, .. paréntesis representa la configuración de todos los parámetros coincidan. Además, también podemos hacer en línea plug-in de la cobertura de análisis de código muerto directa, tener en cuenta que, recuerde que debe cambiar el nombre del servidor al registrar sus datos reportados.

https://github.com/bytedance/ByteX/blob/master/coverage/README-zh.md

Por último, también podemos utilizar la herramienta en línea para escanear el código duplicado simio.

https://blog.csdn.net/Love667767/article/details/53558382

8, para evitar método de acceso de Java
lo método de acceso?
Con el fin de ofrecer clases internas y externas como la posibilidad de acceder directamente a los miembros privados de cada uno, sin violar los requisitos de embalaje, compilador de Java genera automáticamente el acceso $ xxx métodos estáticos paquete de visibilidad durante la compilación, y la necesidad de tener acceso a otra privada los miembros locales en lugar de llamar a los métodos de acceso correspondientes.

Hay dos formas principales para evitar los métodos de acceso:

Tenga en cuenta que en el proceso de desarrollo en el caso de que los ajustes apropiados posible método de acceso, como para quitar el privado, a la visibilidad del paquete.
Uso ASM método de acceso delete genera en tiempo de compilación.
Debido a que la optimización no es muy obvio, aquí no se introduce, los detalles de la implementación específica se pueden encontrar en el método de acceso de Java de la pérdida de peso de vídeo de eliminación apk sandía, además, Redex también proporciona un método para el acceso de marcado acceso a esta función para eliminar el código, y, en Redex también función de escritura borrado ese efecto el acceso de marcado y la optimización de la misma, no sólo puede reducir el tamaño del paquete, pero también puede mejorar la velocidad de inicio de la aplicación.

9, el código de explotación ByteX Gradle plugin de plataforma optimizada plug-ins
si desea eliminar método de acceso en la fase de elaboración del proyecto, y aquí me recomiendan un uso más directo del enchufe access_inline ByteX. Además de access_inlie, en ByteX hay cuatro optimización de código muy útil Gradle plug-in nos puede ayudar a reducir efectivamente el tamaño del archivo de Dex, de la siguiente manera:

1, durante la compilación inlining campo constante: const_inline.
2, eliminar asignaciones innecesarias durante la compilación del código: field_assign_opt.
3, eliminar el código durante la compilación de registro: method_call_opt.
4, durante la compilación con métodos get / set: captador-setter-inline-plugin .
https://github.com/bytedance/ByteX

Para bajar de peso exploración de los recursos del programa

  • Conocido, Android herramientas de construcción de herramientas AAPT cadena utilizada para procesar los recursos, los recursos manifiesto, recursos, bienes a través de la ManifesMerger correspondiente, recursos de uso ResourcesMerger, AssetsMerger combinador de recursos para una pluralidad de diferentes moudule MergedManifest, MergedResources, MergedAssets. A continuación, se procesan joven AAPT se convirtió en R.java, configuración Proguard, Compilado Recursos. La parte superior izquierda como se muestra en la figura:

En el que el efecto de configuración Proguard, Compilado Recursos de la siguiente manera:

Configuración Proguard: Ésta es la disposición de los diversos componentes de las cuatro vistas de archivos AAPT herramienta de mercancías declaradas utilizando la confusión generada configuración, normalmente se almacena en el archivo $ {} project.buildDir / $ {} AndroidProject.FD_INTERMEDIATES / Proguard -normas / $ {} flavorName / $ {} buildtype /aapt_rules.txt.

Compilado Recursos: Es un formato de archivo Zip, la ruta del archivo es generalmente project.buildDir} {$ / $ {AndroidProject.FD Intermediarios} / RES / Recursos - $ flavorName} {-} {$ buildtype -stripped.ap . Después de extraer con cremallera, se puede ver que contiene la res, AndroidManifest.xml y resources.arsc tres partes. Y, se puede aprender de la apkbuilder anterior proceso de construcción APK, recursos compilados serán empaquetados al paquete APK, en realidad es APK paquete de recursos.

Por lo tanto, podemos modificar el archivo de recursos de compresión diferente sufijo de archivo de recursos compilados para lograr el efecto de pérdida de peso.

Sin embargo, cabe destacar que, almacenamiento de archivos resources.arsc es mejor no comprimido, si la compresión afectará a ciertas propiedades, especialmente el impacto en términos de tiempo de arranque en frío. Y, si está activado Android en Android 6.0: extractNativeLibs = "false", entonces, lo que el archivo no puede ser comprimido.

El artículo no es fácil, si te gusto este artículo, o para ayuda que espera mucha atención Oh pulgares hacia adelante. Los artículos serán actualizados continuamente. Absolutamente seco! ! !

Supongo que te gusta

Origin blog.51cto.com/14775360/2484821
Recomendado
Clasificación