UbuntuでAndroid + Rust/Slint開発環境をAnsible管理する

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-android target
  • cargo-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_studioAndroid Studio 展開
android_sdkcommand-line tools と SDK packages
android_emulatoremulator image と AVD
android_rustRust 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 用環境か、手元開発機かで変える。