5
3

More than 3 years have passed since last update.

一部のktxを使うにはJava8対応が必要

Last updated at Posted at 2019-11-09

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生成時にjavackotlincによって.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が必要なライブラリは結構ある

例えばWorkManager2.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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3