Skip to content

Instantly share code, notes, and snippets.

@dai1975
Last active December 17, 2023 22:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dai1975/e5369fb3cfabf52f860424faedeefc1c to your computer and use it in GitHub Desktop.
Save dai1975/e5369fb3cfabf52f860424faedeefc1c to your computer and use it in GitHub Desktop.

rust で android app 開発

いくつか方法はあるようだが、ここでは WebView + rust target=android の方式。

System API は file と network(https) を試した。 コードは Rust で。 Rust の std/reqwest API で済んでいて、NDK や Java 関数呼び出しは直接書いていない(std 内部では呼んでるかもしれない)。

ビルド環境は cargo-mobile2 を使う。

全部入り

https://github.com/dai1975/etude-androidapp-rust

aarch64 の release ビルドの apk は 21MB ほど。

環境構築

android device and sdk

WSL 上に android 開発環境構築参照

rust

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android

cargo-mobile2

cargo install --git https://github.com/tauri-apps/cargo-mobile2

プロジェクトセットアップ

普通に cargo new 後、cargo mobile init する。

cargo mobile init

Detected template packs:
  [0] bevy
  [1] bevy-demo
  [2] egui
  [3] wgpu
  [4] winit
  [5] wry

色々な描画方法に対応している。 ここでは WebView 使うので wry.

dioxus アプリ

WebView 使う GUI フレームワークには、android 環境のドキュメントが充実していた Dioxus を試した。 React ライクに書けるやつ。

cargo add dioxus
cargo add dioxus-desktop --no-default-features --features tokio_runtime

wry

生成された Cargo.toml の wry が古かったので最新に。

dioxus

少なくとも dioxus v0.4.0 では、issue 1525 にあるように、 issune cx.needs_update で止まるバグがある。 fix されてるブランチを明示的に使う。

dioxus = { git = "https://github.com/ealmloff/dioxus", branch = "bump-wry" }
dioxus-mobile = { git = "https://github.com/ealmloff/dioxus", branch = "bump-wry" }
dioxus-desktop = { git = "https://github.com/ealmloff/dioxus", branch = "bump-wry" }

使ってる wry のバージョンも違うようなので変更。

wry = "0.34.0"

ssl

明示的に openssl crate 必要。

openssl = { version = "0.10.59", features = ["vendored"] }

さらに、ビルド時に ranlib が無いと言われる。環境変数 RANLIB を指定。

export RANLIB=$(NDK_HOME)/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib

system API

file

普通に Rust の io が使える。

アプリ用の領域は /data/user/0/<app package name>. 本来はこのパスは API から取るようだが Java にしかない? ぽくて面倒なので直書き。

network(https)

reqwest crate でアクセスできた。

SSL も crate をビルド。 (TODO: android の提供してるだろう標準ライブラリは使えないのかな?)

run

cargo android run -f Debug

WSL 上に android 開発環境構築 2023-11-19


android device に接続

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

WiFi でも接続できるらしいが上手くいかなかったのでパス。そのうち。

0. usb debug モード

android デバイス情報でビルド番号を連打して、開発者向けオプションを有効に。

システム > 開発者オプションから、USB デバッグを有効に。

1. install usbipd on windows

いくつか方法はあるが、winget で入れた。

winget install usbipd

パスに usbipd が追加される。 作業してるターミナルおよび wsl の再起動が必要。

これで usbipd コマンドが使える:

usbipd list

2. install on wsl

apt install linux-tools-generic hwdata
update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

3. bind to wsl

windows 上で、

usbipd list

で、対象 android の BUSID を確認。

管理者で、

usbipd wsl attach -a -b <BUSID>

wsl で

lsusb

することで、デバイスが見れるようになる。


android studio と SDK 等

0. X window system

Windows に X Server をインストール。 何でもいいけど、自分は VcXsrv 使ってます。

WSL 側は DISPLAY 環境変数をセット。 WSL から見たホスト Windows のアドレスは毎回変わるので、以下のように ip route から拾ってセットしてる:

 export DISPLAY=$(ip route | grep 'default via' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'):0

あとは xeyes とか起動して表示されれば ok.

1. Android Studio

https://developer.android.com/studio/install

wsl に linux 版をインストール。

2. tools

Android Studio を起動。

Tools > SDK manages > SDK Tools メニュー。

まず SDK を入れる。 ディレクトリは適当に。 /usr/local とか /opt が普通だが、パーミッション面倒だったので $HOME/android-sdk 入れた。

続いて各種ツールのインストール。

  • Android SDK Build-Tools
  • Android Emulator
  • Android SDK Platform Tools
  • NDK
  • Android SDK Command-line Tools
  • CMake

上 3つは既に入ってると思う。

あと環境変数の設定。

  • JAVA_HOME=<android studio install dir>/jbr
  • ANDROID_HOME=<android sdk install dir>
  • NDK_HOME=$ANDROID_HOME/ndk/26.1.10909125
  • PATH += $ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin

adb コマンドが使えるようになってるはずなので、

adb devices

接続後の初回は unauthorized と出る。 android の方にダイアログ出てるので許可する。


FAQ

adb で unauthorized

$ adb devices
List of devices attached
HQ618M27C5	unauthorized

unauthorized なのはスマホからの許諾がまだだった。 ダイアログ出てるので許可。

$ adb devices
List of devices attached
HQ618M27C5	device

adb で no permissions

"no permissions" と表示されることもある。 adb を再起動すると直った。

$ sudo $(which adb) kill-server
$ sudo $(which adb) start-server

WSL usbip client not correctly installed

windows 側で usbipd wsl attach しようとすると出る。

linux 側で、

sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

としたら治った。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment