2014-10-21 15 views
20

Mam problem z tym, że Proguard usuwa metody mojego APK do debugowania (muszę uruchomić proguard na debugowanie, ponieważ limit pliku dex metody), nawet jeśli są one używane w testowym pakiecie APK. Na przykład. Używam metody GSON addProeprty w teście jednostki, ale nie w apk aplikacji. Ta metoda zostaje usunięta i powoduje niepowodzenie testu. Ale nie chcę skonfigurować proguard, aby zachować cały GSOn ze względu na limit plików dex, ale nie chcę też osobno wymieniać wszystkich metod. czy istnieje sposób, aby rpguard mógł uznać testy jednostkowe za punkty wejściowe kodu źródłowego?Testy urządzenia Android z proguard włączone

Odpowiedz

1

Rozwiązałem ten problem w mojej kompilacji, wprowadzając dodatkowe "dev" buildType, w którym włączam proguard, ale konfiguruję go tak, aby zachować cały kod w moim własnym pakiecie, oraz kilka konkretnych klas bibliotek, z których zdarza się korzystać tylko testy. Wyłączam również zaciemnianie w dev buildType, aby można było debugować z IDE.

Do kompilacji debugowania i wydania używam moich "prawdziwych" ustawień proguardów, w tym zaciemniania i optymalizacji.

+0

Czy możesz udostępnić podobny plik proguard? –

+0

Dziękuję, to powinno zadziałać. Mamy jednak kilka smaków i modułów, a posiadanie innego typu dla wszystkich to rodzaj bałaganu. Niestandardowe reguły proguarda z drugiej odpowiedzi pomogły. – Gaket

3

Testy oprzyrządowania (i inne?) Nie używają tego samego pliku proguard co plik debug/release apk. Możesz spróbować ustawić opcję testProguardFile w blokach debugowania i zwalniania. Ten specyficzny dla testu plik proguard może być bardzo permisywny, ponieważ nie jest używany w aplikacjach debug/release.

25

Oto co zrobiłem.

Dodaj niestandardowy plik reguł proguard.

/project/app/proguard-test-rules.pro

# Proguard rules that are applied to your test apk/code. 
-ignorewarnings 

-keepattributes *Annotation* 

-dontnote junit.framework.** 
-dontnote junit.runner.** 

-dontwarn android.test.** 
-dontwarn android.support.test.** 
-dontwarn org.junit.** 
-dontwarn org.hamcrest.** 
-dontwarn com.squareup.javawriter.JavaWriter 
# Uncomment this if you use Mockito 
#-dontwarn org.mockito.** 

dodawania następujących do build.gradle dla swojej aplikacji. Aby użyć pliku proguard podczas testowania.

/project/app/build.gradle

android { 
    debug { 
     minifyEnabled true 
     testProguardFile 'proguard-test-rules.pro' 
    } 
} 
+3

jesteś sir, są niesamowite! – spy

+2

Brakowało mi "testu" w testProguardFile przy pierwszym użyciu tego rozwiązania, dzięki! –

+0

to powinna być zaakceptowana odpowiedź. – Gaket

5

Żadna z powyższych odpowiedzi wystarczyły dla mnie. Miałem dwa problemy: musiałem również użyć domyślnego pliku proguard do testowania, a mój domyślny plik proguard był nieprawidłowy.

  1. Aby korzystać z domyślnego pliku PROGUARD, oprócz własnych:

    android { 
        debug { 
         minifyEnabled true 
         testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project-test.pro' 
        } 
    } 
    
  2. Domyślną PROGUARD (i wszystkich folderze tools/proguard) jest widocznie not replaced by default podczas aktualizacji narzędzia SDK poprzez Studio Androida. Moja maszyna używała przestarzałego pliku konfiguracyjnego, który powodował dziwne problemy z progamowaniem. Aby zaktualizować domyślną konfigurację proguard, zamień ~/Library/Android/Sdk/tools/proguard/proguard-android.txt na this.

+0

Właśnie rozmawialiśmy o drugim numerze. Myślę, że warto wspomnieć, że od wersji 2.2.0 dodatku do androida dla gradle, 'proguard-android.txt' nie jest już używane i zamiast tego reguły domyślne są generowane w czasie kompilacji. Źródło: [wtyczka do systemu Android w wersji Gradle, wersja 2.2.0] (https://developer.android.com/studio/releases/gradle-plugin.html) – aProperFox

Powiązane problemy