上篇文章我们分析了android M PackageManagerService 启动过程,今天我们继续深入了解下对于apk的安装,PackageManager又是怎样做的呢?
应用程序安装有很多种方法,开发者最常见的就是使用adb install命令或者pm install脚本命令。
很多的应用市场也都有自己的封装,android原生的安装应用为PackageInsteller。
本篇涉及源码路径:
system/core/adb/ commandline.cpp
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/core/java/com/android/server/pm/PackageInstallerService.java
frameworks/base/packages/DefaultContainerService/
frameworks/base/core/java/android/content/pm/PackageParser.java
adb install原理
我们先看adb install原理
adb install命令来源于/android/system/core/adb工具,从上面的代码看到,adb install实际执行的是install_app()。
Install_app会根据存储路径将apk文件copy到/data/local/temp或者sd卡中的路径,后面进行apk复制时会从这个路径里面取。
这里我们可以看到adb命令最终调用的是pm脚本来进行apk的安装。
PM脚本
pm是android中的一个脚本,由pm.java编译生成,最终被放到system/bin下的,其代码路径为:
frameworks/base/cmds/pm
pm脚本的main方法中创建一个Pm对象,然后调用其run方法跑起来。
run方法中获取到package包管理器的binder客户端本地代理Proxy,就可以和IPackageManager服务端通信了。