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

标签 android performance gradle apk android-resources

我链接到我的应用程序的第三方库通常包含我的应用程序未使用的资源文件,因此最终导致我的 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.

第三方库包含您的应用程序代码路径不使用的 Assets 是一个常见问题,删除这些 Assets 以便为您的用户生成更小的 APK 文件至关重要。值得庆幸的是,最新版本的 Gradle 和 Android Studio 提供了帮助解决方案。

通过在 Gradle 配置中将 minifyEnabledshrinkResources 设置为 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 文件。

现在,这里可能会出现误报或漏报的情况。当您想要相反的行为时, Assets 可能会被削减或保留。 (公平地说,资源缩减往往过于急切......)要对此进行调整,您可以添加 tools: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"
/>

关于android - 如何从我包含在 Android 上的第三方库中删除未使用的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112527/

相关文章:

java - 如何在 Activity 之间传递自定义对象?

android - 在可穿戴模拟器上看不到可穿戴通知

java - Android Studio 错误 org.apache.http.conn.HttpHostConnectException : Connection to http://10. 0.2.2:8080 拒绝

Java XPath(Apache JAXP 实现)性能

javascript - 页面在移动设备上卡住

c++ - 使用 OpenCV/C++ 设置树莓相机模式

Gradle 与 Artifactory

android - 已启用 Multidex - 仍然无法合并 dex

java - 如何在 Android 应用程序中显示韩语单词

java - 从 gradle org.gradle.api.Project 获取 ClassLoader?