Android Apk安装原理

APK安装分为有界面安装和无界面安装

有界面安装

UI界面在packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
在这里插入图片描述
来看下PackageInstallerActivity (Android7.0.0_r31)
在这里插入图片描述
然后,通过PackageUtil.getPackageInfo可以获取到包的信息
在这里插入图片描述
然后,点击安装的时候,会调用startInstall()
在这里插入图片描述
startInstall会跳转到另一个界面进行安装
在这里插入图片描述
接着来看packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java
在这个类中,会去监听安装广播,然后根据安装的状态改变UI等操作

无界面的安装

adb commandline
在这里插入图片描述
具体来看 system/core/adb/commandline.c (Android 5.1.0_r3),我们通过adb install安装应用的时候,就会执行到这里
在这里插入图片描述
然后接着会调用到 install_app
在这里插入图片描述
来看下pm_command,可以看到,实际执行的是一个pm的脚本文件
在这里插入图片描述
我们再来看下pm脚本,frameworks/base/cmds/pm/pm

# Script to start "pm" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/pm.jar
exec app_process $base/bin com.android.commands.pm.Pm "$@"

可以看到,pm脚本里指向了pm.jar,再来看frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
在这里插入图片描述
可以看到new Pm()并执行了run()方法
来看run方法
在这里插入图片描述
可以看到,根据不同的指令,会执行不同的操作
来看runInstall
在这里插入图片描述
可以看到最终是调用mPm(PackageMananger).installPackageAsUser方法 (此方法通过Binder跨进程调用)
再来看PackageManagerService
在这里插入图片描述
再来看Handler的接收
在这里插入图片描述
可以看到发送了MCS_BOUND的Message
在这里插入图片描述
可以看到,主要调用了startCopy
在这里插入图片描述
在这里插入图片描述
如果安装次数大于MAXPETRIES (4次),即表示安装失败,否则则表示安装成功。

再来看下processPendingInstall,后续的流程牵扯掉NDK、之类的代码,这里就暂时先到这里了。
在这里插入图片描述
再来过一遍无界面安装的流程
在这里插入图片描述

安装的原理

安装的原理其实就是把apk文件拷贝到了对应的目录

  1. data/app/包名 ---- 安装时把apk文件复制到此目录,(里面的apk和我们本身的apk是一模一样的)
  2. data/data/包名 ---- 开辟存放应用程序文件数据的文件夹,包括我们应用的so库,缓存文件等等
  3. 将apk中的dex文件安装到data/dalvik-cache目录下 (dex文件是Dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
PS:为什么Android在开机的时候那么慢?

开机的时候,会把所有的APP再安装一遍

每次开机过程中,之前手机中已经安装过的app是会重新安装一次的,在开机过程中会启动SystemServer,然后SystemServer会启动PackageManagerService,在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程,即把所有APP重新安装一遍。安装过程会解析应用程序配置文件AndroidManifest.xml,然后把前面解析得到的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中,并分配Linux用户ID和Linux用户组ID。
https://www.zhihu.com/question/36549923

参考 : 大体了解Android应用安装过程及原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值