当前位置: 首页 > news >正文

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\fise fise 是自己取的名字,方便标志。 这里和编译.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 文件中启动可执行文件等。实际应用场景很多的。
http://www.dtcms.com/a/316130.html

相关文章:

  • 本地使用uv管理的python项目怎么部署到服务器?
  • Next.js 链接与导航:页面间无缝切换
  • 最新安卓原生对接苹果cms App后端+app(最新优化版)
  • Spring Cloud系列—简介
  • 从循环嵌套到拓扑编排:LangGraph如何重构Agent工作流
  • 网络 —— 笔记本(主机)、主机虚拟机(Windows、Ubuntu)、手机(笔记本热点),三者进行相互ping通
  • 企业AI转型之战:Coze、Dify与FastGPT的巅峰对决
  • css动态样式
  • Linux 内存管理之 Rmap 反向映射(二)
  • 去哪儿StarRocks实践
  • 以Linux为例补充内存管理基础知识
  • 【 IPMI 内核模块】重新加载
  • BeeWorks私有化即时通讯,局域网办公安全可控
  • 光伏电站环境监测系统:绿色能源的“智慧守护者”
  • 是的,或许这就是意识!
  • 政安晨【开源人工智能硬件】【ESP乐鑫篇】 —— 详细分享小智(78/xiaozhi-esp32)AI终端开源硬件的嵌入式开发经验笔记
  • C语言---文件操作
  • 上传文件至华为云OBS
  • 分布式微服务--Nacos 集群部署
  • 【CTF】命令注入绕过技术专题:变量比较与逻辑运算
  • Spring Boot 整合 Thymeleaf
  • 【qt5_study】1.Hello world
  • 中国地级及以上城市人均GDP数据集(1990-2022年)
  • 【运动控制框架】WPF运动控制框架源码,可用于激光切割机,雕刻机,分板机,点胶机,插件机等设备,开箱即用
  • 37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action
  • 400V降24V,200mA,应用领域:从生活到工业的 “全能电源管家”
  • Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决
  • LeetCode347.前K个高频元素(hash表+桶排序)
  • scikit-learn工具介绍
  • 五十、【Linux系统shell脚本】case语句 、 函数及中断控制演示