Jak korzystać z ProGuard w Android Studio?

98

To mój pierwszy projekt w Android Studio, a kod moich aplikacji nie jest zaciemniony. Używam tej konfiguracji w pliku build.gradle: wprowadź opis obrazu tutaj

Używam kompilacji> Generuj podpisany plik APK ... z zaznaczonym Run Proguard. A kiedy testowałem przy użyciu Apk_OneClick.v4.2, mój kod jest całkowicie łatwy do odczytania:

wprowadź opis obrazu tutaj

Proszę pomóż mi. :(

Felipe Porge Xavier
źródło
pokaż reguły proguard zdefiniowane w pliku tekstowym dla zaciemnionego kodu.
pyus13
Jak sprawdzić, czy aplikacja jest zaciemniona, czy nie?
VVB,
@VVB przez odwrotną inżynierię plik APK, jak sądzę: D
hotHead

Odpowiedzi:

71

Prawdopodobnie nie podpisujesz wersji wydania pakietu APK za pomocą kreatora podpisywania. Możesz zbudować pakiet APK wydania z wiersza poleceń za pomocą polecenia:

./gradlew assembleRelease

lub możesz wybrać wariant wydania z widoku Warianty kompilacji i zbudować go z GUI:

Główne okno IDE pokazujące warianty kompilacji

Scott Barta
źródło
Wspaniały! Przetestowałem, zmieniając debug na runProguard, prawda i działa idealnie. Teraz czytam twoją odpowiedź i działa !!!! Wielki człowiek! Dziękuję Ci.
Felipe Porge Xavier
Ups, przypadkowo umieściłem „assembleDebug” zamiast „assembleRelease” w moich instrukcjach wiersza polecenia. Poprawiłem odpowiedź.
Scott Barta
Jaka jest ścieżka do pliku .apk eksportowanego za pomocą wiersza poleceń?
Shajeel Afzal
50

Możesz skonfigurować plik build.gradle pod kątem implementacji programu Proguard. Może to być na poziomie modułu lub na poziomie projektu.

 buildTypes {

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

    }

}

Pokazana konfiguracja dotyczy poziomu debugowania, ale możesz napisać własne style kompilacji, jak pokazano poniżej w buildTypes:

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

Lepiej jest mieć debugowanie, minifyEnabled falsekompilację produkcyjną i inne kompilacje jako minifyEnabled true.

Skopiuj plik proguard-rules.txt do katalogu głównego modułu lub folderu projektu, takiego jak

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

Możesz zmienić nazwę pliku, jak chcesz. Po skonfigurowaniu użyj jednej z trzech dostępnych opcji, aby wygenerować kompilację zgodnie z typem buildType

  1. Przejdź do zadania oceny w prawym panelu i wyszukaj assembleRelease/assemble(#your_defined_buildtype)zadania pod modułami

  2. Przejdź do opcji Build Variant w lewym panelu i wybierz kompilację z listy rozwijanej

  3. Przejdź do katalogu głównego projektu w Eksploratorze plików i otwórz cmd / terminal i uruchom

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

Windows gradlew assembleRelease or assemble(#your_defined_buildtype)

Możesz znaleźć apk w katalogu module / build.

Więcej o konfiguracji i lokalizacji plików proguard można znaleźć pod linkiem

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

pyus13
źródło
Gdzie mogę powiedzieć, aby użyć mojej konstrukcji produkcyjnej?
Felipe Porge Xavier
tak, masz rację :) możesz zobaczyć to samo w zakładce Wariant kompilacji na lewym panelu bocznym.
pyus13
Ale apk nie ma zaciemniania ... :(
Felipe Porge Xavier
czy zapisałeś konfigurację w proguard-rule.txt zobacz kilka przykładów tutaj proguard.sourceforge.net/index.html#manual/examples.html
pyus13
Nie znaleziono metody Gradle DSL runProguard ().
SleepNot
41

NB .: Teraz zamiast

runProguard false

będziesz musiał użyć

minifyEnabled false
ViliusK
źródło
5
zgaduję, że powinno być
ustawione
1

Spróbuj zmienić nazwę pliku „proguard-rules.txt” na „proguard-android.txt” i usuń odniesienie do „proguard-rules.txt” w pliku gradle. getDefaultProguardFile(...)Wywołanie odwołuje inny domyślny plik PROGUARD, jeden udostępnianej przez Google, a nie, że w swoim projekcie. Więc usuń to również, aby tutaj plik gradle brzmiał:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}
SK9
źródło
Nie pracuj dla mnie. Umieściłem mój niestandardowy proguard-android.txt w tym samym katalogu przez proguard-rules.txt, ale nic się nie zmieniło w moim kodzie.
Felipe Porge Xavier
0

Pozostałe odpowiedzi to świetne odniesienia do korzystania z proguard. Jednak nie widziałem omawianego problemu, na który natknąłem się, że był to głupek. Po wygenerowaniu podpisanej wersji .apk jest ona umieszczana w /releasefolderze w Twojej aplikacji, ale moja aplikacja miała plik APK, którego nie było w /releasefolderze. Dlatego spędziłem godziny na dekompilowaniu niewłaściwego apk, zastanawiając się, dlaczego moje zmiany proguard nie mają żadnego wpływu. Mam nadzieję, że to komuś pomoże!

mikeLundquist
źródło
0

Oto niektóre z najczęściej używanych reguł Proguard, które należy dodać w pliku proguard-rules.pro w systemie Android Sutdio.

Nóż do masła

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

Modernizacja

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

Maskowanie kodu

-keepclassmembers class com.yourname.models** { <fields>; }
Bhavik Nathani
źródło