Proguard/R8 规则排除资产文件夹

Posted

技术标签:

【中文标题】Proguard/R8 规则排除资产文件夹【英文标题】:Proguard/R8 rule to exclude asset folder 【发布时间】:2019-10-03 10:47:51 【问题描述】:

我的项目由主模块组成,然后是其他模块依赖项。 一种这样的依赖是“公地”。 在“commons”中有一个名为“flags”的资产文件夹。

如果我们事先知道这个文件夹永远不会被使用,有没有办法写一个proguard规则来排除这个特定的“flags”文件夹?

在我的项目中,主模块没有使用“commons”模块中专门针对此文件夹的任何代码,但它仍然包含在最终包中。

【问题讨论】:

【参考方案1】:

R8 和 Proguard 都不能删除资产,因为这些资产甚至不会作为输入传递给这些工具。此外,即使它们是输入的一部分,查找资产是否被使用也并非易事。出于同样的原因,R8 和 Proguard 不会删除 Java 资源(它们只能更改其路径/名称)。

您的问题的解决方案可能是在应用程序build.gradle 文件中使用 DSL。即,如果您添加:

android 
  aaptOptions 
    ignoreAssetsPattern "<dir>flags"
  

最终的 APK 不会包含 flags 目录下的任何文件。请记住,此选项不是特定于变体的,所有应用程序变体(例如调试、发布)都不会包含这些资产。

希望对您有所帮助。

【讨论】:

太好了,感谢您的回答。知道是否可以定位子文件夹吗?类似于 ignoreAssetsPattern "[folder][subfolder]"

以上是关于Proguard/R8 规则排除资产文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Proguard (R8) 混淆自定义视图名称

如何修复因 ProGuard/R8 导致的崩溃?

Firebase + Proguard/R8

使用 proguard / R8 删除数据类元数据

Proguard (R8) 否定操作员不工作以保留某些包以外的任何东西

Xcode:根据预处理器标志从资产目录中排除构建中的图像