如何正确将文件添加到Android AOSP Marshmallow的rombuild /data部分

4
我正在制作棉花糖AOSP rom,并尝试将device_owner.xml添加到/data/system中,以直接向设备所有者提供应用程序。
我已经添加了一个.mk文件,按照产品复制文件的方式进行了操作。
 PRODUCT_COPY_FILES += abc/cba:data/system/device_owner.xml

文件可以在out/data/system/路径下找到,但似乎没有包含在rom中。
我还尝试将PRODUCT_COPY_FILES替换为
PRODUCT_PACKAGES += device_owner.xml

并为该文件制作了自己的Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = device_owner.xml
LOCAL_SRC_FILES = $(LOCAL_MODULE)
LOCAL_MODULE_CLASS = ETC
LOCAL_MODULE_PATH = $(TARGET_OUT_DATA)/system
include $(BUILD_PREBUILT)

但它仍未包含在rom中。

我已经读到过,数据分区将成为userdata.img的一部分,但该文件也不在那里。

我还尝试将device_owner.xml包含到不同的位置,例如/system/下,并将其复制到post-fs-data阶段的init.rc文件中。

copy /system/abc/device_owner.xml /data/system/device_owner.xml
chown system system /data/system/device_owner.xml
chmod 0600 /data/system/device_owner.xml

文件将被放置在正确的位置,但由于某种原因,chown命令不能将所有者和组更改为system。默认情况下,文件具有root所有者和组。
你有任何想法如何解决这个问题吗?
编辑1.
我现在已经为此提供了一种解决方案。
我创建了set_device_owner.sh文件,在其中:
 #!/system/bin/sh

 chown system:system /data/system/device_owner.xml
 chmod 0600 /data/system/device_owner.xml

然后我添加了一个.mk文件,跟着产品复制文件一起。

 PRODUCT_COPY_FILES += abc/cba/device_owner.xml:/system/xbin/device_owner.xml
 PRODUCT_COPY_FILES += abc/cba/set_device_owner.sh:/system/xbin/set_device_owner.sh

在init.rc中,我在post-fs-data下面有以下内容:

copy /system/xbin/device_owner.xml /data/system/device_owner.xml
exec - root root -- /system/bin/sh ./system/xbin/set_device_owner.sh

现在这样做可以工作,但我仍然想知道正确或更可取的方法是什么。

而且我不知道为什么将拷贝、更改文件所有者和更改文件权限的命令直接应用到init.rc上没有生效。

1个回答

6
AOSP构建过程无法将文件放入data目录,因此我认为您的解决方案是正确的。您会发现init.rc实际上创建了数据目录,并且进行出厂重置将清除/data。就我所知,没有其他好方法来解决这个问题,而您的方法也没有什么问题。
chmod命令应该直接在init.rc文件中起作用,不确定为什么它在您的情况下没有起作用,在文件的其他地方使用了多次。
我刚刚自己实现了这一点,而且能够在没有使用单独脚本的情况下完成。以下是我在“post-fs-data”部分末尾添加到init.rc文件中的行:
copy /system/device_owner.xml /data/system/device_owner.xml
copy /system/device_policies.xml /data/system/device_policies.xml
chmod 0600 /data/system/device_owner.xml
chmod 0600 /data/system/device_policies.xml
chown system system /data/system/device_owner.xml
chown system system /data/system/device_policies.xml

请注意,我的设备配置中有 PRODUCT_COPY_FILES 用于将文件复制到构建时的 /system 目录中,否则这显然不起作用。
另外,为了防止用户在应用程序首次启动时出现关于沉浸模式的消息,您可以使用设备覆盖将您的包 ID 添加到 packages/SettingsProvider/res/values/default.xml 中的 def_immersive_mode_confirmations 部分。有关更多信息,请参见此处:How does the Android source overlays work?。尽管由于某种原因,尽管我似乎已经正确设置了覆盖,但它仍然显示消息,而且我现在没有时间调试它,因为我发现大多数 AOSP 中的“简单”事情都不起作用,然后耗费整天来弄清楚我做错了什么随机的东西...当我弄清楚时,我会编辑这个答案以确认它是否有效。
编辑:所以事实证明,覆盖工作正常。是文档错误...要禁用警告,请在 packages/SettingsProvider/res/values/default.xml 中的 def_immersive_mode_confirmations 部分中使用值 confirmed 以下是问题跟踪器帖子:https://issuetracker.google.com/issues/37093452#c1 因此,您实际上需要这个: <string name="def_immersive_mode_confirmations" translatable="false">confirmed</string>

这个方法还有效吗?我正在使用Lineage OS 16源代码,将文件添加到/data/system/device_owner_2.xml和/data/system/device_policies.xml中,在设置中显示我的应用程序为设备所有者,但我的应用程序似乎没有获得所需的特权(我需要读取网络设备的MAC地址,这可以使用DPM API实现)。 - chrstnwhlrt
我不确定,我们的定制ROM基于Android 6.0.1。Google倾向于在发布版本之间随机破坏事物,修复它们,然后再次破坏它们。因此,根据Lineage OS 16所基于的AOSP版本,甚至到点发行版,很难说。 - Ben Baron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接