2017-08-16 23 views
5

我有一個proguard-rules.pro文件爲app模塊只包含以下內容的Android項目:我如何教導ProGuard擺脫一些它保持不被使用的東西?

# ProGuard rules 
-dontobfuscate 
-dontwarn android.arch.util.paging.CountedDataSource 
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource 

我沒有任何保留自己。所有-keep規則都來自其他內容,無論是由getDefaultProguardFile('proguard-android-optimize.txt')提供的規則還是來自庫中包裝的規則。

但是,東西被保留,我不使用。如果我在我的release版本上使用Android Studio APK分析器,而ProGuard刪除了許多刪除的內容,但我還沒有引用其他很多內容。

例如:通過傳遞依賴關係,我有支持庫模塊,該應用程序的依賴關係樹中包含ViewPager。但是,我沒有(目前)在此應用程序中使用ViewPager。儘管如此,還是有一些東西導致它被保留下來,因爲APK Analyzer爲android.support.v4.view.ViewPager顯示了107個已定義的方法,包括其構造函數。

我可以使用各種ProGuard選項來追蹤爲什麼這樣被保留。但是,這不是來自我的規則。沒有我自己的-keep需要修復— -keep來自其他人,大概是Google工程師。

那麼,我該如何擺脫ViewPager?有沒有一種方法可以覆蓋導致其保留的-keep規則(例如,使用allowshrinking)?如果是這樣,那麼Android Studio調用的ProGuard如何確定哪一個規則獲勝?

回答

2

ViewPager類不保存在我剛剛檢查過的小應用程序中,所以它必須是其他代碼或其他規則。

你可以讓ProGuard的打印輸出觸發ViewPager鏈開始保持:

-whyareyoukeeping class android.support.v4.view.ViewPager 

您可能需要重複此多次爲各種類和方法去的根本原因。 ProGuard不打印出哪個規則完全負責 - 當然,這將是一個有用的功能。

然後,您可以查找包含匹配規則的build/intermediates/exploded-aar中的proguard.txt文件。

至於在該點的解決方案:

  • 不可能重寫-keep規則;他們只積累。
  • 據我所知,Android Gradle插件也不支持在庫中禁用過於保守的proguard.txt文件,因此您需要使用更新後的規則創建自定義.aar文件,或向開發者發送建議的圖書館。
+0

「不可能重寫-keep規則;它們只會累積」 - * *將是一個有用的功能,儘管我可以理解哪些地方可能會有趣的實現。我沒有'build/intermediates/exploded-aar /',但我認爲你所指的規則在'build/intermediates/proguard-rules/release/aapt_rules.txt'中。現在我更好地理解爲什麼要保留'ViewPager'。非常感謝! – CommonsWare

相關問題