2012-08-24 21 views
10

Używam najnowszego zestawu SDK systemu Android (4.1) i próbowałem wyeksportować podpisany plik jar z włączoną opcją Proguard. Jednak po dekompilacji zoptymalizowanego pliku APK zauważyłem, że metody, które oczekiwałbym, że zostaną wstawione, nie były.Android Proguard nie jest wbudowany

Wiem, że Proguard działał, ponieważ kod został poprawnie zaciemniony. Tak, aby to potwierdzić, dodałem tę metodę do mojego działalność:

private void testInlining() 
{ 
    mConfig = null; 
} 

Ta prywatna metoda jest wywoływana tylko raz w mojej działalności, a ponieważ jest prywatny, powinno być oczywiste dla optymalizatora, że ​​jest ona wywołana tylko raz i to powinno być zaznaczone.

Dokumentacja mówi, że wszystkie optymalizacje są domyślnie włączone, a Proguard "Metody śródliniowe, które są krótkie lub wywoływane tylko raz".

Czy istnieje konkretna flaga, którą powinienem dać Proguard, aby umożliwić wstawianie?

EDIT

Mój plik konfiguracyjny PROGUARD zawiera

-optimizationpasses 5 
-allowaccessmodification 
-overloadaggressively 
-repackageclasses '' 
-dontskipnonpubliclibraryclasses 

EDIT

Po użyciu

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;} 

pojawia się powód, dla którego metoda ta nie jest inlined:

[proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21) 
[proguard] is invoked by com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15) 
[proguard] implements  com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig() 
[proguard] is invoked by com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175) 
[proguard] implements  android.app.Activity: void onCreate(android.os.Bundle) 
[proguard] is a library method. 

Ale nie jestem pewien, w jaki sposób fakt, że metoda testInlining jest stosowany w metodzie getIvConfig który jest z kolei używany przez inną metodą zapobiega wstawianiu na testInlining w testInlining w testInlining.

+0

Próbowałeś tego? -optimizationpasses 5 Więcej na http://stackoverflow.com/questions/5068251/android-what-are-the-recommended-configurations-for-proguard?rq=1 – user1154664

+0

Gdyby rzeczywiście w stanie uzyskać ProGuard wykonać wywołanie metody inline? Korzystając z proguard-android-optimize.txt i pisząc prostą prywatną metodę, która zwraca int, nie mogłem zobaczyć, jak działa: http://paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3 – brAzzi64

Odpowiedz

15

Ten ostatni Android SDK wyłącza wszystkie optymalizacje domyślnie, patrz $ {sdk.dir} /tools/proguard/proguard-android.txt:

-dontoptimize 

Konfiguracja alternatywna optymalizacji wyłącza tylko kilka optymalizacji, zobacz $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt:

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

można określić preferowany plik konfiguracyjny w project.properties.

Możesz sprawdzić, która kompletna konfiguracja ProGuard używa, dodając opcję -printconfiguration.

Niektóre optymalizacje zostały wyłączone, aby uniknąć błędów w starszych wersjach Dalvik VM (! Kod/uproszczenie/arytmetyczne,! Kod/uproszczenie/rzutowanie), a niektóre optymalizacje mogły zostać wyłączone, aby uniknąć błędów w starszych wersjach ProGuarda (! field/*,! class/merging/*).

Należy pamiętać, że -whyareyoukeeping odnosi się do etapu kurczenia, który usuwa niepotrzebne klasy/pola/metody jako całość. Metody, które nie zostały usunięte, mogą być zaznaczone na etapie optymalizacji (chyba że wyraźnie określono inaczej w przypadku -keep).

+0

To ma sens, nie wiedziałem, że Domyślnie Google wyłącza optymalizacje. Wielkie dzięki, spróbuję, aby daccept odpowiedź, jeśli to naprawi. –

1

w module za build.gradle pliku, należy spojrzeć na:

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

i zastąpić proguard-android.txt z proguard-android-optimize.txt, który nie obejmuje linię -dontoptimize zachowując problemy Dalvik dala (patrz odpowiedź Erica Lafortune za) .