这是我们的老祖宗
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>
答案 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
,则至少将<
和>
编码为<
和>
(但这仍然需要转义撇号)。