简单记录一下使用 Tauri 2.0 开发安卓应用踩的小坑
打包签名 apk
官网上其实写的很清楚,但是就是有两个 🐖 眼睛瞎了

首先你要有一个密钥库,可以通过 Android Studio 生成密钥,也可以用 keytool 生成,这里我们通过命令行使用 keytool
keytool -genkey -v -keystore $env:USERPROFILE\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
你的 keytool 安装在 Android Studio 附带的 JDK 中,例如
C:\\Program Files\\Android\\Android Studio\\jbr\\bin\\keytool.exe
然后在[project]/src-tauri/gen/android/keystore.properties位置创建文件,这个文件包含对你密钥库的引用信息
注意你的密钥库和 keystore.properties 都应该是私密的
最后,我们只需要在 Gradle 中配置签名选项即可
在**[project]/src-tauri/gen/android/app/build.gradle.kts**文件中,添加如下引用
import java.util.Properties
import java.io.FileInputStream
在buildTypes代码块之前的signingConfigs 中添加release代码块
signingConfigs {
create("release") {
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
...
}
最后在buildTypes块的release中使用新的配置
buildTypes {
getByName("release") {
signingConfig = signingConfigs.getByName("release")
}
}
看上去很简单,但是就是有 🐖 分不清src-tauri\gen\android\build.gradle.kts和src-tauri\gen\android\app\build.gradle.kts
注意着两个文件同名但路径不同,功能也不同
使用 HTTP 客户端插件
这里官网的文档说的不是很详细
我们使用的是 JavaScript API 版本,通过
npm run tauri add http
安装插件
在官方文档中,给出的配置允许访问的 URL 的配置文件如下
// src-tauri/capabilities/base.json
{
"permissions": [
{
"identifier": "http:default",
"allow": [{ "url": "https://*.tauri.app" }],
"deny": [{ "url": "https://private.tauri.app" }]
}
]
}
但是我们找到src-tauri/capabilities中,并没有发现base.json文件
直接创建一个base.json文件并粘贴代码肯定是错误的,我按照我对 Tauri 配置的诸多理解进行了修改,也依然报错
最简单的方式是直接在default.json中复制代码块
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "Capability for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"opener:default",
{
"identifier": "http:default",
"allow": [
{
"url": "https://*.*"
},
{
"url": "http://*.*"
}
]
}
]
}
然后就可以正常使用了
使用 SQL 插件
构建配置
这个插件官方的文档也有点小问题
首先,在Cargo.toml文件中添加以下内容
[dependencies.tauri-plugin-sql]
features = ["sqlite"] # or "postgres", or "mysql"
git = "https://github.com/tauri-apps/plugins-workspace"
branch = "v2"
然后使用以下命令下载插件
npm add https://github.com/tauri-apps/tauri-plugin-sql#v2
我们在 Tauri 中注册插件
// src-tauri/src/main.rs
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_sql::Builder::default().build()) // 注册插件
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
官网的说明就到这里,实际上,你还需要在src-tauri\src\lib.rs中添加如下代码
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_http::init())
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_sql::Builder::default().build()) // 添加
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
类型转换
不知道为什么,我们通过execute执行 sql 语句,拿回来的 Date 类型和 Boolean 类型都变成了字符串类型,而且 TypeScript 并看不出来变量的实际类型,导致类型转换的时候还要套一层unkown
const completed = JSON.parse(rawPlan.completed as unknown as string);
使用自定义动态库
先 🕊 着