Android obfuscate aplicación utilizando proguard mantiene obfuscating frascos de la biblioteca – o es?

Soy nuevo en usar Proguard, así que probablemente estoy cometiendo un error de novato. Tengo una aplicación que después de ejecutar la versión de compilación (que utiliza Proguard para ofuscar) se bloquea bastante rápido. Creo que lo he reducido al hecho de que parece que está obscureciendo mis bibliotecas de referencia. En mi caso mis bibliotecas de referencia se utilizan para definir mis clases de mensajes que estoy usando para comunicarse con otro dispositivo usando Google Protobuffers. Estoy construyendo usando, liberación de hormigas. Mi config proguard es:

-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } 

En mi archivo ant build.xml tengo definido lo siguiente:

 <target name="-obfuscate" unless="do.not.compile"> <if condition="${proguard.enabled}"> <then> <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" /> <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" /> <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" /> <!-- input for dex will be proguard's output --> <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" /> <!-- Add Proguard Tasks --> <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" /> <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" /> <!-- Set the android classpath Path object into a single property. It'll be all the jar files separated by a platform path-separator. --> <property name="android.libraryjars" refid="android.target.classpath"/> <!-- Build a path object with all the jar files that must be obfuscated. This include the project compiled source code and any 3rd party jar files. --> <path id="project.jars.ref"> <pathelement location="${preobfuscate.jar.file}" /> <path refid="jar.libs.ref" /> </path> <!-- Set the project jar files Path object into a single property. It'll be all the jar files separated by a platform path-separator. --> <property name="project.jars" refid="project.jars.ref" /> <mkdir dir="${obfuscate.absolute.dir}" /> <delete file="${preobfuscate.jar.file}" /> <delete file="${obfuscated.jar.file}" /> <jar basedir="${out.classes.dir}" destfile="${preobfuscate.jar.file}" /> <proguard> @${proguard.config} -injars ${project.jars} -outjars ${obfuscated.jar.file} -libraryjars ${android.libraryjars} -dump ${obfuscate.absolute.dir}/dump.txt -printseeds ${obfuscate.absolute.dir}/seeds.txt -printusage ${obfuscate.absolute.dir}/usage.txt -printmapping ${obfuscate.absolute.dir}/mapping.txt </proguard> </then> </if> </target> <!-- Converts this project's .class files into .dex files --> <target name="-dex" depends="compile, -post-compile, -obfuscate" unless="do.not.compile"> <if condition="${manifest.hasCode}"> <then> <dex-helper /> </then> <else> <echo>hasCode = false. Skipping...</echo> </else> </if> </target> <!-- Puts the project's resources into the output package file This actually can create multiple resource package in case Some custom apk with specific configuration have been declared in default.properties. --> <target name="-package-resources"> <echo>Packaging resources</echo> <aapt executable="${aapt}" command="package" versioncode="${version.code}" debug="${build.packaging.debug}" manifest="AndroidManifest.xml" assets="${asset.absolute.dir}" androidjar="${android.jar}" apkfolder="${out.absolute.dir}" resourcefilename="${resource.package.file.name}" resourcefilter="${aapt.resource.filter}"> <res path="${resource.absolute.dir}" /> <!-- <nocompress /> forces no compression on any files in assets or res/raw --> <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw --> </aapt> </target> <!-- Packages the application and sign it with a debug key. --> <target name="-package-debug-sign" depends="-dex, -package-resources"> <package-helper output.filepath="${out.debug.unaligned.file}" /> </target> <!-- Packages the application without signing it. --> <target name="-package-release" depends="-dex, -package-resources"> <package-helper output.filepath="${out.unsigned.file}"/> </target> <target name="-set-release-mode"> <!-- release mode is only valid if the manifest does not explicitly set debuggable to true. default is false. We actually store build.packaging.debug, not build.release --> <xpath input="AndroidManifest.xml" expression="/manifest/application/@android:debuggable" output="build.packaging.debug" default="false"/> <!-- Enable proguard --> <property name="proguard.enabled" value="true"/> <property name="proguard.config" value="proguard.cfg"/> <!-- signing mode: release --> <property name="build.signing.debug" value="false" /> <if condition="${build.packaging.debug}"> <then> <echo>*************************************************</echo> <echo>**** Android Manifest has debuggable=true ****</echo> <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo> <echo>*************************************************</echo> </then> <else> <!-- property only set in release mode. Useful for if/unless attributes in target node when using Ant before 1.8 --> <property name="build.mode.release" value="true"/> </else> </if> </target> <target name="release" depends="-set-release-mode, -release-obfuscation-check, -package-release, -release-prompt-for-password, -release-nosign" if="has.keystore" description="Builds the application. The generated apk file must be signed before it is published."> <!-- Signs the APK --> <echo>Signing final apk...</echo> <signjar jar="${out.unsigned.file}" signedjar="${out.unaligned.file}" keystore="${key.store}" storepass="${key.store.password}" alias="${key.alias}" keypass="${key.alias.password}" verbose="${verbose}" /> <!-- Zip aligns the APK --> <zipalign-helper in.package="${out.unaligned.file}" out.package="${out.release.file}" /> <echo>Release Package: ${out.release.file}</echo> </target> 

Apreciaría cualquier idea. Copié en la mayor parte de mis configuraciones de la estructura y del proguard de las plantillas en línea, sospecho que realmente estoy construyendo Proguard para ofuscar los tarros de la biblioteca o tengo algo lisconfigured. Estoy viendo la siguiente salida en mi ventana de cmd al final de la compilación:

 [proguard] Writing output... [proguard] Preparing output jar [C:\Workspace\UI\MyApp\build\proguard\obfuscated.jar] [proguard] Copying resources from program jar [C:\Workspace\UI\MyApp\build\proguard\original.jar] [proguard] Copying resources from program jar [C:\Workspace\UI\MyApp\libs\libmessaging.jar] [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [libmessaging.jar:META-INF/MANIFEST.MF]) [proguard] Copying resources from program jar [C:\Workspace\UI\MyApp\libs\protobuf-2.3.0.jar] [proguard] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [protobuf-2.3.0.jar:META-INF/MANIFEST.MF]) [proguard] Printing classes to [C:\Workspace\Riptide1_1_ptr_74\WPG_HAWKSBILL\UI\MyApp\build\proguard\dump.txt]... 

¡Gracias!

Ha comentado las directivas jar de su biblioteca en la configuración de Proguard.
Cambio:

 # -libraryjars /libs/protobuf-2.3.0.jar # -libraryjars /libs/libmessaging.jar 

a:

 -libraryjars /libs/protobuf-2.3.0.jar -libraryjars /libs/libmessaging.jar 

(Y luego no te molestes en definir tus frascos de la biblioteca en tu build.xml)

EDITAR:
Encontré otra forma de hacer que Proguard dejara los jarros de la biblioteca solos para pedirle que preservara sus nombres de paquetes, por ejemplo:

 -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; } 

Tuve un problema similar cuando proGuard cifrado el jsoup lib. Lo arreglé agregando lo siguiente a mi proguard-rules.txt :

 -keep class org.jsoup** { *; } 

Así que build.gradle terminará con la siguiente sección:

 release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } 
  • Proguard config para newrelic en la aplicación android?
  • Proguard no obstruye las aplicaciones de Android
  • NoClassDefFoundError: android.support.design.internal.NavigationMenu en Android 4.2.2 (wiko)
  • "No se puede encontrar la clase referenciada" con Proguard y Kotlin
  • Cómo bajar la versión proguard en androide gradle estudio?
  • Errores de Proguard con jar externo - devuelve el código de error 1
  • Errores de Proguard al exportar el proyecto de Android después de actualizar a ADT 20
  • Android y Proguard - cómo ofuscar, pero no optimizar ningún código?
  • Android cómo colocar todas mis clases en un solo paquete usando Proguard
  • Crash ORMLite en Android con proguard
  • No se puede corregir Android Proguard Devuelto con error error de código 1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.