2015-10-13 48 views
61

我鏈接到我的應用程序的第三方庫通常包含未被我的應用程序使用的資源文件,因此最終導致我的APK膨脹。如何從Android上包含的第三方庫中刪除未使用的資源?

例如,包括Google Play服務庫,但未使用登錄按鈕功能;所有這些圖像和佈局資源都會在我的最終構建中結束。

由於這些資源包含在已編譯的庫中,因此如何從構建中刪除它們?

回答

69

這個答案是從Removing Unused Resources這也解釋瞭如何使用minifyEnabled和shrinkResources,這是在Official document page覆蓋更深入總結。

第三方庫包含應用程序代碼路徑未使用的資產是一個常見問題,爲了爲用戶生成更小的APK文件,刪除這些資產非常重要。謝天謝地,最新版本的Gradle和Android Studio提供了一個解決方案來幫助。

通過設置minifyEnabledshrinkResources到真正在你的搖籃配置,系統將出去,從你的應用程序刪除未使用的資源。

android { 
    ... 

    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
         'proguard-rules.pro' 
     } 
    } 
} 

重要的是要注意,刪除未使用的資源需要minifyEnabled標誌設置是非常重要的。此標誌(如Removing unused code中所述)將觸發ProGuard刪除未被應用程序使用的代碼路徑。這是從包含的庫中刪除資源的重要步驟。如果代碼路徑沒有被刪除,那麼編譯器仍然會認爲資源被現有代碼路徑引用,並且不會正確刪除它們。

值得注意的是,這是一個相當廣泛的系統。例如,它會查看代碼中特定的字符串常量,以及查找以file:///….形式保留的任何URL的各種res/raw資源。它甚至可以分析CSS,HTML和JavaScript文件。

現在,可能會出現假陽性或假陰性的情況。當你想要相反的行爲時,資產可能會被削減或保留。 (公平地說,資源收縮趨於過份...)爲了調整這一點,您可以添加工具:保留工具:放棄屬性以按照約定在res/raw/keep.xml文件中定義所需的行爲。

<resources xmlns:tools="http://schemas.android.com/tools" 
    tools:keep= "@layout/l_used*_c, @layout/l_used_b*" 
    tools:discard="@layout/unused2" 
/> 
+0

對於那些使用retrolambda的人 - 如果資源中引用了lambda表達式所使用的資源 - 資源將被刪除,因此它將制動構建。所以,現在shrinkResources必須設置爲false,即使對於發佈變體 – curioushikhov

+0

@Colt McAnlis是否也會刪除未使用的語言?我們可以在defaultConfig中使用resConfigs「en」來刪除未使用的語言。 –

8

如果您不能使用shrinkResources出於某些原因,在至少我們可以用resConfig刪除我們不支持的語言。

defaultConfig { 
    resConfig "en"  
} 
+1

即使您使用shrinkResources,也可以添加resConfig網絡來降低apk大小。 –

+0

添加resConfig會打破APK SPLITS ... – slott

相關問題