提示:通过脚本实现静默安装app
文章目录
- 前言 - 需求
- 一、 涉及到的知识点
- 1、静默安装-资源包拷贝
- 2、静默安装脚本编写-配置开机启动-实现安装
- 二、 参考资料
- 静默安装参考
- 拷贝资源参考
- 开机自启脚本实现参考
- 三、实现方案
- 大佬实现方案
- 个人实现方案
- 1、 预置安装资源到系统
- 2、拷贝脚本实现
- 3、将拷贝脚本作为开机服务-开机自启
- 配置编译模块-将可执行文件放到指定目录
- 配置编译模块脚本-实现拷贝工作
- 开机脚本init.rc 文件中配置开机自启-配置服务
- on post-fs-data 路径下授可执行文件权限
- 创建自定义的开机自启服务
- 开机后sys.boot_completed 自启服务
- 四、功能验证
- 查看拷贝脚本-拷贝资源是否已经成功
- /system/bin/ 下查看可执行脚本
- /system/preloadapp/ 下查看预制的apk 资源包
- logcat 日志验证
- 实际机器看一下安装-app是否真的安装成功
- 总结-思考
前言 - 需求
- 这里讲的是静默安装的功能,之前做过几篇静默安装笔记,其实已经实现功能的,但是都是基于代码层面也就是基于
Framework APK或者 应用App来实现的。 - 看到大佬的博客,用脚本来实现: Android 10.0 静默安装脚本实现静默安装app,我觉得很有意义,自己也实现一遍。但是两者思想一样,实际实现方案完全不一样, 都可以供参考。不同版本、不同芯片平台要求不一样导致的,个人的更加通用。
一、 涉及到的知识点
首先要搞清楚这个需求涉及到哪些知识点,这里特别列出来 其实就是一个大纲。
1、静默安装-资源包拷贝
总得准备需要静默安装的资源包apk吧
2、静默安装脚本编写-配置开机启动-实现安装
如上1中安装的apk资源包准备好后就可以进行安装了,那么安装一定是通过脚本安装的,所以务必要求:
- 静默安装的脚步
- 静默安装脚本肯定需要执行,那么其实就是一个服务,开机自启服务
二、 参考资料
静默安装参考
直接上大神的一篇,如果版本低于Android11 可以参考:
Android 10.0 静默安装脚本实现静默安装app
其它自己之前笔记:
PMS安装apk之界面跳转
Android13-包安装器PackageInstaller-之apk安装流程
MTK-Android13-包安装器PackageInstaller 静默安装实现
RK-Android11-PackageInstaller安装器自动安装功能实现
拦截adb install/uninstall安装 - 安装流程分析
RK3576-Android15-整合PackageInstaller实现静默安装功能
拷贝资源参考
MTK-Android12拷贝apk文件到指定目录-如system目录下
开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务
预制资源-拷贝文件-/system/lib/ 目录-拷贝可执行文件/system/bin/-拷贝文件到/system/etc/permissions目录
系统拷贝文件到data分区-/data/system目录-实战拷贝资源到vendor分区
Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画
拷贝预置资源到vendor分区-/vendor/lib目录/vendor/lib/hw目录-vendor/etc目录-拷贝可执行文件配置
系统拷贝预置资源-拷贝到/system/bin目录-拷贝可执行文件并启动-拷贝到product/etc分区-拷贝到system/etc分区
开机自启脚本实现参考
开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务
三、实现方案
大佬实现方案
Android 10.0 静默安装脚本实现静默安装app
个人实现方案
1、 预置安装资源到系统
如上篇笔记,详细做了相关说明
MTK-Android12拷贝apk文件到指定目录-如system目录下
2、拷贝脚本实现
我直接把拷贝脚本放出来了,可直接使用:batch_install.sh
#!/system/bin/shTAG="BatchPreInstallAPK"APK_STORE_DIR="/system/preloadapp"MARK_FILE="/data/preinstall_all_apks.mark"SLEEP_DELAY=20 log-t$TAG"===== Batch PreInstall Start, delay ${SLEEP_DELAY}s wait system ready ====="sleep${SLEEP_DELAY}if[-f ${MARK_FILE}];then log-t$TAG"Mark file exist, all apks already installed, skip"exit0 fiif[!-d ${APK_STORE_DIR}];then log-t$TAG"Error: APK dir ${APK_STORE_DIR} not found"exit1 fiforAPK_FILE in ${APK_STORE_DIR}/*.apk;do[!-f"${APK_FILE}"]&&continuelog-t$TAG"========================"log-t$TAG"Handle apk: ${APK_FILE}"# PKG_NAME=$(aapt2 dump badging "${APK_FILE}" 2>/dev/null | grep package: | awk '{print $2}' | sed 's/name=//g' | sed s/\'//g)PKG_NAME=$(pm dump packages-f"${APK_FILE}"2>/dev/null|grep package=|head-n1|cut-d'='-f2|cut-d'/'-f1)if[-z"${PKG_NAME}"];then log-t$TAG"Failed parse package name, skip this apk"continuefi log-t$TAG"Parse package name: ${PKG_NAME}"pm list packages ${PKG_NAME}|grep-q ${PKG_NAME}if[$?-eq0];then log-t$TAG"App ${PKG_NAME} already installed, skip"continuefi log-t$TAG"Start install ${PKG_NAME}"pm install-r"${APK_FILE}"INSTALL_RET=$?if[${INSTALL_RET}-eq0];then log-t$TAG"Install ${PKG_NAME} SUCCESS"elselog-t$TAG"Install ${PKG_NAME} FAILED, ret=${INSTALL_RET}"fi done touch ${MARK_FILE}log-t$TAG"===== All APK Batch Install Finish, write mark file ====="exit03、将拷贝脚本作为开机服务-开机自启
参考之前笔记文章: 开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务
配置编译模块-将可执行文件放到指定目录
配置模块名称:batch_install
配置编译模块脚本-实现拷贝工作
如上Android.mk文件
LOCAL_PATH:=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:=batch_installLOCAL_MODULE_TAGS:=optionalLOCAL_MODULE_CLASS:=EXECUTABLESLOCAL_SRC_FILES:=fise/batch_install.shLOCAL_MODULE_PATH:=$(TARGET_OUT)/binLOCAL_CHECK_ELF_FILES:=falseinclude $(BUILD_PREBUILT)开机脚本init.rc 文件中配置开机自启-配置服务
路径:\system\core\rootdir\init.rc
on post-fs-data 路径下授可执行文件权限
on post-fs-data......chmod0755/system/bin/batch_install chown0.0/system/bin/batch_install创建自定义的开机自启服务
service batch_install/system/bin/batch_installclassmain user rootgrouproot seclabel u:r:system_server:s0 disabled oneshot开机后sys.boot_completed 自启服务
on property:sys.boot_completed=1......startbatch_install四、功能验证
查看拷贝脚本-拷贝资源是否已经成功
/system/bin/ 下查看可执行脚本
/system/preloadapp/ 下查看预制的apk 资源包
logcat 日志验证
开机后,logcat验证:
说上,说明开机后 开机自启执行了脚本自动安装脚本
实际机器看一下安装-app是否真的安装成功
查看更多应用,有木有静默安装的apk,如下 已经有了的,静默安装成功。
总结-思考
- 这里面通过脚本实现静默安装功能,子啊实际开发中各种原因可以作为一种预案
- 对于安装脚本可以自行优化,有优化的空间。时间上、日志显示上方便验证和差错