我的應用程序有很多活動,也使用本地庫。使用Eclipse生成的默認ProGuard配置,ProGuard可以移除很多東西 - OnClick方法,靜態成員,我的本地庫使用的回調方法......是否有一種簡單方法可以指示ProGuard不從我的包中移除任何東西?刪除東西只能節省大約2.5%的應用程序大小,但完全破壞我的應用程序。在ProGuard配置中按類進行配置,測試和維護將會很痛苦。如何告訴ProGuard將所有物品放在特定的包裝中?
40
A
回答
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. 如何告訴sbt-proguard包含java * .jars?
- 2. 如何刪除所有物料清單中的特定物品?
- 3. 如何告訴Proguard混淆特定的死代碼
- 4. vis時間線如何將特定物品放在圖表底部並且所有物品仍然對齊
- 5. 包裝物品
- 6. 如何將所有內容包裝在特定的高度?
- 7. 如何在包裝中顯示包裝物品
- 8. Android如何使用Proguard將我所有的課程放在一個包中
- 9. 我如何告訴NuGet,我不想從包裝中獲得特定的依賴?
- 10. 如何從一組物品中選擇特定物品?
- 11. 如何告訴節點使用特定的已安裝軟件包版本?
- 12. 有沒有辦法告訴maven在哪裏放置文物?
- 13. 如何告訴選擇的所有者?
- 14. 如何告訴一個特定的bean在所有其他bean後被銷燬
- 15. 如何獲取特定物品周圍的物品?
- 16. delphi - TRadioGroup與物品包裝
- 17. Flexbox目標包裝物品
- 18. 如何僅在包裝面板中水平放置兩件物品?
- 19. 如何告訴ProGuard保持私有字段沒有指定每個字段
- 20. 將物品包裝成固定數量的箱子
- 21. 如何告訴cxf保持方法中的包裝類型?
- 22. 如何告訴特定的Delayed :: Job在控制檯中運行?
- 23. 如何告訴Eclipse爲所有項目包含標準.jar庫
- 24. Proguard:將課程保留在特定的包中
- 25. 如何將一個物品放在android的另一個物品後面?
- 26. SimpleCartJS - 如何獲取購物車中的所有物品?
- 27. HTML - 拖放 - 將物品移回特定地點
- 28. 我可以告訴python將現有人物放入新圖中嗎?
- 29. Cargo.toml有沒有貨物告訴rustc包含插件?
- 30. Extjs將物品動態包裝在容器中
你的意思是,例如,像根本沒有使用ProGuard? – mah
不,我想混淆,我只是不想從我的包中刪除任何類和類成員。 – ggurov
我有同樣的問題。這應該對你有所幫助。 http://stackoverflow.com/questions/6633411/android-proguard-only-obfuscation – Vinoth