10年ぶりのAndroidアプリ開発 (1)開発環境準備編

# はじめに
およそ10年ぶりにAndroidアプリを作ってみることにしたので、準備から（たどり着ければ）公開までを記事にしていきたいと思います。
私はAndroidのバージョンがまだ2の頃、少しだけアプリを作って遊んだことはありますが、その後はまったく触っていません。なので大まかなアプリの仕組みや開発の流れは分かっているつもりですが、Android Studioも触ったことがないし、Kotlinもまったく知りません。その他にも10年前と変わっていることはたくさんあると思いますので、そういった変化で戸惑ったところなど、紹介していければと思っています。

# 環境

- ホストPC:　Ubuntu 18.04.3 LTS
- Android Studio: 3.5.3 for Linux 64-bit
- デバッグに使うデバイス：　主にSHARP SH-M08 (Android 9)

# Android Studioのインストール
[Android Studioのインストール](https://developer.android.com/studio/install?hl=ja)に従ってインストールします。ちゃんとLinux用の手順も書いてくれているのでありがたいです。Android Studioのバージョンは3.5.3でした。

まずは[ダウンロードページ](https://developer.android.com/studio/?hl=ja)からダウンロードし、解凍した android-studio フォルダを /usr/local/ に置きます。

以下のコマンドで32bit用のライブラリをインストールします

```
$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
```

android-sudio/bin/ フォルダで `./studio.sh` を実行します。
ここで私の環境では下記のエラーが出ました。

```
$ ./studio.sh
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f301898f3e6, pid=8378, tid=0x00007f2ffc2cc700
#
# JRE version: OpenJDK Runtime Environment (8.0_202) (build 1.8.0_202-release-1483-b49-5587405)
# Java VM: OpenJDK 64-Bit Server VM (25.202-b49-5587405 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x4b13e6]  MarkFromRootsClosure::scanOopsInOop(HeapWord*)+0x1c6
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/atsushi/java_error_in_STUDIO_8378.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
Aborted (core dumped)
```

とりあえず`apt upgrade`と`apt update`して再チャレンジしたらインストールできました。ただ、一度失敗した影響か、ウィザードのステップが随分と省略されてしまっているような気がしました。たぶん、必要なら後からでも設定変更できると思うのでそのまま続行することにします。

[Welcome to Android Studio] の画面右下の [Configure] の中の [Create Desktop Entry] を選択することにより、Ubuntuのアプリケーション一覧の中にAndroid Studioが表示されるようになります。

これでAndroid Studioのインストールは完了したっぽいです。

# Hello World

Android Studioを起動し、[Start a new Android Studio project] を選択します。
![Welcome to Android Studio_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/0fc6dafe-639f-6627-851c-1d0b1e4ae588.png)

最初なので、[Empty Activity] を選んでみます。
![Create New Project_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/3c50281c-6324-df09-e1b9-20bb58730d1d.png)

[Name] を "Hello" として、[Language] が "Kotlin" になっていることを確認して [Finish] します。
![Create New Project_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/ccb461d9-0c72-4571-29eb-26479c6b7e73.png)

今回はHello World程度なのでどうでもよいですが、API levelのHelpを開くと、API LevelとAndroid versionとユーザー比率が表示されるの、よいですね。古いAndroid versionを切り捨てるかどうかの判断がやりやすそうです。
![Android Platform-API Version Distribution_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/b1d543ec-3dcd-953a-20fe-6748f498680b.png)

さて、Hello Worldアプリなので、適当にラベルを配置して"Hello World"とでも表示しようと思ってactivity_main.xmlを開いたらなんと！！すでにHello World!と書かれたラベルが配置されている！！！考えが読まれている（笑）。コーディング0行でアプリができてしまいました。

## エミュレータで実行
せっかくなのでこのまま進めましょう。エミュレータで実行してみます。ツールバーの[No devices]をクリックし、Open AVD Managerを開きます。
![範囲を選択_010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/f7d53328-0f23-db1b-0176-40b7ada1a536.png)

[Create Virtual Device]をクリック。
![Android Virtual Device Manager_011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/45cf0597-ab73-827f-e476-d133e2860c6c.png)

個人的に欲しいと思っているPixel 3aを選んでみます。
![Virtual Device Configuration_012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/4735e1d9-b5ea-4073-eb5c-650a44d93432.png)

"Q"の横の"Download"をクリックし、System Imageを入手します。ライセンスを読んで同意しましょう。ダウンロードとインストールにしばらくかかります。インストールが完了したら、改めて"Q"を選択して"Next"をクリックします。
![Virtual Device Configuration_013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/1156a96a-a5fd-52cf-7ddd-246a7224b601.png)

あとからAVDを複数作ったときに見分けがつきやすいように、AVD Nameを適切につけておきます。もともと"Pixel 3a API 29"と入力されていたので、Android versionとの関係がわかりやすいように"(Q)"と付け加えました。
![Virtual Device Configuration_014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/26c4cb60-f378-8b3c-beaf-0df81f979960.png)

"Finish"をクリックすると"Android Virtual Device Manager"の画面に戻るので、先程追加したデバイスの三角ボタン(Launch)を押すと・・
![Android Virtual Device Manager_015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/0213f120-8440-a469-9eda-e0073daea761.png)

"KVM is required to run this AVD"と怒られました。そういえばさっきからずっと、"/dev/kvm is not found"ってメッセージが出てましたね。
![Troubleshoot_016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/88abf08a-39d8-b703-04b4-582afdd00ac9.png)

### KVMの準備
KVMって何？って感じですが、Kernel-based Virtual Machine、つまりLinux Kernel自身が仮想OSを管理するハイパーバイザとして動作するものらしいです。詳しく調べていくとこれだけで記事がいくつも書けそうですが、今回はとりあえず動かすことを優先します。[ここ](https://www.hiroom2.com/2018/05/11/ubuntu-1804-kvm-ja/)と[ここ](https://qiita.com/ceratophry/items/0b2a974f3c02a2d4b23c)が参考になりました。試行錯誤しながらやったので、不要な手順も含んでしまっているかもしれません。

まず、必要なパッケージをインストールし、ユーザーグループに追加します。

```
$ sudo apt install -y qemu-kvm libvirt0 libvirt-bin virt-manager libguestfs-tools
$ sudo gpasswd libvirt -a [username]
$ sudo reboot
```

再起動のついでにBIOSに入り、Intel(R) Virtualization TechnologyとIntel(R) VT-d FeatureをEnableにします。

これで改めてAVDを起動してみると・・・

一歩進んだ感じですが、まだダメ。
![Troubleshoot_017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/167bae4c-0ae7-8720-99e8-6e71fe36f5d2.png)

KVMに対してもユーザーの追加が必要なようです。ということで以下を実行。

```
$ sudo adduser [username] kvm
$ sudo reboot
```

三度目の正直！今度こそエミュレータが起動しました。10年前はエミュレータは遅すぎて実用にならなかったですけど、今は十分使えそうです。
![Android Emulator - Pixel_3a_API_29_Q_:5554_019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/63547ecd-1325-1cf0-dfd5-2a60ee566ab9.png)

エミュレータ起動したので、意気揚々とRunボタンをクリック！ Hello Worldアプリが起動しました！
![Android Emulator - Pixel_3a_API_29_Q_:5554_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/de817ecc-c8d2-fea7-7bf7-5d45421bf097.png)

## 実機で実行
続いて実機でも動作を確認します。

Androidデバイス側で 設定 > システム > 端末情報 > ビルド番号 を連打すると、開発者向けオプションが有効になるので、設定 > システム > 開発者向けオプション > USBデバッグ をONします。このあたりは昔から変わりませんね。

USBケーブルでデバイスとPCを接続したところ、Android Studioのデバイス欄に "Unknown Device" と出ました。機種名が表示されないのが気になりますが、とりあえずRunしてみます。
![範囲を選択_020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/c37c1478-9c37-c0e5-9094-3d7d7a1a0fad.png)

案の定、怒られました。

```
01/01 19:23:46: Launching 'app' on Unknown Device.
Installation did not succeed.
The application could not be installed.
Installation failed due to: 'insufficient permissions for device: user in plugdev group; are your udev rules wrong?
See [http://developer.android.com/tools/device.html] for more information'
```

メッセージに従い、http://developer.android.com/tools/device.html を確認すると、adbを入れろとのこと。そりゃそうか。

```
$ sudo apt install adb
```

下記で、自分がplugdevグループに所属しているかどうかを確認。私の環境ではすでにグループに参加しているようでした。

```
$ groups [ユーザー名]
```

デバイス側で「USBデバッグを許可しますか？」のメッセージが表示されるので、OKを押します。
すると、Android Studioのデバイス欄に "SHARP SH-M08" が表示されました。
![範囲を選択_021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/f968e51b-3184-97f9-5013-28f7b7c94482.png)

改めて、Runしたらデバイスで実行できました！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3437303434362f39656236663563352d613562322d336562642d613064382d6132316331353636376535382e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470446/b7fa97da-20fe-54bf-fb26-a1679ca84caa.png)

# まとめ
KVMを導入するところで若干苦労しましたが、それ以外は比較的スムーズに進めることができました。公式のドキュメントもしっかりしているので、この先の開発もやりやすそうな予感です。
2020年の元旦から引き籠もってしまいましたが、今年はたくさんソースコード書いてたくさんアプリ作って楽しめるといいなあと思います。