微信号:xuejie_mobile

介绍:我是程序媛学姐,伪90后.在这里和大家交流互联网技术和产品相关的信息,欢迎一起讨论.

Android打包系列——打包流程梳理

2016-08-04 15:57 某学姐

0x00 前言

通常一个团队都会有一个人专门负责打包,对于其他同学并不需要关注具体打包的细节。然而,我们存在的意义不是为了仅仅满足工作的需求,而是要让自己掌握的东西更多、不断成长。

关于打包序列文字,我的计划分成几篇文章来介绍:

  1. 打包流程梳理

  2. 多渠道打包

  3. 多渠道快速打包

  4. 自动化构建

本文介绍基本打包流程。

通常有2种打包方式:

  • Android Studio图形界面 点击run按钮

  • 命令行方式 gradlew assembleDebug, gradlew assembleRelease

方式1使用自动生成的debug keystore签名;方式2如果是Release包使用release keystore签名,如果是Debug包则使用debug keystore签名。

下面讲下从一堆源代码到产生apk文件的过程。

0x01 基本流程


上图是Android官方提供的打包简略流程图。清晰地展示了一个Android Project经过编译和打包后生成apk文件,然后再经过签名,就可以安装到设备上。

我们将一个实际的apk文件后缀改为zip并解压后,得到的内容如下:


和上图的描述一致。apk包内容包括:

  • classes.dex…

  • resources.arsc

  • assets

  • res

  • AndroidManifest.xml

  • META-INF

其中:

  1. res中图片和raw文件下内容保持原样,res中其他xml文件内容均转化为二进制形式;assets文件内容保持原样

  2. res中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类

0x02 详细流程

下面这张图是官网提供的详细流程图。


我们可以将整个打包过程概括为以下几步:

  1. 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)

  2. 处理.aidl文件,生成对应的Java接口文件

  3. 通过Java Compiler编译R.java、Java接口文件、Java源文件,生成.class文件

  4. 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex

  5. 通过apkbuilder工具,将aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk

  6. 通过Jarsigner工具,对上面的apk进行debug或release签名

  7. 通过zipalign工具,将签名后的apk进行对齐处理。

以上步骤均为必须,否则不能在设备上安装。

关于zipalign工具,根据名字就知道是个zip文件对齐的工具。使得apk中的资源文件偏离文件起始位置4个字节,从而可以通过mmap()直接访问,从而减少RAM占用。

更详细的流程,可以看下图。


0x03 参考文档

 
学姐的IT专栏 更多文章 Android打包系列——多渠道打包及签名 一篇日记而已 AndroidShareGroup技术周报(第二期) Android打包系列——多渠道快速打包 AndroidShareGroup技术周报(第三期)
猜您喜欢 Java对象内存分配原理及源码分析 LIVE第三期:SQL执行计划(SQL高级优化) 大数据解析盘中餐 —— "轻工业产品全生命周期信息追溯平台"告诉你食物原从何处来 网站更懂读者:戳中开发者痛点的文章推荐算法 测试向开发行进,论自动化测试