【朝花夕拾】Android性能篇之(四)Apk打包

前言

       原文:【朝花夕拾】Android性能篇之(四)Apk打包

        APK,即Android Package,是将android程序和资源整合在一起,形成的一个.apk文件。相信所有的Android程序员是在IDE的帮助下,完成打包轻而易举,但对打包流程真正清楚的可能并不多。本章的内容比较简单,也是非常基础的内容,但是对理解android应用的结构却有很大的帮助。笔者写这篇文章的目的,一方面是为了弥补这方面的盲点,回顾和梳理apk打包方面的理论知识点;第二方面,是为了给后续写Android虚拟机知识做铺垫,进而去研究android的性能优化,这也是把这篇文章放到Android性能优化系列文章当中的原因;第三方面,也是为了方便读者理解Android虚拟机的相关内容。

       对于在IDE,如Android Studio上操作打包的过程,本文不做演示,对于更深入的源码分析,也不在本文讨论之列,出于前面说到的原因,本文只简单阐述其打包流程,本文主要内容如下:


一、apk构建流程图

       以下截图为Google官方提供的详细的apk构建过程图,其中包含了各个环节所用到的工具和中间相关的文件。

                         apk构建过程(绿色部分为对应环节工具,蓝色部分为相关文件)


二、构建过程中所用工具

        如下截图展示了apk构建过程中所使用的部分工具,这些工具大部分都在sdk/build-tools/文件夹下:

                    代码混淆所用工具

                                   打包所用工具所在的jar包

三、apk打包流程详解

       依据如上的流程图和工具图,下面咱们按照流程顺序对其进行讲解。

1、aapt打包资源

      工具:aapt(Android Asset Package Tool Android资源打包工具)

      工具路径:sdkpath/build-tools/版本号/aapt.exe和aapt2.exe

      输入:Android资源文件、AndroidManifest.xml

      输出: R.java类、二进制的resource.arsc,res文件夹(包括二进制的xml、没被改变的图片和res/raw文件)、二进制的AndroidManifest.xml文件、没有改变的assets文件夹。

        Android的资源文件包含了两类:1)assets类资源。该类资源放在工程目录的assets根目录下,存放一些原始文件,这些文件不会被编译为二进制文件,而是被原封不动地打包在apk文件中,同样也不能通过资源ID来查找,不保存在R文件中。2)res类资源,10种目录。这类资源保存在工程目录中的res目录下,包含了animator(属性动画资源)、anim(补间动画资源)、color(对象颜色状态选择资源)、drawable(xml或Bitmap文件的图像资源)、layout(布局文件资源)、menu(程序菜单资源)、mipmap(图标资源,推荐阅读:drawable与mipmap的区别)、raw(不被编译成二进制文件的资源,注意和assets资源的区别,推荐阅读:assets和raw的区别)、values(6种不同的值:数组arrays.xml、颜色值colors.xml、尺寸dimens.xml、字符串strings.xml和样式值styles.xml)、xml(描述应用程序配置信息的资源)。

       如下截图展示了R.java的内容,其中包含了各种静态内部类,分别对应了某种资源的类型。

                            R.java结构图

       以R.string类为例,其中展示了字符串名称对应的id值,就是对应在res/values文件夹下,string字符串资源。

                                                                    R.string结构图

      推荐阅读:apk打包安装过程

2、aidl生成跨进程通信的java文件

      工具:aidl(Android Interface Definition Language安卓接口定义语言)

      工具路径:sdkpath/build-tools/版本号/aidl.exe

      输入:aidl后缀的文件,位于工程项目src/main/aidl目录下

      输出:可用于进程间通信的C/S端java代码,位于build/generated/source/aidl

                                       工程项目中的aidl原始文件

                                       aidl工具处理后生成的java文件

3、Java编译源码

      工具:javac.exe

      工具路径:jdk/bin/javac.exe

      输入:java source文件夹、aapt中生成的R.java文件、aidl生成的java文件、BuildConfig.java文件

      输出:对于gradle编译,生成的class文件保存在build/intermediates/classes里

                               BuildConfig.java和R.java文件

                                              输出的class文件

4、proguard代码混淆

       完成javac编译之后,一般还会对其进行代码的混淆,其实就是类似于加密的功能,作用就是增加反编译的难度,同时也将一些代码的命名进行了缩短,减少代码占用的空间。推荐阅读:Android代码混淆零基础入门

      工具:ProGuard

      工具路径:sdk/tools/proguard/bin/proguard.bat

      输入:被编译过的class文件、混淆配置文件proguard-rules.pro

      输出:被混淆过的.class文件、混淆前后映射文件

5、将所有.class文件转化为classes.dex文件

      工具:dx.bat

      工具路径:sdkpath/build-tools/版本号/dx.bat

      输入:编译后生成的所有.class文件、第三方库和.class文件

      输出:可以在Android虚拟机上使用的.dex文件

        调用dx.bat将所有的class文件转化为classes.dex文件,将二进制码转化为Android虚拟机(Android4.4以前虚拟机是Dalvik,4.4上是Dalvik和ART可以切换、Android5.0及以后是ART)上的字节码、生成常量池、消除冗余数据等。由于Android虚拟机是一种针对嵌入式设备而特殊设计的java虚拟机,所有dex文件与标准的class文件在结构设计上有着很大的区别,当javac将java程序编译成class后,dx工具将所有的class文件整合到一个dex文件中,这样做使得各个类能够共享数据,在一定程度上降低了容易,同时也使文结构更加紧凑,实验表明,dex文件时传统jar文件的50%左右。class文件结构和dex文件结构比对如下(该部分还会在后文讲Android虚拟机时提到):

                     .class文件和.dex文件结构对比图

6、apkbuilder打包生成apk

      工具:ApkBuilder类

      工具路径:sdkpath/tools/lib/sdklib_xxx.jar

      输入:上一步生成的classes.dex文件,aapt时生成的resources.arsc、被编译后的res文件夹、AndroidManifest.xml,Other Resouces(assets文件夹)

输出:.apk文件(Android Package)

7、对apk进行签名

      工具:apksigner.bat

      工具路径:sdkpath/build-tools/版本号/apksigner.bat

      输入:上一步中生成的.apk文件、签名文件(Debug or Release Keystore)

      输出:签名后的.apk文件

       签名是一个apk身份的证明,Android系统在安装apk的时候,首先会检验apk的签名,如果发现签名文件不存在或者校验签名失败,就会拒绝安装。对一个apk文件签名后,apk文件根目录下回增加META-INF目录,该目录下有三个文件:

               META-IINF文件夹结构

      Android系统就是根据这三个文件的内容对apk文件进行签名验证的:

      MANIFEST.MF中包含对apk中除了/META-INF文件夹外所有文件的签名值。

                                                 MANIFEST.MF内容截图

      CERT.SF是对MANIFEST.MF文件整体签名以及其中各个条目的签名。一般地,如果是使用工具签名,还多包括一项,就是对MANIFEST.MF头部信息签名。

                                                               CERT.SF内容截图

      CERT.RSA包含用私钥对CERT.SF的签名以及包含公钥信息的数字证书。用一般的文本打开后,会显示乱码。

                          CETR.RSA内容截图

      推荐阅读:

       【Android签名有什么用?

       【Android签名过程详解

8、zipalign优化

      如果是在release mode下,还会对apk进行align,即对签名后的apk进行对齐处理,这种方式是对apk进行整理和优化。

      工具:zipalign

      工具路径:sdkpath/build-tools/版本号/zipalign.exe

      输入:上一步中签名后的apk文件

      输出:优化后的apk文件


四、APK文件结构

       一个apk解压后,其典型的结构如下所示,分别在apk打包流程中appt资源打包、javac编译、签名阶段所产生:

当前系列内容已完成如下篇章:

【朝花夕拾】Android性能篇之(一)序言及JVM篇

【朝花夕拾】Android性能篇之(二)Java内存分配

【朝花夕拾】Android性能篇之(三)Java内存回收

【朝花夕拾】Android性能篇之(四)Apk打包

【朝花夕拾】Android性能篇之(五)Android虚拟机

【朝花夕拾】Android性能篇之(六)Android进程管理机制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342