adb安装apk的流程

当执行adbinstalltest2.apk时,系统在com.android.server.pm.PackageManagerShellCommand的runInstall方法中处理安装请求。过程中发生了NullPointerException,具体在scanPackageOnlyLI方法中尝试调用String的length()方法时,传入了null对象。异常随后沿着安装流程回溯,涉及PackageManagerService的多个安装相关方法,如installPackagesLI和handleReturnCode等。问题可能与包的完整性验证失败有关,因为错误出现在AppIntegrityManagerServiceImpl的处理逻辑中。
摘要由CSDN通过智能技术生成

如果我们执行 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来异步处理。

  1. MSG_STREAM_VALIDATE_AND_COMMIT : streamValidateAndCommit()
  2. 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_ADDEDIntent.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 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值