Cursor blinking

Android Gradle Plugin 编译流程

Android 基础|字数 713|阅读时长≈ 2 分钟

前言

Gradle 是一个基于 Apache AntApache Maven 概念的项目 自动化建构 工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的,而不是传统的 XML

Android Gradle Plugin(AGP) 是 Android Studio IDE 上面,以 Gradle 为基础,添加了几项专用于构建 Android 应用功能的插件。

本地编译 Android Gradle Plugin

准备工作

本示例所使用电脑环境

Code
Mac m1 电脑 Android Studio Arctic Fox|2020.3.1 配置 JDK、Android SDK 环境

源码下载

在配置 repo 工具之后,执行以下命令

Code
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 插件,浪费了不必要的时间和硬盘空间,这点属实有些坑。

截屏2024-04-22 13.52.17.png
截屏2024-04-22 13.52.17.png

在 sync 之前,可修改 manifest/default.xml,减少下载文件数量(修改之后需要约 12 GB 磁盘空间)

Code
<?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 完成之后,即可对源码进行编译了

Code
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
Code
// 错误日志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 缺少
Code
// 错误日志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 目标安装了您的构建)。

Code
// 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 是我本地编译发布的。

截屏2024-04-22 14.17.02.png
截屏2024-04-22 14.17.02.png

以上几步即完成了对 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

参考文档