【问题标题】:How to completely remove unused resources when building android?构建android时如何完全删除未使用的资源?
【发布时间】:2021-06-10 08:11:48
【问题描述】:

我有一个通过另一个程序随机创建的资源组。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#000000" />
</shape>

这些资源组中有些是实际使用的,有些不是。

此资源组属于另一个库,我的应用导入并使用该库。

由于该组不断更新,我不希望将其从项目中删除,我只想将其从构建输出中排除。

https://developer.android.com/studio/build/shrink-code

官方文档说我可以通过shrinkResource函数删除我未使用的资源。所以我将我的 app.gradle 设置如下。

...
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles 'proguard-rules.pro' <-- This is an empty file.
          
        }

...

dependencies {
    implementation project(':myResourceLibrary')
...
}

我还在 res/raw 中创建了 keep.xml 以进行严格的资源检查。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@raw/*" <-- This part is the same with or without it.
    tools:shrinkMode="strict" />

好的,我运行构建并成功获取了 apk。但是通过Android Studio的apk分析查看apk时,资源并没有被移除。

资源保留在下面的表格中。

<?xml version="1.0" encoding="utf-8"?>
<x />

构建日志表明资源处理如下。

Skipped unused resource 'my_resource_file': 444 bytes (replaced with small dummy file of size 104 bytes)

好的,我可以说单独减少容量是有效的,但我喜欢这里 (https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/resource-shrinking) 我希望完全删除未使用的文件。

没有任何文档解释为什么可以完全删除此文件,或者为什么不能完全删除。

为什么 gradle 不知道资源没有被使用,但它不删除文件?我可以删除那个文件吗?

我正在使用 gradle 4.1.0 进行构建,并且正在使用以下命令进行构建。

./gradlew --info assemble(MyProductFlavor)Release

即使我使用Android Studio的Rebuild Project,它也会处于如下所示的相同状态。

【问题讨论】:

  • 你已经在 Debug 或 Release 模式下构建了 apk 吗?您应该在发布版本中启用压缩以删除未使用的代码和资源
  • 我很确定这与资源的存储方式以及访问资源的不同方式有关。据我所知,进行源代码修改的库可能希望在找到文件时找到资源。因此,为了防止不可预知的结果,它们被替换为虚拟值而不是被移除。 (这都是我从播客/博客中获得的记忆和拼凑的信息)
  • 就删除资源而言,我很确定删除它是安全的(除非您有一个更复杂的构建,其中包含依赖于不同资源集的不同变体或类似的东西)。尽管不确定时,请始终尝试在代码中查找引用并检查该资源是否实际上未被使用。

标签: android gradle proguard android-resources


【解决方案1】:

这部分代码:

release {
        minifyEnabled true
        shrinkResources true
        proguardFiles 'proguard-rules.pro' <-- This is an empty file.
      
    }

要删除未使用的资源,然后缩小您的代码(因为没有人可以反编译您的 apk),如果您看到您的 apk 还包含未使用的资源,因为该 apk 用于调试,并且 minify/shrink 不会影响调试apk,但对发布 apk 有影响。

【讨论】:

  • 感谢回答,不过我觉得这是通过release build得到的apk。我在正文中添加了构建命令。
  • 所以检查一下:首先将 Build Variants 放在 release 上,然后 Rebuild Project。最后,将视图设置为项目视图,然后双击发布文件夹,然后单击 app-release.apk 。
  • 同理。在Rebuild Project之后,我直接添加了项目的apk文件中没有使用的drawables的结果。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2015-09-27
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多