应用安装源码阅读指南(下)
运用设备源码阅览攻略(上)是从PackageInstaller到PackageInstallerService,首要的效果是仿制apk以乳糖操纵子及处理设备的参数,本篇则会叙说运用是怎样设备到体系中
UML图
installStage()
- 将传入的
ActiveInstallSession
转为InstallParartc是什么意思ms
- 发送一个
INIT_COPY
音讯给设备线程,由于设备运用也是涉接口类型及到IO操作,这一步终究线程是什么意思是调用到HandlerParams.startCopy()
,这儿有个小留神的点是InstallParams extends HandlerParams
Handle线程是什么意思rParam架构师和程序员的差异s.staRTCrtCopy()
调用了两个笼统方法,hand接口crc过错计数leStarapp是什么意思tCopy()
和handleReturnCode()
,由于InstallParams是承继自HandlerParams,所以是别离调用到InstallParams.handleStartCoprtc是什么意思y()
和InstallParams.handleReturnCode()
InstallPara乳糖操纵子ms.handleStartCopy()
- 调用
PackageManagerS闰土刺猹erviceUtils.getMin接口crc过错计数imalPackageInfo
获取PackageLiteInfo,首要是manifest下的一些标签 - 假定存储空间短少,则尝试释放一些缓存尝试设备
- 判别
origin.existing
,假定不存在则需求调用sendIntegrityVerificationRequest()
和send让天秤倒追的星座Pack人体承受的最大电压ageVerificationRequest()
给运用appreciate商铺验证是否有异常信息,这儿底子apple都是要检测的,除非是体系内部移动package - 判别是否是回滚版别,假定是要回架构师和程序员的差异滚版别则需求发送一个广播,这个广播用来干嘛的暂时appointment也是不知道
InstallParams.handleappstoreReturnCode()
- 这儿有三个条件一线程池创立的四种起满足
mVerificati线程onCompleted,mVerificationCompleted,mAPPEnab接口类型leRollbackCompleted
才能够进入设备,所以一开始是不会进入,一般调用栈是从接口文档ha线程和进程的差异是什么ndleVeappearancerificationFinished()
或许是架构图模板handleIntegrityVerificationFinished()
- 调用
FileInstallArgs.copyApk()
这步会判别有没有之前有没有创立临时文件夹,假定没有就需求将apk仿制到data/app架构图目录 - 调用
processPending接口测验Install()
进入下一个阶段
processPendingInstall()
直接调用processInstallRequestsAsync()
processInstallRequestsAsync()
- 判别
success
,假定不成功则不会进行设备 - 顺次调用
FileInstallArgs.doPreInstall()
,installPackagesTracedLI()
,FileIn架构图怎样做wordstallArgs.do让天秤倒追的星座PostInstall()
,FileInstallArgs.doPreInst接口卡all()
和FileInstallArgs.doPostInstall接口的效果()
并没approach有做什么作业,最首要的设备作业仍是交给了installPackagrtc是什么意思esTracedLI()
- 调用
restoreAndPostInstall()
将设备效果发送给监听者
installPackagesTracedLI()
直接调用installPackagesLI()
installPackagesLI()
这个方法是设备最首要的部分,分为首要人头攒动的近义词三个阶段,接口和抽象类的差异预备,扫描,和提交。架构是什么意思
- 预备阶线程池段便是解析Package,然后生成对应的数据人头攒动的读音结构
- 扫描阶段是生成Package在体系中的特征,例如:uid,code方位,供认真实的包名,接口crc过错计数供认sharedUserId等等
- 提交阶段首要便是央求权限,以及将特征缓存在xRTCml中,便当下次开机的时分获取
接下来看一下详细的流程
- 参数,能够看到一开始就建立了许多Map,其实RTC这儿无需重视,只需当咱们要批量设备加了–multipackage参数的时分才可能会呈现,这儿能够假定In让天秤倒追的星座stallRequest列表中就一个app下载
- 调用
preparePackageLI()闰土刺猹
获取解析之后的PrepareResult - 调用
scaAPPnPackageTracedLI()
获取扫描之后的成appstore果ScanResult - 调用
r接口的效果econcilePackagesLocke接口文档d()
做一些一致性的处理 - 调用
commiappointmenttPackagesAPPLocked()
将特征进行线程撕裂者缓存到xml并央求权限 - 调用
executePostCommitSteps()
创立app的目录以及做dex的优化作业
preparePackageLI()
- 供认scanFlags和parseFlags
- 调用
PackageParser2.parsePackage()APP
进行扫描apk - 调用
ParsingPackageUt乳糖操纵子ils.getSigningDetails()
获取apapproachk的签名,当然,假定是设备运用会在之前PackageInstallerSession中获取签名 - 判别是否存在已设备运用,假定有,则需求进行签名验证或许更新签名,更新签名需求老的package包括,首先是检测之前设备的运用是否匹配,别的还要检测sharedUserId的运用是否匹配签名,不过不知道为何要在这校验签名,由于之后在
reconcilePackagesLocked()
也会进行校验接口crc过错计数 - 处理定义的权限,详细处理的逻辑能够不看,也不大能看懂,首要看抛出的异常是什么,底子能够供认是对重复定义的权限以及掩盖体系让天秤倒追的星座权限的一些权限进行检查
- 判别
FileInstallArgs.move
,然后设置运用abi(application binary interface),abi首要指的是二进制文件履行的架构,x86,arm这些或许32位64位体系 - 调用
FileInstallArgs.doRename()
,这儿才是真实生成运用目录的当地,在Androidapp下载11中应该是相似的目录结构/data/app/~~JfQyWVYLzBkOPnXEZp9YhQ==/com.example.anrdemo-lIG1Gajd9XweYWfdp7eYrw==/base.apk
- 调用
freezePackageForInstaappearancell()
向AMS发送间架构图用什么软件做断运用,或许假定设备的时分带有DELETE_DONT_KILL_APP
能够不杀死进程 - 整理
PrepareResult
的特征
PackageParser2.parsePackage()
详细逻辑见PkMS解析package攻略
ParsingPackageUtils.getSig线程池创立的四种ningDetails()
详细的逻辑见APK 签名计划 v2 验证,这个是签名的官方逻辑,详细的代码逻辑看了一遍和这个差不多,就不进行详细分析了
File架构是什么意思InstallArgs.doRename()
- 调用
g接口类型etNextCodePath()
生成新的apk目录,需求留神的是codeFile其实是代码的目录,并不是详细到apk傍边 -
Os.rename()
将旧的代码目录变成新的代码目录,举个比方,原本是/data/app/vmdl218208396.tmp
通过rename之后就变成/data/app/~~tJDAn7WYw1ddEHvCsow接口测验0fw==/com.example.anrdemo-na线程是什么意思n3乳糖操纵子xIC6appstorepBnBLiej45appreciate17eQ架构图模板==
不知道为什么要设置两层目录,Android Q中只需一层,没有后面带包名的那一层
scanPackag人头攒动eTracedLI()
直接调用scanPackageNewLI()
方法,scanPackageNewLI()
详细逻辑见Android 开机运用扫描攻略
optimisticallyRegisterAppId()
运用这个方法为运用恳架构求uid,之后一路调用到acquireAndRegisterNewAppIdLPw(),全部的uid都appreciate放线程安全在一个mAppIds的ArrayList下面,分配的规矩架构图用什么软件做如下:
- 看一下mAppIds中有没有没被占用的(有运用被闰土刺猹卸载了就会释放出来appearance了),能够尽量的让空间紧凑架构图用什么软件做,由于设备运用最大接口是什么也就10000个
- 假定都占满了,新增一个
reconcilePackagesLocked()
- 判别是不线程池的七个参数是已设备的运用,假定是则需求先调用
mayDeletePackageLocked()
结构需线程优化开不开求卸载的运用参数,预备卸载已设备的运用 - 再次校验线程池签名,不知道为什么要在
preparePackag线程的几种状况eLI()
中校验一次签名 - 构建
ReconciledPackage
- 搜集SharedLibrarappointmenty,能够线程的几种状况了解为线程是什么意思同享jar包,是虚拟机预先加载过的jar包,最常见的便是frame接口是什么work.jar,其次就架构是运用运用比较多的httpclient库。SharedLibrary分接口卡为接口是什么三种
- uses-library标签,required=接口和抽象类的差异true,对应在AndroidPackage的接口便是
getUsesLibr人头攒动aries()
- uses-library标签,required=true,RTC对应是
getUsesOptionalLibraries()
,这种用的是最多的,能够参看微信的AndroidManifest.xml - uses-srtc是什么意思tatic-library标签,这种标签现在还没见到人用过
getUsesStaticLibrari人体肠道结构图部位称号es()
- uses-library标签,required=接口和抽象类的差异true,对应在AndroidPackage的接口便是
cappstoreommitPackagesLocked()
- 判别是掩盖设备仍是新增,假定是掩盖设备,持续判别是不是体系运用
- 假定是体系运用,接口crc过错计数则调用
disableSystemPackageLPw()
- 假定不是,则调用
executeDeletePackageLIF()
卸载旧运用
- 假定是体系运用,接口crc过错计数则调用
- 调用
commitReconciledScanResultLocked()
进行持续更新运乳糖操纵子用在体系中的信息 - 调用
updateSettings接口和抽象类的差异LI()
将运用信息缓存,这样就不用appearance在下次开机的时分scan了,直接读取即可
commitReconciledScanResultLocked()
详细逻辑见commitReconciledScanResultLocked()
updateSettingsLI()
直接调用的updateSettingsInternalLI()
updateSettingsIn线程优化开不开ternalLI()
- 调用
PermissionManager线程撕裂者Service.upda架构师薪酬一月多少tePermissions()
,央求权限,这儿设备权限和掩盖闰土刺猹设备时之前央求了的运行时权限 - 假定掩盖设备的体系运用,则需求更新一些状况,体系运用假定没有特殊情况,都是为全部用户设备的
- enable全部用户的当时运架构师证书用
- 设置体系运用的人头攒动的近义词当时状况
- 重置运用的图标
- 更新overlay的动态库人体承受的最大电压信息
- 调用Settings.writeLPr()更新运用信息到xml中,详细的方位在
/data/system/packages.xml
,这儿有个让天秤倒追的星座比较幽默的当地是,每一次设备运用都是全写,而不是增量更新,是由于运用数量不多仍是为什么不太清楚
executePostCommitSteps()
这部分的操作底子都与C++层Installer相关了
- 调用
prepareAppDataAft接口测验erInstallLIF()
创立运用内部存储,比方sharedPreference, sqlite db文件便是存在这个目线程池的七个参数录傍边,开发者应当比较了解这块的目录 - 调用
PackageDexOptimize架构师薪酬一月多少r.performDexOpt.pe线程池创立的四种rformDexOpt()
进行初步优化 - 调用
notifyPartc是什么意思ckageChangeObserversOnUpdate()
通知native层的进让天秤倒追的星座程运线程用设备改变
总结
以上便是运用设备的全进程,并没有很深邃的代码,apple但是事务逻辑也是恰当恰当的杂乱,需求很强的这方面的经历才干看懂代码的意思,许多代码的规划只需遇到问题的时分才知道为什么这样写,当然,我研讨PkMS不过短线程的几种状况短一年让天秤倒追的星座多的时刻,许多代码我也没有看懂,里面凡是我越过的逻辑以及包括处理或许一些含糊不清的动词,底子上这块的逻辑我是没有搞透彻的。还app下载有一些appstore剩余的源码分析的内容没有弄清楚
- 签名的源码,原理我知道的差不多,但是从原理转换到源码的进程仍是差的远,这接口的效果儿罗列一下签名理论的几个文档
- 摘要、签名与数字证书人头攒动都是什么?
- Android 端 V1/V2架构图/V3 签名的原理
- APK 签名计划 v2
- Permissi线程和进程的差异是什么on这块的东西没研讨很深,但是应该不算杂乱,由于PermissionManagerService算是PkMS的一个子模块,别的和权限相关的还有AppOpsManager。这儿罗列一下相关的文档供查询
- 全方位了解Android权限之Android权限体系1
- Perm线程池的七个参数issions.md
- AppOps.md
- dex2oat的优化作业,这部分的原理还没搞清楚,发现dex相关的书本和文章仍是太少了