Android系统预安装第三方应用

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

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下
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值