Android
发布时间:2026-07-27 | 浏览:1
Notifications You must be signed in to change notification settings
Files Expand file tree
File metadata and controls
包管�机制
所谓包,其å®�是一ç§�æ–‡ä»¶æ ¼å¼�,比如apk包ã€�jar包ç‰ã€‚包管ç�†è€…一个è�Œèƒ½å°±æ˜¯è¯†åˆ«ä¸�å�Œçš„包,维护这些包的信æ�¯ã€‚当有一个新的包进入或离开Android世界,都需è¦�å�‘包管ç�†è€…申报一下,其他管ç�†éƒ¨åˆ†è¦�è�·å�–包的具体信æ�¯ï¼Œä¹Ÿéƒ½éœ€è¦�å�‘包管ç�†è€…申请。包管ç�†æœºåˆ¶çš„æ ¸å¿ƒæ˜¯PackageManagerService(下文称PMS),它负责对包进行管ç�†ã€‚
apk的安装方法
开机过程ä¸å®‰è£…:系统在æ¯�次开机会安装系统应用
adb工具安装:adb命令安装apk
手动安装:平时下载的apk,通过系统安装器PackageInstaller(它是系统内置的应用程�,用�安装和�载应用程�)�安装apk,是有安装界�的
商店应用安装:商店上安装app,没有安装界�
PackageInstaller
它是安�的一个系统app,用�安装和�载app的。
我们主è¦�æ�¥åˆ†æ��一下手动安装apk的情况,系统会打开一个安装界é�¢ï¼Œæˆ‘们å�¯ä»¥ç»§ç»å®‰è£…å’Œå�–消,应该大家都比较熟悉。这个界é�¢å°±æ˜¯PackageInstaller这个appä¸çš„PackageInstallerActivity。
安装之�的过程
当我们点击安装的时候,会跳转到å�¦ä¸€ä¸ªç•Œé�¢InstallInstalling,最终会将需è¦�安装的apkä¿¡æ�¯é€šè¿‡PackageInstallerSessionä¼ ç»™PMS。
ä»�这里开始,就æ�¥åˆ°äº†PMS,installStage()方法就是æ£å¼�安装apk的过程了。整个apk的安装过程大致分为2æ¥ï¼š
拷�安装包
拷�安装包
ç›´æ�¥æ�€åˆ°PMSçš„installStage方法,看看æµ�ç¨‹æ˜¯ä»€ä¹ˆæ ·çš„
注æ„�到,上é�¢çš„代ç �å�ªä¸�过是å�‘了个消æ�¯ï¼Œæˆ‘们看看是æ€�么处ç�†è¿™æ�¡æ¶ˆæ�¯çš„
把Messageçš„objå�–出æ�¥ï¼Œå®�际上就是之å‰�ä¼ å…¥çš„InstallParams,直æ�¥å�»InstallParamsçš„startCopy()方法
å�Ÿæ�¥InstallParams自己并没有å®�ç�°startCopy方法,而是由父类HandlerParamså®�ç�°çš„,里é�¢å�ªæœ‰2个抽象方法,这2个抽象方法都是å�ç±»å�»å®�ç�°çš„。这里其å®�用到了一ç§�设计模å¼�,å�«æ¨¡æ�¿æ–¹æ³•。下é�¢æˆ‘们继ç»çœ‹handleStartCopy()å’ŒhandleReturnCode()çš„å�ç±»å®�ç�°ï¼Œå…ˆçœ‹handleStartCopy()。
在handleStartCopy()方法ä¸ï¼Œæˆ‘们å�ªéœ€è¦�知é�“它创建了安装å�‚数对象InstallArgså�³å�¯ã€‚ç„¶å��在handleReturnCode()方法ä¸ä¼šç”¨åˆ°å®ƒ
利用之å‰�创建好的InstallArgs对象,å®�际是其å�ç±»FileInstallArgsç±»å�‹ï¼Œç„¶å��调用其copyApk方法进行安装包的拷è´�æ“�作。
在FileInstallArgsçš„copyApk方法ä¸è°ƒç”¨doCopyApk方法,主è¦�干的事情就是3ä¸ªï¼šé¦–å…ˆåˆ›å»ºå®‰è£…åŒ…çš„ç›®æ ‡è·¯å¾„ï¼Œæ–¹ä¾¿å¾…ä¼šå„¿å¤�制到这里æ�¥ï¼Œå®ƒçš„å®�际路径是 /data/app/com.example ;其次将安装包apkæ‹·è´�åˆ°ç›®æ ‡è·¯å¾„ä¸ï¼›æœ€å��是将apkä¸çš„动æ€�库.so文件也拷è´�åˆ°ç›®æ ‡è·¯å¾„ä¸ã€‚å…¶å®�ç�°éƒ½æ˜¯ä¸€äº›IOçš„æ“�作,就ä¸�ç»§ç»å¾€ä¸‹çœ‹äº†ã€‚
安装包在这一æ¥éª¤å®Œæˆ�之å��,就å˜åœ¨äº� /data/app/com.example/base.apk ä¸äº†ï¼Œåˆ°è¿™é‡Œå®‰è£…包的拷è´�工作是完æˆ�了。
在上é�¢InstallParams#handleReturnCode()ä¸ï¼Œè°ƒç”¨processPendingInstall方法处ç�†å®‰è£…:
安装过程是放å�线程里é�¢è¿›è¡Œçš„,这里的mHandler用的ä¸�是主线程的Looper,而是一个HandlerThread里é�¢çš„Looper。大致处ç�†æµ�程如下:
预安装:检查当å‰�安装包的状æ€�,确ä¿�安装ç�¯å¢ƒæ£å¸¸ï¼Œå¦‚æ�œå®‰è£…ç�¯å¢ƒæœ‰é—®é¢˜ä¼šæ¸…ç�†æ‹·è´�文件
安装:真æ£çš„安装阶段在installPackagesTracedLI方法ä¸ï¼Œåœ¨é‡Œé�¢æ·»åŠ è·Ÿè¸ªTrace,最å��是调用的installPackageLI进行安装
安装收尾工作:检查状æ€�,如æ�œå®‰è£…ä¸�æˆ�åŠŸï¼Œåˆ é™¤æ�‰ç›¸å…³ç›®å½•文件
通知æ“�作:å�‘é€� POST_INSTALL 消æ�¯ï¼Œç„¶å��通过广æ’ã€�å›�è°ƒæ�¥å�£ç‰æ–¹å¼�通知系统ä¸çš„其他组件,有新的Package安装或å�‘生了改å�˜
所以说installPackagesTracedLI是安装apkçš„æ ¸å¿ƒä»£ç �:
installPackagesLI()方法内部�常��,上�简�调了一些主�程拿出�。
Prepare准备:分æ��任何当å‰�安装状æ€�,分æ��包并对其进行åˆ�始验è¯�。 在这一阶段首先是将apk文件解æ��出æ�¥ï¼Œè§£æ��它的AndroidManifest.xml文件,将结æ�œè®°å½•èµ·æ�¥ã€‚我们平时在清å�•文件ä¸å£°æ˜�çš„Activityç‰ç»„件就是在这一æ¥è¢«è®°å½•到Frameworkä¸çš„,å��ç»æ‰�能通过startActivityç‰æ–¹å¼�å�¯åЍæ�¥ ç„¶å��是对ç¾å��ä¿¡æ�¯è¿›è¡ŒéªŒè¯� 设置相关æ�ƒé™� 生æˆ�安装包abi dex优化,å®�际为dex2oatæ“�作,将apkä¸çš„dex文件转æ�¢ä¸ºoat文件
在这一阶段首先是将apk文件解æ��出æ�¥ï¼Œè§£æ��它的AndroidManifest.xml文件,将结æ�œè®°å½•èµ·æ�¥ã€‚我们平时在清å�•文件ä¸å£°æ˜�çš„Activityç‰ç»„件就是在这一æ¥è¢«è®°å½•到Frameworkä¸çš„,å��ç»æ‰�能通过startActivityç‰æ–¹å¼�å�¯åЍæ�¥
ç„¶å��是对ç¾å��ä¿¡æ�¯è¿›è¡ŒéªŒè¯�
设置相关��
生�安装包abi
dex优化,å®�际为dex2oatæ“�作,将apkä¸çš„dex文件转æ�¢ä¸ºoat文件
Scan扫æ��:考虑到prepare䏿”¶é›†çš„上下文,询问已分æ��的包
Reconcile调和:在彼æ¤çš„上下文和当å‰�系统状æ€�ä¸éªŒè¯�扫æ��的包,以确ä¿�安装æˆ�功
Commitæ��交:æ��交所有扫æ��的包并更新系统状æ€�。这是安装æµ�ä¸å”¯ä¸€å�¯ä»¥ä¿®æ”¹ç³»ç»Ÿçжæ€�的地方,必须在æ¤é˜¶æ®µä¹‹å‰�确定所有å�¯é¢„测的错误
完�APK的安装,�次执行dex优化(如有必�),然�将apk的安装�作交给installed进程进行apk的安装
首先将apk的信æ�¯äº¤ç»™PMS进行处ç�†ï¼Œç„¶å��æ‹·è´�apk,然å��装载代ç �,最å��交给installed进程æ�¥å®Œæˆ�安装。
APP的安装过程
应用程�安装�程
Android包管�机制(一)PackageInstaller的�始化
APK安装æµ�程详解12——PMSä¸çš„æ–°å®‰è£…æµ�程上(æ‹·è´�)
Android10_��机制系列_PMS的�动�应用的安装过程
Android 10.0 PackageManagerService(四)APK安装�程-[Android��之路]