1. 需求场景与技术背景解析
在Android系统开发过程中,我们经常遇到需要将特定资源文件预置到系统分区,并在设备首次启动时自动拷贝到目标分区的需求。这种操作在系统权限管理、白名单控制等场景尤为常见。以LowMemoryKiller(低内存杀手)机制为例,系统通过读取/data/system/cmhi_permissions.xml文件中的配置,决定哪些应用可以豁免被系统回收。
为什么不能直接将文件放到/data分区?因为/data分区在出厂时是空的,首次启动时才会初始化。而/system分区作为只读分区,可以确保预置文件的完整性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现资源拷贝到data分区
2.1 资源预置到system分区
首先需要将目标文件放入system镜像的指定位置。以cmhi_permissions.xml为例:
- 在AOSP源码树的
device/<厂商>/<设备>/目录下创建prebuilt/etc/文件夹 - 将配置文件放入该目录
- 在设备Makefile(通常是
device.mk)中添加:
makefile复制PRODUCT_COPY_FILES += \
device/<厂商>/<设备>/prebuilt/etc/cmhi_permissions.xml:system/etc/cmhi_permissions.xml
这样编译时文件会被打包到system分区的/system/etc/目录下。
2.2 实现自动拷贝机制
我们需要在系统启动时完成拷贝操作,推荐使用init.rc脚本实现:
- 在
device/<厂商>/<设备>/目录下创建init.<设备>.rc文件(如果不存在) - 添加如下服务定义:
rc复制service copy_cmhi_permissions /system/bin/sh /system/bin/copy_cmhi_permissions.sh
class main
user root
group root
oneshot
- 创建
copy_cmhi_permissions.sh脚本:
bash复制#!/system/bin/sh
SRC_FILE="/system/
