大体了解Android应用安装过程及原理
Android应用安装的流程及路径:
应用安装涉及到如下几个目录:
system/app 系统自带的应用程序,无法删除
data/app 用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录
data/data 存放应用程序的数据
Data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
安装过程:
复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
卸载过程:
删除安装过程中在上述三个目录下创建的文件及目录。
Android应用安装的四种方式:
1.系统应用安装:开机时完成,没有安装界面
2.网络下载应用安装:通过market应用完成,没有安装界面
3.ADB工具安装:没有安装界面。
4.第三方应用安装:通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。
安装流程图
APK文件结构
APK(Android Package),可以看做是一个zip压缩包,可以通过解压缩工具解开,其文件结构如下:
目录 or 文件 | 描述 |
---|---|
assert | 存放的原生资源文件,通过AssetManager类访问 |
lib | native库文件 |
META-INF | 存放签名信息,用来保证APK包的完整性和系统的安全。系统安装APK时,应用管理器会按照对应算法对包里文件做校验,如果校验结果与META-INF中内容不一致,则不会安装这个APK。 |
res | 种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可 |
AndroidManifest.xml | 每个应用都必须定义和包含,描述应用的名字、版本权限、引用的库文件等信息。apk中的AndroidManifest.xml经过压缩,可以通过AXMLPrinter2工具解开。 |
classes.dex | 是JAVA源码编译后生成的JAVA字节码文件。但Android使用的dalvik虚拟机与标准的JAVA虚拟机不兼容,dex文件与class文件相比,不论是文件结构还是opcode都不一样。 |
resources.arsc | 编译后的二进制资源文件。 |
安装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对象的结构如图所示:
这个PackageParser包含了IntentFilter的信息,使得PMS可以根据Intent来获取一个Activity的信息。那么,PMS在得到PackageParser对象之后,接着会将这个APK的信息加入到PMS自身管理中去,比如将Activity的数据保存在mActivities对象中,将Provider的数据保存在mProviders对象中等,PKMS提供了好几个重要数据结构来保存这些数据,这些数据结构的相关信息如图所示:
除了解析和保存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包中加载而已。
重要参考:
应用程序安装流程
一文看懂 Android APK 安装的原理
大体了解Android应用安装过程及原理相关推荐
- Android应用安装过程及原理
Android应用安装的流程及路径: 应用安装涉及到如下几个目录: system/app 系统自带的应用程序,无法删除 data/app ...
- Android studio安装过程中入的坑的记录与记录
Android studio安装过程中入的坑的记录与记录 * 由于最近项目的需求,所以最近一直在配置安卓的开发环境,之前用的是Eclipse + ADT的模式开发的,配置环境也花了一些时间,但是由于谷 ...
- 解决Android Studio安装过程中“SDK tools directory is missing”的问题
解决Android Studio安装过程中"SDK tools directory is missing"的问题 参考文章: (1)解决Android Studio安装过程中&qu ...
- 【转】Android中APK安装过程及原理解析
应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作.APK是Android Package的缩写,即Android安装包.APK是类似Symbian ...
- Android中APK安装过程及原理解析
来自华为内部资料 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作.APK是Android Package的缩写,即android安装包.APK是 ...
- android备份:apk安装过程及原理,备份已安装应用的apk包技术实现方案
安卓设备上备份已安装应用的apk包技术实现方案 需求的目的 在只有安装应用, 没有该应用的apk,而我们又想活取应用apk,用来分享给别人,或是应用的备份, 说是应用的增量升级的, 怎么办? 本文将告 ...
- APK安装过程及原理详解
应用程序包的安装是android的特点 APK为AndroidPackage的缩写 Android应用安装有如下四种方式: 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过m ...
- Android apk安装过程
Android安装包.APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. Android应用安装有如下四种方式 1 ...
- 【SealDEV 倾情奉献】Android APK 安装过程详解
开发 Android 应用后,一般都会安装到手机上去运行,了解应用是如何安装到手机上的,可以更好的理解应用的本质,理解应用是如何运行的,在自己开发的应用遇到一些问题时,会从更深层次去分析,快速定位找到 ...
最新文章
- 机器学习案例学习【每周一例】之 Titanic: Machine Learning from Disaster
- 1075 PAT Judge (25 分)【难度: 一般 / 知识点: 多关键字排序】
- git commit时避免填写Commit Message
- 小白的算法初识课堂(part1)--二分查找法
- SDI, DVI, HDMI, DisplayPort的区别(Z)
- 怎么改变asp.net中.sln文件的默认生成路径
- 古剑2计算机中丢失,小编研习win7系统玩古剑奇谭2提示计算机中丢失Vcomp100.dl的图文方法...
- ruby wxruby rubytk的安装
- nginx tornado php,tornado+nginx+python 微信公众号接入配置
- python3.7版本简介_python3.7.2各平台安装简介
- wps如何设置文字环绕图片
- 我的在校项目:校园类app
- 渝粤题库 陕西师范大学 《教育科学研究方法》作业
- 74HC595D驱动程序
- Steven Lin 林嘉澍
- 手机安装软件解析包错误解决办法
- 基于matlab的网络通信RSRP切换仿真
- PHP计算每个月有多少工作日
- 阿里腾讯的文化产业路线
- 【Delphi学习】Form的borderstyle属性
热门文章
- 观念什么意思_俗语“女怕午时生,男怕子夜临”是啥意思?古人的忌讳有道理吗?...
- 自定义结构体-相机参数数据类型
- java 默认函数,java 构造函数默认修饰符
- 数字断路器获得商用认证
- JXJJOI2018_T2_tank
- opentracing
- spring 整合websoket(整理)
- MySQL中字段类型与合理的选择字段类型;int(11)最大长度是多少?varchar最大长度是多少?...
- Maven系列三Maven内置变量
- 概率论与数理统计常用英文词汇对照