rust slint android 安卓
目前能把编译的软件安装到手机里,但是启动就崩溃,可能是配置条例的问题
环境
- 安装rust
windows下的本机目标建议用x86_64-pc-windows-gnu,如果用msvc后缀的还需要vs cpp工具链里的link.exe 安装rust之后执行以下命令以添加安卓目标 rustup target add aarch64-linux-android
- 安装cargo-apk2
用于软件的打包和安装到手机,也支持rust结合java、kotlin等,而且有很多参数 cargo install cargo-apk2
- 安装python3
cargo-apk2会用到
- 安装android的sdk
代理:安装android studio 会上google下载资源,若需要代理可在其设置里填写
安卓sdk:
安卓sdk在本地文件夹里的样子:
- 设置环境变量
ANDROID_HOME C:/Users/16175/AppData/Local/Android/Sdk ANDROID_NDK C:/Users/16175/AppData/Local/Android/Sdk/ndk/29.0.14033849 ANDROID_NDK_ROOT C:/Users/16175/AppData/Local/Android/Sdk/ndk/29.0.14033849 JAVA_HOME C:/Program Files/Android/Android Studio/jbr ANDROID_NDK 和 ANDROID_NDK_ROOT 一样是因为cargo-apk2涉及到的多个工具会使用不同的环境变量名称,值是一样的 设置之后确认,并重启打开的编辑器、IDE等,只是关闭其内置终端是不行的为方便随时使用adb工具,在Path里添加C:\Users\16175\AppData\Local\Android\Sdk\platform-tools
检查 C:\Users\16175\AppData\Local\Android\Sdk\ndk\29.0.14033849\build\core\platforms.mk里 是否将sdk版本全部列出 cargo-apk2会读取该文件,如果安装了版本36的,但此文件里只记录到版本35的就需要把NDK_MAX_PLATFORM_LEVEL的值改成36,并且添加`NDK_PLATFORM_ALIAS_Baklava := android-36`
slint
基本的文件结构就是这样
lib.rs:
slint::include_modules!();/// 主要功能
pub fn app_main() {let ui = AppWindow::new().unwrap();ui.on_request_increase_value({let ui_handle = ui.as_weak();move || {let ui = ui_handle.unwrap();ui.set_counter(ui.get_counter() + 1);}});ui.run().unwrap();
}/// 安卓使用此函数作为该程序的main
#[cfg(target_os = "android")]
#[unsafe(no_mangle)]
fn android_main(app: slint::android::AndroidApp) {slint::android::init(app).unwrap();app_main();
}
main.rs:
/// 电脑使用此函数作为该程序的main
fn main() {slint_rust_template::app_main();
}
app-window.slint:
import { Button, VerticalBox } from "std-widgets.slint";export component AppWindow inherits Window {in-out property <int> counter: 42;callback request-increase-value();VerticalBox {Text {text: "Counter: \{root.counter}";}Button {text: "Increase value";clicked => {root.request-increase-value();}}}
}
build.rs:
fn main() {slint_build::compile("ui/app-window.slint").expect("Slint build failed");
}
Cargo.toml
[package]
name = "slint-rust-template"
version = "0.1.0"
edition = "2024"[lib]
crate-type = [ "cdylib", "lib" ][dependencies]
slint = { version = "1.13.1", features = [ "backend-android-activity-06" ] }[build-dependencies]
slint-build = "1.13.1"# 以下部分都是cargo-apk2的打包配置条例
[package.metadata.android]
use_aapt2 = true[package.metadata.android.application]
has_code = false[[package.metadata.android.application.activity]]
name = "android.app.NativeActivity"[[package.metadata.android.application.activity.meta_data]]
name = "android.app.lib_name"
value = "ndk_examples"[[package.metadata.android.application.activity.intent_filter]]
actions = ["android.intent.action.VIEW", "android.intent.action.MAIN"]
categories = ["android.intent.category.LAUNCHER"]
编译
cargo-apk2用到的skia工具会从github下载东西,可能需要 powershell 添加临时代理: $env:all_proxy="http://ipxxx:portxxx"
安卓使用usb连接电脑,安装应用需要在开发者模式里打开“USB调试”和“USB安装”,有的手机里“USB安装”选项不一定有,没有就算了
本机运行:cargo run
打包、安装到安卓并启动一次:cargo apk2 run