Optimización de volumen de APK (con instrucciones de funcionamiento de Android Studio)

Directorio

1. El significado de comprimir el volumen APK

2. Composición y embalaje de APK

3. Compresión y optimización de recursos de recursos.

3.1 Eliminar recursos no referenciados

3.2 Usar WebP para comprimir imágenes

3.3 Use TinyPNG para comprimir imágenes

4. Eliminar código redundante (clases / métodos / variables sin referencia)

4.1 Código de ofuscación

4.2 Use Lint para encontrar código inútil

5. Optimización del formato zip

6. Optimización de Classes.dex

7. optimización de lib

8. Referencias


 

1. El significado de comprimir el volumen APK

 

  • A medida que el proyecto continúa iterando, más y más funciones, el tamaño del archivo apk creado también se hará cada vez más grande, lo que hará que aumente el tráfico de red utilizado al descargar en el caso de redes móviles, y el apk es demasiado grande , Lo que lleva a un aumento en el tiempo de descarga. Aunque los teléfonos móviles de todos tienen mucho tráfico y tienen poco efecto en el tráfico de usuarios, según algunas estadísticas del sitio web, cuanto mayor es el paquete de instalación, la tasa de conversión de usuarios disminuye, por lo que se reduce el apk. El volumen permite que más usuarios descarguen y experimenten productos; [1]
  • Comprimir el volumen APK también tiene una importancia muy importante: ahorrar espacio de memoria y espacio de almacenamiento del teléfono móvil. Después de comprimir el volumen APK, la carga de recursos cuando se ejecuta la aplicación es menor, la memoria del teléfono móvil ocupada será menor y la operación general es más fluida;
  • Para algunos softwares con funciones completas, se puede usar una arquitectura de múltiples complementos internamente, y estos complementos también pueden estar compuestos de APK individuales. Luego, cuando el usuario usa la función correspondiente del complemento por primera vez después de descargar el software, es decir, cuando el arranque en frío Si el APK es demasiado grande, causará una carga lenta, lo que afectará seriamente la experiencia del usuario.

 

2. Composición y embalaje de APK

Aquí hay un ejemplo de una versión de lanzamiento del APK compilada por Demo, para ver qué está instalado en un APK:

Aquí hay una introducción detallada a la composición de APK: [2]

  • lib: almacene el archivo so, puede haber armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, en la mayoría de los casos solo es necesario admitir la arquitectura armabi y x86, si no es necesario, puede considerar eliminar x86 Parte
  • res: almacenar archivos de recursos compilados, como dibujables, diseño, etc.
  • activos: los recursos de la aplicación, la aplicación puede usar AssetManager para recuperar los recursos;
  • META-INF: esta carpeta generalmente se almacena en el APK firmado, que contiene información como el resumen de la firma de todos los archivos en el APK;
  • kotlin: estos archivos contienen datos utilizados para declarar clases Kotlin estándar ("integradas"), que no se compilan en archivos .class, pero se asignan a los tipos existentes en la plataforma (en este caso, JVM). Por ejemplo, kotlin / kotlin.kotlin_builtins contiene información no física en el paquete kotlin: Int, String, Enum, Annotation, Collection, etc.
  • clases (n) .dex: el archivo de clases es una clase Java, un formato de archivo que puede ser entendido por la máquina virtual Dalvik / ART después de ser compilado por DEX;
  • resources.arsc: archivo de recursos binarios compilado;
  • AndroidManifest.xml: archivo de manifiesto de Android, el formato es AXML, que se utiliza para describir los cuatro componentes principales del nombre de la aplicación, la versión, los permisos necesarios y el registro.

Aquí hay un suplemento al proceso de los recursos de la aplicación que se empaquetan en APK. La cadena de herramientas de compilación de Android utiliza herramientas AAPT para procesar recursos. Mire la siguiente figura:

 

3. Compresión y optimización de recursos de recursos.

3.1 Eliminar recursos no referenciados

En un proyecto de Android, habrá más o menos archivos de recursos sin referencia. Android Studio tiene una herramienta integrada Lint para encontrar recursos no válidos. A continuación, se muestra Demo como ejemplo para introducir pasos específicos:

Paso 1: haga clic en Analizar-> Ejecutar inspección por nombre ... en la barra de menú superior

Paso 2: busque recursos no utilizados

Paso 3: configure y comience a verificar los recursos

La herramienta Lint mostrará una lista de archivos de recursos a los que no se ha hecho referencia en el proyecto después de ejecutarse, y luego puede comenzar a eliminar estos archivos:

3.2 Usar WebP para comprimir imágenes

WebP es un formato de archivo de imagen que proporciona compresión con y sin pérdida (compresión reversible), derivada del formato de codificación de imagen VP8, y se considera un proyecto asociado del formato multimedia WebM. WebP fue lanzado originalmente por Google en 2010. El objetivo es reducir el tamaño del archivo, pero lograr la misma calidad de imagen que el formato JPEG, con la esperanza de reducir el tiempo de transmisión de los archivos de imagen en la red. [3]

Según las pruebas anteriores de Google, la compresión sin pérdidas de WebP es un 45% menor que los archivos PNG que se encuentran en la Web. Incluso si estos archivos PNG se procesan usando pngcrush y PNGOUT, WebP aún puede reducir el tamaño del archivo en un 28%. [4]

Android: Android 4.0 (API nivel 14) y superior admite imágenes WebP con pérdida, y Android 4.3 (API nivel 18) y superior admite imágenes WebP sin pérdida y transparentes.

IOS: el iOS actual no es compatible con webp. No sé si será compatible en el futuro, por lo que después de obtener una imagen en formato webp de la red, no se puede mostrar directamente. Debe convertir los datos de datos a jpg o png para mostrarlos.

Hablemos sobre la herramienta de conversión de webp y los pasos de operación integrados en Android Studio:

Paso 1: haga clic derecho en la imagen que desea convertir y seleccione convertir a webp ...

Paso 2: configura e inicia la conversión

3.3 Use TinyPNG para comprimir imágenes

TinyPNG es una herramienta de compresión sin pérdida de imágenes en línea gratuita, el efecto de compresión es bueno, se recomienda a todos:

 

4. Eliminar código redundante (clases / métodos / variables sin referencia)

4.1 Código de ofuscación

Ofuscar el código no es evitar que el código se descompile, sino cambiar el nombre de las clases, métodos, variables y otra información en el código y cambiarlos a nombres sin sentido. Métodos, variables, etc. De manera intuitiva, la ofuscación puede mejorar la seguridad del programa, aumentar la dificultad de la ingeniería inversa y también reducir efectivamente el tamaño del apk. Las funciones principales son las siguientes: [5]

  • Cambie el nombre de la clase, método, variable y otra información en el proyecto a nombres cortos sin sentido;
  • Eliminar clases no utilizadas, métodos, variables, etc.

Realice la siguiente configuración en el archivo gradle en el módulo principal de la aplicación: [1]

buildTypes { 
	release { 
		//开启代码混淆 
		minifyEnabled true 
		//Zipalign优化 
		zipAlignEnabled true 
		//移除无用的resource文件 
		shrinkResources true 
		proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
	} 
} 

Use shrinkResources para eliminar, pero para usar shrinkResources, primero debe habilitar la ofuscación de código minifyEnabled.

Además del atributo minifyEnabled, existen atributos proguardFiles para definir las reglas de ProGuard:

  • getDefaultProguardFile(‘proguard-android.txt')La tools/proguard/configuración predeterminada de ProGuard se obtiene de la carpeta del SDK de Android .
  • proguard-rules.proEl archivo se utiliza para agregar reglas personalizadas de ProGuard. De manera predeterminada, este archivo se encuentra en el directorio raíz del módulo (al lado del archivo build.gradle).

Nota: La compresión de código reducirá la velocidad de compilación, por lo que debe evitarse en las compilaciones de depuración siempre que sea posible. Sin embargo, asegúrese de habilitar la compresión de código para el APK final utilizado para las pruebas. Si no puede personalizar completamente el código que desea conservar, puede introducir errores.

4.2 Use Lint para encontrar código inútil

Usando Lint para encontrar recursos sin referencia similares a los anteriores, haga clic en Analizar-> Analizar-> Ejecutar inspección por nombre ...

Busque la declaración no utilizada de la siguiente manera:

Los resultados de la búsqueda enumerarán las clases / métodos / variables sin referencia, y luego puede considerar eliminar estos códigos inútiles:

 

5. Optimización del formato zip

Los detalles del APK se pueden ver a través de aapt l -v xxx.apk o descomprimir -l xxx.apk:

La cifra puede ser visto por una gran cantidad de recursos en el APK es Storedpara almacenar estos archivos no se comprimen. Encuentre la siguiente descripción del código fuente de AAPT:

/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
    ".jpg", ".jpeg", ".png", ".gif",
    ".wav", ".mp2", ".mp3", ".ogg", ".aac",
    ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
    ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
    ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
    ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"
};

Se puede ver que AAPT no comprime los recursos de estos tipos de sufijo de archivo durante el procesamiento de recursos. ¿Es posible modificar su método de compresión para lograr el efecto de adelgazamiento? El método de compresión detallado se puede consultar: Optimización de adelgazamiento del paquete técnico de Meituan-equipo de Android

 

6. Optimización de Classes.dex

Cómo optimizar el tamaño de classes.dex generalmente tiene las siguientes dos direcciones: [2]

  • Mantenga buenos hábitos de programación y un gran sentido del tamaño del paquete en todo momento, elimine el código duplicado o no utilizado, use las bibliotecas de terceros con precaución, elija pequeños SDK de terceros, etc.
  • Active ProGuard para la compresión del código y use ProGuard para ofuscar, optimizar y comprimir el código.

 

7. optimización de lib

Al desarrollar aplicaciones de Android, a menudo utiliza bibliotecas de bibliotecas externas para mejorar la usabilidad y escalabilidad de su aplicación. Por ejemplo, presentará la Biblioteca de soporte de Android para mejorar la experiencia del usuario en modelos más antiguos, o utilizará el Servicio Google Play para traducir automáticamente el texto en su aplicación. Si una biblioteca está diseñada como un servicio o escritorio, contendrá muchos objetos y métodos que su aplicación no utiliza. Para incluir solo las partes utilizadas en su proyecto, puede modificar este archivo de biblioteca. Si la licencia lo permite, también puede usar otra biblioteca compatible con dispositivos móviles para agregar funciones específicas a su aplicación. [6]

Nota: Progard puede borrar algunos códigos inútiles en la biblioteca importada, pero no puede borrar grandes dependencias internas en la biblioteca.

Hay una solución de código abierto en GitHub-upx: https://github.com/upx/upx

Introducción de upx (50% ~ 70% relación de compresión):

UPX is an advanced executable file compressor. UPX will typically
reduce the file size of programs and DLLs by around 50%-70%, thus
reducing disk space, network load times, download times and
other distribution and storage costs.

Programs and libraries compressed by UPX are completely self-contained
and run exactly as before, with no runtime or memory penalty for most
of the supported formats.

 

8. Referencias

[1] Zhihu-Column-Andriod APK Optimización del volumen

[2] Práctica de optimización de adelgazamiento de Meituan Technical Team-Android App Package

[3] Wikipedia-WebP

[4] Formato Baidu Encyclopedia-webp

[5] Nuggets: explicación detallada de la ofuscación del código de Android

[6] Breve libro Optimización del rendimiento (6) -Reduce el volumen del APK

Publicado 16 artículos originales · elogiado 59 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/Carson1145/article/details/105609608
Recomendado
Clasificación