普段はiOS開発がメインなのですがKotlinも慣れてかないといけないと思い本格的に勉強を開始することにしました。まずはビルドなどの開発環境周りから理解していきたいと思います。
目次
Android Studioとは
Androidアプリ開発用の統合開発環境で、ビルド・実行・デバッグ・テスト・配布まで行うことができます。ベースの統合開発環境(IDE)はIntelliJ IDEAです。
InteliJ IDEA
JetBrainsという会社の統合開発環境がInteliJ IDEAというもので元々はJava用に作られたIDEだったのですが、今ではKotlin含め多言語化に対応されています。また、KotlinはGoogleがAndroidの公式言語としてサポートしています。
Android StudioはこのInteliJ IDEAにGoogleがAndroidの機能を搭載したIDEで、Android SDKやGradleなどの機能が多数ついてます。またエディタや言語解析などについてはInteliJ IDEAの機能をそのまま利用しているためツールの見た目はどちらも同じですね。
JDK(Java Development Kit)
まずJDKという存在を知る必要があります。Androidアプリの開発をする時に必ず耳にする単語です。InteliJ IDEAの機能ではなく、Java言語の公式ツールセットでOracleやOpenJDKコミュニティが提供しているものです。Java/Kotlinのコードをコンパイルして実行することができます。
JDKの標準ライブラリ
JDKにはJava言語向けの標準ライブラリなどが含まれています。Kotlinにも同じく標準ライブラリがありますが、javaのライブラリをラップして作られたものが多く存在するためKotlinを動かすにはJDKの標準ライブラリも必要となります。
javac
JDKに含まれるJavaコンパイラ。javacコマンドを利用して.javaで書かれたソースコードをJVMバイトコード(.class)に変換します。Kotlinの場合はkotlincというコンパイラがAndroid Studioに組み込まれており、同様にJVMバイトコードに変換することができます。
JVM(Java Virtual Machine)
JavaとKotlinのプログラムを実行する仮想マシンで.classコードを読み取って実行します。Javaアプリの場合はJVMをそのまま利用しますが、Androidアプリの場合は.classをD8で.dexに変換してからART(Android Runtime)が実行します。
D8:.classを.dexに変換するツール
.dex:拡張子はDalvik Executableの略。.classファイルを1つの.dexにまとめられるようにしたものになります(Android用バイナリコードの生成)
Gradle
Gradleでは依存関係の管理、ビルドの自動化、タスクの実行などを行うことができます。
Gradleによるビルドは./gradlew buildで実行します。そのほかにも最初から用意されているタスクが複数あります。
settings.gradle.kts
Gradleビルドするために必要なモジュールを定義します。Gradleにどのモジュールがこのプロジェクトに含まれるかを知らせるためのファイルです。
rootProject.name = "MyApp"
include(":shared") // KMPのSharedモジュール
include(":cmp") // CMPモジュール(UIなど)
include(":app") // iOS/Androidアプリ本体※:はルートプロジェクトからのパスを表します
local.properties
プロジェクト固有のローカル環境設定を書くためのファイルでSDK パス、Xcode パス、ライブラリのローカルパスなどを記述します。各開発者に依存するためGitの管理対象外です。
sdk.dir=/Users/username/Library/Android/sdkgradle.properties
Gradleのビルド挙動やプラグインの設定を制御します。プロジェクト全体で共通して使う定数やフラグを定義するためGitの管理対象です。
build.gradle.kts
GradleビルドスクリプトをKotlin DSLで書いたファイルで、プロジェクトやモジュールのビルド設定を定義する中心的なファイルとなります。
・依存関係(ライブラリやモジュール)を定義
・モジュールのビルド設定
・Androidのターゲットの指定
・ビルドタスクのカスタマイズ
Gradleではモジュール単位でビルドスクリプトを持つことができます。settings.gradle.ktsでどのモジュールを含めるかをinclude(“:モジュール”)のように宣言しているため、それぞれのモジュールには独自のbuild.gradle.ktsを置くことができます。
プロジェクトのルートのbuild.gradle.ktsでは全体の共通設定やプラグイン管理などを定義し、各モジュールのbuild.gradle.ktsではモジュール固有のビルド設定、依存関係、ターゲットなどを指定します。
Android SDK(Android Software Development Kit)
Android アプリを開発するために必要なライブラリ、ツール、APIのセットです。JDKがJavaやKotlinの基盤なら、Android SDKはAndroid専用の基盤。
APIライブラリ
Android 固有のクラスやインターフェース(Activity, Flagment, Intent, View)を適用しており、KotlinやJavaからこれを呼ぶことでAndroidアプリを作ることができます。
ビルドツール
- aab(Android Debug Bridge)
- エミュレーターや実機にアプリをインストール / デバッグする
- emulator
- Android OSの仮想環境
- D8/R8
- .class → .dexの最適化や難読化
JAR
配布やデプロイに関係するファイルになります。
JAR
Java Archiveの略称でジャーファイルと呼ばれています。複数の.classファイルやリソースをZip形式でJavaとKotlinのライブラリや実行可能アプリの配布形式に使われます(.jar)
Gradleのimplementation "xxx:yyy:1.0.0"のように書いたときに利用できるライブラリのほとんどはJAR形式になっています。ライブラリをimportして使えるようにするためにはクラスパスと呼ばれるコンパイラや実行環境がクラスを探している場所にパスを追加する必要があります。Gradleはライブラリをこのクラスパスに追加してくれるため、開発時にはimportできるように候補が出る仕組みになっています。
おわりに
まだまだ知らないことがたくさんあるので手を動かしてみながらまとめていく予定です。