简单记录一下使用 Tauri 2.0 开发安卓应用踩的小坑

打包签名 apk

官网上其实写的很清楚,但是就是有两个 🐖 眼睛瞎了

img

首先你要有一个密钥库,可以通过 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.ktssrc-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);

使用自定义动态库

先 🕊 着