DX向上のためにAndroidプロジェクトにktxを導入しようとしたのですが、以下のようにJVM target 1.6にしろというエラーに遭遇したので、なぜこのエラーがでるかと言う原因と解決策をちょっと調べてみました。
Cannnot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper 'jvm -target' option
JVM target って何
Androidプロジェクトに含まれる.javaや.kotlinファイルはapk生成時にjavac
やkotlinc
によって.class拡張子のバイトコードにコンパイルされるのですが、この.classファイルを実行する仮装環境がJVMです※1 ※2。
そして、このJVMのtargetというのはつまりはJavaプラットフォームのバージョンのことであり、ここではJava8を指定しろ、と言うことだと思います。
(Java8のバージョン文字列が1.8です ※3)
何で1.8指定(Java8)が必要なの?
これは、いくつかのktxライブラリがJava8に依存しており、かつgradleのデフォルトのJVM targetが1.6だからです。
例えば fragment-ktx
の1.2のリリースノートには以下のように明記されています※4
The Kotlin dependant libraries of this version (fragment-ktx,fragment-testing) target Java 8 programming language bytecode. Please read Use Java 8 language features to learn how to use it in your project.
一方で、jvm tergetに関しては以下となっており、デフォルトでは1.6指定になっているのがわかります※5。
Target version of the generated JVM bytecode (1.6, 1.8, 9, 10, 11 or 12), default is 1.6
ktx以外でもJava8が必要なライブラリは結構ある
例えばWorkManagerの2.1.0
でも
work-runtime-ktx では今後、Java 8 が必要になります
とあります※6し、JetpackComposeでも必要だったと思います。
どうやってJVMtargetを変えるの
developersにある通り、各モジュールのbuild.gradleで以下のように指定できます。
https://developer.android.com/studio/write/java8-support?hl=ja
android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
compileOptions
がJavaコンパイラ向けのJava8対応、kotlinOptions
がKotlinコンパイラ向けのJava8対応です。
参考
※1. Javaコードが動くのはJVM環境ですが、AndroidアプリはJVMではなくARTというランタイムで実行され、そのために.classファイルはclasses.dexというdexファイルに圧縮変換されてapkに含まれます。AndroidアプリがJVMを含んでいるわけではないです
dexファイルについては別途記事を書いたので参照してください。
https://qiita.com/nichiyoshi/items/46f44001358fbafd85a5
※2 https://www.javatpoint.com/difference-between-jdk-jre-and-jvm
※3 https://www.oracle.com/technetwork/jp/java/javase/jdk8-naming-2157130-ja.html
※4 https://developer.android.com/jetpack/androidx/releases/fragment#version_120_2
※5 https://kotlinlang.org/docs/reference/using-gradle.html#attributes-specific-for-jvm
※6 https://developer.android.com/jetpack/androidx/releases/work#2.1.0