android studio 同期エラー "NDK version is UNKNOWN"

新しいAndroid Studioを使用するため、Androidの開発環境を作り直しました。

Android Studioから```Sync Project with Gradle Files```を行うと失敗し、EventLogに以下の出力がありました。

```
Gradle sync started with IDEA sync
Project setup started
Gradle sync failed (6 s 705 ms)
NDK Resolution Outcome: Project settings: Gradle model version=4.4, NDK version is UNKNOWN
```


解決手順と調査したことを記述します。


# 環境

作成した環境のバージョンです。(関連する項目のみ)

|項目|バージョン|
|:--:|:--:|
|Android Studio|3.5.1|
|Gradle|4.4|
|Android Gradle Plugin|3.1.2|
|NDK|20.0.5994570|
|CMake|3.10.2.4988404 (以下3.10と書く)|

Gradle、Android Gradle Pluginのバージョンが古いです。バージョンの更新を怠っているプロジェクトでした。


# 解決手順

CMake 3.10をアンインストールし、CMake 3.6をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/621b238f-e158-48f2-8ed3-30b4059d5e5e.png)

この作業のみで、解決しました。


# 調査したこと

## (1) gradleの出力メッセージ
問題のあった環境で```gradle sync```を実行した際の出力メッセージの一部です。

```
14:24:21:Executing task 'sync'...

Executing tasks: [sync] in project C:\Users\hoge

Support for CMake 3.7 and higher is a preview feature. To report a bug, see https://developer.android.com/studio/report-bugs.html
Support for CMake 3.7 and higher is a preview feature. To report a bug, see https://developer.android.com/studio/report-bugs.html
External native generate JSON debug: building json with force flag false
External native generate JSON debug: starting JSON generation
(省略)
External native generate JSON debug: executing cmake Executable : C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe
arguments : 
(省略)
BUILD FAILED in 1s
14:24:25: Task execution finished 'sync'.
```

CMake 3.7以上を使用する機能はプレビューであることがわかります。CMake 3.6を使用した方が良さそうです。


## (2) デフォルトで使用されるCMakeのバージョン
SDK Managerでは、CMake 3.6、CMake 3.10、両方をインストールすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/eeab18ca-f7ea-1894-de35-0e300d4d8b95.png)

以下のドキュメントでは、CMakeのバージョンを指定する手順とデフォルトで使用するバージョンについて記述されています。

https://developer.android.com/studio/projects/add-native-code?hl=ja#vanilla_cmake
> SDK Manager には、CMake の 3.6.0 分岐バージョンとバージョン 3.10.2 が含まれています。build.gradle で特定のバージョンの CMake を設定していないプロジェクトは、CMake 3.6.0 を使用してビルドされます。

この記述により、「このプロジェクトではCMakeのバージョンは指定していないので、両方インストールした場合はCMake3.6が使用される」、と思いました。しかし、実際に両方をインストールして、```gradle sync```を行った場合、同じエラーになります。

```
14:29:48: Executing task 'sync'...

Executing tasks: [sync] in project C:\Users\hoge

Support for CMake 3.7 and higher is a preview feature. To report a bug, see https://developer.android.com/studio/report-bugs.html
Support for CMake 3.7 and higher is a preview feature. To report a bug, see https://developer.android.com/studio/report-bugs.html
External native generate JSON debug: building json with force flag false
External native generate JSON debug: starting JSON generation
(省略)
External native generate JSON debug: executing cmake Executable : C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe
arguments : 
(省略)
BUILD FAILED in 1s
14:29:48: Task execution finished 'sync'.
```

おそらくですが、「バージョンを設定していない場合にCMake　3.6を使用する」という動作は、Android-Gradle-Plugin 3.3からの動作だと思います。というのは、Android StudioでCMake 3.10をダウンロードできるようになったのは、Android Studio 3.3 だからです。
https://developer.android.com/studio/releases#cmake-3-10-2

実際に、Android-Gradle-Plugin のバージョンを3.3に更新してみます。
```gradle :app:generateDebugSources```を実行した出力メッセージの一部です。
「SDKにあるCMake 3.10.2は要求されたバージョン"3.6.0"とマッチしない。SDKにあるCMake 3.6.4111459は、バージョン"3.6.0"だ。」

```
14:38:07: Executing task ':app:generateDebugSources --info'...
(省略)
No CMake version was specified in build.gradle. Choosing a suitable version.
Trying to locate CMake in local SDK repository.
CMake '3.10.2' found in SDK did not match requested version '3.6.0'.
- CMake found in SDK at 'C:\android-sdk\cmake\3.6.4111459' had version '3.6.0'
No CMake version was specified in build.gradle. Choosing a suitable version.
Trying to locate CMake in local SDK repository.
CMake '3.10.2' found in SDK did not match requested version '3.6.0'.
- CMake found in SDK at 'C:\android-sdk\cmake\3.6.4111459' had version '3.6.0'
(省略)

BUILD SUCCESSFUL in 1s
5 actionable tasks: 5 up-to-date
14:38:09: Task execution finished ':app:generateDebugSources --info'.
```

ちなみに、Android-Gradle-Plugin 3.2の場合は、```gradle assembleDebug --info```で確認できます。

```
Executing task 'assembleDebug --info'...
(略)
externalNativeBuildDebug: starting build
externalNativeBuildDebug: reading expected JSONs
externalNativeBuildDebug: done reading expected JSONs
externalNativeBuildDebug: executing build commands for targets that produce .so files or executables
externalNativeBuildDebug: evaluate miniconfig
externalNativeBuildDebug: evaluate library MarshalxIf-Debug-armeabi-v7a
externalNativeBuildDebug: building target library MarshalxIf because no targets are specified.
externalNativeBuildDebug: about to build C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe --build C:\Users\
externalNativeBuildDebug: evaluate miniconfig
externalNativeBuildDebug: evaluate library MarshalxIf-Debug-arm64-v8a
externalNativeBuildDebug: building target library MarshalxIf because no targets are specified.
externalNativeBuildDebug: about to build C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe --build C:\Users\
externalNativeBuildDebug: evaluate miniconfig
externalNativeBuildDebug: evaluate library MarshalxIf-Debug-x86
externalNativeBuildDebug: building target library MarshalxIf because no targets are specified.
externalNativeBuildDebug: about to build C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe --build C:\Users\
externalNativeBuildDebug: evaluate miniconfig
externalNativeBuildDebug: evaluate library MarshalxIf-Debug-x86_64
externalNativeBuildDebug: building target library MarshalxIf because no targets are specified.
externalNativeBuildDebug: about to build C:\android-sdk\cmake\3.10.2.4988404\bin\cmake.exe --build C:\Users\
(略)
BUILD SUCCESSFUL in 8s
34 actionable tasks: 5 executed, 29 up-to-date
AAPT2 aapt2-3.2.0-4818971-windows Daemon #0: shutdown
15:25:52: Task execution finished 'assembleDebug --info'.
```

# まとめ

* Android Gradle Plugin 3.1.2 では、CMake 7以上のバージョンを使用するビルドはプレビュー段階。
  * Android Gradle Plugin 3.1.2 では、CMake 3.6 を使用した方が良さそう。
* "CMakeのバージョンを明記しないときには CMake 3.6を使用する"、という動作は、おそらくAndroid Gradle Plugin 3.3以上から。
  * Android Gradle Plugin 3.3未満では、新しいバージョンのCMakeを使用している。

こんなことよりも、いろいろなツールのバージョンの更新と検証をしましょう。