升级 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 资源库 )

升级到 Android Gradle 插件 3.3.0 时出现无效的 Crashlytics API 密钥错误

解决Flutter升级后,flutter run 卡在gradle build running的问题