深色模式
Android apk 的安装过程
解析APK文件
系统使用PackageParser
类来解析APK文件,提取其中的关键信息:
解压APK
APK本质上是一个ZIP压缩包,系统首先解压部分必要的文件进行解析,如:
AndroidManifest.xml
classes.dex
- 资源文件(res目录)
META-INF
目录下的签名文件
解析AndroidManifest.xml
AndroidManifest.xml
包含应用的基本信息、组件声明、权限声明等。解析过程中,系统会提取:
- 包名(Package Name)
- 版本信息(Version Code和Version Name)
- 应用组件(Activities, Services, Broadcast Receivers, Content Providers)
- 所需权限(Permissions)
- 最低和目标SDK版本(minSdkVersion, targetSdkVersion)
解析DEX文件
classes.dex
包含应用的可执行代码。系统会读取DEX文件的信息,为后续的字节码优化做准备。
提取资源文件
系统解析资源文件(如图像、布局、字符串),并准备好供应用运行时使用。
验证APK签名
为了确保应用的完整性和来源,系统会进行以下验证:
读取签名文件
从META-INF
目录中提取签名文件(如CERT.RSA
、CERT.SF
)。
验证签名有效性
- 数字签名验证:使用开发者的公钥验证APK文件的签名,确保APK未被篡改。
- 签名算法:支持多种签名算法,如RSA、ECDSA等。
签名一致性检查
如果设备上已安装同包名的应用,系统会检查新APK的签名是否与已安装应用一致,以防止恶意替换应用。
权限检查
系统根据AndroidManifest.xml
中声明的权限,执行以下操作:
安装时权限
显示应用请求的所有权限,用户需在安装前同意这些权限(主要适用于Android 5.1及以前版本)。
运行时权限
从Android 6.0开始,某些敏感权限需要在应用运行时动态请求,安装时只显示部分权限。
优化DEX字节码
为了提升应用的性能,系统对DEX文件进行优化:
ART编译(Ahead-Of-Time Compilation)
- 编译过程:将DEX字节码编译为设备的机器码,生成
.oat
文件。 - 存储位置:编译后的文件存储在
/data/dalvik-cache/
或相应的优化目录中。 - 好处:加快应用启动速度,提升运行效率。
验证DEX文件
确保DEX文件的完整性和正确性,防止恶意代码注入。
复制和安装资源
系统将APK文件解压,并将资源文件复制到适当的位置:
存放APK文件
- 路径:通常位于
/data/app/包名-1/base.apk
,根据设备和安装方式不同,路径可能有所变化。
资源优化
- AAPT工具:使用Android Asset Packaging Tool(AAPT)优化和打包资源文件。
- 资源索引:生成资源索引文件,加快资源的访问速度。
注册应用
包管理器将应用的信息注册到系统中,具体包括:
更新数据库
将应用的元数据(包名、版本、组件、权限等)插入到Package Manager的数据库中。
注册应用组件
注册四大组件
生成启动器图标
系统在应用抽屉或主屏幕生成应用图标,并关联应用的启动入口。
创建用户数据目录
系统为新安装的应用创建专属的数据目录,用于存储应用的私有数据和设置:
目录结构
- 内部存储:
/data/data/包名/
,包含应用的私有文件、数据库、共享偏好等。 - 缓存目录:
/data/data/包名/cache/
,用于存放临时缓存数据。
权限设置
设置应用数据目录的访问权限,确保只有该应用自身和系统相关进程可以访问。
完成安装
所有安装步骤完成后,系统会进行以下操作:
通知用户
通过通知栏或弹窗提示用户安装成功。
生成快捷方式
在主屏幕或应用抽屉生成应用的快捷方式,用户可以直接点击启动应用。
启动应用(可选)
根据用户操作,系统可能自动启动应用,展示首次启动的界面。
卸载过程
如果卸载应用,系统会执行相反的过程:
删除应用文件
从/data/app/
中删除APK和优化后的代码文件。
移除用户数据
删除应用的私有数据目录(如/data/data/包名/
),清理所有与应用相关的数据。
更新注册信息
从Package Manager的数据库中移除应用的元数据和组件信息。
移除快捷方式
从主屏幕或应用抽屉移除应用的快捷方式。