如果我们执行 adb install test2.apk
,系统是如何处理的呢?
源码位置在:com.android.server.pm.PackageManagerShellCommand#runInstall
1 以下为一些有用的调用堆栈信息.
01-17 15:43:25.058 439 519 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: PackageManager
01-17 15:43:25.058 439 519 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.scanPackageOnlyLI(PackageManagerService.java:11869)
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.scanPackageNewLI(PackageManagerService.java:11213)
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.scanPackageTracedLI(PackageManagerService.java:10952)
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.installPackagesLI(PackageManagerService.java:17090)
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.installPackagesTracedLI(PackageManagerService.java:16459)
01-17 15:43:25.058 439 519 E AndroidRuntime: at com.android.server.pm.PackageManagerService.lambda$processInstallRequestsAsync$22$PackageManagerService(PackageManagerService.java:14625)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService.processInstallRequestsAsync(PackageManagerService.java:14623)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService.processPendingInstall(PackageManagerService.java:14610)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService.access$3600(PackageManagerService.java:479)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService$InstallParams.handleReturnCode(PackageManagerService.java:15748)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService$InstallParams.handleIntegrityVerificationFinished(PackageManagerService.java:15702)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1992)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1684)
01-17 16:25:05.593 440 525 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
01-17 16:25:05.593 440 525 E AndroidRuntime: at android.os.Looper.loop(Looper.java:223)
01-17 16:25:05.593 440 525 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:67)
01-17 16:25:05.593 440 525 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:44)
at com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.setIntegrityVerificationResult(PackageManagerService.java:25447)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at com.android.server.integrity.AppIntegrityManagerServiceImpl.handleIntegrityVerification(AppIntegrityManagerServiceImpl.java:364)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at com.android.server.integrity.AppIntegrityManagerServiceImpl.access$100(AppIntegrityManagerServiceImpl.java:97)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at com.android.server.integrity.AppIntegrityManagerServiceImpl$1.lambda$onReceive$0$AppIntegrityManagerServiceImpl$1(AppIntegrityManagerServiceImpl.java:180)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at com.android.server.integrity.-$$Lambda$AppIntegrityManagerServiceImpl$1$AQicMJqZVSufBnAD8HJ81gPtf7Y.run(Unknown Source:4)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:938)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at android.os.Looper.loop(Looper.java:223)
01-17 11:38:40.056 1955 2035 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.pm.PackageInstallerSession.commit(PackageInstallerSession.java:1151)
at android.content.pm.PackageInstaller$Session.commit(PackageInstaller.java:1243)
at com.android.server.pm.PackageManagerShellCommand.doCommitSession(PackageManagerShellCommand.java:3365)
at com.android.server.pm.PackageManagerShellCommand.doRun
com.android.server.pm.PackageInstallerSession.commit()
dispatchStreamValidateAndCommit
com.android.server.pm.PackageInstallerSession.handleStreamValidateAndCommit(PackageInstallerSession.java:1210)
com.android.server.pm.PackageManagerService.installStage(PackageManagerService.java:13097)
com.android.server.pm.PackageInstallerSession.installNonStagedLocked(PackageInstallerSession.java:1756)
com.android.server.pm.PackageInstallerSession.handleInstall(PackageInstallerSession.java:1712)
com.android.server.pm.PackageInstallerSession.access$100(PackageInstallerSession.java:162)
com.android.server.pm.PackageInstallerSession$4.handleMessage(PackageInstallerSession.java:449)
2 客户端安装apk的流程:
使用 PackageInstaller.Session()接口 :
createSession
session.write
session.commit
3 服务端的处理
1
提交:
com.android.server.pm.PackageInstallerSession#commit
然后发送 MSG_STREAM_VALIDATE_AND_COMMIT 给 mHandler , 让mHandler来异步处理。
- MSG_STREAM_VALIDATE_AND_COMMIT : streamValidateAndCommit()
- MSG_INSTALL : 调用 PackageManagerService#installStage(),然后installStage 发送 INIT_COPY 消息。
2
com.android.server.pm.PackageManagerService.PackageHandler.doHandleMessage 处理 INIT_COPY 消息:
INIT_COPY : 调用 InstallParams.handleStartCopy() 和 InstallParams.handleReturnCode();
InstallParams.handleStartCopy 调用
com.android.server.pm.PackageManagerService.InstallParams.sendIntegrityVerificationRequest 发送广播 : ACTION_PACKAGE_NEEDS_INTEGRITY_VERIFICATION,
这个广播定义在: com.android.server.integrity.AppIntegrityManagerServiceImpl#handleIntegrityVerification
InstallParams.handleReturnCode: apk的复制和安装 。
apk的复制 :PackageManagerService.FileInstallArgs#doCopyApk
apk的安装:PackageManagerService#installPackagesLI
com.android.server.backup.UserBackupManagerService#restoreAtInstall 调用 PackageManagerService.finishPackageInstall 调用
PackageManagerService.handlePackagePostInstall ,这个方法会发送各种广播:
Intent.ACTION_PACKAGE_ADDED
和 Intent.ACTION_PACKAGE_REPLACED
以及通知 mPackageListObservers 。
PackageManagerService.notifyPackageAdded notifyPackageChanged
几个重要的方法:
com.android.server.pm.PackageManagerService.finishPackageInstall
com.android.server.pm.PackageManagerService#restoreAndPostInstall
PackageInstallerSession 何时创建 ?
客户端调用 :
final int sessionId = mInterface.getPackageInstaller()
.createSession(params, installerPackageName, translatedUserId);
最终ipc调用
com.android.server.pm.PackageInstallerService#createSession,创建好的session 放入mSessions 。