首先項目肯定沒問題,去年寫的好好的項目,今天 clone 下來根本跑不起來,編譯直接報錯:SIMPLE: Error configuring
,除此以外沒有任何信息,網上的資料很少,也基本上都沒什麼用。
一、 發現問題
先來看下奇葩的報錯:
有沒有搞錯,我肯定知道配置錯誤啊,但你一點提示都不給啊!
二、定位問題
我們要搞點事情,根據多年工作經驗 assemble
一下,assemble
、assembleDebug
、assembleRelease
這些運行哪個都無所謂,我們只要拿到編譯時的日誌。
日誌來了,我們只關注紅色 Error 信息:
這就是關鍵信息了:
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 構建程序,沒有設置 CMAKE_MAKE_PROGRAM。
三、分析問題
趕時間,可以跳過,直接看第四步。
Ninja 這東西確實沒有用過,也沒有安裝過,網上其它文章的解決辦法,基本都是對 Ninja 下手,太狠了!
但是,我寫的項目怎麼可能問題!況且,新建一個 NDK 項目都可以跑起來,肯定是其它不可抗力。
我可不想隨便裝個不瞭解的 Ninja 就草草了事,改 bug 使我快樂,下面就將兩個項目對比一下。
CMakeLists.txt
首先看它,因爲是 CMake 構建失敗。檢查結果沒有問題。build.gradle
這個是 Module 下的 build.gradle,因爲這裏對 CMake 進行了配置。檢查結果沒有問題。-
gradle
由於之前項目是正常的,現在構建出問題,根據多年工作經驗,很有可能是 gradle 升級後出現的問題。需要修改兩個地方
- gradle-wrapper.properties 文件的 distributionUrl 地址修改爲可運行的項目中的。
- build.gradle(這個是項目的,也就是外層的)文件的 classpath 修改爲可運行的項目中的。
修改完上面兩個文件,再次編譯正常,運行正常。
運氣比較好,很快就解決問題了,分析這類問題的思路,一般還可以從 NDK 版本、CMake 版本入手,我後面嘗試了不修改 gradle,只降低 NDK 版本,還是不能正常編譯的,說明並不是 NDK 版本問題。
四、解決問題
先說下我的環境,Android Studio 3.4.1,NDK r19c,CMake 3.10.2
- 修改 gradle-wrapper.properties 文件
修改distributionUrl
,改爲你能運行的其它項目的內容,構建時會按照這個地址下載 gradle。
#Wed May 29 18:30:37 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
# 改爲你能運行的其它項目的內容,構建時會按照這個地址,下載gradle
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
- 修改外層 build.gradle
修改classpath
,這裏需要修改爲你能運行的其它項目的內容,這個是 gradle 插件版本,這個版本一般與Android Studio 的版本一致。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// 改爲你能運行的其它項目的內容,這個是 gradle 插件版本,一般與Android一般與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
}
五、最後
其實構建、編譯失敗都是很好解決的,關鍵還是分析的思路。
現在網絡很發達,不要一味相信那些解決辦法,要抱着質疑的態度,多搜索,多嘗試。
就像遇到這個的問題,大多數人一頓操作猛如虎,噼裏啪啦幾個命令,裝上了 Ninja,根本原因其實沒有解決,就算解決了,絕大多數人也不會去了解 Ninja 是什麼。
當然我的解決辦法不一定適用於你,也要帶着質疑的眼光去嘗試,這樣才能不斷進步。
好了,我要跑去 Ninja 那邊看一眼了:使用 Ninja 代替 make。