基于Rust+Tauri+React 开发的adb命令工具
最近使用Electron 开发完了公司的工厂工具后,发现Electron打包实在是太大了,在网上搜索后开始学习 Tauri 和 Rust ,并编写了一个小工具 。
Tauri
Tauri是一个用于构建跨平台桌面应用程序的开源工具。它提供了一种简化的方式,使开发者能够使用常见的Web技术(如HTML、CSS和JavaScript/TypeScript)来构建高性能的桌面应用程序,同时允许访问底层操作系统的功能和API。 auri的特点包括:
- 快速启动和响应的用户界面。
- 具有本机外观和行为的应用程序。
- 支持访问底层操作系统的功能和API。
- 跨平台支持,可以在多个操作系统上构建和部署应用程序。
总之,Tauri是一个强大的工具,为开发者提供了一种使用Web技术构建跨平台桌面应用程序的方式,并且提供了更接近本机应用的用户体验和功能。
相对于Electronic, Tauri的优势在于打包后的大小。
放一个实际图比例:第一个是使用Tauri打包后的,第二个是Electron打包后的
大小比例相差巨大。
但是,Tauri需要使用Rust,Rust需要学习成本,而Electron是使用node,基本没有学习成本
基本环境搭建就不说了,百度很多,注意版本内容就好,给出一个参考 blog.csdn.net/weixin_4736…
技术栈
- Tauri 1.2.3+react ^18.2
- antd ^5.1.2
- tauri-apps ^1.2.2
- vite ^4.0.0
- Android Debug Bridge version 1.0.41 Version 33.0.1-8253317
要使用Tauri接受一个前端发送的命令,并且执行adb,并返回应用程序结果。 在Tauri中创建一个 execute_command 的方法
use std::process::Command;
#[tauri::command]
async fn execute_command(command: String) -> Result<String, String> {
println!("{}", command);
let output = Command::new("adb")
.arg("shell")
.arg(&command)
.output()
.map_err(|e| format!("Failed to execute command: {}", e))?;
let stdout = String::from_utf8(output.stdout).map_err(|e: std::string::FromUtf8Error| {
format!("Invalid UTF-8 sequence in output: {}", e)
})?;
let stderr = String::from_utf8(output.stderr).map_err(|e: std::string::FromUtf8Error| {
format!("Invalid UTF-8 sequence in output: {}", e)
})?;
let result_str = stdout + "&" + &stderr;
println!("{}", result_str);
println!("{}", stderr);
Ok(result_str)
}
并且需要在main.rs中去暴露出这个端点,使用invoke_handler ;
fn main() {
tauri::Builder::default()
.setup(|app| {
set_window_shadow(app);
Ok(())
})
.invoke_handler(tauri::generate_handler![
execute_command,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
在前端程序中使用Tauri的‘invoke’ 函数来调用 execute_command 端点
export const runAdbCommand = async (command: string) => {
try {
const output: string = await invoke('execute_command', { command: command });
return output;
} catch (error) {
return null;
}
}
···
···
const handleSendAdb = (str: string, name: string, fun: (stdout: string) => void) => {
runAdbCommand(str).then(res => {
const res_struct = {
stdout: (res?.split('&')[0]?.replace(/\r\n/g, '') ?? ''),
stderr: (res?.split('&')[1]?.replace(/\r\n/g, '') ?? ''),
};
····
····
});
};
这样就基于Rust+Tauri+react 实现一个前后端的通信,从前端将需要发送的命令传输给后端,后端通过使用Rust的Command方法来进行调用adb,执行完成后将结果输出反馈给前端,效果如下图
要使用adb命令进行安装apk,需要使用到Tauri的"open" 方法,在前端页面中引入Tauri的open方法,打开文件选择器
open 方法的参数可以选择是多选或者指定类别
import { open } from "@tauri-apps/api/dialog"
// 一般来说open方法不会有catch的时候,所以可以使用简单的方法
// let res=await open({ multiple: false })
open({ multiple: false }).then(res => {
···
let files = res as string
const fileName = files.replace(/^.*[\\\/]/, '');
····
})
这样就完成一个文件的选择,并且将路径传输给之前定义的"execute_cammand",使用 "adb install {files}"
这样基于Tauri+Rust+react 完成了一个简单的adb命令工具
转载自:https://juejin.cn/post/7239526353522081853