¿Cómo usar ProGuard en Android Studio?

98

Este es mi primer proyecto en Android Studio, y el código de mis aplicaciones no está ofuscado. Estoy usando esta configuración en el archivo build.gradle: ingrese la descripción de la imagen aquí

Estoy usando Build> Generate Signed APK ... con Run Proguard marcado. Y, cuando probé usando Apk_OneClick.v4.2, mi código es completamente fácil de leer:

ingrese la descripción de la imagen aquí

Por favor, ayúdame. :(

Felipe Porge Xavier
fuente
muestre sus reglas proguard definidas en el archivo de texto para ofuscar el código.
pyus13
¿Cómo comprobar si la aplicación está ofuscada o no?
VVB
@VVB por archivo APK de ingeniería inversa supongo: D
hotHead

Respuestas:

71

Probablemente no esté firmando la versión de lanzamiento del APK a través del asistente de firma. Puede compilar el APK de lanzamiento desde la línea de comando con el comando:

./gradlew assembleRelease

o puede elegir la variante de lanzamiento desde la vista Build Variants y compilarla desde la GUI:

Ventana principal de IDE que muestra variantes de compilación

Scott Barta
fuente
¡Excelente! He probado cambiar la depuración a runProguard true y funciona perfectamente. Ahora leo tu respuesta, y funciona !!!! ¡Gran hombre! Gracias.
Felipe Porge Xavier
Vaya, accidentalmente puse "assembleDebug" en lugar de "assembleRelease" en las instrucciones de la línea de comandos. Arreglé mi respuesta.
Scott Barta
¿Cuál es la ruta del archivo .apk que se exporta a través de la línea de comando?
Shajeel Afzal
50

Puede configurar su archivo build.gradle para la implementación de proguard. Puede ser a nivel de módulo o de proyecto.

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }

}

La configuración que se muestra es para el nivel de depuración, pero puede escribir sus propios tipos de compilación como se muestra a continuación dentro de buildTypes:

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

Es mejor tener su depuración con minifyEnabled falsey productionbuild y otras compilaciones como minifyEnabled true.

Copie su archivo proguard-rules.txt en la raíz de su módulo o carpeta de proyecto como

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

Puede cambiar el nombre de su archivo como desee. Después de la configuración, use una de las tres opciones disponibles para generar su compilación según el buildType

  1. Vaya a la tarea de Gradle en el panel derecho y busque assembleRelease/assemble(#your_defined_buildtype)en las tareas del módulo

  2. Vaya a Compilar variante en el Panel izquierdo y seleccione la compilación del menú desplegable

  3. Vaya al directorio raíz del proyecto en el Explorador de archivos y abra cmd / terminal y ejecute

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

Ventanas gradlew assembleRelease or assemble(#your_defined_buildtype)

Puede encontrar apk en el directorio de su módulo / compilación.

Más sobre la configuración y la ubicación de los archivos proguard está disponible en el enlace

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard

pyus13
fuente
¿Dónde puedo decir que use myproductionbuild?
Felipe Porge Xavier
ya, tienes razón :) puedes ver lo mismo en la pestaña de compilación Variant en el panel lateral izquierdo.
pyus13
Pero apk no tiene ofuscar ... :(
Felipe Porge Xavier
¿Ha escrito la configuración en proguard-rule.txt? Vea algunos ejemplos aquí proguard.sourceforge.net/index.html#manual/examples.html
pyus13
Tengo el método Gradle DSL runProguard () no encontrado.
SleepNot
41

NB .: Ahora en lugar de

runProguard false

necesitarás usar

minifyEnabled false
ViliusK
fuente
5
supongo que debería establecerse en verdadero
anna_manzhula
1

Intente cambiar el nombre de su archivo 'proguard-rules.txt' a 'proguard-android.txt' y elimine la referencia a 'proguard-rules.txt' en su archivo gradle. La getDefaultProguardFile(...)llamada hace referencia a un archivo proguard predeterminado diferente, uno proporcionado por Google y no en su proyecto. Así que elimine esto también, para que aquí el archivo gradle diga:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}
SK9
fuente
No trabajes para mi. Puse mi proguard-android.txt personalizado en el mismo directorio que proguard-rules.txt, pero nada ha cambiado en mi código.
Felipe Porge Xavier
0

Las otras respuestas aquí son excelentes referencias sobre el uso de proguard. Sin embargo, no he visto un tema discutido con el que me encontré que fue un alucinante. Después de generar una versión .apk firmada, se coloca en la /releasecarpeta de su aplicación, pero mi aplicación tenía una apk que no estaba en la /releasecarpeta. Por lo tanto, pasé horas descompilando la aplicación incorrecta preguntándome por qué mis cambios de proguard no tenían ningún efecto. ¡Espero que esto ayude a alguien!

mikeLundquist
fuente
0

Estas son algunas de las reglas de Proguard más comunes que debe agregar en el archivo proguard-rules.pro en Android Sutdio.

Cuchillo de mantequilla

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

Modernización

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp3

 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class sun.misc.Unsafe { *; }
 -dontwarn java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

Ofuscación de código

-keepclassmembers class com.yourname.models** { <fields>; }
Bhavik Nathani
fuente