Open5

Arch Linux + Flutter + VSCodeでのAndroid開発環境構築

k5nk5n

Arch Linux (正確には Manjaro) での環境構築に少々手間取ったのでメモを残す。

Android Studio は使わず、VSCode を使う。なので Android Studio はインストールしなかった。
恐らく使わないとしても Android Studio をインストールしたほうがトラブルは少ないと思われる。

参考:

Flutter はインストールされているものとする。自分は asdf で管理している。

k5nk5n

必要なパッケージのインストール

yay -S android-sdk

android-sdk を入れると、依存関係で android-platformandroid-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 のパッケージからインストール。

k5nk5n

ライセンス承認

以下を実行して、全て 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)
(以下略)
k5nk5n

実機での開発

Wifiデバッグの場合

Android 11 以降だと Wifi 経由で実機を使った開発ができる。USB デバッグよりこちらの方が、ケーブルがいらないだけでなく環境整備も圧倒的に楽。
特に Linux に限った話ではなく、Windows でもやり方は同じだし、Flutter も関係ない。
android wifi デバッグ とかでググれば色々と情報が出てくる。
ただし Android Studio を入れていないので、ここではコマンドラインで操作する。

手順としては以下。

  1. 実機側で開発者向けオプションを有効化
  2. 開発者向けオプションでワイヤレスでバッグを有効化
  3. ワイヤレスでバッグをタップして、「ペア設定コードによるデバイスのペア設定」をタップ
  4. adb pair <ip address>:<port> でペアリング
  5. 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 デバッグは試していない。

k5nk5n

エミュレータ

デバイスイメージをインストール。

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 とかの関係で。