Android设备在第一次开机时需预装一些第三方应用,安装后用户可卸载。同时恢复出厂设置并清除系统数据后能够重新预装应用。
需求描述
PackageManagerService作为是Android系统中核心服务之一,管理着所有跟package相关的工作,常见的比如安装、卸载应用。我们可以在此实现该需求。
- 开启后需要自动安装应用,PMS服务扫描时需触发一次该流程。
- 预安装应用能够卸载,说明该应用的安装路径需要在可擦写的data目录下。
- 为了避免重复安装,由一个系统属性开关来控制应用安装逻辑。
- 安装过程需解决preinstall目录下的apk文件的权限问题。
源码实现
以Android 12系统为例,源码位置:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
预安装后的应用路径:/data/app
private static final File DIR_ANDROID_DATA = getDirectory(ENV_ANDROID_DATA, "/data");
/** Directory where installed applications are stored */
private static final File sAppInstallDir = new File(Environment.getDataDirectory(), "app");
源文件apk路径:/system/preinstall
private static final File DIR_ANDROID_ROOT = getDirectory(ENV_ANDROID_ROOT, "/system");
File preinstallAppDir = new File(Environment.getRootDirectory(), "preinstall");
在PackageManagerService构造方法中,在scanDirTracedLI()扫描应用安装目录后再进行应用预安装工作。
//通过该系统属性:persist.sys.preinstalled控制预安装流程只执行一次
if (!SystemProperties.getBoolean("persist.sys.preinstalled", false)) {
//将/system/preinstall目录下的apk文件复制到/data/app下

本文围绕Android设备预装第三方应用展开。需求是首次开机预装,用户可卸载,恢复出厂设置能重新预装。借助PackageManagerService服务实现,通过系统属性开关控制避免重复安装,解决权限问题。给出Android 12系统源码位置及路径,最后介绍了效果验证方法。
最低0.47元/天 解锁文章
296

被折叠的 条评论
为什么被折叠?



