Android Gradle Plugin 编译流程
前言
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目 自动化建构 工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的 XML。
Android Gradle Plugin(AGP) 是 Android Studio IDE 上面,以 Gradle 为基础,添加了几项专用于构建 Android 应用功能的插件。
本地编译 Android Gradle Plugin
准备工作
本示例所使用电脑环境
Mac m1 电脑 Android Studio Arctic Fox|2020.3.1 配置 JDK、Android SDK 环境源码下载
在配置 repo 工具之后,执行以下命令
mkdir gradle-340 // 创建文件夹cd gradle-340 // 打开文件夹repo init -u https://android.googlesource.com/platform/manifest -b gradle_3.4.0 // 初始化同步 gradle_3.4.0 分支代码repo sync -c -j4 -q // 同步代码编译 AGP 的源码有很多分支可选,网上能查阅到的博客大多是关于 gradle_3.0.0 和 gradle_3.4.0 分支,我也尝试了几个分支,但我的电脑环境下只有 gradle_3.4.0 编译通过了,感兴趣者可试试别的分支,或者可以尝试编译 Android Studio IDE。
很多分支克隆包含整个 Android Studio IDE 的源码,克隆整个存储库只是为了获取 Android Gradle 插件,浪费了不必要的时间和硬盘空间,这点属实有些坑。

在 sync 之前,可修改 manifest/default.xml,减少下载文件数量(修改之后需要约 12 GB 磁盘空间)
<?xml version="1.0" encoding="UTF-8"?><manifest> <remote name="aosp" fetch=".." review="https://android-review.googlesource.com/" /> <default revision="refs/tags/gradle_3.4.0" remote="aosp" sync-j="4" /> <!-- BEGIN open-source projects --> <project path="tools/buildSrc" name="platform/tools/buildSrc"> <linkfile src="base/build.xml" dest="tools/build.xml" /> <linkfile src="base/build.gradle" dest="tools/build.gradle" /> <copyfile src="base/settings.gradle" dest="tools/settings.gradle" /> <copyfile src="base/gradlew" dest="tools/gradlew" /> <copyfile src="base/gradlew.bat" dest="tools/gradlew.bat" /> <linkfile src="base/gradle.properties" dest="tools/gradle.properties" /> </project> <project path="tools/analytics-library" name="platform/tools/analytics-library" /> <project path="prebuilts/r8" name="platform/prebuilts/r8" clone-depth="1" /> <project path="prebuilts/tools" name="platform/prebuilts/tools" clone-depth="1" /> <project path="tools/apksig" name="platform/tools/apksig" /> <project path="tools/dx/dalvik" name="platform/dalvik" /> <project path="tools/base" name="platform/tools/base"> <linkfile src="bazel/toplevel.WORKSPACE" dest="WORKSPACE" /> <linkfile src="bazel/sdk/prebuilts.studio.sdk.BUILD" dest="prebuilts/studio/sdk/BUILD" /> <linkfile src="bazel/sdk/prebuilts.studio.sdk.README.md" dest="prebuilts/studio/sdk/README.md" /> </project> <project path="tools/apkzlib" name="platform/tools/apkzlib" /> <project path="tools/data-binding" name="platform/frameworks/data-binding"/> <project path="tools/external/desugar" name="platform/external/desugar" /> <project path="tools/external/fat32lib" name="platform/tools/external/fat32lib" /> <project path="tools/external/gradle" name="platform/tools/external/gradle" clone-depth="1" /> <project path="tools/gradle" name="platform/tools/gradle" /> <project path="tools/repohooks" name="platform/tools/repohooks" /> <!-- END open-source projects --> <repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" /> </manifest>Android Gradle Plugin 编译
在 sync 完成之后,即可对源码进行编译了
cd tools // 打开 tools 文件夹./gradlew :publishAndroidGradleLocal // 编译并发布插件(发布到本地)你可能会遇到的问题
android-25 android.jar not found at /Users/dafay/Desktop/source/gradle-340/prebuilts/studio/sdk/darwin/platforms/android-27/android.jar
// 错误日志FAILURE: Build failed with an exception. - Where:Build file '/Users/lipengfei/Desktop/source/gradle-340/tools/base/instant-run/instant-run-server/build.gradle' line: 43- What went wrong:A problem occurred evaluating project ':base:instant-run:instant-run-server'. > android-25 android.jar not found at /Users/lipengfei/Desktop/source/gradle-340/prebuilts/studio/sdk/darwin/platforms/android-27/android.jar> - Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.- Get more help at [https://help.gradle.org](https://help.gradle.org/) Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.Use '--warning-mode all' to show the individual deprecation warnings.See https://docs.gradle.org/5.1.1/userguide/command_line_interface.html#sec:command_line_warnings BUILD FAILED in 21s解决:android-platforms jar(github) 下载 android-27 放入对应的位置
protoc-3.4.0-osx-aarch_64.exe 缺少
// 错误日志FAILURE: Build failed with an exception. - What went wrong:Execution failed for task ':analytics-library:protos:generateProto'. > Could not resolve all files for configuration ':analytics-library:protos:protobufToolsLocator_protoc'.Could not find protoc-osx-aarch_64.exe (com.google.protobuf:protoc:3.4.0).Searched in the following locations:file:/Users/lipengfei/Desktop/source/gradle-340/prebuilts/tools/common/m2/repository/com/google/protobuf/protoc/3.4.0/protoc-3.4.0-osx-aarch_64.exe> - Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.- Get more help at [https://help.gradle.org](https://help.gradle.org/) Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.解决:https://repo.maven.apache.org/maven2/com/github/os72/protoc/3.4.0/ 没有找到对应的文件,直接选择一个 osx 平台的修改为 protoc-3.4.0-osx-aarch_64.exe 这个名字放到对应的位置,编译通过了
Android Studio IDE 中引入本地的 AGP
使用修改后的 Android Gradle 插件,测试您自己的 Gradle 项目,修改 build.gradle 文件以指向您的本地存储库(上面的 publishLocal 目标安装了您的构建)。
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { repositories { mavenCentral() maven { url '/Users/dafay/Desktop/source/gradle-340/out/repo' } google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:3.4.0-dev' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }} allprojects { repositories { maven { url '/Users/dafay/Desktop/source/gradle-340/out/repo' } google() jcenter() }} task clean(type: Delete) { delete rootProject.buildDir}我在源码里面添加一些日志输入,可以对 AGP 的工作流程做一些观察,也确保引入的 AGP 是我本地编译发布的。

以上几步即完成了对 AGP 的编译和使用。
当前 AGP 已更新至 8.+ 版本,相较于 AGP 3.4.0,已有许多变化,尽管使用的是旧版本的源码,通过成功编译 AGP,您积累了宝贵的经验,不再畏惧 Gradle 和 AGP。毕竟,Gradle 和 AGP 也是由其他开发人员编写的,我们同样可以对其进行编写。作为一个构建工具,Gradle 本身并不复杂,AGP 也只是以 Gradle 为基础添加了几项专用于构建 Android 应用的插件,有了这个小小的成功经验,可以让您更加从容面对日后碰到的 Android Apk 编译问题。
附录
Android Studio IDE gradle tasklist 不显示
Android Studio IDE AGP 缓存位置
.gradle/caches/modules-2/files-2.1