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