Android ProGuard: Optimizaciones más agresivas

La documentación oficial de proguard de Android muestra dos optimizaciones principales:

  • Establecer minifyEnabled a true
  • Utilice proguard-android-optimize.txt lugar de proguard-android.txt

¿Son estas dos configuraciones posibles más agresivas?

Estoy escribiendo una biblioteca de android y necesito asegurarme cuando la gente usa mi biblioteca que mi código no se rompe. (Sé que hay reglas que puedo poner en mi biblioteca para contrarrestar la configuración de proguard en la aplicación que usa la biblioteca, pero no quiero hacerlo si no tengo que hacerlo).

Recuerde que la mejor configuración de ProGuard es una configuración con un mínimo de excepciones. Bajo las excepciones que entiendo:

  -keepclassmembers class * extends android.content.Context { public void *(android.view.View); public void *(android.view.MenuItem); } 

Vamos a caminar a través de proguard-android-optimize.txt y buscar opciones de optimización / ofuscación.

Para obtener una descripción detallada de las opciones de ProGuard,

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* Esta lista de optimización posible! Significa negar, por lo que esta optimización no se utiliza

-optimizationpasses 5 Especifica el número de pases de optimización a realizar. De forma predeterminada, se realiza una sola pasada. Múltiples pases pueden resultar en mejoras adicionales. Si no se encuentran mejoras después de un pase de optimización, se termina la optimización. Únicamente aplicable en la optimización.
Uso: OK , y parece que por defecto 5 pases es suficiente

-allowaccessmodification Especifica que los modificadores de acceso de clases y miembros de clase pueden ampliarse durante el procesamiento. Esto puede mejorar los resultados de la etapa de optimización.
Uso: OK , sí parece mejorar la optimización

-dontpreverify Al orientar Android, preverifing no es necesario, por lo que dontververify apagarlo para reducir el tiempo de procesamiento un poco. Pero esta opción no tiene impacto en la capacidad de irromperse del código.
Uso: OK , sólo para poco tiempo de procesamiento reduse

-dontusemixedcaseclassnames Especifica que no se generen nombres de clase de caso mixto mientras se ofusca. De forma predeterminada, los nombres de clase ofuscados pueden contener una mezcla de caracteres en mayúsculas y minúsculas. Esto crea jarras perfectamente aceptables y utilizables.
Uso: QUESTIONABLE , no puedo encontrar la razón exacta por la cual esta opción agregó, pero parece cambiar nombre de clase de abcdef a AbSdEf no hace que el código sea irrompible

-dontskipnonpubliclibraryclasses Especifica no ignorar las clases de biblioteca no pública. A partir de la versión 4.5, esta es la configuración predeterminada.
Uso: OK , muy útil

Las siguientes opciones no se incluyen en proguard-android-optimize.txt:

-mergeinterfacesaggressively Especifica que las interfaces pueden fusionarse, incluso si sus clases de implementación no implementan todos los métodos de interfaz … establecer esta opción puede reducir el rendimiento del código procesado en algunas JVM
Uso: MALO , parezca peligroso para Android, no incluido en config, sumular de prohibición de clase / fusión / en optimizaciones

-overloadaggressively Especifica que se aplique una sobrecarga agresiva mientras se ofusca. Múltiples campos y métodos pueden obtener los mismos nombres, siempre y cuando sus argumentos y tipos de retorno sean diferentes, como lo requiere el bytecode de Java (no sólo sus argumentos, como requiere el lenguaje Java)
Uso: Malo , VM de Dalvik de Google no puede manejar los campos estáticos sobrecargados.

-repackageclasses '' Especifica reempaquetar todos los archivos de clase que se renombran, moviéndolos en el solo paquete dado. Sin argumento o con una cadena vacía (''), el paquete se elimina completamente. Esta opción anula la opción -flattenpackagehierarchy.
Uso: Aceptar , Utilizado por Google, por lo que parece que al menos hemos encontrado la opción que podemos agregar a nuestra configuración

Así que sé que sólo uno más útil para la ofuscación y la opción no peligrosa:
-repackageclasses ''

También tenga en cuenta la descodificación de trazas de pila. ProGuard también elimina el nombre de archivo y los números de línea del stacktrace. Esto hace que encontrar errores sea muy complicado. Puede guardar los números de línea agregando el siguiente código a su config:

 -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable 

Esto mantendrá los números de línea pero reemplazará el nombre de archivo en el stacktrace con "SourceFile".

También no olvide que el ProGuard se ve vulnerable porque no encripta los recursos de cadena , así que considere usar DexGuard o cifrar cadenas importantes (como fichas, urls) ellos mismos.

Según el comentario del archivo de optimización, las optimizaciones introducen ciertos riesgos y si se utilizan, la aplicación debe ser probada a fondo. Según mi experiencia, es necesario desactivar el código / simplificación / avanzado, ya que causó variables locales finales que se inicializaron fuera de un lambda siendo NULL dentro del lambda. Era muy difícil de depurar y encontrar. Por lo tanto, mis ajustes de optimización son los siguientes:

-optimizaciones! Código / simplificación / cast,! Código / simplificación / avanzado,! Campo / *,! Clase / fusión / *,! Método / eliminación / parámetro,! Método / propagación / parámetro

Tenga en cuenta que el código / simplificación / aritmética también debe estar deshabilitado si se orienta a Android 2.0 y inferior (lo cual es muy poco probable). Además, también tuve que deshabilitar método / eliminación / parámetro y método / propagación / parámetro, ya que estos implicitamente habilitar código / simplificación / avanzado (consulte el manual de ProGuard para más información).

  • ¿Cómo usar nuevo Android 2.0 Shrinker y setProPropertor falsa?
  • ¿Cómo usar el ProGuard en Android Studio?
  • Error: Error de ejecución para la tarea ': app: transformClassesAndResourcesWithProguardForDebug'
  • El uso de MultiDex en Android App ejecuta ProGuard dos veces y sólo segunda vez con Advertencias / Notas?
  • Al ofuscar con ProGuard, ¿hace -keepattributes SourceFile, LineNumberTable hacer el apk resultante más fácil de ingeniería inversa?
  • Mantener los métodos Java llamados desde Android JNI
  • Eliminar localizaciones no utilizadas de APK
  • Android pesadilla proguard
  • Android Proguard saltar el frasco externo
  • Siempre ejecutando proguard antes de Android dex'ing en Eclipse
  • ProGuard no funciona en mi aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.