Apk编译过程1 - Android Studio 与 gradle
文章目录
- Apk编译过程1 - Android Studio 与 gradle
- gradlew
- Android studio 的 gradle plugin
- gradle脚本
- AGP:Android Gradle Plugin
gradle 是 Android 开发者比较熟悉的构建工具了,因为 Android Studio 默认使用它来编译 Android 应用。在这之前使用 eclipse + ADT 开发 Android 应用的时代,我们使用的是 Ant。Android 系统源码编译也不使用 gradle,google 使用了它自己开发的工具链。Ant,Gradle包括 Maven,它属于一类软件,叫做 Build System,作用是集成各种编程语言的编译器,定义工程结构,进行工程化的依赖和编译工作,避免了大家对于类似工程都要写非常复杂且雷同的编译脚本。
当使用 Android Studio 新建完成一个 Application Project 后,gradle 工具链就被 Android Studio 部署完成了。它包括四个部分。
gradlew
gradlew 全称是 gradle wrapper,顾名思义。它是一个脚本,我们新建的工程根目录下,所以比较容易研究。在工程 sync 过程中,它根据 project_root/gradle/gradle-wrapper.properties 中指定的信息,执行 project_root/gradle/gradle-wapper.jar 去下载指定版本的 gradle,到 user_home/.gradle/dist 目录下。在编译时就使用这个版本的 gradle。如果指定版本的 gradle 已经存在,再执行 gradlew 编译命令,命令就会通过 gradlew 代理过去。gradle 也是 java 或 kotlin 开发的,所以看 gradle-wapper.jar 代码,是去执行 gradle 特定的 launch jar。
Android studio 的 gradle plugin
就是下图中红框中的插件,Android Studio 的 Settings 界面:
它使得我们在 Android Studio 中以 GUI 方式执行 gradle 命令成为可能。Android Studio 的 Gradle 面板:
gradle脚本
build.gradle 大家都非常熟悉。不消多讲。在 project root 下的 build.gradle 中有如下一个配置。
L7:classpath "com.android.tools.build:gradle:4.1.3"
这就是 AGP:Android Gradle Plugin,用来具体执行 Android 工程的编译。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
为什么有了 gradle 还需要AGP?因为 gradle 想做平台化的编译系统,只提供一个框架。对于不同类型的项目,需要在gradle api框架内开发专门的 Gradle Plugin。对于比较大众化的工程类型,比如 Java Application,大家都清楚怎样进行编译和部署,所以 gradle 提供了这样的plugin。但是 gradle 不清楚 apk 的编译细节,还是 Android 系统团队开发比较合适,所以其代码也是 AOSP 的一部分。
AGP:Android Gradle Plugin
综上,如果要研究 apk 的编译过程必须研究 AGP 的代码,其源码是和 AOSP 在一起的,按照如下方式获取源码和进行编译:
http://tools.android.com/build
http://tools.android.com/build/gradleplugin
国内有很多aosp镜像站,很容易获取 AOSP 源码,比如tuna:https://mirrors.tuna.tsinghua.edu.cn/
如果感觉获取 AOSP 代码比较麻烦,可以直接在一个Android Project 中依赖 com.android.tools.build:gradle,这样在 External Libraries 中也能阅读代码,缺点是无法编译且体验较差。