原文地址:https://blog.csdn.net/zhaohad/article/details/104068936
本文解决gradle 3.4.0源码在mac平台编译不过的问题,源代码下载过程可以看之前的博客:https://blog.csdn.net/zhaohad/article/details/104031757
上文说到,mac下载了源码之后执行./gradlew :publishAndroidGradleLocal编译,会出现编译错误,编译错误如下。
FAILURE: Build failed with an exception.
* Where:
Script ' /gradle-3.4.0/tools/buildSrc/base/baseJava.gradle' line: 6
* What went wrong:
A problem occurred evaluating script.
> Could not get unknown property 'cloneArtifacts' for root project 'tools' of type org.gradle.api.Project.
我先写解决方案,再说解决的过程吧。
terminal切到源代码根目录,执行
cd tools/
ls -s buildSrc/base/build.gradle build.gradle
ln -s buildSrc/base/build.xml build.xml
ls -s buildSrc/base/gradle.properties gradle.properties
运行完上面的命令之后就可以重新编译了,执行
./gradlew :publishAndroidGradleLocal
这次执行还是会有编译错误,但是编译错误已经变成了下面这样:
FAILURE: Build failed with an exception.
* Where:
Build file '/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 /prebuilts/studio/sdk/linux/platforms/android-27/android.jar
解决方法比较简单,上一篇里面也提到了,把相应的目录考过去就可以了。Mac下AS下载android SDK的目录在“~/Library/Android/sdk/platforms”
拷贝完之后就能顺利编译通过了。
先看编译错误里面显示:Script '
所以直接全局里面搜一下cloneArtifacts,发现是在buildSrc/base/build.gradle里面定义的。
然后在buildSrc/base/build.gradle这个里面打了几行log,发现至始至终编译都不会走到这个文件。
所以就开始找buildSrc/base/build.gradle是在哪里被引入的。
“build.gradle”这样的文件名一般是作为模块或者项目的默认构建脚本存在的,那么他的引入应该是在buildSrc目录下或者根目录下的settings.gradle文件里面。找到跟目录下的settings.gradle后里面是直接include了另外一个文件
// This file is copied by repo to tools/settings.gradle
// To enable pre-submit checks, it imports settings-real.gradle,
// so changes are effective immediately, without a manual copy.
apply from: 'buildSrc/base/settings-real.gradle'
// Do not add anything else here.
然后继续找buildSrc/base/settings-real.gradle,发现里面有引用base模块,但是这个base模块指的应该是根目录下的base目录而不是buildSrc/base。
无奈!!!确实找不到buildSrc/base/build.gradle的引入源头。
仔细看build.gradle或者其他的一些.gradle文件里面可能会发现一些目录引用关系的细节,比如这段在buildSrc/base/build.gradle里面第一句话就有:
apply plugin: 'clone-artifacts'
buildscript {
apply from: "$rootDir/buildSrc/base/version.gradle"
repositories {
maven { url "$rootDir/../prebuilts/tools/common/m2/repository" }
}
dependencies {
classpath libs.kotlin_gradle_plugin
}
}
细节就在里面用了一个rootDir的变量,这个变量表示根项目build文件的绝对路径,那么反推一下,跟项目应该位于buildSrc的上级目录也就是tools目录下。那么tools目录下应该有个build.gradle文件才对的嘛,找了一下这个文件,没有!!!!
难道是我不小心删掉了?运行了下git status,发现这个tools目录就不是个git工程。无奈跟Ubuntu上下载的源码做了一下对比,发现确实少了3个文件,就是在解决过程中写到的那3个build.gradle, build.xml, gradle.properties。再一看这三个文件是个软连接直接指向了buildSrc/base里面的3个同名文件!!!
创建了3个软连接之后,果然就能够编译了。所以之前一直在找buildSrc/base/build.gradle这个文件到底在哪里引入的,原来它才是最最最根的那个build.gradle。
至于为啥mac平台上repo下载之后软连接文件会丢失的问题,咱也不细追了,可能是repo的bug吧,总之问题也算是解决了。