预制资源-拷贝文件-/system/lib/ 目录-拷贝可执行文件/system/bin/-拷贝文件到/system/etc/permissions目录文章目录前言一、需求二、参考资料三、实现方案1、拷贝资源部到 /system/lib/ 下拷贝单独的.so 到 /system/lib/ 下配置编译模块放置需要拷贝的.so 文件编译文件配置拷贝在mk 文件中配置加载拷贝的模块在/system/lib 目录中验证结果拷贝内置apk 中的.so 文件到 /system/lib/ 下配置编译模块放置需要拷贝的资源文件.so 到指定目录下编译文件配置-内置应用-拷贝文件在mk 文件中配置内置应用的模块2、拷贝可执行文件资源到/system/bin/ 目录下将可执行文件放到指定目录配置拷贝指令设置规则-BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES配置开机启动3、拷贝资源到/system/etc/permissions目录下放置需要拷贝资源到指定目录配置拷贝脚本实际验证四、拷贝知识点-案例-其它相关静默安装需求-拷贝资源apk实现方案总结前言在定制Room 开发中经常会遇到 预制资源拷贝问题。 在之前篇章其实总结了很多的拷贝到不同的目录下。 有以下特别注意点拷贝到同目录可能对应不同分区不同目录对应的目标分区所以拷贝方式不一样。拷贝目标是一样但是拷贝规则、系统规则限制导致拷贝需要特定的方式。甚至不同的平台、不同的Android版本拷贝方式可能也不一样。如上 是注意点所以 有必要对新的知识点做一下总结、对旧的知识点 如果需要 也要温故下。一、需求将新提供的单端.so文件libiflyblesvc_xiri_d.so及libxdriver_xiri_d.so预置到system/lib目录下将提供的xiriservice_All的文件预置到system/bin目录下且需要加到开机启动文件“init.bigfish.sh”里面将android.hardware.usb.host.xml文件放置在/system/etc/permissions目录下需要将SystemXiri.apk、Xiri.apk解压后lib/armeabi目录下的全部so库文件放置 /system/lib 目录下综合来讲部分驱动的.so 驱动文件需要放到指定目录下如system/lib目录下将可执行文件xiriservice_All放到 可执行目录system/bin下一般开机启动某个服务功能将配置文件拷贝到指定的目录比如 音频策略文件很多音频策略文件都有自己的xml 配置文件。 比如遥控器 产品接入Android 设备。第三方apk 实现里面的库文件 拷贝到指定的目录下。 这里其实还分为32位和64位特别是老版本的apk 都是32位需要拷贝到系统的目录。 很多平台内置apk 到系统系统并不会去自动拷贝依赖的.so 库文件那么就需要收到拷贝一次。二、参考资料系统拷贝文件到data分区-/data/system目录-实战拷贝资源到vendor分区Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画拷贝预置资源到vendor分区-/vendor/lib目录/vendor/lib/hw目录-vendor/etc目录-拷贝可执行文件配置系统拷贝预置资源-拷贝到/system/bin目录-拷贝可执行文件并启动-拷贝到product/etc分区-拷贝到system/etc分区MTK-实现系统集成思必驰语音功能-采用Usb相机Mic作为音频输入-资源内置到vendor/lib - vendor/etc 目录参考以前处理过的各种 拷贝整个拷贝系列有一个基础认识、有一个概念、思路不同场景不同需求的拷贝理解下来很多知识点特别重要。三、实现方案1、拷贝资源部到 /system/lib/ 下这里有个坑或者规则定义来说。 你在\device\mediatek\system\common\device.mk \device\mediateksample\k69v1_64_k419\device.mk文件中配置拷贝脚本并不会报错也不会成功。 说白了 系统规则限制不允许 静态配置。 所以 我们采用的方案是动态配置配置.so 文件拷贝。分区严格校验在 Android 12 中system 分区默认开启了严格的文件哈希校验。直接通过 PRODUCT_COPY_FILES 拷贝 .so 文件到 /system/lib 可能会破坏分区映像system.img的完整性导致编译被跳过或报错拷贝单独的.so 到 /system/lib/ 下需求将新提供的单端.so文件libiflyblesvc_xiri_d.so及libxdriver_xiri_d.so预置到system/lib目录下配置编译模块放置需要拷贝的.so 文件编译文件配置拷贝LOCAL_PATH:$(call my-dir)include $(CLEAR_VARS)#Modulename should match apk nametobeinstalledLOCAL_MODULE:libxdriver_xiri_dLOCAL_MODULE_TAGS:optionalLOCAL_SRC_FILES:libxdriver_xiri_d.soLOCAL_MODULE_CLASS:SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:.soLOCAL_CERTIFICATE:PRESIGNEDLOCAL_PRODUCT_MODULE:true##LOCAL_PROPRIETARY_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_DEX_PREOPT:falseLOCAL_MODULE_PATH:$(TARGET_OUT)/lib # 对应 system/lib,$(shell mkdir-p $(PRODUCT_OUT)/system/lib/)$(shell cp-rf $(LOCAL_PATH)/fise/* $(PRODUCT_OUT)/system/lib/) # 这里其实 命令拷贝一次 include $(BUILD_PREBUILT)在mk 文件中配置加载拷贝的模块路径\device\mediatek\system\common\device.mkPRODUCT_PACKAGESlibiflyblesvc_xiri_d在/system/lib 目录中验证结果拷贝内置apk 中的.so 文件到 /system/lib/ 下其实如上就是配置一个.so 模块然后拷贝了对应的.so 文件。这里 我们看编译内置apk 如何拷贝apk 里面的.so 文件到系统指定目录/system/lib需求需要将SystemXiri.apk、Xiri.apk解压后lib/armeabi目录下的全部so库文件放置/system/lib 目录下。配置编译模块将编译文件,需要内置的apk 文件和资源文件放到fise 目录下。放置需要拷贝的资源文件.so 到指定目录下编译文件配置-内置应用-拷贝文件LOCAL_PATH:$(call my-dir)include $(CLEAR_VARS)#Modulename should match apk nametobeinstalledLOCAL_MODULE:ottjiaguLOCAL_MODULE_TAGS:optionalLOCAL_SRC_FILES:$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:APPSLOCAL_MODULE_SUFFIX:$(COMMON_ANDROID_PACKAGE_SUFFIX)#LOCAL_CERTIFICATE:PRESIGNEDLOCAL_CERTIFICATE:platform ##LOCAL_PROPRIETARY_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_DEX_PREOPT:false$(shell mkdir-p $(PRODUCT_OUT)/system/lib/)$(shell cp-rf $(LOCAL_PATH)/fise/* $(PRODUCT_OUT)/system/lib/) include $(BUILD_PREBUILT)在mk 文件中配置内置应用的模块路径\device\mediatek\system\common\device.mkPRODUCT_PACKAGESottjiagu2、拷贝可执行文件资源到/system/bin/ 目录下这里其实是拷贝可执行文件到/system/bin/目录然后做开机自启动。强烈推荐 系统拷贝预置资源-拷贝到/system/bin目录-拷贝可执行文件并启动-拷贝到product/etc分区-拷贝到system/etc分区 文章中实际案例记录一次科大语音集成方案案例参考。这里以另外一种方案 来做。将可执行文件放到指定目录路径\device\mediateksample\k69v1_64_k419\fise配置拷贝指令路径\device\mediateksample\k69v1_64_k419\device.mk#forxunfei yaokong voicePRODUCT_COPY_FILES$(LOCAL_PATH)/fise/xiriservice_All:$(TARGET_COPY_OUT_SYSTEM)/bin/xiriservice_All:0644设置规则-BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES路径\device\mediateksample\k69v1_64_k419\BoardConfig.mk为了实现 特殊文件如 可执行文件的拷贝配置 拷贝规则不然 可执行文件拷贝不成功的系统限制了。在最后一行加如下内容BUILD_BROKEN_ELF_PREBUILT_PRODUCT_COPY_FILES:true配置开机启动路径\system\core\rootdir\init.rc# modify by fangchen start service xiriservice_All/system/bin/xiriservice_Allclassmain user root group root oneshot disabled seclabel u:r:xiriservice_All:s0 # modify by fangchen end on property:sys.boot_completed1bootchart stop #Setupper_boot directory so other.rc could starttouseit on boot_completed exec-system system--/bin/rm-rf/data/per_boot mkdir/data/per_boot0700system system encryptionRequirekeyper_boot_ref # modify by fangchen start chmod0775/system/bin/xiriservice_All start xiriservice_All # modify by fangchen end3、拷贝资源到/system/etc/permissions目录下这个需求其实是很简单的一个需求了 之前都有相关做过的案例。 步骤如下放置需要拷贝资源到指定目录配置拷贝脚本路径\device\mediatek\system\common\device.mkPRODUCT_COPY_FILES$(LOCAL_PATH)/fise/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/android.hardware.usb.host.xml:mtk实际验证四、拷贝知识点-案例-其它相关静默安装需求-拷贝资源apk需求场景 假使日常中经常遇到有应用无法内置成功各种原因。那么就要做静默安装就是第一次开机做一次静默安装。需求拆解-拷贝既然是做静默安装那么apk 从哪里来 那么就拷贝一次到指定目录下。 问题是.apk文件属于特殊文件很难规避规则来实现拷贝工作。需求-实现思路那么 我们就如上在编译模块中实现某个apk 拷贝动作 先把需要静默安装的安装包准备好然后在开机后进行静默安装。实现方案其实就是把 特殊文件apk资源 在编译脚本里面拷贝到指定目录一次。LOCAL_PATH:$(call my-dir)include $(CLEAR_VARS)#Modulename should match apk nametobeinstalledLOCAL_MODULE:chedalauncherLOCAL_MODULE_TAGS:optionalLOCAL_SRC_FILES:$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:APPSLOCAL_MODULE_SUFFIX:$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE:PRESIGNEDLOCAL_PRODUCT_MODULE:true##LOCAL_PROPRIETARY_MODULE:trueLOCAL_ENFORCE_USES_LIBRARIES:falseLOCAL_DEX_PREOPT:false$(shell mkdir-p $(PRODUCT_OUT)/system/media/cheda/)$(shell cp-rf $(LOCAL_PATH)/fise/* $(PRODUCT_OUT)/system/media/cheda/) include $(BUILD_PREBUILT)总结这里实现了预制资源-拷贝文件-/system/lib/ 目录-拷贝可执行文件/system/bin/-拷贝文件到/system/etc/permissions目录需求进一步对拷贝需求进行了基本的总结。必须掌握拷贝基础知识实际开发中经常遇到掌握后无形当中提高开发效率事半功倍。