目前能把编译的软件安装到手机里,但是启动就崩溃,可能是配置条例的问题
环境
-
安装rust
windows下的本机目标建议用x86_64-pc-windows-gnu,如果用msvc后缀的还需要vs cpp工具链里的link.exe 安装rust之后执行命令以添加arm安卓目标:rustup target add aarch64-linux-android 如果使用android studio的模拟器需要安装x86_64的安卓目标:rustup target add x86_64-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

基本的文件结构就是这样
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
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();
}
}
}
}
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-apk2貌似会主动查找连接到电脑的安卓设备以确定生成目标是arm还是x86_64的安卓,也可以直接指定目标,可以在配置条例里设置也可在执行apk2命令时指定
本机运行:cargo run
打包、安装到安卓并启动一次:cargo apk2 run