Android Gradle Plugin源码学习(一)

479 阅读4分钟

本系列将完成一整个AGP的学习过程,主要将内容分为如下几个模块,更新时间待定

  • AGP源码的下载与编译
  • Android APP编译构建的基本过程
  • 具体的常用任务的源码分析
  • R8&D8的源码下载与编译、详细逻辑拆分
  • 其他待补充内容

本文主要介绍Windows下编译过程,Ubuntu可以参考后续步骤,Mac请参考其他文章

(一)Windows下运行Linux环境

最常见的手段就是使用虚拟机,但是使用虚拟机就会导致CPU暴涨,严重影响系统体验;如果使用双系统,还会存在一个重启切换的过程,并且无法同时共享两个系统的实时数据。

在Windows10之后,微软推出了WSL子系统功能,因此本文利用WSL在Windows上安装Linux操作系统,并通过子系统完成AGP代码的下载和编译;并且由于子系统的文件系统是在Windows上的,所以其他时候可以直接在Windows下使用IDEA阅读编译好的代码库。

(二)安装WSL以及Ubuntu

这一步骤网络上相关介绍比较多,这里简单概述下

通过应用商店下载WSL并且完成安装,这一步一般默认是安装到C盘系统盘的,对此有迁移想法的同学请参考网上的博文,需要使用额外的工具进行迁移,直接通过系统的迁移功能是会导致整体WSL失效的

WSL安装完毕后,需要设置子系统功能可用和虚拟化功能,该功能通过搜索“开启或关闭Windows功能”开启

接着同样,在应用商店内搜索Ubuntu并进行安装,这一步骤是可以配置安装到其他分区的,并且可以直接使用系统的移动功能。需要注意的是,这个Ubuntu是命令行的,没有图形界面,而且我们也不需要弄图形界面

至此,WSL安装Ubuntu的步骤完成(本人使用的wsl2,具体差异可以查看相关文章介绍)

(三)下载AGP源码

通过Windows的PowerShell,输入wsl切换到Ubuntu操作系统

这一步骤和下载AOSP是一样的,只是需要拉取的分支不一样而已 由于AGP的源码比较少,只有30G左右,所以下载速度很快,不用像AOSP那样要等一晚上才会拉好

前置准备

由于系统是刚刚装好的,所以需要配置下python3/Java8等环境

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install openjdk-8-jdk

sudo apt-get install python3

代码环境

可以参考清华源和科大源写的操作手册

中间有变动的点就是需要切换下branch

清华源AOSP网站 -> mirrors.tuna.tsinghua.edu.cn/help/AOSP/

科大源AOSP网站 -> mirrors.ustc.edu.cn/help/aosp.h…

如果访问谷歌源比较慢,请使用上述两个源操作

当通过repo init 初始化时,需要注意添加 -b gradle_你要的版本 来设置,否则默认就是AOSP代码了

(四)代码编译

经过几十分钟后,代码就会下载完毕

当全部校验完成后,直接打开tools目录

cd 你的下载目录/tools

./gradlew init

./gradlew assemble

触发gradlew任务,执行初始化

一般情况下会出现以下几个问题:

JAVA_HOME的目录不正确

针对这个问题,是使用了Windows系统中安装的JDK并且配置了Ubuntu的环境变量导致的;

比较简单的解决方案就是前述的使用apt-get install jdk8的形式解决

如果不想如此处理,那么需要在 /etc/environment(统一控制)中增加下export JAVA_HOME的配置,并且写入到 ./bashrc

Java版本问题

我下载的是目前最新的AGP(国内镜像的3.4,正式已经7.0了),需要使用Java8进行编译,所以如果遇到编译时报错版本号问题(gradle有一个checkJavaVersion任务),如果此任务报错,那么需要更换到正确的JDK版本

android-25 android.jar not found in xxx/prebuilts/studio/sdk/linux/platforms/android-27/android.jar

针对此问题,是AGP编译的依赖缺失导致的,解决方案是从我们Android SDK目录中找到Platforms目录,并且找到一个android-version的目录,直接复制到缺失的路径下(可能linux这一层级的目录就缺失,那么我们直接手动mkdir加一下即可),并且将copy来的目录更改为android-27

接着重新触发编译即可,等待编译完成

(五)阅读代码

直接在Windows下使用IDEA打开tools/base目录,完成IDEA的自动导入,此时就可以看到整体的AGP代码了(不包含R8/D8,这两个模块是Jar包形式提供的)

结语

由于本人水平有限,欢迎各位在评论区批评指正