浅析Android如何编译生成apk

开发完Android工程后,点击Android Studio的run按钮后就可以在build/outputs下面得到我们的.apk文件,这背后的英雄就是gradle构建工具。

Android中的gradle介绍

关于什么是gradle,可以看这里。Android Studio用到的gradle分为两部分:Gradle软件和 Android Plugin for Gradle 。这两个都是独立于 Android Studio 运行,Android Plugin for Gradle 在Gradle的基础上增加了一些构建Android App的特性,两者配合完成Android App的构建工作。
我们在项目中使用的Android Plugin for Gradle版本在项目的根build.gradle文件中指定:

classpath 'com.android.tools.build:gradle:2.3.0'

Gradle的版本在项目中的gradle/wrapper/gradle-wrapper.properties文件中指定:

distributionUrl = https\://services.gradle.org/distributions/gradle-3.3-all.zip

当然Android Studio中提供了图形化的界面查看这两个的版本以及对它们修改,打开File > Project Structure > Project就可以看到。
可见,Android Plugin for Gradle和Gradle的版本有个对应关系

插件版本Gradle版本
1.0.0 - 1.1.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1+
2.3.0+3.3+**

谷歌会在这儿更新最新的对应关系表。
至于如何安装Gradle,可以看这里

构建流程

Android的APK文件是一个压缩文件,解压后一般得到如下的文件结构:
APK文件结构
这些文件就是由gradle根据Android Studio中的项目中的资源构建生成。

一个粗糙的构建流程

gradle构建APK的流程大致如下图:
初步的构建流程
1. Android编译器(5.0之前是Dalvik,之后是ART)将项目的源代码(包括一些第三方库、jar包和aar包)转换成DEX文件,将其他资源转换成已编译资源。
2. APK打包器将DEX文件和已编译资源在使用秘钥签署后打包。
3. 在生成最终 APK 之前,打包器会使用zipalign等工具对应用进行优化,减少其在设备上运行时的内存占用。
构建流程结束后获得测试或发布用的apk。

一个稍详细的构建流程

更详细的gradle构建过程如下图:
这里写图片描述
图中的矩形表示用到或者生成的文件,椭圆表示工具。
1. 通过aapt打包res资源文件,生成R.java、resources.arsc和res文件
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进行对齐处理。
这样就得到了一个可以安装运行的Android程序。
这样的流程仍然不是详细的,下面的这幅图带你看下什么叫详细。

详细的构建流程

这里写图片描述
这张图已经说的很详细了,当然有这张图,绝大多数人也没法就因此写出一套构建系统……

总结

Android使用gradle构建生成的apk关键就是aapt处理资源文件,aidl处理.aidl,javac生成.class文件,proguard混淆后再由dex生成.dex文件,由apkbuilder签名后再经zipalign对齐字节码就可以上线发布了。

致谢

本文的诞生离不开:
1. 配置构建
2. Android打包系列——打包流程梳理
很惭愧,做了一点微小的贡献!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值