升级 Gradle 插件后,XML 资源名称在发布版本中更改
Posted
技术标签:
【中文标题】升级 Gradle 插件后,XML 资源名称在发布版本中更改【英文标题】:XML resource names are changed in release builds after upgrading Gradle plugin 【发布时间】:2021-07-29 02:11:26 【问题描述】:在将 Gradle 插件升级到 4.2.0 之后(在此之前,我没有这个问题),似乎在构建发布版本时 XML 资源文件的名称发生了变化,例如从 res/xml/settings_master_switch_1.xml
到 @987654323 @。
这对我编写的库提出了问题,因为它采用了 xml 中给出的资源的名称,例如
<com.smp.masterswitchpreference.MasterSwitchPreference
..
app:ms_includedPrefScreen="@xml/settings_master_switch_1" />
并使用此函数查找资源 id
fun resInt(resName: String?, type: String): Int?
resName ?: return null
val f = File(resName).nameWithoutExtension
return context.resources.getIdentifier(f, type, context.packageName)
这个库的消费者可以简单地拥有
release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
甚至使用minifyEnabled false
来产生问题。
可以在这里找到带有演示应用程序的库https://github.com/svenoaks/MasterSwitchPreference
所以我假设我必须在这个库的使用者中添加某种类型的 R8/Proguard 或 Gradle 设置才能不更改 xml 资源的名称?这个规则是什么?
我已经尝试定义要保留在消费者应用程序的res/raw/keep.xml
中的资源 -
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@xml/settings_master_switch_1,@xml/settings_master_switch_2,@drawable/ic_baseline_cake_24.xml" />
这个规则在proguard-rules.pro
-verbose
-keepattributes InnerClasses
-keep class **.R
-keep class **.R$*
<fields>;
如果没有成功,插件还是会重命名 XML 资源。
【问题讨论】:
【参考方案1】:一般来说,你可能想继续上课R
:
-verbose
-keepattributes InnerClasses
-keep class **.R
-keep class **.R$*
<fields>;
但也可以注释,以保留特定资源:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@xml/settings_master_switch_1" />
【讨论】:
我在消费者应用程序中尝试了这两个,不幸的是,这些都不能与 Gradle 插件 4.2.0 一起使用,资源还是被重命名了。【参考方案2】:就我而言,我需要做的就是将 attr 声明从整数更改为字符串:
<attr name="ms_includedPrefScreen" format="string"/>
<attr name="ms_excludedPrefScreen" format="string"/>
并去掉消费者的“@”注解,这样就可以传入一个正确名字的字符串了:
app:ms_includedPrefScreen="xml/settings_master_switch_1"
【讨论】:
以上是关于升级 Gradle 插件后,XML 资源名称在发布版本中更改的主要内容,如果未能解决你的问题,请参考以下文章
将 android gradle 插件从 4.2.1 升级到 7.0.1 后出现错误
升级到 Gradle 6 和 Android Gradle 插件 4.0.0 无法获取“https://dl.google.com/android/repository/addons_list-3.x
Android Gradle 插件Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )
Android Gradle 插件Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )