在分析安装过程之前,需要先了解一下 Android 项目是如何经过编译->打包生成最终的 .apk 格式的安装包。谷歌有一张官方图片来描述 apk 的打包流程,如下图所示。
Android 应用模块的构建过程(如上图所示)遵循以下一般步骤:
在构建过程结束时,你将拥有应用的调试 APK 或发布 APK,可用于部署、测试或发布给外部用户。
以上是官方介绍。下面咱开始自己的理解。
开始新项目时,Android Studio 会自动为您创建其中的部分文件,并为其填充合理的默认值。所以不管一个完整的 Android 项目可能包含多个 module,而从宏观上看每一个 module 中的内容可以分为 2 部分:
因此整个项目的编译打包过程也是针对这 2 部分来完成,如下图:
资源文件包括项目中 res 目录下的各种 XML 文件、动画、drawable 图片、音视频等。AAPT 工具负责编译项目中的这些资源文件,所有资源文件会被编译处理,XML 文件(drawable 图片除外)会被编译成二进制文件,所以解压 apk 之后无法直接打开 XML 文件。但是 assets 和 raw 目录下的资源并不会被编译,会被原封不动的打包到 apk 压缩包中。
资源文件编译之后的产物包括两部分:resources.arsc 文件和一个 R 文件。前者保存的是一个资源索引表,后者定义了各个资源 ID 常量。这两者结合就可以在代码中找到对应的资源引用。如 下图 文件:
可以看出,R 文件 中的资源 ID 是一个 4 字节的无符号整数,用 16 进制表示。其中,最高的 1 字节表示 Package ID,次高的 1 个字节表示 Type ID,最低的 2 字节表示 Entry ID。
resources.arsc 相当于一个资源索引表,也可以理解为一个 map 映射表。其中 map 的 key 就是 R.java 中的资源 ID,而 value 就是其对应的资源所在路径。实际上 resources.arsc 里面还有其他信息,关于 resource.arsc 的解析可以参考 解析编译之后的Resource.arsc文件格式。
项目中的源代码首先会通过 javac 编译为 .class 字节码文件,然后这些 .class 文件连同依赖的三方库中的 .class 文件一同被 dx(D8) 工具优化为 .dex 文件。如果有分包,那么也可能会生成多个 .dex 文件。
实际上源代码文件也包括 AIDL 接口文件编译之后生成的 .java 文件,Android 项目中如果包含 .aidl 接口文件,这些 .aidl 文件会被编译成 .java 文件。
最后使用工具 APK Builder 将经过编译之后的 resource 和 .dex 文件一起打包到 apk 中,实际上被打包到 apk 中的还有一些其他资源,比如 AndroidManifest.xml 清单文件和三方库中使用的动态库 .so 文件。
APK(Android Package),APK 文件由一个 Zip 压缩文件组成,其中包含构成应用的所有文件。这些文件包括 Java 类文件、资源文件和包含已编译资源的文件。其文件结构如下:
apk 创建好之后,还不能直接使用。需要使用工具 jarsigner 对其进行签名,因为 Android 系统不会安装没有进行签名的程序。签名之后会生成 META_INF 文件夹,此文件夹中保存着跟签名相关的各个文件。
PackageManagerService(PKMS) 在安装过程中会检查 apk 中的签名证书的合法性。
常理来说,签名之后的 apk 应该是可以正常安装使用了,但是实际打包过程还会多一步使用工具 zipalign 对 apk 优化操作。
zipalign:是一种 zip 归档文件对齐工具。它对 apk 中的未压缩资源(图片、视频等)进行对齐操作,相对于文件开头都是对齐的。这样一来,你便可直接通过 mmap(2) 访问这些文件,而无需在 RAM 中复制相关数据并减少了应用的内存用量。
在将 APK 文件分发给最终用户之前,应该先使用 zipalign 进行优化。如果你使用 Android Studio 进行构建,则此步骤会自动完成。
mmap(2):mmap, munmap - 将文件或设备映射或取消映射到内存中。
至此一个完整的 apk 安装包就创建成功。
整个编译打包流程可以用下图来描述:
无论如何,在实现 AIDL 之前,请您务必理解绑定服务(绑定服务是 Service 类的实现,可让其他应用与其进行绑定和交互。)。
这里说一下,aab包打包正常,传到Google后台,谷歌还是会生成apk 文件提供给玩家下载,而不是直接使用aab文件。
Apk 已经打包好了。后面咱们看看 Android 应用是如何启动的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有