Ofuscando múltiples módulos con el estudio de Android

Tengo problemas con gradle proguard … Tengo los siguientes módulos:

  • Aplicación: módulo principal de la aplicación. Tener dependencia ModuleA y ModuleC
  • ModuleA: módulo de biblioteca. Tener dependencia ModuleB, y jarro dépendcies.
  • ModuleB: Módulo de biblioteca
  • ModuleC: módulo de biblioteca
  • Desgaste: desgaste módulo de la aplicación.

Build.gradle files: – Aplicación:

buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':ModuleA') compile project(':ModuleC') wearApp project(':Wear') } 

ModuleA:

 buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':ModuleB') } 

ModuleB:

 buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

ModuleC: Lo mismo que ModuleB.

Vestir:

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

** Sólo escribí las líneas importantes

Mi problema es que si genero un APK firmado con esa configuración, cuando lo instalo en un dispositivo se bloquea con esta excepción:

Java.lang.NoSuchFieldError: no hay campo con nombre = 'peer' signature = 'J' en la clase Lcom / package / ClassInJar;

Se bloquea en una clase contenida en un tarro en la carpeta libs del módulo A.

Si establezco minifyEnabled en false en todos los módulos no se bloquea, pero prefiero ocultar el código. Y si convierto minifyEnabled a true en módulos de biblioteca no compila y me muestra esta excepción:

 Error:Execution failed for task ':ModuleB:proguardRelease'. 

Java.io.IOException: La jarra de salida está vacía. ¿Especificó las opciones adecuadas de 'mantenimiento'?

En primer lugar es importante entender que proguard desempeña dos rollos principales:

  • Cuando proguard obfuscate realmente toma todas sus clases, miembros de las clases, métodos etc y cambia sus nombres por lo que se convertirá en jerga. De esta forma, es mucho más difícil para alguien hacer ingeniería inversa en su código.
  • Se encoge el código de una manera que cada clase no utilizada, miembro de la clase, etc método se descarta en la compilación para hacer su apk más delgado.

Así que en cuanto a "minify" va, no es necesario, a pesar de que podría ahorrar unos kilobytes aquí y allá. Probablemente puede dejarlo y estará bien.

En cuanto a la caída – esto sucede porque una parte de su código está tratando de llegar a una clase que su nombre probablemente se obscureció y por lo tanto falta.
Intente establecer reglas para el proguard. Que podría hacerse así:

  • Busque el archivo 'proguard-rules.pro' que se encuentra justo al lado del archivo 'build.gradle' dentro de la carpeta "app" (imagen a continuación). Introduzca aquí la descripción de la imagen

  • A continuación, debe agregar reglas 'keep' para las clases / clases / métodos / etc específicas para que la ofuscación no se produzca en estos elementos. Tiene ejemplos comentados en el archivo, por ejemplo:

    -keepclassmembers clase fqcn.of.javascript.interface.for.webview {public *; }

Lo que significa "no ofusque a ningún miembro de la clase que sea público dentro de la clase dada.

Pero, hay muchas variaciones del guardar.
Para obtener más información sobre las variaciones "mantener", consulte esta documentación con ejemplos (al hacer clic en un elemento) en el enlace: Mantenga las opciones .

Buena suerte

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.