Ofuscación del código de Android y cómo determinar si un código apk ha sido ofuscado
1. Principio de Proguard
El código Java se compila en un archivo de clase binario. Este archivo de clase también se puede descompilar en código fuente, además de los comentarios, básicamente se pueden ver otros códigos. . Para evitar que se filtre código importante, a menudo necesitamos ofuscar, es decir, cambiar los nombres de elementos Java, como nombres de métodos, nombres de variables, nombres de clases, nombres de paquetes, etc., a nombres inesperados, de modo que la estructura del código no cambia y aún se puede ejecutar, pero es difícil entender la estructura del código. Proguard desempeña este papel:
1. Puede analizar la estructura de un grupo de clases y luego ofuscar los elementos Java que pueden confundirse en estos archivos de clases según la configuración del usuario
2. Eliminar el código no válido
3. Optimice el código (use el apk exportado por el complemento adt y también realice la optimización zipalign)
De forma predeterminada, proguard ofuscará todos códigos, pero en las siguientes situaciones, el nombre del elemento java no se puede cambiar, de lo contrario provocará un error en el programa.
1. Dónde se usa la reflexión (las API en Android a menudo se comentan con @hide y los desarrolladores deben usar la reflexión al llamar a los métodos correspondientes)
2. Cuándo app Cuando El código depende de la interfaz del sistema, como el método de devolución de llamada llamado por el código del sistema, este método es más complicado
3. El nombre del elemento Java está configurado en el archivo de configuración
Entonces Cuando usamos proguard, necesitamos un archivo de configuración para indicarle a proguard qué elementos de Java no se pueden confundir.
2. Configuración de Proguard
-dontwarn De forma predeterminada, proguard comprobará si cada referencia es correcta, pero a menudo hay algunas clases no utilizadas en bibliotecas de terceros a las que no se hace referencia correctamente. Si no está configurado, el sistema informará un error.
La clase y los miembros de clase especificados por -keep se conservan como entradas.
Los miembros de clase especificados por -keepclassmembes se conservan.
-keepclasswithmembersLa clase especificada y los miembros de la clase se conservan, si el miembro de la clase especificado existe.