最新gradle 5.4.1的问题-字符串中未转义的撇号

时间:2019-09-18 03:25:33

标签: android gradle

这是我们的老祖宗

classpath 'com.android.tools.build:gradle:3.4.2'
...
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

通过上述方法,我们可以使用以下字符串资源

<string name="reminder_doesnt_work_description"><![CDATA[doesn't]]></string>

但是,如果我们升级到最新的gradle

classpath 'com.android.tools.build:gradle:3.5.0'
...
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

我们将收到以下错误

> Multiple task action failures occurred:
   > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
      > Android resource compilation failed
        C:\yocto\noteplus\app\src\main\res\values\strings.xml:696:5-81: AAPT: error: unescaped apostrophe in string

        C:\yocto\noteplus\app\src\main\res\values\strings.xml:696:5-81: AAPT: error: not a valid string.

知道为什么会发生这种错误吗?

请注意,两个等级都可以处理字符串而无需单引号。

<string name="reminder_doesnt_work_description"><![CDATA[doesnt]]></string>

3 个答案:

答案 0 :(得分:0)

在Android Studio将项目从Gradle 5.1.1升级到5.4.1之后,我也使用CDATA在字符串资源中使用未转义的撇号也遇到了这个问题。

有趣的是,在我通过用反斜杠转义撇号解决了这些AAPT错误之后,字符串资源中的CDATA文本在应用程序中显示时丢失了回车符,并且看起来就像一个巨大的文本块。

当我降级到Gradle 5.1.1时,问题消失了

基于此行为,我怀疑Gradle 5.4.1与Android Studio集成的方式存在错误,导致其忽略了CDATA令牌。因此,资源内容就像没有指定CDATA令牌一样被对待。该错误可能不在Gradle本身中,而是在其AAPT插件或两者之间的某些配置中。

我在https://issuetracker.google.com/issues/145430021上对此提交了Android Studio错误

我说现在只是将Gradle降级到5.1.1

答案 1 :(得分:0)

只需将字符串资源中的所有'替换为\'

答案 2 :(得分:0)

为什么不只是按照AAPT2的要求对字符串进行转义?

<string name="reminder_doesnt_work_description">doesn\'t</string>
XML解析器会跳过XML中的

CDATA节,但这显然不适用于这种情况,因为CDATA“节”位于a的文本内容之内节点(因此它具有零影响,因为它不包含任何节点)。而且,如果您真的想使用CDATA,则至少将<>编码为&lt;&gt;(但这仍然需要转义撇号)。