UbuntuでAndroid + Rust/Slint開発環境をAnsible管理する
Posted:
UbuntuでAndroid + Rust/Slint開発環境をAnsible管理する
Ubuntu workstation に Android Studio、Android SDK、Emulator、Rust Android build 環境を入れる場合、GUI installer 任せにすると再構築時の差分が見えにくい。
Ansible では、OS 側の依存、SDK directory、Rust toolchain、Emulator 用 group、確認用 AVD を分けて管理すると扱いやすい。
管理するもの
- Android Studio
- Android SDK command-line tools
- platform-tools
- emulator
- Android platform / build-tools
- NDK
- x86_64 emulator image
- Rust toolchain
x86_64-linux-androidtargetcargo-apk- KVM / libvirt / plugdev group
Android Studio 本体は公式 tarball を固定 path に展開し、SDK は /opt/android-sdk のような system-wide path に置くと、複数 shell や editor から参照しやすい。
directory方針
例:
/opt/android-studio
/opt/android-sdk
/opt/rustup
/opt/cargo/bin
環境変数は profile script で配る。
export ANDROID_HOME=/opt/android-sdk
export ANDROID_SDK_ROOT=/opt/android-sdk
export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
export RUSTUP_HOME=/opt/rustup
export CARGO_HOME=/opt/cargo
export PATH="$CARGO_HOME/bin:$PATH"
ANDROID_SDK_ROOT は deprecated warning が出ることがあるが、一部 tool 互換のため ANDROID_HOME と併記する判断はあり得る。
Ansible roleの分け方
role では task を tag で分ける。
| tag | 内容 |
|---|---|
android_studio | Android Studio 展開 |
android_sdk | command-line tools と SDK packages |
android_emulator | emulator image と AVD |
android_rust | Rust target と cargo-apk |
android | 全体 |
一度に全部流すと時間がかかるため、SDK や emulator だけを短く再実行できるようにする。
package選定の注意
Ubuntu では qemu-kvm が virtual package になっている release がある。その場合は qemu-system-x86 など実 package を入れる。
Emulator の KVM acceleration には、user が kvm group に入っている必要がある。group 追加は現在の login session には反映されないので、反映後にログアウト/ログインする。
確認:
emulator -accel-check
SDKの確認
SDK packages は sdkmanager で固定する。
sdkmanager --list_installed
avdmanager list device
AVD 作成例:
avdmanager create avd \
--name rust-hello-x86_64 \
--package "system-images;android-35;google_apis;x86_64" \
--device "pixel_6"
headless smoke では、window を出さずに起動できる。
emulator -avd rust-hello-x86_64 -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect
adb wait-for-device
adb devices
Rust Android build
Rust 側は target を入れる。
rustup target add x86_64-linux-android
cargo apk version
Slint の最小 app では、Android activity backend と software renderer の組み合わせを使う。
Cargo.toml の方向性:
[lib]
crate-type = ["cdylib"]
[dependencies]
slint = { version = "=1.6.0", default-features = false, features = ["std", "compat-1-2", "backend-android-activity-06", "renderer-software"] }
[package.metadata.android]
package = "com.example.androidrusthello"
apk_name = "AndroidRustHello"
build_targets = ["x86_64-linux-android"]
[package.metadata.android.sdk]
min_sdk_version = 23
target_sdk_version = 35
Slint の最新版は組み合わせによって compile error が出ることがある。確認用 smoke test では、まず動作実績のある version に固定し、あとで更新する方が切り分けやすい。
smoke test
build と install:
cargo apk build --target x86_64-linux-android --lib
cargo apk run --target x86_64-linux-android --lib --device emulator-5554 --no-logcat
foreground の確認:
adb shell dumpsys window | grep -E "mCurrentFocus|mFocusedApp"
adb exec-out screencap -p > /tmp/android-rust-hello.png
GUI smoke では、screencap に期待した文字列や画面が出ているかを確認する。
checksumの扱い
Android command-line tools や Studio の download URL は更新される。Ansible では version と checksum を固定する。
公式ページの表示 checksum と実ファイル checksum がずれることもあるため、導入時には実ダウンロードファイルの SHA-256 を確認し、role 側に固定する。
更新方針
趣味・検証用 workstation では、初回 bootstrap を Ansible で固定し、その後の Android Studio / SDK minor update は Android Studio 側から行う運用も現実的である。
完全再現性を優先する場合は、Android Studio、command-line tools、SDK package version、NDK、emulator image、Rust crate version をすべて固定する。
どちらを選ぶかは、CI 用環境か、手元開発機かで変える。