Android ProGuard: Optimizaciones más agresivas
La documentación oficial de proguard de Android muestra dos optimizaciones principales:
- Establecer
minifyEnabled
atrue
- Utilice
proguard-android-optimize.txt
lugar deproguard-android.txt
¿Son estas dos configuraciones posibles más agresivas?
- cómo escribir una configuración proguard para una lib de servicio remoto
- Proguard mantener a los miembros de la clase
- Problemas con ProGuard para Android con Parse 1.3.5 jar
- TransformClassesAndResourcesWithProguardForRelease FALLA
- Ejecución de ProGuard con una biblioteca AQuery
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).
- No se puede obtener jar biblioteca para trabajar con Android y Proguard
- RestTemplate, Jackson y proguard
- Proguard dando el siguiente error al exportar la aplicación
- Android proguard obfuscated código está causando NullPointerException cuando realmente no debe ser
- Obfuscating ActionBarSherlock con Proguard
- Facturación en aplicaciones Android y Proguard (fuente desconocida)
- Proguard con código de error de devolución Unity3d 1
- ADT R22 - Proguard - No se puede encontrar la clase referenciada
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).
- Android Studio – Autocompletar de XML Editor no funciona con bibliotecas de soporte
- ¿Por qué "los botones de las barras de botones no deben tener bordes" en la API de Android Nivel 15?