ofuscar - proguard android studio tutorial
Cómo ofuscar una biblioteca de Android(archivo.jar) usando Proguard en Eclipse (5)
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 compila su aplicación en modo de lanzamiento, ya sea ejecutando ant release o utilizando el Asistente de exportación en Eclipse, el sistema de compilación verifica automáticamente si la propiedad proguard.config está establecida. Si lo está, ProGuard procesa automáticamente el código de bytes de la aplicación antes de empaquetar todo en un archivo .apk ".
Pero en el caso de exportar un proyecto de Android en un archivo .jar utilizando el Asistente de exportación de Eclipse, siga los pasos descritos (de crear un archivo proguard.cfg, configurar la propiedad proguard.config a proguard.cfg en el archivo default.properties, usar el Asistente de exportación No parece funcionar, no veo ninguna confusió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 el directorio de mi 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 el directorio de mi proyecto con la siguiente línea, pero eso no parece incitar a ProGuard a actuar:
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 tiene que ser interpuesto explícitamente de alguna manera en el Asistente de exportación de Eclipse. Apreciaré cualquier ayuda o visión. Gracias.
La forma de invocar ProGuard es bastante sencilla:
- Agregue la línea
proguard.config=proguard.cfg
a project.properties - Exportar el paquete de la aplicación.
El asistente para nuevos proyectos debería haber creado automáticamente un archivo proguard.cfg predeterminado.
No ofuscas tu puro Java Jar. Omita esa fase por completo mientras produce el Jar (ya sea manualmente en Eclipse o mediante Ant build desde la línea de comandos).
En su lugar, configure y realice la ofuscación adecuada en el proyecto del cliente , el que usa el Jar, donde agrega la biblioteca como Jar externo. Proguard también podrá ofuscar código dentro del Jar.
Me topé con este problema y terminé exitosamente como lo describí aquí.
Utilizo una forma indirecta para generar un frasco de ofuscación de Android exportado, a mi manera es:
exportar un apk firmado utiliza eclipse
Descomprima el apk, encuentre las clases.
use dex2jar.bat, cambie classes.dex a un jar
descomprima el jar y elimine la clase que no necesita, luego comprímalo y cambie el nombre del archivo a XXX.jar
Luego usa este frasco en otro proyecto, o se lo da al cliente, ¡es confuso!
Estoy seguro de que esto te ayudará! ¡Disfrútala!
como se sugiere en los comentarios a una de las respuestas anteriores (pero que no me di cuenta al principio porque estaba enterrado entre uno de los "comentarios adicionales") ...
simplemente ejecutamos progruard en la línea de comandos ( 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 nuestro proguard.cfg
(y definitivamente no use -dontpreverify
, o proyectos que usen su El proyecto como una biblioteca de Android no se podrá ofuscar correctamente debido a los 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 <fields>;
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(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 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.
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 <methods>;
}
-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 puede ser verificado con jd-gui