当前位置: 首页 > 知识库问答 >
问题:

带有自定义属性的Android运行时资源覆盖

诸龙野
2023-03-14

我试图使用运行时资源覆盖(RRO)机制覆盖xml资源,该资源使用自定义属性和自定义名称空间。当构建覆盖APK时,aapt2(link)抛出一个属性未找到错误。

如何使自定义属性从主应用程序到覆盖层?
甚至可以在覆盖层中使用自定义属性吗?

详细信息:
覆盖包含两个文件:

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" -->
...
<declare-styleable name="MyConfig">
    <attr name="text" format="string" />
</declare-styleable>
<?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 compile-v--dir app/src/main/res/-o simpleappoverlay.flata

而且

aapt2链接-v--无资源-删除
-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]APK“/users/bernd/library/android/sdk/platforms/android-29/android.jar”中的resources.arsc已压缩
注意:使用包ID 7f链接包“de.test.simpleappoverlay”注意:合并存档simpleappoverlay.flata
注意:从已编译文件

共有1个答案

叶坚
2023-03-14

我认为RROs的当前实现(至少在Android Q中)不支持包含新的ID。对于您的错误,aapt使用android.jar生成覆盖层的apk。由于它找不到您的新属性,它会抛出一个错误。要使其工作,我相信您需要使用修改过的android.jar(包括您的属性)。一种方法是修改AOSP中的Android SDK并创建您自己的版本,然后将其用于aapt命令。

 类似资料:
  • 本文向大家介绍Android自定义控件之自定义属性(二),包括了Android自定义控件之自定义属性(二)的使用技巧和注意事项,需要的朋友参考一下 前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参考Android自定义控件基本原理详解(一)这篇文章。  需求产生背景: 为

  • 我有一个简单的问题,但我在文档中找不到任何关于它的东西,也找不到任何示例。 我有一个使用RabbitMQ和spring boot AMQP模块的spring boot项目。我正在使用一个特定的交换和spring,所以我想我需要定义我自己的bean(在这一点上,如果有人知道是否可以用另一种更简单的方法来完成,欢迎您)。 这里对我来说真正的问题是,我还必须定义一个bean,只是为了将其设置为模板,但似

  • 这就是所谓的扩展枚举。我知道它管用--我以前试过并用过很多次。我知道如果这是您应该对枚举做的事情,可能会有讨论--我认为是的,因为您仍然有您定义的常量,但它们只是包含了一些更多的信息(仍然是常量)。(另外:我看过这个例子,java枚举上的自定义字段没有序列化,我认为它们也遵循了我在如何生成枚举上的自定义属性方面的思路)。 现在,我究竟应该如何从Eclipse EMF模型生成这样的东西呢?我甚至不知

  • 在扩展中经常需要保存C++指针,使用属性操作方法,需要分2条指令实现从属性 -> 资源变量 -> 指针的转换。 PHP-X提供了oGet和oSet两个方法来简化资源属性的操作。 设置指针 _this.oSet("propertyName", "ResourceType", new CppObject(1, 2)); 获取指针 CppObject *ptr = _this.oGet<CppObje

  • 试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!

  • 问题内容: 我正在从DropWizard 0.7.1迁移到0.8.1的过程中。这包括从Jersey 1.x迁移到2.x。在使用Jersey 1.18.1的实现中,我实现了(为简单起见,更改了所有类名)。此类将创建包含自定义注入批注的对象。包含传递并由读取的各种属性。最后,在该类中,我注册的新实例,如下所示。 我已经进行了一些研究,似乎无法完全围绕如何在Jersey 2.x中创建(或替换)这样的se