我正在尝试使用运行时资源覆盖 (RRO) 机制来覆盖使用自定义属性和自定义命名空间的 xml 资源。在构建覆盖 APK 时,aapt2(链接)会引发属性未找到错误。
我如何知道从主应用程序到叠加层的自定义属性?
甚至可以在叠加层中使用自定义属性吗?
详细信息:
覆盖包含两个文件:
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.test.simpleappoverlay">
<overlay
android:targetPackage="de.test.simpleapp"
android:targetName="Test"/>
</manifest>
和 xml 文件 res/xml/my_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<MyConfig xmlns:app="http://schemas.android.com/apk/res/de.test.simpleapp"
app:text="hello">
</MyConfig>
<!-- I also tried: xmlns:app="http://schemas.android.com/apk/res-auto" -->
主应用程序在 res/values/attrs.xml 中定义属性文本:
...
<declare-styleable name="MyConfig">
<attr name="text" format="string" />
</declare-styleable>
此外,它在 res/values/overlayable.xml 中定义了可覆盖标签:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<overlayable name="Test">
<policy type="public">
<item type="xml" name="my_config"/>
</policy>
</overlayable>
</resources>
要构建叠加层,我这样做:
aapt2 编译 -v --dir app/src/main/res/ -o SimpleAppOverlay.flata
和
aapt2 链接 -v --no-resource-removal
-I ~/Library/Android/sdk/platforms/android-29/android.jar
--manifest app/src/main/AndroidManifest.xml
-o sao.apk SimpleAppOverlay.flata
这导致以下输出:
注意:包括/Users/bernd/Library/Android/sdk/platforms/android-29/android.jar
aapt2 W 09-01 14:33:06 20083 694697 ApkAssets.cpp:138] resources.arsc 在 APK '/Users/ bernd/Library/Android/sdk/platforms/android-29/android.jar' 被压缩
注意:使用包 ID 7f 链接包 'de.test.simpleappoverlay' 注意:合并存档
SimpleAppOverlay.flata 注意:合并'xml/my_config'从编译文件 app/src/main/res/xml/my_config.xml
注意:启用 pre-O 功能拆分 ID 重写 AndroidManifest.xml:
注意:写入存档 (keep_raw_values=false)
注意:将 AndroidManifest.xml 写入存档 注意:链接 app/src/main/res/xml/my_config.xml (de.test.simpleappoverlay:xml/my_config)
app/src/main/res/xml/my_config.xml:2:错误:找不到属性文本(又名 de.test.simpleappoverlay:text)
错误:链接文件资源失败。