【从一个APK安装另一个APK】
首先是从context获得PackageManager句柄,然后调用installPackage()进行安装
ContextImpl.java::getPackageManager()
pm = ActivityThread.java::getPackageManager(){
//最终获得PackageManagerService服务
ServiceManager.getService("package");
}
new ApplicationPackageManager.java:ApplicationPackageManager(pm)
}
ContextImpl::getPackageManager()获得的是ApplicationPackageManager实例,ApplicationPackageManager通过构造函数传入的pm句柄访问PackageManagerService的部分接口。
ApplicationPackageManager.java::installPackage(){
ApplicationPackageManager.java::installCommon(){
PackageManagerService.java::installPackageAsUser(){
PackageManagerService.java::PackageHandler.doHandleMessage(INIT_COPY)
//MCS=Media Contain Service
PackageManagerService.java::PackageHandler.doHandleMessage(MCS_BOUND)
//拷贝安装
PackageManagerService.java::HandlerParams.startCopy(){
PackageManagerService.java::InstallParams.startCopy(){
//拷贝
PackageManagerService.java::InstallParams.handleStartCopy(){
DefaultContainerService.java::getMinimalPackageInfo(){
PackageHelper.resolveInstallLocation(){
//决定目标安装位置
}}
PackageManagerService.java::FileInstallArgs.copyApk(){
PackageManagerService.java::FileInstallArgs.doCopyApk(){
DefaultContainerService.java::copyPackage(){
DefaultContainerService.java::copyPackageInner(){
DefaultContainerService.java::copyFile(){
Streams.copy(in, out);
}}}}}}
//安装
PackageManagerService.java::InstallParams.handleReturnCode(){
PackageManagerService.java::processPendingInstall(){
mHandler.post(new Runnable()){:
//安装前准备
PackageManagerService.java::InstallArgs.doPreInstall()
//执行安装
PackageManagerService.java::installPackageTracedLI(){
PackageManagerService.java::installPackageLI(){
PackageParser.parsePackage()
//if replace: 替换安装
PackageManagerService.java::replacePackageLIF()
//else : 新包安装
PackageManagerService.java::installNewPackageLIF(){
//扫描Package
PackageManagerService.java::scanPackageTracedLI(){
PackageManagerService.java::scanPackageLI(){
PackageManagerService.java::scanPackageLI(){
PackageManagerService.java::scanPackageInternalLI()
}}}}
//把Package更新到Settings里
PackageManagerService.java::updateSettingsLI(){
PackageManagerService.java::updateSettingsInternalLI(){
//更新apk的权限
PackageManagerService.java::updatePermissionsLPw()
//再次把已安装apk的信息写入/data/system/package.xml
Settings.java::writeLPr()
}}
}}
//安装收尾
PackageManagerService.java::doPostInstall()
}}
}}}}}
要点:
- PKMS的一个安装入口:PackageManagerService.java::installPackageAsUser()
【adb install】
Pm.java::main(){
Pm.java::run(){
Pm.java::runInstall(){
final InstallParams params = makeInstallParams();
//打开一个Session
Pm.java::doCreateSession(){
PackageInstaller.java::createSession(){
PackageInstallerService.java::createSession(){
PackageInstallerService.java::createSessionInternal(){
PackageInstallerSession.java::PackageInstallerSession(){
}}}}
//把要安装的APK写入Session
Pm.java::doWriteSession(){
PackageInstaller.java::openSession(){
PackageInstallerService.java::openSession(){
PackageInstallerService.java::openSessionInternal(){
PackageInstallerSession.java::open(){
}}}
out = PackageInstaller.java::openWrite(){
PackageInstallerSession.java::openWrite(){
PackageInstallerSession.java::openWriteInternal(){
new RevocableFileDescriptor.java::RevocableFileDescriptor()
}}
ParcelFileDescriptor.java::AutoCloseOutputStream()
}
while(1){
in.read(buffer) //从inPath中读取
out.write(buffer) //写入out
}}
//提交:告诉PKMS开始安装
Pm.java::doCommitSession(){
PackageInstaller.java::Session.commit(){
PackageInstallerSession.java::commit(){
mHandler.obtainMessage(MSG_COMMIT).sendToTarget()
PackageInstallerSession.java::commitLocked(){
PackageManagerService.java::installStage(){
mHandler.sendMessage(INIT_COPY);//往后过程与上节部分重叠
}}}}}
}}}
要点:
- adb install会创建一个新进程,从pm.main函数开始执行
- 先创建与PackageInstallerService的连接
- PKMS的另一个安装入口:PackageManagerService.java::installStage()
未完待续……