本系列将完成一整个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包形式提供的)
结语
由于本人水平有限,欢迎各位在评论区批评指正