つばくろぐ @takamii228

知は力なり

AndroidのCIパイプラインでAndroid StudioのJDKを使う

AndroidのCIパイプラインでgradleタスク実行する場合にはJDKが必要になります。

Android Studio経由でgradleタスク実行する場合はAndroid Studioに内包されたJDKが用いられます。

一方でmacOSのTerminalでプロジェクト作成時にimportされるgralde wrapper経由でgradleタスクを実行すると、利用するJDKmacOSのものになります。

例えばCIパイプラインをmacOSのCI Runnerで実行する場合、何も設定しないとmacOS側のJDKが用いられてします。macOS側ではJava14、15を入れていた場合にはAndroid Studioで実行した結果と変わってしまう可能性があります。

例えばmacOSのTerminalでの./gradlew --versionの結果とAndroid Studio側での実行結果が微妙に異なっています。

# macOSでの./gradlew --versionの結果
$ ./gradlew --version

------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------

Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          11.0.10 (Oracle Corporation 11.0.10+9)
OS:           Mac OS X 11.3.1 x86_64

# Android StudioのJREでの./gradlew --versionの結果
$ ./gradlew --version                                                        

------------------------------------------------------------
Gradle 6.7.1
------------------------------------------------------------

Build time:   2020-11-16 17:09:24 UTC
Revision:     2972ff02f3210d2ceed2f1ea880f026acfbab5c0

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          11.0.8 (JetBrains s.r.o 11.0.8+10-b944.6916264)
OS:           Mac OS X 10.16 x86_64

ちなみにAndroid Studio 4.2からBundleされるJDKが11系に変わったようです。

developer.android.com

build.gradleで利用するバージョンをきちんと指定していれば問題ないのですが、気になる場合はAndroid StudioJDKでgralde タスクを実行するようにしておきましょう。

具体的にはgradleタスクを実行する前にJAVA_HOMEの設定をAndroid Studioが内包しているものに変更すればよいです。

例えばCIパイプラインを実行するシェルスクリプトの最初にJAVA_HOMEを入れ替えるようにするとよいでしょう。

macOSの場合、Android StudioJDK/Applications/Android Studio.app/Contents/jre/jdk/Contents/Homeにあります。

!/bin/sh

set -e
set -x

...
JAVA_HOME="/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home"

./gradlew --version

./gradlew lint

./gradlew test

./gradlew connectedAndroidTest