簡體   English   中英

使用proguard for Android刪除未使用的類

[英]remove unused classes with proguard for Android

歷史/上下文我有一個項目[1],其中大小真的很重要 - 最近我把東西移到共享庫[2]並認為proguard會小心並刪除未使用的類,因為我有一個配置,大大減小了大小,但是使用lib我來到了神奇的100kb標記,所以我調查了:我沒有使用的類肯定是​​在生成的dex文件中 - 甚至是全名(不縮寫為單字符) - 例如我在中看到了SquareView我沒有在App中使用的dex。

問題令人驚訝的是,我在proguard文檔中發現了以下內容:

The library jars themselves always remain unchanged. 

我可以以某種方式告訴/欺騙proguard(in)來處理它們嗎? 我覺得這很奇怪,特別是因為我希望在lib中可以刪除比在App本身中更多的東西。

[1] https://github.com/ligi/FAST [2] https://github.com/ligi/AndroidHelper

Android SDK中的Eclipse / Ant / Gradle構建過程使用選項-injars自動指定您的代碼(來自bin/classes )及其庫(來自libs )。 這意味着整個應用程序被壓縮,優化和混淆(在發布版本中,假設啟用了ProGuard)。

構建過程僅使用選項-libraryjars指定Android運行時android.jar 有必要處理代碼,但它不應該在已處理的apk中結束,因為它已經存在於設備上。

所以它應該全部自動解決。 如果你的配置proguard-project.txt包含像-keep class org.mylibrary.** { *; }這樣的行,你仍然可以在處理過的apks中看到整個庫的原始名稱-keep class org.mylibrary.** { *; } -keep class org.mylibrary.** { *; } 這種配置通常是考慮反射的保守解決方案。 通過一些研究和實驗,您通常可以優化配置並獲得更好的結果。 您可以通過選項-whyareyoukeeping來確定為什么要保留-whyareyoukeeping

我相信你必須使用-injars

-injars class_path指定要處理的應用程序的輸入jar(或戰爭,耳朵,拉鏈或目錄)。 這些jar中的類文件將被處理並寫入輸出jar。 默認情況下,將復制任何非類文件而不進行更改。 請注意任何臨時文件(例如由IDE創建),特別是如果您直接從目錄中讀取輸入文件。 可以過濾類路徑中的條目,如過濾器部分中所述。 為了更好的可讀性,可以使用多個-injars選項指定類路徑條目。

資料來源: http //proguard.sourceforge.net/index.html#manual/usage.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM