0%

Gradle app模块构建顺序探究

错误提示

使用Gradle构建安卓项目,第一次构建时报错:

1
2
Task :app:buildCMakeDebug FAILED
C/C++: ninja: error: missing and no known rule to make it

查看项目依赖

app模块和inject模块都位于父项目下,在文件夹上属于平行关系。
Project Structure中查看,app依赖于inject(在build.gradle中设置为依赖)。
理应先执行inject:buildCMakeDebug再执行app:buildCMakeDebug

查看构建顺序

点击下方Build-Build Output查看顺序,发现app模块先于inject模块构建。

解决方案

重命名项目

app模块重命名为victim_app后,构建顺序正常。
具体操作:
Clean Project后,删除模块内的.cxx文件夹(方便重命名)。
重命名app模块为victim_app,并修改setting.gradle及依赖,使其保持一致。
最后Sync with Gradle FilesRebuild Project

手动按顺序构建

1
2
gradlew inject:build
gradlew app:build

推论

Gradle执行Tasks时,app模块比inject模块具有更高优先级,导致不按照依赖顺序构建。

推测Gradle会对setting.gradle中的模块按字典序排序,然后构建。

测试

inject模块名改为abc,修改依赖项目名,Rebuild Project,发现构建顺序正常。

inject改为bcd,出现同样错误,说明确实是按字典序构建。

参考

However, ./gradlew run will run applications in lexicographical order. Instead, explicitly specify which subproject to run

gradle-multi-project-example