提示:通过脚本实现静默安装app
文章目录
- [前言 - 需求](#前言 - 需求)
- [一、 涉及到的知识点](#一、 涉及到的知识点)
- [二、 参考资料](#二、 参考资料)
- 三、实现方案
-
- 大佬实现方案
- 个人实现方案
-
- [1、 预置安装资源到系统](#1、 预置安装资源到系统)
- 2、拷贝脚本实现
- 3、将拷贝脚本作为开机服务-开机自启
-
- 配置编译模块-将可执行文件放到指定目录
- 配置编译模块脚本-实现拷贝工作
- [开机脚本init.rc 文件中配置开机自启-配置服务](#开机脚本init.rc 文件中配置开机自启-配置服务)
-
- [on post-fs-data 路径下授可执行文件权限](#on post-fs-data 路径下授可执行文件权限)
- 创建自定义的开机自启服务
- [开机后sys.boot_completed 自启服务](#开机后sys.boot_completed 自启服务)
- 四、功能验证
-
- 查看拷贝脚本-拷贝资源是否已经成功
-
- [/system/bin/ 下查看可执行脚本](#/system/bin/ 下查看可执行脚本)
- [/system/preloadapp/ 下查看预制的apk 资源包](#/system/preloadapp/ 下查看预制的apk 资源包)
- [logcat 日志验证](#logcat 日志验证)
- 实际机器看一下安装-app是否真的安装成功
- 总结-思考
前言 - 需求
- 这里讲的是静默安装的功能,之前做过几篇静默安装笔记,其实已经实现功能的,但是都是基于代码层面也就是基于
Framework APK或者 应用App来实现的。 - 看到大佬的博客,用脚本来实现: Android 10.0 静默安装脚本实现静默安装app,我觉得很有意义,自己也实现一遍。但是两者思想一样,实际实现方案完全不一样, 都可以供参考。不同版本、不同芯片平台要求不一样导致的,个人的更加通用。
一、 涉及到的知识点
首先要搞清楚这个需求涉及到哪些知识点,这里特别列出来 其实就是一个大纲。
1、静默安装-资源包拷贝
总得准备需要静默安装的资源包apk吧
2、静默安装脚本编写-配置开机启动-实现安装
如上1中安装的apk 资源包准备好后就可以进行安装了,那么安装一定是通过脚本安装的,所以务必要求:
- 静默安装的脚步
- 静默安装脚本肯定需要执行,那么其实就是一个服务,开机自启服务
二、 参考资料
静默安装参考
直接上大神的一篇,如果版本低于Android11 可以参考:
其它自己之前笔记:
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目录-并实现开机自启二进制脚本服务
三、实现方案
大佬实现方案
个人实现方案
1、 预置安装资源到系统
如上篇笔记,详细做了相关说明
MTK-Android12拷贝apk文件到指定目录-如system目录下
2、拷贝脚本实现
我直接把拷贝脚本放出来了,可直接使用:batch_install.sh
powershell
#!/system/bin/sh
TAG="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"
exit 0
fi
if [ ! -d ${APK_STORE_DIR} ]; then
log -t $TAG "Error: APK dir ${APK_STORE_DIR} not found"
exit 1
fi
for APK_FILE in ${APK_STORE_DIR}/*.apk; do
[ ! -f "${APK_FILE}" ] && continue
log -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"
continue
fi
log -t $TAG "Parse package name: ${PKG_NAME}"
pm list packages ${PKG_NAME} | grep -q ${PKG_NAME}
if [ $? -eq 0 ]; then
log -t $TAG "App ${PKG_NAME} already installed, skip"
continue
fi
log -t $TAG "Start install ${PKG_NAME}"
pm install -r "${APK_FILE}"
INSTALL_RET=$?
if [ ${INSTALL_RET} -eq 0 ]; then
log -t $TAG "Install ${PKG_NAME} SUCCESS"
else
log -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 ====="
exit 0
3、将拷贝脚本作为开机服务-开机自启
参考之前笔记文章: 开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务

配置编译模块-将可执行文件放到指定目录
配置模块名称:batch_install

配置编译模块脚本-实现拷贝工作
如上Android.mk 文件
java
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := batch_install
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := fise/batch_install.sh
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin
LOCAL_CHECK_ELF_FILES := false
include $(BUILD_PREBUILT)
开机脚本init.rc 文件中配置开机自启-配置服务
路径:\system\core\rootdir\init.rc
on post-fs-data 路径下授可执行文件权限
java
on post-fs-data
......
chmod 0755 /system/bin/batch_install
chown 0.0 /system/bin/batch_install
创建自定义的开机自启服务
powershell
service batch_install /system/bin/batch_install
class main
user root
group root
seclabel u:r:system_server:s0
disabled
oneshot
开机后sys.boot_completed 自启服务
powershell
on property:sys.boot_completed=1
......
start batch_install
四、功能验证
查看拷贝脚本-拷贝资源是否已经成功
/system/bin/ 下查看可执行脚本

/system/preloadapp/ 下查看预制的apk 资源包

logcat 日志验证
开机后,logcat 验证:
说上,说明开机后 开机自启执行了脚本自动安装脚本
实际机器看一下安装-app是否真的安装成功
查看更多应用,有木有静默安装的apk ,如下 已经有了的,静默安装成功。

总结-思考
- 这里面通过脚本实现静默安装功能,子啊实际开发中各种原因可以作为一种预案
- 对于安装脚本可以自行优化,有优化的空间。时间上、日志显示上方便验证和差错