新しい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をインストールします。
この作業のみで、解決しました。
調査したこと
(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、両方をインストールすることができます。
以下のドキュメントでは、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を使用している。
こんなことよりも、いろいろなツールのバージョンの更新と検証をしましょう。