android pms 安装流程,Android PMS(四)-安装微信

原创内容,转载请注明出处,多谢配合。

经过前面三篇文章的分析,基本上对Apk的安装流程有了个大体的了解。

再来一张图回顾下整个大框架:

7af55bb8b303

下面简单来实验下安装微信:

我选择在应用市场安装微信,流程是先下载再安装,多个应用的场景下是并行下载,串行安装。

根据安装流程粗分为三步:

一、复制Apk

三方应用安装在data/app下,这个是系统目录,直接看复制之后的结果:

/data/app # ls -al

drwxr-xr-x 4 system system 4096 2019-07-19 13:45 com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==

/data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA== # ls -al

-rw-r--r-- 1 system system 111405470 2019-07-19 13:45 base.apk //主apk在这

drwxr-xr-x 3 system system 4096 2019-07-19 13:45 lib //so库文件

drwxrwx--x 3 system install 4096 2019-07-19 13:45 oat //dex文件

另外还有两个APP自己私有目录在这里一并说下:

内部存储:

/data/data # ls -al

drwx------ 18 u0_a167 u0_a167 4096 2019-07-19 15:08 com.tencent.mm

外部存储:

/sdcard/Android/data # ls -al

drwxrwx--x 3 u0_a167 sdcard_rw 4096 2019-07-19 13:55 com.tencent.mm

点击应用管理的清除全部数据:

data/data/com.tencent.mm 目录还在,内部文件全部被清理掉

/sdcard/Android/data/com.tencent.mm 目录被删除

点击应用管理的清除缓存:

data/data/com.tencent.mm 目录还在,内部子文件夹也在,这就是只清理缓存

/sdcard/Android/data/com.tencent.mm 目录还在

二、安装Apk

安装的本质是pull解析AndroidManifext.xml,按组件分类保存在Package数据结构中,最后通过Settings将所有安装app的信息 ,当系统进行程序安装、卸载和更新等操作时,均会更新该文件。通过readLPw()函数和writeLPr函数分别来读写packages.xml。

packages.xml 记录所有安装app的信息,当系统进行程序安装、卸载和更新等操作时,均会更新该文件。

packages-backup.xml 备份文件

packages-stopped.xml 记录被用户强行停止的应用的Package信息

packages-stopped-backup.xml 备份文件

packages.list 记录非系统自带的APK的数据信息,这些APK有变化时会更新该文件

当系统启动、升级或者有APK安装、升级、删除时会重新scan,有变化会更新文件信息。这些xml文件相当于是安装解析之后得到的PackageParser.Package的持久化存储方案。

挑一个packages.xml pull出来看看:

adb root

adb disable-verity

adb reboot

adb root

adb remount

adb pull /data/system/packages.xml .

微信相关的:

主要还是权限

这里就不对每个xml一一分析了。

详细信息可以dumpsys package com.tencent.mm查看。

三、编译Apk

frameworks/base/services/core/java/com/android/server/pm/Installer.java

public void dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet,

int dexoptNeeded, @Nullable String outputPath, int dexFlags,

String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries,

@Nullable String seInfo, boolean downgrade, int targetSdkVersion,

@Nullable String profileName, @Nullable String dexMetadataPath,

@Nullable String compilationReason) throws InstallerException {

Slog.i(TAG,"installdebug: getCallers:"+ Debug.getCallers(20)+"; apkPath:"+apkPath+"; pkgName: "+pkgName+"; compileFilter: "+compilerFilter);

assertValidInstructionSet(instructionSet);

if (!checkBeforeRemote()) return;

try {

mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,

dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade,

targetSdkVersion, profileName, dexMetadataPath, compilationReason);

} catch (Exception e) {

throw InstallerException.from(e);

}

}

这里加了个Log,打印信息如下:

07-19 13:45:27.855 1501 1596 I Installer: installdebug: getCallers:

com.android.server.pm.PackageDexOptimizer.dexOptPath:305

com.android.server.pm.PackageDexOptimizer.performDexOptLI:253

com.android.server.pm.PackageDexOptimizer.performDexOpt:149

com.android.server.pm.PackageManagerService.installPackageLI:18215

com.android.server.pm.PackageManagerService.installPackageTracedLI:17635

com.android.server.pm.PackageManagerService.access$3300:407

com.android.server.pm.PackageManagerService$10.run:15465

android.os.Handler.handleCallback:873

android.os.Handler.dispatchMessage:99

android.os.Looper.loop:201

android.os.HandlerThread.run:65

com.android.server.ServiceThread.run:44

就是之前介绍的流程

apkPath: /data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==/base.apk;

pkgName: com.tencent.mm;

compileFilter: quicken 编译方式为quicken

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值