多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

RK3576-Android15-实现开机脚本静默安装功能

RK3576-Android15-实现开机脚本静默安装功能 RK3576-Android15-实现开机脚本静默安装功能文章目录前言一、涉及到知识点二、参考资料三、修改文件四、实现方案1、拷贝apk 到指定目录/system/preloadapp 下配置系统编译环境(框架)-便于管理-确认 fise_preloadapp 的目录结构创建 fise_preloadapp/Android.mk创建 fise_preloadapp/fise_preloadapp.mkrk3576_u.mk 中引入 fise_preloadapp.mk2、拷贝批量安装脚本到指定目录/system/bin/3、批量安装脚本实现-并在开机后自动执行批量安装脚本批量安装脚本编写批量安装脚本-开机执行批量安装五、思考总结前言一般有两种情况需要用静默安装来实现系统内置应用开机后进入应用出现闪退的情况系统需要内置一些应用 可卸载的应用可以内置也可以开机后批量安装来实现其实就是需要系统来实现系统内置应用但是有时候内置会出现各种各种问题造成app 内置失败、内置成功了打开不可用。 那么就用静默安装 方案在开机后模拟adb install安装 或者模拟 系统pm install安装进去的方案。一、涉及到知识点拷贝apk 、拷贝脚本 到指定目录 拷贝相关知识点对于apk 这种特殊文件 采用 编译形式实现拷贝知识点对于开机自启脚本实现在init.rc中如何配置。批量安装脚本如何编写等权限问题不同的权限GMS/root/非root 方案权限不一样的批处理脚本实现方案也不一样保存是否已经安装成功的flag 方式 不一样总归权限问题。二、参考资料Android 10.0 静默安装脚本实现静默安装appMTK-Android12 静默安装脚本实现静默安装app开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务预制资源-拷贝文件-/system/lib/ 目录-拷贝可执行文件/system/bin/-拷贝文件到/system/etc/permissions目录系统拷贝预置资源-拷贝到/system/bin目录-拷贝可执行文件并启动-拷贝到product/etc分区-拷贝到system/etc分区如上这些知识点足以满足我们当前需求基本思路如下拷贝apk 到指定目录拷贝开机脚本到安卓系统/system/bin目录实现脚本开机自启进行批量安装apk 功能三、修改文件device\rockchip\rk3576\device.mk 设置属性是否已经安装 device\rockchip\common\fise_preloadapp\batch_install.sh 批量安装脚本 device\rockchip\common\device.mk 拷贝批量安装脚本到指定目录 system\core\rootdir\init.rc 配置开机启动后 启动批量安装脚本 rk3576_u\fise_preloadapp\Android.mk 配置编译环境当前目录及子目录被编译 rk3576_u\fise_preloadapp\fise_preloadapp.mk 配置当前目录下需要编译的模块 device\rockchip\rk3576\rk3576_u\fise_preloadapp\xiongmaohuihua\**.apk 配置子目录 需要安装的apk 文件 device\rockchip\rk3576\rk3576_u\fise_preloadapp\xiongmaohuihua\Android.mk 配置当前apk 拷贝脚本 device\rockchip\rk3576\rk3576_u\rk3576_u.mk 配置fise_preloadapp 到系统编译环境里面来让整个目录可以被编译到四、实现方案1、拷贝apk 到指定目录/system/preloadapp 下配置系统编译环境(框架)-便于管理-确认 fise_preloadapp 的目录结构device/rockchip/rk3576/rk3576_u/fise_preloadapp/├──Android.mk--新建内容只有递归扫描 ├── fise_preloadapp.mk--新建声明PRODUCT_PACKAGES└── xiongmaohuihua/--你的APK模块目录已存在 ├── xiongmaohuihua.mk └── xiongmaohuihua.apk创建 fise_preloadapp/Android.mk内容与preinstall_del/Android.mk保持一致 就是参考写法include $(call all-subdir-makefiles)创建 fise_preloadapp/fise_preloadapp.mk内容仿照preinstall.mk 其实还是仿照其它模块怎么写脚本的PRODUCT_PACKAGESxiongmaohuihua如果有多个 APK按同样格式依次添加PRODUCT_PACKAGES\ xiongmaohuihua \ someotherapprk3576_u.mk 中引入 fise_preloadapp.mk$(call inherit-product,device/rockchip/rk3576/rk3576_u/fise_preloadapp/fise_preloadapp.mk)或者直接 includeinclude device/rockchip/rk3576/rk3576_u/fise_preloadapp/fise_preloadapp.mk2、拷贝批量安装脚本到指定目录/system/bin/就是一个拷贝命令如下路径device\rockchip\common\device.mkPRODUCT_COPY_FILES\ $(LOCAL_PATH)/fise_preloadapp/batch_install.sh:/system/bin/batch_install.sh3、批量安装脚本实现-并在开机后自动执行批量安装脚本批量安装脚本编写路径device\rockchip\common\fise_preloadapp\batch_install.sh#!/system/bin/shTAGPreInstallAPKAPK_STORE_DIR/system/preloadappPROP_KEYcustom.fise.preloadappSLEEP_DELAY5log-t $TAG Batch PreInstall Start, delay ${SLEEP_DELAY}s wait system ready sleep ${SLEEP_DELAY}# 读取属性判断是否已经安装过INSTALLED_FLAG$(getprop ${PROP_KEY})if[${INSTALLED_FLAG}1];then log-t $TAGProperty ${PROP_KEY}1, all apks already installed, skipexit0fiif[!-d ${APK_STORE_DIR}];then log-t $TAGError: APK dir ${APK_STORE_DIR} not foundexit1fiALL_OK1forAPK_FILEin ${APK_STORE_DIR}/*.apk; do [ ! -f ${APK_FILE} ] continue log -t $TAG log -t $TAG Handle apk: ${APK_FILE} log -t $TAG Start install ${APK_FILE} pm install -r ${APK_FILE} INSTALL_RET$? if [ ${INSTALL_RET} -eq 0 ]; then log -t $TAG Install ${APK_FILE} SUCCESS else log -t $TAG Install ${APK_FILE} FAILED, ret${INSTALL_RET} ALL_OK0 fi done # 只有全部处理成功才写入标记避免部分失败后无法重试 if [ ${ALL_OK} -eq 1 ]; then setprop ${PROP_KEY} 1 log -t $TAG All APK Batch Install Finish, set ${PROP_KEY}1 else log -t $TAG Some APK failed, keep ${PROP_KEY}0 for retry fi exit 0批量安装脚本-开机执行批量安装路径system\core\rootdir\init.rc# modify by fangchen start service batch_install/system/bin/sh/system/bin/batch_install.shclassmain user root group root disabled oneshot seclabel u:r:shell: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 start batch_install # modify by fangchen end五、思考如果Android10 及一下的RK平台 可以参考Android 10.0 静默安装脚本实现静默安装app如果是MTK平台Android12/13 及以上可以参考MTK-Android12 静默安装脚本实现静默安装app基本思路就是拷贝文件、执行脚本来实现的。 注意脚本给一个延时不然拷贝还没来的及拷贝成功、脚本执行太早也会有部分问题的。为什么拷贝要搞成编译模块形式这个本身是Android 在Android10 之后主导的特殊文件不允许直接脚本拷贝来实现。总结记录的一次RK平台 Android15 进行的开机脚本静默安装的功能
返回列表