来自:https://zhuanlan.zhihu.com/p/79973102
我们知道,Windows应用程序的安装包是一个可执行的压缩包,安装的过程是把压缩包中的数据和依赖库拷贝到安装目录,再在桌面或启动栏创建快捷方式,那么安卓的APK安装过程是不是也是这样的呢
apk:
APK包是个简单的压缩包,可以用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系统运行一个应用程序时会用到的数据和代码,
安装过程
- 与应用相关的一些目录
/system/priv-app:系统应用安装路径,Android 4.4+ 开始出现,区分系统应用权限,拥有 SignatureOrSystem 权限,此目录下的 service 具有保活能力
/system/app:系统应用安装路径,权限略低于 priv-app 目录下的应用,放置比如厂商内置应用
/data/app:用户应用安装路径,应用安装时将 apk 复制到此目录下
/data/data:用户应用数据存放路径,存在沙箱隔离
/data/dalvik-cache:存放应用的dex 文件
/data/system:存放应用安装相关文件
packages.xml 是一个应用的注册表,在解析应用时创建,有变化时更新,记录系统权限,各应用信息,如name, codePath, flag, version, userid,下次开机时直接读取并添加到内存列表
package.list 指定应用的默认存储位置,userid 等
- 应用安装过程总结
将应用 apk 拷贝到指定目录下
解压 apk,将 dex 文件拷贝到 /data/dalvik-cache 目录,创建 /data/data/ 数据目录
解析 AndroidManifest.xml 及其他资源文件,提取应用包信息,注册到 packags.xml 中
由 Launcher 进程通过 PMS 取出所有应用程序,展示在桌面上
网友评论