Androidのビルドの話

自分のAndroidアプリのビルド方法ついてまとめる。せっかくなのでAndroid開発のドメイン知識がない人でも伝わるように紹介をしたいと思う。 Java/Kotlinでアプリ開発する場合Android Studio(以下AS)以外の選択肢は殆どない。ただビルド方法については工夫の余地がある。

ビルドの話

ビルド&ランする一番簡単な方法はASのRunボタンで、クリックすると実行対象を選択するダイアログが表示され、アプリが起動する。 もう少し手順を分解してみる。Androidプロジェクトにはflavor(例えばstaging,production)とbuildType(debug,release)の組み合わせのパターン数のビルド方法がある。 ASのRunを押したときはデフォルト値にどれかが選択され、その設定でビルドが走る。ビルドの設定はウィンドウ左下にあるBuild Variantsウィンドウから変更できる。
Androidアプリはgradleによってビルドされる。ASも裏側でgradleコマンドを使ってビルトを行う。プロジェクトからapkファイルを作成するためのコマンドは、

./gradlew assemble

である。これは基本的な形でflavorやbuildTypeで変化する。StagingフレーバーのDebugビルドが欲しい場合は、

./gradlew assembleStagingDebug

となる。プロジェクトにフレーバーが定義されているが、

./gradlew assembleDebug

のようにフレーバーを指定せずに実行した場合は全てのフレーバーがビルドされるので注意したい。同様にproductionフレーバーのReleaseビルドが欲しい場合は

./gradlew assembleProductionRelease

となる。ビルドが完了するとapp/builds/output以下にapkファイルが作成される。
もう少し補足する。ASのRunボタンの左にappという文字があると思う。ASはappモジュールをビルドする設定を予め用意してくれているため、Runを押すだけでビルドが走りアプリが起動する。 先程は省略したが、正確なビルドコマンドは、

./gradlew app:assembleStagingDebug

のようなmodule名をつけた形になる。モジュール名は明示的に書かなくてもビルドは出来るが、プロジェクトに複数のmoduleがある場合に明示したほうが良い場合もある。

インストールの話

ビルドされたapkファイルは端末にインストールする必要がある。これにはadbコマンドが使用される。
まずUSBデバッグが有効な端末をマシンに接続する。この状態で

adb install -r {apk_path}

でアプリがインストールされる。 -rは同一パッケージが存在した場合に上書きするオプションである。 ASでRunボタンを押した場合、この過程も自動で行われる。

起動の話

Androidにはランチャーアプリと呼ばれるアプリのアイコンが並んだ画面が存在する(ホーム画面とも呼ばれる)。ユーザーがアイコンをタップすることでアプリが起動するが、起動して最初に表示すべき画面はアプリに定義されている。より正確にはアプリ内に複数存在するActivityの中で、android.intent.category.LAUNCHERカテゴリのものがランチャーに並び、通常それらにはandroid.intent.action.MAINアクションが付けられている。AS上でRunを実行した場合は、android.intent.action.MAINが設定されているActivityを探し起動する。アプリの起動もadbコマンドから行える。

adb shell start -n {package_name}/{activity_package}

僕の開発スタイル

ビルド->インストール->起動の手順はCLI経由で手軽に行えるので、私はすべてターミナルで行っている。これには理由があって、ASでビルドを走らせると非常に重いからである。原因を調べたことがないがassmble系以外のコマンドも同時に行われていそうな雰囲気がある。またビルドをしている間AS自体の処理も重くなりがちなのでそれも避けたい理由になっている。もちろんCLIでビルドするデメリットもあって、例えばInstant Runが使えないなどがある。

ビルド&インストールスクリプト

./gradlew assembleDebug && find . -name "*.apk" | peco | xargs adb-peco install -r

普段はこういうものを叩いている。adb-pecoは、adbに置き換えても問題ない。adb-pecoを利用すると端末が複数接続されている場合に、pecoで選択できるようになる。 gem install adb-pecoで導入できるはずである。 アプリの起動に関しては手動でやっているのだけど、やろうと思えば自動化出来る(はず)。

おわり

今日たまたまAndroid環境整える同僚の人がいたので、僕は普段こうやって普段ビルドしてます。って話を書いてみたくなった。なんか前置きが長くなって、本当に書きたい内容は雑になってしまった。 mac book pro 13inchとか比較的非力なマシンだとASで巨大プロジェクトビルドするのキツいのでCLIでのビルドおすすめなんだけど、他の開発者の人がどうやってるのかも気になるのでぜひ誰か書いてほしい。