Cómo ofuscar una biblioteca de Android (archivo .jar) con Proguard en Eclipse

He visto muchas publicaciones sobre cómo ofuscar una aplicación de Android (archivo .apk) usando ProGuard en Eclipse. También vea http://developer.android.com/guide/developing/tools/proguard.html :

“Cuando construyes tu aplicación en modo de lanzamiento, ya sea ejecutando un lanzamiento de ant o usando el Asistente de exportación en Eclipse, el sistema de comstackción verifica automáticamente si se establece la propiedad proguard.config. Si es así, ProGuard procesa automáticamente el código byte de la aplicación antes de empacar todo en un archivo .apk “.

Pero en caso de exportar un proyecto de Android en un archivo .jar usando Eclipse Export Wizard, siga los pasos descritos (para crear un archivo proguard.cfg, configurar la propiedad proguard.config para proguard.cfg en el archivo default.properties, usando Export Wizard etc.) no parece funcionar: no veo ninguna ofuscación de nombres de clase, etc. en el archivo jar resultante. También tengo la siguiente configuración en mi archivo proguard.cfg, pero no veo ningún archivo de salida en mi directorio de proyecto o en el directorio de proguard (ese directorio ni siquiera está creado).

-dump class_files.txt -printseeds seeds.txt -printusage unused.txt -printmapping mapping.txt 

Incluso he creado un archivo project.properties en mi directorio de proyectos con la siguiente línea, pero eso no parece tentar a ProGuard a la acción:

 proguard.config=proguard.cfg 

No hay actividades definidas en este proyecto. Estoy usando Android 2.3.1 y Eclipse Galileo 3.5.2 en Windows. Los mismos resultados con Android 3.0. Parece que el paso de ofuscación debe ser interpuesto de alguna manera explícitamente en el Asistente de exportación de Eclipse. Apreciaré cualquier ayuda o idea. Gracias.

como se sugirió en los comentarios a una de las respuestas anteriores (pero que no noté al principio porque estaba enterrado entre uno de los “comentarios adicionales”) …

simplemente ejecutamos progruard en la línea de comando ( vea el primer bloque a continuación ) en la biblioteca fuera de eclipse con los parámetros en el segundo bloque a continuación en nuestro archivo proguard.cfg (y definitivamente no use -dontpreverify , o proyectos que usen su proyecto como una biblioteca de Android no podrá ser ofuscado correctamente debido a problemas de StackMapTable de su project.jar).

línea de comando:

 $ java -jar $ANDROID_SDK/tools/proguard/lib/proguard.jar \ -libraryjars $ANDROID_SDK/platforms/android-18/android.jar @proguard.cfg -outjars /tmp/project.jar -verbose 

proguard.cfg:

 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontwarn our.company.project.R* -injars bin/project.jar -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep class org.apache.3rdparty.stuff.** -keep public class our.company.project.ProjectAPI -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 -keepclassmembers public class our.company.project.ProjectAPI { public static ; } -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } 

es posible que no todos los parámetros y los elementos de mantenimiento sean estrictamente necesarios (aparte de no usar -dontpreverify como se mencionó anteriormente), pero la mayoría de estos tienen sentido para mí como elementos que deben estar allí si tiene una extensión de clase de actividad en el biblioteca que está exportando

Utilizo una forma indirecta para generar un contenedor de ofuscación de android exportado, mi manera es:

  1. exportar un eclipse de uso apk firmado

  2. descomprime el apk, encuentra las clases.dex

  3. use dex2jar.bat, cambie las clases.dex a un contenedor

  4. descomprime el archivo jar y borra la clase que no necesitas, luego comprímalo y cambia el nombre del archivo a XXX.jar

  5. Luego, usa este flask en otro proyecto, o se lo da al cliente, ¡se ofusca!

¡Estoy seguro de que esto te ayudará! ¡Disfrútala!

 java -jar proguard.jar @yourconfig.pro 

yourconfig.pro (extendido desde http://proguard.sourceforge.net/index.html#manual/examples.html ):

 -injars yourjar.jar -outjars yourjar_out.jar -libraryjars 'C:\android\sdk\platforms\android-10\android.jar' -printmapping mapping.txt -verbose -dontoptimize -dontpreverify -dontshrink -dontskipnonpubliclibraryclassmembers -dontusemixedcaseclassnames -keepparameternames -renamesourcefileattribute SourceFile -keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*,EnclosingMethod -keep public class * { public protected *; } -keepclassmembernames class * { java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean); } -keepclasseswithmembernames class * { native ; } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } 

El resultado se puede verificar con jd-gui

La forma de invocar ProGuard es bastante sencilla:

  1. Agregue la línea proguard.config=proguard.cfg a project.properties
  2. Exportar el paquete de la aplicación

El nuevo asistente de proyecto debe haber creado automáticamente un archivo proguard.cfg predeterminado.

No ofusque su Java Jar puro . Omita esa fase por completo mientras produce el Jar (ya sea manualmente en Eclipse o a través de Ant build desde la línea de comandos).

En su lugar, configure y realice una ofuscación adecuada en el proyecto del cliente , la que usa el Jar, donde agrega la biblioteca como Jar externo. Proguard también podrá ofuscar el código dentro del Jar.

Me encontré con este problema y terminé con éxito como lo describí aquí.