2011-09-18 36 views
40

我的應用程序有很多活動,也使用本地庫。使用Eclipse生成的默認ProGuard配置,ProGuard可以移除很多東西 - OnClick方法,靜態成員,我的本地庫使用的回調方法......是否有一種簡單方法可以指示ProGuard不從我的包中移除任何東西?刪除東西只能節省大約2.5%的應用程序大小,但完全破壞我的應用程序。在ProGuard配置中按類進行配置,測試和維護將會很痛苦。如何告訴ProGuard將所有物品放在特定的包裝中?

+2

你的意思是,例如,像根本沒有使用ProGuard? – mah

+5

不,我想混淆,我只是不想從我的包中刪除任何類和類成員。 – ggurov

+0

我有同樣的問題。這應該對你有所幫助。 http://stackoverflow.com/questions/6633411/android-proguard-only-obfuscation – Vinoth

回答

17

作爲最終結果,我發現只保留所有類成員是不夠的正確的申請工作,也沒有必要。我addded的設置文件這樣的:

-keepclasseswithmembers class * { 
    void onClick*(...); 
} 
-keepclasseswithmembers class * { 
    *** *Callback(...); 
} 

用的onClick *的情況是,我在android系統解決所有方法:的onClick屬性附加傷害爲.xml佈局文件(我開始對所有這些方法用的「onClick」的名字)。

*回調的情況是我從我的本地代碼(通過JNI)調用的所有回調方法。我爲每個這樣的方法的名稱放置了一個後綴「Callback」。從封裝類

-keep class com.myapp.mypackage.SomeMyClass { 
    *** position; 
} 

(與名稱「位置」一varible名爲「SomeMyClass」:

而且我加幾行對某些特殊情況下,與我從原生代碼中使用,如變量com.myapp.mypackage)

所有這些都是因爲這些onClick,回調等不僅必須存在,而且還要保留原來的名稱。 ProGuard的其他功能可以自由優化。

的情況下,與本地方法是很重要的,但是對於它有從Eclipse的文件中生成一個聲明:

-keepclasseswithmembernames class * { 
    native <methods>; 
} 
44

我認爲你需要至少是添加這些標誌(修改你個人的包名):

-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

此外,添加這些標誌:

-dontshrink 
-dontoptimize 
-dontpreverify 

這裏是我的整個配置文件:我的Proguard.cfg:

-dontshrink 
-dontoptimize 
-dontpreverify 
-verbose 

-dontwarn javax.management.** 
-dontwarn java.lang.management.** 
-dontwarn org.apache.log4j.** 
-dontwarn org.apache.commons.logging.** 
-dontwarn org.slf4j.** 
-dontwarn org.json.** 


-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class * extends android.app.backup.BackupAgentHelper 
-keep public class * extends android.preference.Preference 
-keep public class com.android.vending.licensing.ILicensingService 
-keep class javax.** { *; } 
-keep class org.** { *; } 
-keep class twitter4j.** { *; } 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembernames class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 


-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
+1

謝謝你,我從引用的選項中使用了「-dontshrink」。 – ggurov

+1

我的最終解決方案並沒有使用任何答案(查看我的最後一次編輯),因爲我的理解發展了,但無論如何,你應該得到我的讚賞,而且你擁有它 - 因爲答案對於最初的問題是好的。 – ggurov

+0

夠公平的。不管怎麼說,還是要謝謝你。 –

相關問題