2011-05-23 27 views
8

¿Cómo puedo crear un archivo jar ofuscado? A partir de ahora puedo exportar fácilmente mi proyecto lib de Android a un jar y usarlo. ¿Cómo puedo ofuscar el archivo jar?¿Cómo crear un archivo jar ofuscado?

Mi objetivo final es permitir que otros usen mi lib.jar en sus proyectos. Solo quiero proteger el código tanto como pueda ... :)

Respuesta

15

Resulta que es posible y no es tan difícil. ¡Después de 3 horas de intentar, finalmente lo descubrí!

Android proporciona una interfaz gráfica de usuario Proguard conveniente en:

android-sdk \ tools \ Proguard

Uso de la interfaz gráfica de usuario que acaba de seleccionar el in.jar y la out.jar. Luego debe seleccionar android.jar y eliminar el valor predeterminado rt.jar.

Una vez hecho esto, debe seleccionar cuidadosamente las opciones de Reducción y Ofuscación.

Espero que de alguna manera u otra esto ayude!

+3

Reemplazar el rt.jar con android.jar definitivamente vale la pena mencionarlo. +1. – Dave

+0

Gracias por publicar esta respuesta. ¿Podría agregar cómo mantuvo las clases de la biblioteca para que estuvieran accesibles por favor? Después de importar (la carpeta libs, agregar a la ruta de compilación) la biblioteca ofuscada con clases como A.class, no se reconoce nada y estoy atascado en qué mantener exactamente, mientras sigo protegiendo el código – brandall

0

Si se trata de un contenedor externo, entonces si lo tienes en la carpeta "libs" y compila con, por ejemplo, Android 2.2+ SDK, usa automáticamente procure ofuscar a la apk. Si quiere este contenedor como una biblioteca y también lo ofusca antes de usarlo en su apk, puede que no sea posible. Si estás hablando de ofuscación apk que Android lo hace desde 2.2 en creo (con proguard), y no tienes que preocuparte por ello.

+0

Gracias por su comentario. De hecho, estoy buscando ofuscar el archivo lib.jar real. Flurry hace esto con su SDK lib. – Jona

+0

Ofuscación que jar puede ser tan simple como ejecutar proguard en él, usar ese jar ofuscado, en la apk de Android puede ser difícil. – omermuhammed

0

para habilitar Proguard para su proyecto, es muy fácil. http://developer.android.com/guide/developing/tools/proguard.html

Un error común que puede ocurrir es que los métodos no se encuentran cuando se utiliza la reflexión. Esto se debe a que la ofuscación elimina los nombres de los métodos y, a veces, incluso las clases completas. Si tiene vistas personalizadas, puede suceder lo mismo.

configura lo que las clases para mantener mediante el uso de la bandera "-keep" en proguard.cfg

aquí están algunas de las más comunes Esto es de una construcción Maven - pero el concepto es el mismo

-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.view.View { 
           public <init>(android.content.Context); 
           public <init>(android.content.Context, android.util.AttributeSet); 
           public <init>(android.content.Context, android.util.AttributeSet, int); 
           public void set*(...); 
-keepclasseswithmembers class * { 
           public <init> (android.content.Context, android.util.AttributeSet); } 
-keepclasseswithmembers class * { 
           public <init> (android.content.Context, android.util.AttributeSet, int); } 
-keepclassmembers class * implements android.os.Parcelable { 
           static android.os.Parcelable$Creator *; } 
-keepclassmembers class **.R$* { public static <fields>; } 
-keepclasseswithmembernames class * { native <methods>; } 
-keepclassmembers class * extends java.lang.Enum { 
           public static **[] values(); 
           public static ** valueOf(java.lang.String); } 
-keepclassmembers class * extends android.app.Activity{ 
           public void *(android.view.View); } 

un área bastante grande, pero espero que ayude ...

+0

Bueno, esto es para todo un proyecto de Android que ya tengo trabajando sin problemas. Solo quiero ofuscar un archivo jar con mi código. El contenedor está totalmente separado de un proyecto final. El contenedor contiene código de Android. Este contenedor está destinado a ser distribuido a otros desarrolladores. – Jona

0

Para crear un archivo jar ofuscado puede hacerlo agregando un archivo build.xml y haciendo cambios en su archivo proguard-project.txt y ejecutando un lanzamiento de la línea de comando y encontrará el archivo offuscated.jar debajo de Proguard carpeta en la carpeta bin del proyecto

Pasos

  • para agregar build.xml en su proyecto en Linux:

    abrir un terminal y vaya a/herramientas/pliegue hormiga androide er y ejecuta

    ./android update project -p /path_of_your_android_library_project 
    

    y encontrarás build.xml en el directorio raíz de tu proyecto.archivo

    En su editor de abrir un archivo project.properties y quite comentario de

    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
    
  • añadir sus cambios a PROGUARD-project.txt y en el terminal:

  • para permitir la ofuscación en su proyecto ir a su proyecto y ejecute

    ant release 
    
1

figurin g esto no fue fácil, pero una vez hecho esto, repitiendo los pasos no es tan difícil:

  • crear y construir su proyecto de biblioteca de Android como lo haría normalmente
  • crear un archivo proguard.cfg (la siguiente es una receta, pero contiene algunas partes importantes.

ejemplo proguard.cfg

# optimization passes will allow multiple tries to strip dead code 
# if it doesn't find anything on the 2nd pass, it won't do a 3rd. 
-optimizationpasses 5 

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 

# it would complain about my missing R stuff, and it does the right thing with this line 
-dontwarn com.mycompany.myproject.R* 

# the location of the pre-obfuscated .jar built by your project 
-injars bin/myproject.jar 

-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

# this will fake "dead-strip" calls to Log.v() & Log.d()  
-assumenosideeffects class android.util.Log { 
    public static int v(...); 
    public static int d(...); 
} 

# this will fake "dead-strip" calls to a more complex logging function i created 
-assumenosideeffects class com.mycompany.myproject.FirstPackageWithLogging { 
    private void LogR(...); 
} 

# this will fake "dead-strip" a function in which i check to see if the 
# USB-cable is connected and perform waitForDebugger(), since i don't want 
# those making use of my obfuscated library to have to wait for the debgger 
# when they won't be debugging my library 
-assumenosideeffects class com.mycompany.myproject.MyProject { 
    private void setupDebugging(); 
} 

# this will fake "dead-strip" a toast i use to measure focus 
-assumenosideeffects class com.mycompany.myproject.UXObserver { 
    private void toastFocus(); 
} 

# i don't want to obfuscate 3rd-party stuff, in case someone else 
# is using the same classes, and wants to just get mine via pass-through 
-keep class org.thirdparty.package.** 
-keep class com.licensedpackage.** 

# i want my API to be public, so i expose it 
-keep public class com.mycompany.myproject.MyAPI 

# almost all the rest are the suggestion of the proguard examples page 
-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 com.mycompany.myproject.MyAPI { 
    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 *; 
} 
  • en una línea de comandos (esto se orienta hacia Darwin, pero debe ser en su mayoría de la misma en las ventanas

...

$ java -jar $ANDROID_SDK/tools/proguard/lib/proguard.jar 
-libraryjars $ANDROID_SDK/platforms/android-18/android.jar @proguard.cfg 
-outjars ../MyReleaseSDK/libs/myproject.jar 

eso es todo. La salida contendrá su obfu archivo .jar escaqueado

desde ese punto, copio algunos elementos de mi proyecto (archivo .proyecto menos el constructor de herramientas externas para NDK; carpeta res, carpeta libs para mi código jni y project.properties y AndroidManifest.xml) en MyReleaseSDK, luego crea un .zip fuera de él. que .zip puede ser utilizado por otra persona como un proyecto de "importación" de Eclipse; creará una carpeta src vacía, generará los recursos correctamente y cualquiera que lo desee ahora puede usarla como un proyecto de biblioteca Android normal a pesar de estar ofuscado.

Cuestiones relacionadas