【发布时间】:2016-01-11 18:51:36
【问题描述】:
我链接到我的应用程序的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的 APK 膨胀。
例如,包括 Google Play 服务库,但不使用登录按钮功能;所有这些图像和布局资源最终都会出现在我的最终构建中。
由于这些资源包含在已编译的库中,如何从构建中删除它们?
【问题讨论】:
标签: android performance gradle android-resources
我链接到我的应用程序的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的 APK 膨胀。
例如,包括 Google Play 服务库,但不使用登录按钮功能;所有这些图像和布局资源最终都会出现在我的最终构建中。
由于这些资源包含在已编译的库中,如何从构建中删除它们?
【问题讨论】:
标签: android performance gradle android-resources
这个答案是从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。它甚至可以分析 CSS、HTML 和 JavaScript 文件。
现在,这里可能会出现误报或漏报的情况。当您想要相反的行为时,资产可能会被削减或保留。 (公平地说,资源缩减往往过于急切......)要对此进行调整,您可以添加 tools:keep 和 tools: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,至少我们可以使用resConfig来移除我们不支持的语言。
defaultConfig {
resConfig "en"
}
【讨论】: