一文看懂Android APK安装的原理

前言

大家有没有想过一个应用的APK是怎么被安装到安卓手机上的,安装的本质是什么?我们知道,Windows应用程序的安装包是一个可执行的压缩包,安装的过程是把压缩包中的数据和依赖库拷贝到安装目录,再在桌面或启动栏创建快捷方式,那么安卓的APK安装过程是不是也是这样的呢?本文将为大家解答这些问题。

APK包的构成

首先,我看一下APK包的构成,Android的APK包和Windows应用程序安装包是不同的,它只是个简单的压缩包,没有可执行的能力,我们还可以用zip工具直接解压它。

一个APK包含以下这些文件:

  • META-INF目录:包含两个签名文件(CERT.SF和CERT.RSA),以及一个manifest文件(MANIFEST.MF)
  • assets目录:包含工程中的asset目录下的文件,可以使用AssetManager获取
  • res目录:包含那些没有被编译到resources.arsc的资源
  • lib目录:包含适用于不同处理器的第三方依赖库,这里边可以有多个子目录,比如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, 以及mips
  • resources.arsc文件:存储编译好的资源,包括项目工程中的res/values目录里的xml文件,它们都被编译成二进制格式,也包括一些路径,指向那些没有被编译的资源,比如layout文件和图片
  • classes.dex文件:项目中的java类都被编译到该dex文件,这个文件可以被Android的Dalvik/ART虚拟机解析。
  • AndroidManifest.xml:二进制格式的manifest文件,这个文件是必须的。

这些文件是Android系统运行一个应用程序时会用到的数据和代码,下面介绍系统如何安装一个APK包。

安装APK

我们安装应用程序,最常用的方法就是在PC上运行命令adb install 加APK的文件路径,回车等待Android设备安装完成,安装成功命令行会显示Success。那么其内部是怎样的一个过程呢?

1. 将APK包push到手机
首先,adb会将PC端的APK文件push到Android设备的/data/local/tmp目录下,一些手机会将拷贝的进度反馈给adb客户端,于是PC上的命令行会展示拷贝的进度。

2. 执行pm命令
PC端的adb程序会向Android端的adbd发送shell:pm命令,于是adbd会向系统的PackageManagerService(PMS)进程发送消息,通知其安装apk包。这里我有两个理解:
理解一:我们平常也可以在adb shell上执行pm命令与PMS交互,那么pm应该是个独立的进程,adbd执行pm命令,是启动了pm这个进程,这个进程再向PMS进程发送消息,通知其安装APK。
理解二:adbd直接向PMS进程发送消息,通知其安装APK。
不知哪个正确,这个有待继续研究,如果有童鞋了解这个,希望能不吝赐教。

3. 触发安装过程
PMS首先将APK包拷贝到另外一个目录/data/app,这个目录是非系统应用的apk存放的目录,与之相对应的,系统应用的apk存放的目录是/system/frameworks、/system/app和/vendor/app。
PMS内部有个AppDirObserver类,其监听着/data/app目录的变化,当apk被复制到/data/app目录之后,该类随即触发PMS对APK进行解析。

4. APK的解析
我们可以先想想,Android系统是如何启动一个APP的?比如点击屏幕上的应用图标,然后一个Activity就被启动了。这个过程中,桌面程序Launcher先是向ActivityManagerService(AMS)进程发送了一个Intent,AMS随即会将这个Intent扔给PMS,PMS则解析这个Intent得到Activity的信息给到AMS,然后AMS会启动一个空进程,并通知该进程创建该Activity。那么PMS为什么会有这个Activity的信息呢?

这就是PMS解析APK要做的事情了,而解析APK的时机又要分成两种场景:

1. 系统启动时解析APK
Android系统在启动的时候,会启动一个system_server进程,这个进程驻留着系统多个重要的服务,其中便包含了与APK最相关的PackageManagerService服务,这个服务在启动的时候,会扫描Android系统中几个目标文件夹中的APK,对每个APK进行解析。
2. 安装过程中解析APK
安装一个apk的过程,PMS也会对这个APK进行解析,其调用的是PackageManagerService.java的scanPackageLI()方法,其实在系统启动时扫描全部apk的过程也是调用该方法。

可以这样理解,系统启动的时候,是解析已经安装的所有APK,而安装单个APK时,则是用同样的方法解析这个APK,过程是一样的。

那么解析APK具体做的是什么事情呢?

其中主要的过程就是解析APK中的AndroidManifest.xml文件,将APK的关键信息四大组件信息、权限信息等存储在内存中的PackageParser对象中,PackageParser对象的结构如图所示:

来源:https://blog.csdn.net/Innost/article/details/47253179

这个PackageParser包含了IntentFilter的信息,使得PMS可以根据Intent来获取一个Activity的信息。那么,PMS在得到PackageParser对象之后,接着会将这个APK的信息加入到PMS自身管理中去,比如将Activity的数据保存在mActivities对象中,将Provider的数据保存在mProviders对象中等,PKMS提供了好几个重要数据结构来保存这些数据,这些数据结构的相关信息如图所示:

来源:https://blog.csdn.net/Innost/article/details/47253179

除了解析和保存APK的核心数据,PMS还会创建应用程序目录:/data/data/包名,同时提取apk中的dex文件并保存到/data/dalvik-cache中,如果该APK包含了native动态库,则需要将它们从APK文件中解压并复制到对应目录中,以及对APK进行dex优化,还有其它一些细节比如APK签名的校验,杀死APK所在进程(覆盖安装的情况)等,安装过程的最后,会发送ACTION_PACKAGE_ADDED广播,通知所有其它应用有新应用安装了。

总结

至此,APK安装过程就结束了。纵观整个过程,apk安装的关键就是解析AndroidManifest.xml,将重要的信息保存在PMS进程的内存中,以保证后续启动这个应用程序的组件时,可以在PMS中找到这个组件的信息。我们本来认为的更重要的代码只是进行dex优化后简单地提取到一个目录中而已,另外,APK中的资源并没有被处理,而是在启动应用进程的时候,动态去从APK包中加载而已。

本文完。


csdn:https://blog.csdn.net/chz429/article/details/97052635
版权声明:本文为博主原创文章,转载请附上博文链接!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容