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
相关推荐
lichong9512 小时前
【大前端++】Android studio Log日志高对比度配色方案
android·java·前端·json·android studio·大前端·大前端++
晓梦初醒p2 小时前
finalshell 连接服务器报错channel is not opened
linux·运维·服务器
conkl3 小时前
在ARM64 Ubuntu 20.04上部署Mailu邮件系统:深度排查Docker Bridge网络通信失败问题
linux·ubuntu·docker
Code Warrior3 小时前
【Linux】基础IO(2)
linux
你什么冠军?3 小时前
linux入门4.5(NFS服务器和iSCSI服务器)
linux·运维·服务器
什么半岛铁盒3 小时前
C++项目:仿muduo库高并发服务器------EventLoop模块的设计
linux·服务器·c++·mysql·ubuntu
深鱼~3 小时前
VSCode+WSL+cpolar:打造跨平台的随身Linux开发舱
linux·ide·vscode
用户237390331474 小时前
“标准 I/O 用 fopen,底层控制用 open; 要 mmap 必 open,跨平台选 fopen。”
linux
00后程序员张4 小时前
iOS 开发环境搭建完整指南 Xcode 安装配置、iOS 开发工具选择、ipa 打包与 App Store 上架实战经验
android·macos·ios·小程序·uni-app·iphone·xcode