android - tutorial - proguard apk
Android ProGuard: optimizaciones más agresivas (2)
Recuerde que la mejor configuración de ProGuard es una configuración con un mínimo de excepciones. Bajo las excepciones entiendo:
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
Veamos proguard-android-optimice.txt y veamos las opciones de optimización / ofuscación.
Para una descripción detallada de las opciones de ProGuard, uso this
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
This
- lista de posibles optimizaciones,!
significa negar, por lo que esta optimización no se utiliza
-optimizationpasses 5
Especifica el número de pases de optimización que se realizarán.
Por defecto, 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, la optimización finaliza.
Solo aplicable al optimizar.
Uso:
OK
, y parece que 5 pases predeterminados son suficientes
-allowaccessmodification
Especifica que los modificadores de acceso de las clases y los miembros de la clase pueden ampliarse durante el procesamiento.
Esto puede mejorar los resultados del paso de optimización.
Uso:
OK
, sí, parece mejorar la optimización
-dontpreverify
Al apuntar a Android, la verificación previa no es necesaria, así que no preverifique desactivarlo para reducir un poco el tiempo de procesamiento.
Pero esta opción no afecta la irrompibilidad del código.
Uso:
OK
, solo un poco de tiempo de procesamiento de reutilización
-dontusemixedcaseclassnames
Especifica no generar nombres de clase de mayúsculas y minúsculas mientras se ofusca.
De forma predeterminada, los nombres de clase ofuscados pueden contener una combinación de caracteres en mayúscula y minúscula.
Esto crea frascos perfectamente aceptables y utilizables.
Uso:
CUESTIONABLE
, no puedo encontrar la razón exacta por la que se agregó esta opción, pero parece que cambiar el nombre de la clase de
abcdef
a
AbSdEf
no hace que el código sea
AbSdEf
-dontskipnonpubliclibraryclasses
Especifica no ignorar las clases de bibliotecas no públicas.
A partir de la versión 4.5, esta es la configuración predeterminada.
Uso:
OK
, muy útil.
Las siguientes opciones no se incluyen para proguard-android-optimizar.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
, parece peligroso para Android, no está incluido en la configuración, suma de prohibición de clase / fusión / en optimizaciones
-overloadaggressively
Especifica aplicar sobrecarga agresiva mientras se ofusca.
Múltiples campos y métodos pueden obtener los mismos nombres, siempre que sus argumentos y tipos de retorno sean diferentes, como lo requiere el código de bytes de Java (no solo sus argumentos, como lo requiere el lenguaje Java)
Uso:
MALO
, Dalvik VM de Google no puede manejar campos estáticos sobrecargados.
-repackageclasses ''''
Especifica el reempaquetado de todos los archivos de clase que se renombran, moviéndolos al paquete individual dado.
Sin argumento o con una cadena vacía (''''), el paquete se elimina por completo.
Esta opción anula la opción -flattenpackagehierarchy.
Uso:
OK
, utilizado por Google, así que parece que al menos hemos encontrado la opción que podemos agregar a nuestra configuración
Así que solo conozco una opción más útil para la ofuscación y no peligrosa:
-repackageclasses ''''
También tenga en cuenta la decodificació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 mantener los números de línea agregando el siguiente código a su configuración:
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
Esto mantendrá los números de línea pero reemplazará el nombre del archivo en el stacktrace con "SourceFile".
Además, no olvide que el ProGuard parece vulnerable porque no encripta los recursos de la cadena , así que considere usar DexGuard o encriptar cadenas importantes (como tokens, urls).
La documentación oficial de protección de Android muestra dos optimizaciones principales:
-
establecer
minifyEnabled
entrue
-
use
proguard-android-optimize.txt
lugar deproguard-android.txt
¿Son estos dos los ajustes más agresivos posibles?
Estoy escribiendo una biblioteca de Android y necesito asegurarme de que cuando la gente use mi biblioteca, mi código no se rompa. (Sé que hay reglas que puedo poner en mi biblioteca para contrarrestar la configuración de protección establecida en la aplicación que usa la biblioteca, pero no quiero hacerlo si no tengo que hacerlo).
Según el comentario del archivo de optimización, las optimizaciones introducen ciertos riesgos y, si se usan, la aplicación debe probarse a fondo. Según mi experiencia, es necesario deshabilitar el código / simplificación / avanzado, porque causó que las variables locales finales que se inicializaron fuera de una lambda fueran NULAS dentro de la lambda. Fue muy difícil de depurar y encontrar. Por lo tanto, mi configuración de optimización es la siguiente:
-optimizaciones! código / simplificación / conversión,! 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 deshabilitarse si apunta a Android 2.0 y versiones inferiores (lo cual es muy poco probable). Además de eso, también tuve que deshabilitar método / eliminación / parámetro y método / propagación / parámetro, porque implícitamente habilitan código / simplificación / avanzado (consulte el manual de ProGuard para obtener más información).