首先項目肯定沒問題需忿,去年寫的好好的項目,今天 clone 下來根本跑不起來蜡歹,編譯直接報錯:SIMPLE: Error configuring
屋厘,除此以外沒有任何信息,網(wǎng)上的資料很少月而,也基本上都沒什么用汗洒。
一、 發(fā)現(xiàn)問題
先來看下奇葩的報錯:
有沒有搞錯父款,我肯定知道配置錯誤啊溢谤,但你一點提示都不給啊憨攒!
二世杀、定位問題
我們要搞點事情,根據(jù)多年工作經(jīng)驗 assemble
一下肝集,assemble
瞻坝、assembleDebug
、assembleRelease
這些運行哪個都無所謂杏瞻,我們只要拿到編譯時的日志所刀。
日志來了衙荐,我們只關(guān)注紅色 Error 信息:
這就是關(guān)鍵信息了:
CMake Error: CMake was unable to find a build program corresponding to "Ninja".
CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
意思大致是,CMake 不能找到 Ninja 構(gòu)建程序,沒有設(shè)置 CMAKE_MAKE_PROGRAM。
三潜支、分析問題
趕時間,可以跳過瀑罗,直接看第四步。
Ninja 這東西確實沒有用過雏掠,也沒有安裝過斩祭,網(wǎng)上其它文章的解決辦法,基本都是對 Ninja 下手乡话,太狠了摧玫!
但是,我寫的項目怎么可能問題绑青!況且诬像,新建一個 NDK 項目都可以跑起來,肯定是其它不可抗力闸婴。
我可不想隨便裝個不了解的 Ninja 就草草了事坏挠,改 bug 使我快樂,下面就將兩個項目對比一下邪乍。
CMakeLists.txt
首先看它降狠,因為是 CMake 構(gòu)建失敗。檢查結(jié)果沒有問題庇楞。build.gradle
這個是 Module 下的 build.gradle榜配,因為這里對 CMake 進行了配置。檢查結(jié)果沒有問題吕晌。-
gradle
由于之前項目是正常的蛋褥,現(xiàn)在構(gòu)建出問題,根據(jù)多年工作經(jīng)驗睛驳,很有可能是 gradle 升級后出現(xiàn)的問題壁拉。需要修改兩個地方
- gradle-wrapper.properties 文件的 distributionUrl 地址修改為可運行的項目中的。
- build.gradle(這個是項目的柏靶,也就是外層的)文件的 classpath 修改為可運行的項目中的。
修改完上面兩個文件溃论,再次編譯正常屎蜓,運行正常。
運氣比較好钥勋,很快就解決問題了炬转,分析這類問題的思路辆苔,一般還可以從 NDK 版本、CMake 版本入手扼劈,我后面嘗試了不修改 gradle驻啤,只降低 NDK 版本,還是不能正常編譯的荐吵,說明并不是 NDK 版本問題骑冗。
四、解決問題
先說下我的環(huán)境先煎,Android Studio 3.4.1贼涩,NDK r19c,CMake 3.10.2
- 修改 gradle-wrapper.properties 文件
修改distributionUrl
薯蝎,改為你能運行的其它項目的內(nèi)容遥倦,構(gòu)建時會按照這個地址下載 gradle。
#Wed May 29 18:30:37 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
# 改為你能運行的其它項目的內(nèi)容占锯,構(gòu)建時會按照這個地址袒哥,下載gradle
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
- 修改外層 build.gradle
修改classpath
,這里需要修改為你能運行的其它項目的內(nèi)容消略,這個是 gradle 插件版本堡称,這個版本一般與Android Studio 的版本一致。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// 改為你能運行的其它項目的內(nèi)容疑俭,這個是 gradle 插件版本粮呢,一般與Android Studio 的版本一致。
classpath 'com.android.tools.build:gradle:3.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
五钞艇、最后
其實構(gòu)建啄寡、編譯失敗都是很好解決的,關(guān)鍵還是分析的思路哩照。
現(xiàn)在網(wǎng)絡(luò)很發(fā)達挺物,不要一味相信那些解決辦法,要抱著質(zhì)疑的態(tài)度飘弧,多搜索识藤,多嘗試。
就像遇到這個的問題次伶,大多數(shù)人一頓操作猛如虎痴昧,噼里啪啦幾個命令,裝上了 Ninja冠王,根本原因其實沒有解決赶撰,就算解決了,絕大多數(shù)人也不會去了解 Ninja 是什么。
當然我的解決辦法不一定適用于你豪娜,也要帶著質(zhì)疑的眼光去嘗試餐胀,這樣才能不斷進步。
好了瘤载,我要跑去 Ninja 那邊看一眼了:使用 Ninja 代替 make否灾。