如何从Android上包含的第三方库中删除未使用的资源?

我链接到我的应用程序的第三方库通常包括不被我的应用程序使用的资源文件,因此,最终会膨胀我的APK。

例如,包括Google Play服务库,但不使用loginbuttonfunction; 所有这些图像和布局资源都会在我的最终构build中结束。

由于这些资源被包含在一个编译的库中,我怎样才能从我的构build中删除它们?

从“ 删除未使用的资源”中可以总结出这个答案,它解释了如何使用minifyEnabled和shrinkResources,这在官方文档页面中有更深入的介绍 。

对于第三方库来说,包含应用程序代码path不使用的资源是一个常见问题,为了为用户生成更小的APK文件,删除这些资源非常重要。 谢天谢地,Gradle和Android Studio的最新版本提供了一个解决scheme。

通过在您的Gradleconfiguration中将minifyEnabledshrinkResources设置为true,系统将从您的应用程序中去除未使用的资源。

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

注意删除未使用的资源需要设置minifyEnabled标志是很重要的。 此标志(如“ 删除未使用的代码”中所述 )将触发ProGuard删除未被应用程序使用的代码path。 这是从包含的图书馆中删除资源的重要一步。 如果代码path没有被删除,那么编译器仍然会相信这些资源被现有的代码path引用,并且不会被正确删除。

值得注意的是这是一个相当广泛的系统。 例如,它将查看代码中特定的string常量,以及以file:///….forms查找任何URL的各种res / raw资源file:///…. 保持。 甚至可以分析CSS,HTML和JavaScript文件。

现在,这里可能会出现误报或漏报。 当你想要相反的行为时,资产可能会被削减或保留下来。 (公平地说,资源的缩减往往是过度的…)为了调整这个,你可以添加工具:keeptools:discard属性来定义所需的行为,按照惯例在一个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" /> 

如果由于某些原因无法使用shrinkResources ,至less我们可以使用resConfig来删除我们不支持的语言。

 defaultConfig { resConfig "en" }