Como usar o ProGuard no Android Studio?

98

Este é meu primeiro projeto no Android Studio, e o código dos meus aplicativos não está ofuscado. Estou usando esta configuração no arquivo build.gradle: insira a descrição da imagem aqui

Estou usando Build> Generate Signed APK ... com Run Proguard marcado. E, quando testei usando o Apk_OneClick.v4.2, meu código ficou completamente fácil de ler:

insira a descrição da imagem aqui

Por favor me ajude. :(

Felipe Porge Xavier
fonte
mostre suas regras de programa definidas no arquivo de texto para código de ofuscação.
pyus13
Como verificar se o aplicativo está ofuscado ou não?
VVB
@VVB pelo arquivo APK de engenharia reversa, eu acho: D
hotHead

Respostas:

71

Provavelmente, você não está realmente assinando a versão de lançamento do APK por meio do assistente de assinatura. Você pode criar o APK de lançamento a partir da linha de comando com o comando:

./gradlew assembleRelease

ou você pode escolher a variante de lançamento na visualização Build Variants e criá-la a partir da GUI:

Janela principal do IDE mostrando variantes de compilação

Scott Barta
fonte
Ótimo! Eu testei alterando o debug para runProguard true e funciona perfeitamente. Agora li sua resposta e funciona !!!! Grande homem! Obrigado.
Felipe Porge Xavier
Opa, eu acidentalmente coloquei "assembleDebug" em vez de "assembleRelease" nas minhas instruções de linha de comando. Eu fixei minha resposta.
Scott Barta
Qual é o caminho do arquivo .apk que é exportado via linha de comando?
Shajeel Afzal
50

Você pode configurar seu arquivo build.gradle para implementação do Proguard. Pode ser no nível do módulo ou no nível do projeto.

 buildTypes {

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

    }

}

A configuração mostrada é para o nível de depuração, mas você pode escrever seus próprios tipos de compilação, como mostrado abaixo dentro de buildTypes:

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

É melhor ter seu debug com um minifyEnabled falsebuild de produção e outros builds como minifyEnabled true.

Copie seu arquivo proguard-rules.txt na raiz de seu módulo ou pasta de projeto como

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

Você pode alterar o nome do arquivo como desejar. Após a configuração, use uma das três opções disponíveis para gerar sua construção de acordo com o buildType

  1. Vá para a tarefa gradle no painel direito e pesquise as assembleRelease/assemble(#your_defined_buildtype)tarefas do módulo

  2. Vá para Build variant no painel esquerdo e selecione a build no menu suspenso

  3. Vá para o diretório raiz do projeto no File Explorer e abra cmd / terminal e execute

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

janelas gradlew assembleRelease or assemble(#your_defined_buildtype)

Você pode encontrar o apk em seu diretório de módulo / compilação.

Mais sobre a configuração e localização dos arquivos proguard está disponível no link

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

pyus13
fonte
Onde posso dizer para usar o myproductionbuild?
Felipe Porge Xavier
sim, você está correto :) você pode ver o mesmo na guia Variante de construção no painel do lado esquerdo.
pyus13
Mas o apk não tem ofuscação ... :(
Felipe Porge Xavier
você escreveu a configuração em proguard-rule.txt veja alguns exemplos aqui proguard.sourceforge.net/index.html#manual/examples.html
pyus13
Estou tendo o método runProguard () do Gradle DSL não encontrado.
SleepNot
41

NB: Agora em vez de

runProguard false

você precisará usar

minifyEnabled false
ViliusK
fonte
5
acho que deveria ser definido como verdadeiro
anna_manzhula
1

Tente renomear seu arquivo 'proguard-rules.txt' para 'proguard-android.txt' e remova a referência a 'proguard-rules.txt' em seu arquivo gradle. A getDefaultProguardFile(...)chamada faz referência a um arquivo Proguard padrão diferente, fornecido pelo Google e não o do seu projeto. Portanto, remova isso também, para que aqui o arquivo gradle leia:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}
SK9
fonte
Não trabalhe para mim. Coloquei meu proguard-android.txt personalizado no mesmo diretório de proguard-rules.txt, mas nada mudou em meu código.
Felipe Porge Xavier
0

As outras respostas aqui são ótimas referências sobre o uso do Proguard. No entanto, não vi um problema discutido que eu encontrei que fosse um dobrador de mente. Depois de gerar um .apk de liberação assinado, ele é colocado na /releasepasta do seu aplicativo, mas meu aplicativo tinha um apk que não estava na /releasepasta. Conseqüentemente, passei horas descompilando o apk errado me perguntando por que minhas alterações no programa não estavam tendo efeito. Espero que isso ajude alguém!

mikeLundquist
fonte
0

Aqui estão algumas das regras mais comuns do Proguard que você precisa adicionar no arquivo proguard-rules.pro no Android Sutdio.

Faca de manteiga

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

Retrofit

 -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.** { *; }

Ofuscação de código

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