MTK-Android12 静默安装脚本实现静默安装app

提示:通过脚本实现静默安装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

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 ,如下 已经有了的,静默安装成功。

总结-思考

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