Arch Linux + Flutter + VSCodeでのAndroid開発環境構築
Arch Linux (正確には Manjaro) での環境構築に少々手間取ったのでメモを残す。
Android Studio は使わず、VSCode を使う。なので Android Studio はインストールしなかった。
恐らく使わないとしても Android Studio をインストールしたほうがトラブルは少ないと思われる。
参考:
Flutter はインストールされているものとする。自分は asdf で管理している。
必要なパッケージのインストール
yay -S android-sdk
android-sdk
を入れると、依存関係で android-platform
と android-sdk-platform-tools
が入る。
一応以下も入れておく。
yay -S android-sdk-build-tools
ユーザー権限で動作させられるようにしておく。<user>
部分はユーザー名に置き換える。
sudo groupadd android
sudo -a <user> android
sudo chown -R :android /opt/android-sdk/
sudo chmod -R g+w /opt/android-sdk/
(なお自分は最後のグループへの書き込み権限付与を忘れて、後のライセンス承認でハマった)
この段階でコマンドラインを新規に立ち上げて
flutter doctor
すると、以下を実行して cmdline-tools
を入れろと表示される。
sdkmanager --install "cmdline-tools:latest"
が、実行すると Java のエラーになった。
どうも Android Studio に同梱されている Java バージョンなら動くらしいが、自分の環境に入っている Java 17 では動かないっぽい。
もしくは cmdline-tools
が入っていれば、そちらの sdkmanager
コマンドが動くらしいが、そもそもそれをインストールしたいわけで・・・。
というわけで、
yay -S android-sdk-cmdline-tools-latest
で Arch のパッケージからインストール。
ライセンス承認
以下を実行して、全て y
を選択していけば完了する。
flutter doctor --android-licenses
のだが、先述したとおり自分はここでもハマった。
恐らく sudo chmod -R g+w /opt/android-sdk/
を実行していれば大丈夫なのだと思う。
しかし自分はそれをやっていなかったために、何のエラーも発生しないのに、再び flutter doctor
を実行すると、ライセンス認証していないことになっていた。
以下の Issue を参考にした。
sudo mkdir -p /opt/android-sdk/licenses
sudo chmod 777 /opt/android-sdk/licenses
再度ライセンス承認を行ったらうまくいった。
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.6, on Manjaro Linux 5.15.154-1-MANJARO, locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
(以下略)
実機での開発
Wifiデバッグの場合
Android 11 以降だと Wifi 経由で実機を使った開発ができる。USB デバッグよりこちらの方が、ケーブルがいらないだけでなく環境整備も圧倒的に楽。
特に Linux に限った話ではなく、Windows でもやり方は同じだし、Flutter も関係ない。
android wifi デバッグ
とかでググれば色々と情報が出てくる。
ただし Android Studio を入れていないので、ここではコマンドラインで操作する。
手順としては以下。
- 実機側で開発者向けオプションを有効化
- 開発者向けオプションでワイヤレスでバッグを有効化
- ワイヤレスでバッグをタップして、「ペア設定コードによるデバイスのペア設定」をタップ
-
adb pair <ip address>:<port>
でペアリング -
adb connect <ip address>:<port>
で接続
ペアリング時と接続時はポート番号が違うことに注意。
ペアリング時は「ペア設定コードによるデバイスのペア設定」をタップして表示されるポートを利用。
接続時は「IPアドレスとポート」に表示されているポートを利用。
接続したら
adb devices
の一覧に表示されるはず。
なお自分は最初はペアリングに失敗してしてしまう状況だった。
が、Android デバイス側の Wifi を一旦 OFF にして、再度 ON にしたらうまくいった。ルーターを再起動したらうまくいったという報告もあったが、これらの情報源がどこだったか残しておらず・・・。
USBデバッグの場合
実機側で開発者向けオプションを有効化し、さらに USB デバッグを有効化。
この辺りは Linux だとか Flutter とか関係ない、Android 開発で共通の手順。
ここからが Arch Linux に関係する部分。
ユーザーを adbusers
グループに追加。
sudo gpasswd -a <user> adbusers
android-udev
をインストール。
yay -S android-udev
/usr/lib/udev/rules.d/51-android.rules
を配置した上で udev ルールをリロードしてくれる。
が、有名所のデバイス ID なら認識するように に記載されているが、存在しない場合は認識してくれない。
デバイスを繋いでみて、以下を実行。
adb devices
もしリストに出てこないようなら認識されていないかもしれない。
/usr/lib/udev/rules.d/51-android.rules
を確認して、自分の実機のベンダーIDやプロダクトIDが登録されていないようなら、以下のように手動登録する必要がある。
lsusb
でデバイス ID を確認しておく。
Bus 002 Device 006: ID 1ab2:0c1d Smartphone
の場合、VENDOR ID が 1ab2
で、PRODUCT ID が 0c1d
である。
/etc/udev/rules.d/51-android.rules
に登録する。
[VENDOR ID]
と [PRODUCT ID]
は実機のものに置き換えること。
SUBSYSTEM=="usb", ATTR{idVendor}=="[VENDOR ID]", MODE="0660", GROUP="adbusers", TAG+="uaccess"
SUBSYSTEM=="usb", ATTR{idVendor}=="[VENDOR ID]", ATTR{idProduct}=="[PRODUCT ID]", SYMLINK+="android_adb"
SUBSYSTEM=="usb", ATTR{idVendor}=="[VENDOR ID]", ATTR{idProduct}=="[PRODUCT ID]", SYMLINK+="android_fastboot"
udev ルールをリロード。
sudo udevadm control --reload-rules
ちなみに自分は手元にある2つの Android 端末のうち、Wifi デバッグに対応していない古いAndroid 端末(Android 9)が、android-udev
パッケージでサポートされているはずなのに認識してもらえなかった。手動登録しても駄目。
Android 14 の端末が Wifi デバッグで繋がったので、結局 USB デバッグは試していない。
エミュレータ
デバイスイメージをインストール。
yay -S android-x86-64-system-image
Android仮想デバイスを作成する。まずはデフォルトで用意されているテンプレートを確認。
avdmanager list
(略)
id: 32 or "pixel_7"
Name: Pixel 7
OEM : Google
(略)
とりあえず Pixel 7 を選択して作ってみる。こんな感じかなー?
$ avdmanager create avd --name pixel7 --device 32
Error: Package path (-k) not specified. Valid system image paths are:
system-images;android-31;default;x86_64
null
どうやらイメージを提供しているパッケージのパスを指定する必要があるっぽい。
そしてそのパスはファイルパスとかではなく、パッケージ特有のパスっぽい。
$ avdmanager create avd --name pixel7 --device 32 --package "system-images;android-31;default;x86_64"
[=======================================] 100% Fetch remote repository...
Cannot invoke "com.android.sdklib.repository.IdDisplay.getId()" because "tag" is null
何やら tag が null だとか出ているけれど、指定する必要があるのか?ヘルプにはプラットフォームが1つしか tag を持ってない場合、指定しなければ自動選択されるとあるのだけど・・・。
ちゃんと作られているんだろうか?
$ avdmanager list avd
Available Android Virtual Devices:
駄目っぽい。
しかし tag の意味が分からない。
ネットで検索すると google_api
を指定している例が見つかったが、それを指定すると有効な tag じゃないよ、有効なタグとして default
ってのがあるよ、と言われる。
ので、default
を指定。
$ avdmanager create avd --name pixel7 --device 32 --package "system-images;android-31;default;x86_64" --tag default
[=======================================] 100% Fetch remote repository...
Auto-selecting single ABI x86_64
Error: "emulator" package must be installed!
null
今度は emulator パッケージをインストールしろと言われるので、インストールする。
sdkmanager --install emulator
$ avdmanager create avd --name pixel7 --device 32 --package "system-images;android-31;default;x86_64" --tag default
[=======================================] 100% Fetch remote repository...
Auto-selecting single ABI x86_64
うまくいったっぽい。
$ avdmanager list avd
Available Android Virtual Devices:
Name: pixel7
Device: pixel_7 (Google)
Path: /home/username/.config/.android/avd/pixel7.avd
Target: Default
Based on: Android 12.0 ("S") Tag/ABI: default/x86_64
Sdcard: 512 MB
しかし起動しようとするとエラー。
emulator -avd pixel7
PANIC: Unknown AVD name [pixel7], use -list-avds to see valid list.
HOME is defined but there is no file pixel7.ini in $HOME/.android/avd
(Note: Directories are searched in the order $ANDROID_AVD_HOME, $ANDROID_SDK_HOME/avd, and $HOME/.android/avd)
うん、avdmanager list avd
で表示されている Path
と違うね。
環境変数 ANDROID_AVD_HOME
で指定してあげる必要があるってことか。
export ANDROID_AVD_HOME=$HOME/.config/.android/avd
設定したらまた別のエラー。
$ emulator -avd pixel7
[139898284693312]:ERROR:android/android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ../emulator/lib64/qt/lib
Could not launch '/home/username/Projects/sample-app/../emulator/qemu/linux-x86_64/qemu-system-x86_64': No such file or directory
参考: Android Studioのエミュレータをコマンドプロンプトから実行したい
$ which emulator
/opt/android-sdk/tools/emulator
うん、使うべきはこれじゃなくて多分こっち。
/opt/android-sdk/emulator/emulator -avd pixel7
動いた。
自分の環境には既に入っているけれど、実は入れていないと動かない依存パッケージとかがあるかも。
Qt とか QEMU とかの関係で。