如何从已包含在 Android 中的第三方库中删除未使用的资源?
How do I remove unused resources from third-party libraries I’ve included on Android?
我 link 到我的应用程序中的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的 APK 膨胀。
例如,包括 Google Play 服务库,但不使用登录按钮功能;所有这些图像和布局资源最终都出现在我的最终版本中。
由于这些资源包含在已编译的库中,我如何才能将它们从我的构建中删除?
This answer is summarized from Removing Unused Resources which explains how to use minifyEnabled and shrinkResources, which are covered in more depth at the 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 删除应用程序未使用的代码路径。这是从包含的库中删除资源的重要步骤。如果不删除代码路径,编译器仍会认为资源被现有代码路径引用,并且不会正确删除它们。
值得注意的是,这是一个相当广泛的系统。例如,它将查看您代码中的特定字符串常量,以及各种 res/raw 资源,以查找 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"
}
这是给 Kotlin DSL (build.gradle.kts) 的。
我正在使用 Gradle 7.4.2 和 Android Gradle 插件 (AGP) 7.0.4。
注意 proguard-android-optimize.txt
优化更多:
android {
defaultConfig {
resourceConfigurations += setOf("en", "fa") // Only keep English and Farsi
// ...
}
buildTypes {
release {
isShrinkResources = true
isMinifyEnabled = true
signingConfig = signingConfigs["MySigningConfig"]
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
有关详细信息,请参阅 Android Developers: Shrink, obfuscate, and optimize your app。
我 link 到我的应用程序中的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的 APK 膨胀。
例如,包括 Google Play 服务库,但不使用登录按钮功能;所有这些图像和布局资源最终都出现在我的最终版本中。
由于这些资源包含在已编译的库中,我如何才能将它们从我的构建中删除?
This answer is summarized from Removing Unused Resources which explains how to use minifyEnabled and shrinkResources, which are covered in more depth at the 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 删除应用程序未使用的代码路径。这是从包含的库中删除资源的重要步骤。如果不删除代码路径,编译器仍会认为资源被现有代码路径引用,并且不会正确删除它们。
值得注意的是,这是一个相当广泛的系统。例如,它将查看您代码中的特定字符串常量,以及各种 res/raw 资源,以查找 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"
}
这是给 Kotlin DSL (build.gradle.kts) 的。
我正在使用 Gradle 7.4.2 和 Android Gradle 插件 (AGP) 7.0.4。
注意 proguard-android-optimize.txt
优化更多:
android {
defaultConfig {
resourceConfigurations += setOf("en", "fa") // Only keep English and Farsi
// ...
}
buildTypes {
release {
isShrinkResources = true
isMinifyEnabled = true
signingConfig = signingConfigs["MySigningConfig"]
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
有关详细信息,请参阅 Android Developers: Shrink, obfuscate, and optimize your app。