首先,说明下这个问题的来历。
优秀的(Android)软件工程师是如何练成的
这篇文章提到了这个问题,于是就去思考下,也感谢前人的努力,让我们小菜鸟学习更加容易。
你一定会问,点击Build后(我理解是 Build > Make Module module-name),还能发生什么,无非是安装在模拟器或者真机上一个App呗~.没错,但是,这个问题的本意一定没这么简单。
gradle插件
要构建和运行应用,请点击 Run 。Android Studio 使用 Gradle 构建您的应用,会要求您选择部署目标(模拟器或连接的设备),然后将您的应用部署至目标。
我们创建一个Android Application,至少要包含一个application module,并且在build.gradle中设置application 的gradle 插件:
apply plugin: 'com.android.application'
这样,编译这种module时将才成.apk文件。
一个application module不可以依赖另一个application module,只可以依赖library,就是配置 gradle library 插件的module:
apply plugin: 'com.android.library'
发布这样的module时,得到的将是一个.aar文件,与.jar文件相比,aar文件可以包含一些android相关的东西:比如资源文件和manifest文件。
编译
编译一个application module或者library文件,大致可以分为gradle task代表的五个阶段:
1. Preparation of dependecies 在这个阶段gradle检测module依赖的所有library是否ready。如果这个module依赖于另一个module,则另一个module也要被编译。
2. Merging resources and processing Manifest 在这个阶段之后,资源和Manifest文件被打包。
3. Compiling 在这个阶段处理编译器的注解,源码被编译成字节码。
4. Postprocessing 所有带 “transform”前缀的task都是这个阶段进行处理的。
5. Packaging and publishing 这个阶段library生成.aar文件,application生成.apk文件。
构建过程
使用Android Asset Packaging Tool(aapt) ,将AndroidManifest.xml和res下的资源编译生成R.java文件,这样java文件就可以去引用资源了 - 使用aidl 工具去生成对应的Java interfaces - 将src和通过aapt生成的R.java,.aidl文件通过javaC命令去生成.class 文件 - 使用dex tool 将class文件转化成Dalvik byte code.这时候要将所有class文件和第三方的jar包都包括。 - 所有没有编译过得图片和编译过的图片,.dex文件传给apkbuilder去打包成.apk - 最后采用zipalign tool 打入签名