2017-03-16 62 views
4

我正在努力提高對使用ProGuard進行Android構建的理解。我不太確定究竟要保留什麼(不混淆)以及混淆什麼。ProGuard - 如何正確使用Android?要保留哪些類和庫?

夫婦的庫都在我的應用程序中使用,其中一些下面列出

com.android.support:appcompat 
com.android.support:design 
io.reactivex:rxandroid 
io.reactivex:rxjava 
com.jakewharton.rxbinding 
com.trello:rxlifecycle 

問題1:

我應該混淆上述圖書館?他們已經是開源..它會不會是明智的,讓所有支持庫使用ProGuard規則:

keep class android.support.** { *; }

類似的方式,我可以用io.reactivex和jakewharton庫做

問題2

除了支持和外部庫之外,我還有針對此應用程序編寫的應用程序特定類。可以保留AndroidManifest.xml中提及的類名,特別是它們的公共成員,並讓其餘代碼混淆。

讓我知道如果我錯過了某些東西或者我的理解不正確。只是重複一遍這不是一個問題,如何在技術上做到這一點,但更多的是在什麼包括和什麼排除混淆/優化/縮小..更具體的原因背後....肯定它會在咖啡測試之後建立。

回答

2

問題1:我應該混淆上面的庫嗎?

是的。如果您添加了-keep <library>規則,那麼整個庫將包含在您的APK中,這會使其膨脹並導致問題,例如使您的應用超出64k方法限制並需要Multidex。使用庫提供的ProGuard規則總是一個好主意。您通常可以在庫源代碼或網站(如https://github.com/krschultz/android-proguard-snippets)中找到.pro文件。

問題2:可以保留AndroidManifest.xml中提到的類名,特別是它們的公共成員,並讓其餘代碼混淆。

Android插件已經爲你做了。該插件掃描所有需要保留名稱的類(例如,Activities,Services,BroadcastReceivers,Views等),並且不會對其進行混淆。這包括您在AndroidManifest.xml中聲明的所有內容。

+0

謝謝,我忽略了ProGuard的縮小選項..同意我們可以參考相關網站的相應ProGuard配置..但Google Specific Libraries如何.i.e。 com.android.support:appcompat在那裏我們可以找到那些配置..關於你的答案爲特定於應用的代碼的問題2 ...你的意思是..我們不應該提供任何設置..對於我們自己的代碼..?在這種情況下..在AndroidManifest中提到的應用程序特定的代碼總是打開進行反編譯..? – Girish

+0

某些庫,即'com.android.support:appcompat',不需要顯式規則就可以與ProGuard一起使用,因爲Android Plugin指定的默認配置已經捕獲所有邊界案例(例如Views,Fragments),而其他庫(如'rxjava')可能需要明確的規則。它因案例而異,最好的辦法是查看每個庫的文檔以獲取有關ProGuard規則的章節。 –

+0

關於「我們自己的代碼」,Android插件中的默認配置已經指定了許多將應用於您的應用程序的規則。通過啓用「縮小」,ProGuard將盡可能地進行混淆處理。但是你對AndroidManifest是正確的..某些類/方法/字段不能被有效地混淆(例如'Activity.onCreate(Bundle)'將永遠被調用,因爲它是在外部調用的),所以你所做的一個動作是移動儘可能多儘可能將你的活動/片段/視圖中的代碼編入單獨的幫助對象,然後讓ProGuard對它們進行模糊處理:) –

相關問題