kotlin-stdlib-jreがdeprecatedになっていたので深掘りしてみた

環境

  • AndroidStudio 3.1.2
  • Kotlin 1.2.41

起こったこと

AndroidStudioで新しくプロジェクトを作ってみたら、{project}/app.gradleorg.jetbrains.kotlin:kotlin-stdlib-jre7がdeprecatedになっていました。

kotlin-stdlib-jre7 is deprecated since 1.2.0 and should be replaced with kotlin-stdlib-jdk7

f:id:t-miliya612:20180502173641p:plain

言われた通りjre-7からjdk-7に変えたら直りました。よかったです。

……だけで終わるのもアレなので、しっかり調べてみました。

kotlin-stdlibについて

まさにStandardなlibraryで、Kotlinのコア部分の実装を担っています。

The Kotlin Standard Library provides living essentials for everyday work with Kotlin. These include:
- Higher-order functions implementing idiomatic patterns (let, apply, use, synchronized, etc).
- Extension functions providing querying operations for collections (eager) and sequences (lazy).
- Various utilities for working with strings and char sequences.
- Extensions for JDK classes making it convenient to work with files, IO, and threading.

kotlin-stdlib - Kotlin Programming Language

kotlin-stdlibはコア部分、kotlin-stdlib-jre/jdkはextension的な部分っぽいですね。
似たような議論がこちらに。

discuss.kotlinlang.org

変更理由

Java9、特にその中でもモジュールシステムのサポートのためみたいです。

The Kotlin standard library is now fully compatible with the Java 9 module system, which forbids split packages (multiple jar files declaring classes in the same package). In order to support that, new artifacts kotlin-stdlib-jdk7 and kotlin-stdlib-jdk8 are introduced, which replace the old kotlin-stdlib-jre7 and kotlin-stdlib-jre8.

The declarations in the new artifacts are visible under the same package names from the Kotlin point of view, but have different package names for Java. Therefore, switching to the new artifacts will not require any changes to your source code.

What's New in Kotlin 1.2 - Kotlin Programming Language

モジュールシステムについて

  • 別名 Project Jigsaw
  • Packageの上位概念としてモジュールを作る

実際にKotlin内のコードでも使われていますね。

github.com

目的

  • 構成の信頼性の向上
    • モジュール間の依存性を明示的に宣言
    • コンパイル時、実行時に依存性の認識が可能
  • 強力なカプセル化
    • モジュールは明示的にエクスポートしない限り外部からのアクセス不可
    • エクスポートは全開放するか特定のモジュールにのみ解放するか選べる
  • スケーラブルなJavaプラットフォーム
    • プラットフォームがモジュールで分割される
    • 必要なものだけを集めたカスタムランタイムを作れる
      • ランタイムのサイズを削減できる
  • プラットフォームの整合性向上
    • 内部APIを完全にカプセル化できる
    • プラットフォーム内でアプリに使われたくないAPIを隠蔽できる
  • パフォーマンスの向上
    • これちょっとわかりませんでした。。。

http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-SO17-Modules.pdf

エクスポートを明示的にできるのは良さそうですね!openが必要なのはKotlinの影響もあるんでしょうか。

所感

Android-Java-Kotlinと変数が増えると最新版を追っかけるのは大変ですね……。
モジュールシステムに関しては、gradleを使ったモジュールとの今後が気になります。試しにこれ使ってマルチモジュールのアプリ書いてみたいなぁ(伏線)
また、stdlibに関して、ネーミングの理由はよくわからないままでした。何故拡張版をjreなんてネーミングにしたんでしょう。

おまけ

AndroidのJava7サポートって完全じゃなかったようなーと思い調べてみた所、こんな記事が見つかりました。

tech.speee.jp

Androidの開発環境における「Javaのバージョン」はいくつかの考え方があり、自明ではありません。ここでは3つに分けて考えます。

ひとつはAndroid端末にインストールされているAndroid OS、それにバンドルされているDalvik処理系(仮想マシン)がどのJVMバージョンに相当するかというものです。

もうひとつは、Android端末にインストールされているAndroid OS、それにバンドルされているJava標準ライブラリのバージョンです。

最後に、Androidアプリケーションを開発する際にJavaコンパイラに与えるバージョンです。

あれ、そしたら結局AndroidってどのJava使えるの……?

Java 8 言語機能の使用  |  Android Developers

Android Studio では、特定の Java 8 言語機能とそれらを使用するサードパーティ ライブラリのビルトイン サポートを提供しています。

し、知らなかった……。
こちらからは以上です。