rust slint android 安卓

目前能把编译的软件安装到手机里,但是启动就崩溃,可能是配置条例的问题

环境

  1. 安装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
  2. 安装cargo-apk2

    复制代码
    用于软件的打包和安装到手机,也支持rust结合java、kotlin等,而且有很多参数
    cargo install cargo-apk2
  3. 安装python3

    复制代码
    cargo-apk2会用到
  4. 安装android的sdk

    复制代码
    安装android studio
    会上google下载资源,若需要代理可在其设置里填写

    代理:

    安卓sdk:


    安卓sdk在本地文件夹里的样子:

  5. 设置环境变量

    复制代码
    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-apk2貌似会主动查找连接到电脑的安卓设备以确定生成目标是arm还是x86_64的安卓,也可以直接指定目标,可以在配置条例里设置也可在执行apk2命令时指定

复制代码
本机运行:cargo run
打包、安装到安卓并启动一次:cargo apk2 run
相关推荐
蚂蚁背大象3 小时前
Rust 所有权系统是为了解决什么问题
后端·rust
布列瑟农的星空4 小时前
前端都能看懂的rust入门教程(五)—— 所有权
rust
砖厂小工4 小时前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
张拭心5 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心5 小时前
Android 17 来了!新特性介绍与适配建议
android·前端
Kapaseker7 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴7 小时前
Android17 为什么重写 MessageQueue
android
Java水解1 天前
Rust嵌入式开发实战——从ARM裸机编程到RTOS应用
后端·rust
Pomelo_刘金1 天前
Rust:所有权系统
rust
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统