一文看懂Android APK安装的原理_apk安装协议-程序员宅基地

技术标签: 安卓  Android开发  Android知识  Android原理  操作系统  安卓开发  APK安装原理  

一文看懂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包中加载而已。

本文完。


简书:https://www.jianshu.com/p/79e963715d1d
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chz429/article/details/97052635

智能推荐

值得借鉴的eQTL可视化形式-程序员宅基地

文章浏览阅读2.4k次。欢迎关注”生信修炼手册”!eQTL的分析结果本质就是一些调控基因表达的SNP位点,在结果展示时,最经典的可视化方式如下按照SNP分型结果对样本进行分组,用箱体图或者小提琴图的方式展示不同..._eqtl怎么做

pyc文件反编译为python代码_pyc反编译成py在线-程序员宅基地

文章浏览阅读5.6k次。pyc文件反编译为python代码在线工具新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入在线工具l新的改..._pyc反编译成py在线

对未来计算机的畅想作文1500,未来科技_1500字-程序员宅基地

文章浏览阅读572次。我我的老爸是一位教授,他共发明了一万多种东西,其中最出名的是机器人。有一种是家务机器人,它可以干很多的事情,比如说:洗衣服、做饭、扫地、拖地之类的家务,简单地说它就是家庭保姆,我的机器人的能量来源是家里的垃圾。只要机器人吃下垃圾,垃圾就会变成糖然后再变成电。它的身体像一个鸡蛋,有一双灵活的手,蓝蓝的大眼睛和一张大嘴巴。早上,我一起来,它就会自动帮我拿牙、牙膏和杯子,并把牙膏挤到牙刷上,把杯子里灌满..._对未来计算机的畅想

微信小程序音乐播放器+后台python毕业设计,java作业,编程作业,源码网站,毕业设计学习,答辩技巧-程序员宅基地

文章浏览阅读428次,点赞25次,收藏18次。利用MYSQL的数据独立性、安全性等特点,在软件项目中对数据进行操作,可以保证数据准确无误,并降低了程序员的应用开发时间。MYSQL的特点是支持多线程,能方便的对系统资源充分利用,有效提高速度,还提供多种方式途径来对数据库进行连接;MYSQL的功能相对弱小、规模也小,但本系统要求不高,MYSQL完全可以满足本网站使用。利用MYSQL建立系统数据库,不仅有利于数据处理业务的早期整合,还能利于发展后两种数据扩展的操作。

一步步带你解锁Stable Diffusion:SD 图生图功能保姆级入门指南「上」-程序员宅基地

文章浏览阅读731次,点赞8次,收藏5次。AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能技术紧密结合,在更多的领域得到广泛应用,对程序员来说影响至关重要。未来,AIGC技术将继续得到提高,同时也将与人工智能技术紧密结合,在更多的领域得到广泛应用。感兴趣的小伙伴,赠送全套AIGC学习资料和安装工具,包含AI绘画、AI人工智能等前沿科技教程,模型插件,具体看下方。

Python | 如何通过faker批量生成“逼真”的测试数据_faker 批量-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏6次。我们在项目中,常常需要使用一些假数据来做测试,比如客户名、电话号码、街道地址等等,平时我们基本是键盘一顿乱敲,或者随便造个什么字符串出来。现在你不用这样做了,用Faker就能满足你的一切需求。本文将结合实例,讲述Python 如何通过faker第三方库,批量伪造数据。包含两种保存方式:1,存入Excel;2,存入mysql数据库。本文框架结构为:1、faker简介2、faker使用3、常用方法一览4、实例:批量生成测试数据1、faker简介f..._faker 批量

随便推点

bzoj 3672: [Noi2014]购票_noi2014 购票-程序员宅基地

文章浏览阅读1k次。Description 今年夏天,NOI在SZ市迎来了她30周岁的生日。来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会。 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路连接。为了方便起见,我们将全国的 n 个城市用 1 到 n 的整数编号。其中SZ市的编号为 1。对于除SZ市之外的任意一个城市 v,我们给出了它在这棵树上的父亲城市_noi2014 购票

Shiro配置跳过权限验证_shiro 多端登录 app 端避免 @requirespermissions-程序员宅基地

文章浏览阅读9.6k次,点赞6次,收藏9次。通过重写Shiro PermissionAnnotationHandler 和Bean替换 完成 晚点完善_shiro 多端登录 app 端避免 @requirespermissions

小程序自定义tabbar到任意页面_mp-tabbar-程序员宅基地

文章浏览阅读1.3k次。很多时候不是tabbar的页面也需要加上tabbar导航所以我们需要去自定义它~(1)打开小程序官方文档按照图片中的箭头找到按需下载 选择里面的tabbar下载下来放入我们小程序的项目中(2)在需要自定义tabbar的页面json中引入我们下载好的weui{ "usingComponents": { "mp-tabbar": "../../weui/tabbar/tabbar..._mp-tabbar

JDBC连接错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。。。_caused by: com.microsoft.sqlserver.jdbc.sqlservere-程序员宅基地

文章浏览阅读5.9k次。错误提示:Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止_caused by: com.microsoft.sqlserver.jdbc.sqlserverexception: 通过端口 1433 连

(紫书自学系列)P117团体队列(Team Queue,UVa540)(C++)-程序员宅基地

文章浏览阅读392次,点赞2次,收藏6次。通过紫书的例题熟悉并了解队列中间插入和删除,模拟“急诊病人插队”情况。_uva540

Unity的GC优化原理及实践_unity 增量 gc-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏9次。1.概述1.1 简介内存管理一直都是一个让人比较头疼的东西,尤其是现在重度游戏越来越多,每一次卡顿、每一次内存增长对玩家来说都是一个比较差的体验。技术群里总是有人调侃,游戏开发久了人就会变成“GC怪”。事实上,在游戏开发过程中,随着功能的不停迭代,内存问题一直都不能松懈。 Unity 2018集成了正式版的 .NET 4.x 和 C#7.3 ,引入了ref return和ref locals,让值类型操作更加高效,UnsafeUtility让Unsafe编程和Native Memory操作更加方便。_unity 增量 gc

推荐文章

热门文章

相关标签