MTK-Android 系统拷贝预置资源
系统预置资源篇知识点
文章目录
- 前言
- 一、参考资料
- 二、涉及常修改的文件
- 二、PRODUCT_COPY_FILES :Android 编译系统中 PRODUCT_COPY_FILES 的使用方法
- 基本语法
- 使用场景
- 详细使用方法
- 基本文件复制
- 复制到不同分区
- 使用通配符复制多个文件
- 使用通配符复制多个文件
- 条件性复制
- 实际示例
- 复制多个配置文件
- 预装数据库文件
- 复制可执行文件并设置权限
- 高级用法
- 动态生成文件并复制
- PRODUCT_COPY_FILES 小结
- 三、系统拷贝案例分享
- 拷贝开机动画-拷贝动态壁纸
- 内置视频-壁纸-客户预置资源需求
- 动态编译-自动拷贝对应资源文件-命令方式
- 四、实际案例记录一次科大语音集成方案
- 需求-集成科大讯飞遥控器语音功能
- 知识点实现
- 拷贝可执行文件
- 系统配置编译模块
- 实现init.rc 文件配置开机后开启服务
- 实现方法规整
- 总结
前言
系统起来的时候有资源拷贝需求,个人理解有以下具体场景:
- 教育定制类客户:预置大量的音视频课件资源,客户应用可以直接获取系统课程资源,比如视频、文本、文档等
- 静默安装功能:系统第一次开机时候需要静默安装部分app,那么这部分apk 资源需要提前预置到系统内部。 系统第一次开机时候检测到应用未安装就进行安装
- 开机启动可执行文件:对应一些二进制可执行文件,开机自启动服务或者执行这个二进制脚本需求。比如:
- 开机加载开机动画,第一次拷贝需求:类似于系统一些必备资源,如开机动画,系统也会先预置到系统里面去。
一、参考资料
Android P系统编译之使用PRODUCT_COPY_FILES拷贝文件或文件夹
android手机copy文件夹,[摘]使用PRODUCT_COPY_FILES预拷贝文件或文件夹
MTK内置第三方APP-卸载不可卸载-签名问题
init.rc设置机启脚本
Android13 中实现开机执行shell脚本功能
二、涉及常修改的文件
这里仅仅针对mtk 平台,对于RK 平台基本一致,根据系统版本、项目名称不一样路径少许不一致。
- 编译.mk文件:
\device\mediatek\system\common\device.mk - init 启动文件:
\system\core\rootdir\init.rc - 我们自己会把资源提前放置到一个目录:
\device\mediatek\system\common\fisefise 是自己取的名字,方便标志。 这里和编译.mk 文件尽量放到一起 - 放置内置app-二进制文件,编译目录:
\vendor\mediatek\proprietary\packages\3rd-party这里每个主控厂商平台都有自己的规则,我这里直接给出
二、PRODUCT_COPY_FILES :Android 编译系统中 PRODUCT_COPY_FILES 的使用方法
做系统拷贝一定要了解、理解一个关键字:PRODUCT_COPY_FILES
PRODUCT_COPY_FILES 是 Android 构建系统中的一个重要变量,用于在编译时将文件从源路径复制到目标路径。它通常用于将配置文件、预编译的二进制文件、数据库文件等复制到系统镜像中的特定位置。
基本语法
PRODUCT_COPY_FILES += \<source_path>:<destination_path> \<another_source>:<another_destination>
使用场景
- 预装配置文件
- 复制二进制可执行文件
- 预装数据库文件
- 添加自定义字体或资源文件
详细使用方法
基本文件复制
# 将本地文件复制到系统分区
PRODUCT_COPY_FILES += \device/manufacturer/device-name/config/file.cfg:system/etc/file.cfg
复制到不同分区
# 复制到 system 分区
PRODUCT_COPY_FILES += \vendor/mycompany/config/system_config.xml:system/etc/system_config.xml# 复制到 vendor 分区
PRODUCT_COPY_FILES += \vendor/mycompany/config/vendor_config.xml:vendor/etc/vendor_config.xml# 复制到 product 分区
PRODUCT_COPY_FILES += \vendor/mycompany/config/product_config.xml:product/etc/product_config.xml
使用通配符复制多个文件
# 复制目录下所有 .so 文件
PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*.so,vendor/mycompany/libs,system/lib)
使用通配符复制多个文件
# 复制目录下所有 .so 文件
PRODUCT_COPY_FILES += $(call find-copy-subdir-files,*.so,vendor/mycompany/libs,system/lib)
条件性复制
ifeq ($(TARGET_BUILD_VARIANT),userdebug)
PRODUCT_COPY_FILES += \device/manufacturer/device-name/debug/debug.cfg:system/etc/debug.cfg
endif
实际示例
复制多个配置文件
# 在 device.mk 或 product.mk 中
PRODUCT_COPY_FILES += \device/acme/phone/config/audio_policy.conf:system/etc/audio_policy.conf \device/acme/phone/config/gps.conf:system/etc/gps.conf \device/acme/phone/config/wifi/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf
预装数据库文件
# 预装SQLite数据库文件
PRODUCT_COPY_FILES += \vendor/acme/prebuilt/databases/userdata.db:system/data/userdata.db
复制可执行文件并设置权限
PRODUCT_COPY_FILES += \vendor/acme/bin/my_daemon:system/bin/my_daemon# 设置权限(在 init.rc 或其他地方)
PRODUCT_COPY_FILES += \vendor/acme/init/my_daemon.rc:system/etc/init/my_daemon.rc
备注: 并不是所有的Android版本和平台都支持这样copy 可执行文件,要么Android版本限制、要么系统限制。 毕竟 /system/bin 类似于这样的是特殊目录。
但是:可执行文件放在那里都可以的呀,不要纠结于一定要按规范放到/system/bin 、/vendor/bin 等关键目录。 实际发现MTK 安卓12/13 不支持,不分客户不理解,实际上就是这样子的。
高级用法
动态生成文件并复制
# 先使用 BUILD_PREBUILT 生成文件
include $(CLEAR_VARS)
LOCAL_MODULE := my_config
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc
LOCAL_SRC_FILES := config_template.xml
include $(BUILD_PREBUILT)# 然后复制到最终位置
PRODUCT_COPY_FILES += \$(LOCAL_INSTALLED_MODULE):system/etc/final_config.xml
备注:
- 这个动态生成文件并复制的概念蛮重要的,细心会发现,软件安装的逻辑不就是这么干的嘛。
- 实际上,自己在copy 可执行二进制文件过程中也是采用.mk 形式动态实现的,但没有用PRODUCT_COPY_FILES . 下面会举例说明。
PRODUCT_COPY_FILES 小结
上面内容介绍已经说明了PRODUCT_COPY_FILES 基本用法,系统中用这个变量非常多。掌握了这个变量用法,基本的拷贝需求就不难了。
三、系统拷贝案例分享
拷贝开机动画-拷贝动态壁纸
举例拷贝开机动画资源: 这里就是PRODUCT_COPY_FILES 关键字的一个实际简单的案例。

这里以系统里面自带的拷贝开机动画举例说明 类似文件的使用方法,用到了关键字:PRODUCT_COPY_FILES,在 device.mk 文件里面 系统实际使用蛮多的,可参考系统写法。


内置视频-壁纸-客户预置资源需求
还是用上面PRODUCT_COPY_FILES 关键字实现,或者 shell cp -rf 命令实现,如下:
# Add for tuobu
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/bizhi1.jpg:system/media/tuobu/bizhi1.jpg
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/bizhi2.png:system/media/tuobu/bizhi2.png
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/bizhi3.jpg:system/media/tuobu/bizhi3.jpg
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/bizhi4.jpg:system/media/tuobu/bizhi4.jpg
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/gouhuo.mp4:system/media/tuobu/gouhuo.mp4
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/hailang.mp4:system/media/tuobu/hailang.mp4
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/huoche.mp4:system/media/tuobu/huoche.mp4
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/shuimu.mp4:system/media/tuobu/shuimu.mp4
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/xiliu.mp4:system/media/tuobu/xiliu.mp4
PRODUCT_COPY_FILES += $(LOCAL_PATH)/fise/tuobu/yutian.mp4:system/media/tuobu/yutian.mp4$(shell mkdir -p $(PRODUCT_OUT)system/media/tuobu/)
$(shell cp -rf $(LOCAL_PATH)/fise/tuobu/* $(PRODUCT_OUT)/system/media/tuobu/)
备注:这里 用了关键字PRODUCT_COPY_FILES 理论上就成功了,实际上可以考虑shell mkdir 后 执行 shell cp -rf 命令来实现,需要实际测试验证的。
动态编译-自动拷贝对应资源文件-命令方式
**案例一:**前面 PRODUCT_COPY_FILES 有个知识点:动态生成文件并复制


这里关键用到了 shellcp 命令 进行copy 操作
四、实际案例记录一次科大语音集成方案
需求-集成科大讯飞遥控器语音功能

知识点实现
拷贝可执行文件
上面已经介绍了动态编译文件到指定目录的引导,下面直接给出解决方案
目录路径:\vendor\mediatek\proprietary\packages\3rd-party\xiriservice\Android.mk

系统配置编译模块
目录路径:\device\mediatek\system\common\device.mk
在PRODUCT_PACKAGES 节点下配置一个动态编译的模块

实现init.rc 文件配置开机后开启服务
路径:\system\core\rootdir\init.rc
添加如下代码,init.rc 目录里面其实有相关可以参考的。
service xiriservice /system/bin/xiriserviceclass mainuser rootgroup rootoneshotdisabledseclabel u:r:xiriservice:s0on property:sys.boot_completed=1chmod 0775 /system/bin/xiriservicestart xiriservice

实现方法规整
1、内置apk 和 copy 文件到/system/bin 目录
在路径:添加6个编译模块如下:
xiriservice、zkdgitvvideo、zkqqmusictv、zksystemxiri、zktvvideo、zkwanchanglanzheng、zkxiri2、在mk编译文件中配置如上模块
路径:\device\mediatek\system\common\device.mk
PRODUCT_PACKAGES += zkwanchanglanzheng
PRODUCT_PACKAGES += zktvvideo
PRODUCT_PACKAGES += zkqqmusictv
PRODUCT_PACKAGES += zkdgitvvideo
PRODUCT_PACKAGES += zkxiri
PRODUCT_PACKAGES += zksystemxiri
PRODUCT_PACKAGES += xiriservice3、在init.rc 文件中配置开机自启服务
路径:\system\core\rootdir\init.rc
service xiriservice /system/bin/xiriserviceclass mainuser rootgroup rootoneshotdisabledseclabel u:r:xiriservice:s0on property:sys.boot_completed=1chmod 0775 /system/bin/xiriservicestart xiriservice
总结
- 这里主要认识系统拷贝文件的方案和几种不同的场景
- 预置资源搞懂了也蛮简单的。 命令、配置
- 内置预置可执行二进制文件,可能没有那么简单的,实际会遇到各种问题。不让使用
PRODUCT_COPY_FILES方式、shell cp 权限问题 等等。 看编译日志是否报错和报错问题进行修复 - 这里也通过继承科大遥控器语音来学习如何在init.rc 文件中启动可执行文件等。实际应用场景很多的。
