1. 起因
升級 maxOS High Sierra 後在 Android Stuido 中同步專案失敗,報錯原因是 gradle 構建指令碼中 git 相關的 shell 命令執行結果始終返回空,導致無法繼續構建,如下:
def static getGitVersion() {
return 'git rev-parse --short HEAD'.execute().text.trim()
}
複製程式碼
2. 懷疑人生
剛升級完新系統,就出問題,心情相當不好,但沒辦法還是得解決啊
首先試著在終端中執行編譯,結果時能正常執行,這就奇怪了
然後懷疑是不是寫法有什麼問題導致不相容新的 macOS 版本,Google 找到一篇文章 stackoverflow.com/questions/2… 說是預設工作目錄是在 module 下,要將工作目錄切到根目錄下才行,於是改成了
def static getGitVersion() {
'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
}
複製程式碼
結果依然不行,並且這樣改了之後導致終端下也不行了
接下來就想看看當前工作目錄到底在哪裡,是不是真如上述問題說的在 module 目錄下,程式碼如下:
def static getGitVersion() {
String files = 'ls'.execute([], project.rootDir).text.trim()
new throw IllegalStateException("Files: " + files)
}
複製程式碼
由於 Android Studio 同步操作的異常只能在 Gradle Console 視窗中看,並且通過 println 輸出的資訊並不會出現在這個視窗裡,所以只能通過異常的方式在 Gradle Console 視窗中看我們想要的資訊
通過分析 ls 命令返回的結果發現工作目錄就是在專案的根目錄下,並不是像問題中說的那樣在 module 下,再看問題的提問時間是在 3 年前了,可能那時的確是在 module 下
3. 柳暗花明
就在一籌莫展之際驀然間發現並不是所有的命令都不行,ls 命令就可以執行,而 git 命令不行。ls 命令是系統自帶的,git 命令(自己重新安裝的最新版本)不是系統自帶的,需要額外的環境變數配置,會不會是在 Android Studio 中執行同步操作時的 shell 的環境變數有問題
趕緊試了試 java 命令,發現同樣無法執行,這時候有了新的偵查方向了。
Google 搜尋關鍵字 'android studio macos gradle shell not found git' 找到一篇文章 depressiverobot.com/2016/02/05/… maxOS 上 GUI 程式的環境變數和終端是不一樣的,GUI 程式的環境變數只有 /usr/bin:/bin:/usr/sbin:/sbin,而通過 Spotlight 啟動的程式就只有 GUI 程式的環境變數
而我的操作方式就是通過 Spotlight 啟動的 Android Studio ,而我的 git 卻在 usr/local/bin 下,至此真相已經浮出水面了
4. 解決問題
文章中提供了幾種解決辦法,一種是從終端啟動 Android Studio,如下:
open -a "Android Studio"
複製程式碼
另一種是執行如下命令讓 GUI 程式和終端的環境變數保持一致
sudo launchctl config user path $PATH
複製程式碼
執行完需要重啟電腦