Android の実行環境

配属された新人のトレーナーになったので Android のコーチングをしているわけですが
上手く言語化できない部分があったので自分なりに纏めました。

間違い等コメントいただけると嬉しいです🙋


## Java

- クラスベースのオブジェクト指向型プログラミング言語
  - 処理速度が速い
  - プラットフォームに依存しない
  - オブジェクト指向


### JVM

`Java Virtual Machine`

- Java アプリケーションを動かすためのソフトウェア
  - JVM が各 OS 向けに Java クラスファイルをコンバートする事でアプリケーションが動作する

Java プログラム (.java) をコンパイルすると Java クラスファイル (.class) が出来上がる。
Java クラスファイルを JVM が各 OS 向けにバイトコードに変換してアプリケーションを動かしている。

<img width="815" alt="jvm_flow.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308397/1ef489b8-c840-a3bc-2eef-44411db5d254.png">

Java の特徴である `プラットフォームに依存しない` とはこのため。
デメリットとしては、動作環境のセットアップのハードルが他より少し高い。


### JRE

`Java Runtime Environment`

- Java アプリケーションの実行環境
  - JVM + 対応した API

OS に JRE をインストールすることで Java アプリケーションを実行する事ができる。
ただしコンパイラ等がないので開発はできない。
現在は JRE 単独でインストールできず、JDK をインストールする必要がある。


### JDK

`Java Development Kit`

- Java でプログラミングするための開発ツール
  - JRE + コンパイラやデバッガーのプログラム等


<img width="814" alt="jvm.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308397/fc1ada19-5099-3762-e008-2aed019b1d53.png">



## Android の実行環境

- Android アプリは .apk ファイル に含まれている .dex ファイルで動作する

Android アプリはコンパイル時に .class ファイル内のバイトコードから .dex ファイルを生成する。
ART (旧 Dalvik) は生成された .dex ファイルを読み込んでアプリを動作させる。
そのため Java 言語で開発が可能だし、__Android は JVM で動いているわけではない__。

<img width="816" alt="art_flow.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308397/6466514a-30f9-f561-ff35-d61d55ab3bbf.png">


### ART と Dalvik

- ART と Dalvik ではコンパイル方式が違う

| Runtime | Compiler | いつコンパイルされるか |
|:-:|:-:|:--|
| ART | AOT (A Head Of Time) | インストール時 |
| Dalvik | JIT (Just In Time) | プログラム実行時 |

AOT だとプログラム実行時のオーバーヘッドがなくなることで、動作の高速化や省電力化に繋がる。
Android 4.4 から ART にリプレイスされていった。


## Kotlin

- JVM 上で動作するオブジェクト指向言語
  - JDK が必要
  - Java <-> Kotlin の相互運用が可能
  - 実用的で Java より書きやすいけど JVM で動くので OS に依存しない 👏😄
  - Android 用の extension が提供されている

[GitHub - JetBrains/kotlin: The Kotlin Programming Language](https://github.com/JetBrains/kotlin)


### kotlin-stdlib

- Kotlin を使うためのコアライブラリ
  - `stdlib-jdk` は extension


#### kotlin-stdlib-jre の Deprecate

- Java 9 モジュールシステムをサポートするために stdlib-jdk に移行された
  - Kotlin 1.3 から使用も禁止された

[What's New in Kotlin 1.2 - Kotlin Programming Language](https://kotlinlang.org/docs/reference/whatsnew12.html#kotlin-standard-library-artifacts-and-split-packages)

> 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.


以下の様なライブラリのユースケースが解説されていました。

| Library | 使用パターン |
|:-:|:-:|
| stdlib | minSdkVersion < 21 |
| stdlib-jdk7 | minSdkVersion >= 21 |
| stdlib-jdk8 | minSdkVersion >= 24 |

[Androidの開発でkotlin-stdlib, kotlin-stdlib-jre7, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8どれ使えばいいの問題 - Qiita](https://qiita.com/takahirom/items/52a092550ce3931c717b)


## 参考

[Java SEとJDK、JRE、JVMの違いに関する解説 \| Java入門](https://www.javadrive.jp/start/install/index5.html)

[Android ランタイム（ART）と Dalvik  \|  Android オープンソース プロジェクト](https://source.android.google.cn/devices/tech/dalvik?hl=ja)

[VMの歩む道。 Dalvik、ART、そしてJava VM](https://www.slideshare.net/yyyank/vm-dalvikartjava-vm)