我链接到我的应用程序的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的APK膨胀。
例如,包括Google Play服务库,但不使用登录按钮功能;所有这些图像和布局资源最终都在我的最终版本中。
由于这些资源包含在已编译的库中,如何从构建中删除它们?
答案 0 :(得分:71)
此答案摘自Removing Unused Resources,其中解释了如何使用minifyEnabled和shrinkResources,Official document page更详细地介绍了这些内容。
第三方库包含应用程序代码路径不使用的资产是一个常见问题,删除这些资产以便为用户生成较小的APK文件至关重要。值得庆幸的是,最新版本的Gradle和Android Studio提供了一个帮助解决方案。
通过在Gradle配置中将 minifyEnabled 和 shrinkResources 设置为true,系统将从您的应用程序中删除未使用的资源。
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"
/>
答案 1 :(得分:8)
如果由于某些原因无法使用shrinkResources
,至少我们可以使用resConfig
删除我们不支持的语言。
defaultConfig {
resConfig "en"
}