错误提示
使用Gradle构建安卓项目,第一次构建时报错:
1 | Task :app:buildCMakeDebug FAILED |
查看项目依赖
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 Files,Rebuild Project。
手动按顺序构建
1 | gradlew inject: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