升级App到Tauri 2.0并配置Tauri Mobile

Tauri 2.0的新alpha.4 版本已经发布。此版本包括即将发布的Tauri 1.3版本的所有更改,此版本包含了对HTTP客户端的一些breaking change和TauriNative mobile插件的功能一些更改。

以下是从Tauri 1.3或1.4升级到Tauri 2.0.0-alpha.4的一些指引。

升级前环境说明:

OS:windows 11
NPM: 8.5.0
rust: rustc 1.68.0
cargo: 1.68.0
Angular CLI: 16.2.10
Node: 16.14.2

1. 升级rustc

由于Tauri 2.0.0-alpha.4需要rustc至少是1.70.0版本,而我当前的rustc仅为1.68.0版本, 所以需要首先升级rustc, 否则在后续升级tauri-cli时会报错。

1
rustup update

升级以后的rust版本为1.74.0

2. 安装Android SDK

Tauri2.0依赖的Android SDK的版本是Android 12(API级别 31)。这意味着 Tauri2.0应用程序只能在运行Android 12或更高版本的设备上运行。

安装Android SDK可以参考我的文章Android SDK安装与配置 | 鹏叔的技术博客

以下是Tauri2.0依赖的Android SDK的具体版本号:

Android SDK Platform-Tools:31.0.5
Android SDK Build-Tools:31.0.5
Android SDK Tools:31.0.5
Android SDK Documentation:31.0.5
如果您使用的是旧版本的Android SDK,则可能会遇到错误或不兼容性。

3. 安装NDK

NDK 是 Native Development Kit 的缩写,它是一个开发原生 Android 应用程序的工具包。Tauri 会依赖 NDK 的原因有两个:

  • Tauri 是一个跨平台框架,它可以运行在 Windows、macOS、Linux、Android 和 iOS 等平台上。为了访问原生平台的功能,为了在这些平台上提供一致的体验,Tauri 需要访问原生平台的功能,例如图形、音频、文件系统等。NDK 提供了访问这些功能的接口。

  • 为了提高性能。Tauri 使用 WebAssembly 作为其运行时。WebAssembly 是一种高性能的二进制格式,可以编译成机器码。然而,WebAssembly 仍然比原生代码的性能要低一些。为了提高性能,Tauri 可以使用 NDK 来编译原生代码,然后将其嵌入到 WebAssembly 模块中。

4. 更新 NPM 依赖包

1
2
3
4
5

npm install -D @tauri-apps/cli@next
npm install --save @tauri-apps/api@next
npm install --save @tauri-apps/plugin-shell@next

5. 更新 Cargo 依赖包

进入src-tauri目录,更新Cargo 依赖包。

1
2
3
4
5

cargo add tauri@2.0.0-alpha.20
cargo add tauri-build@2.0.0-alpha.13 --build
cargo install tauri-cli --version "^2.0.0-alpha.20"

6. 更新配置文件

升级到Tauri 2.0后有些配置不再兼容,需要修改。

编辑src-tauri/tauri.conf.json

将不符合配置规范的部分移除

1
2
3
4
5
6
7
8

"allowlist": {
"all": false
},

"updater": {
"active": false
},

修改src-tauri/Cargo.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

// 添加lib配置
[lib]
name = "demo_lib"
crate-type = ["staticlib", "cdylib", "rlib"]

[build-dependencies]
tauri-build = { version = "2.0.0-alpha", features = [] }

[dependencies]
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "2.0.0-alpha", features = [] }
tauri-plugin-shell = "2.0.0-alpha"
serde_json = "1.0"


7. 重新创建移动项目以使用新功能

首先,确保安装所需的rust android目标

1
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
1
2
3
4
5
6

# 如果src-tauri/gen有内容,将其清除在重新生成
#rm -r src-tauri/gen
npm run tauri android init
npm run tauri ios init

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$npm run tauri android init
> demo-web@1.0.0 tauri
> tauri "android" "init"

Info "path-to-demo-project\\node_modules\\.bin\\\\..\\@tauri-apps\\cli\\tauri.js" relative to "path-to-demo-project\\src-tauri" is "..\\node_modules\\.bin\\\\..\\@tauri-apps\\cli\\tauri.js"
Installing Android Rust toolchains...
info: downloading component 'rust-std' for 'aarch64-linux-android'
info: installing component 'rust-std' for 'aarch64-linux-android'
info: downloading component 'rust-std' for 'armv7-linux-androideabi'
info: installing component 'rust-std' for 'armv7-linux-androideabi'
info: downloading component 'rust-std' for 'i686-linux-android'
info: installing component 'rust-std' for 'i686-linux-android'
info: downloading component 'rust-std' for 'x86_64-linux-android'
info: installing component 'rust-std' for 'x86_64-linux-android'
Generating Android Studio project...
Info "path-to-demo-project\\src-tauri" relative to "path-to-demo-project\\src-tauri\\gen/android\\app" is "..\\..\\..\\"
victory: Project generated successfully!
Make cool apps! 🌻 🐕 🎉

初始化Android项目后,由于网络原因,使用默认配置会遇到网络延迟或阻塞的情况,所以需要将一些默认配置替换掉。

  1. gradle镜像仓库

    修改配置demo-project/src-tauri/gen/android/build.gradle.kts, 添加阿里云仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    buildscript {
    repositories {
    maven(url = "https://maven.aliyun.com/repository/central")
    maven(url = "https://maven.aliyun.com/repository/public")
    maven(url = "https://maven.aliyun.com/repository/jcenter")
    maven(url = "https://maven.aliyun.com/repository/google")
    maven(url = "https://maven.aliyun.com/repository/releases")
    maven(url = "https://maven.aliyun.com/repository/snapshots")
    maven(url = "https://maven.aliyun.com/repository/gradle-plugin")
    google()
    mavenCentral()
    }
    }
    allprojects {
    repositories {
    maven(url = "https://maven.aliyun.com/repository/central")
    maven(url = "https://maven.aliyun.com/repository/public")
    maven(url = "https://maven.aliyun.com/repository/jcenter")
    maven(url = "https://maven.aliyun.com/repository/google")
    maven(url = "https://maven.aliyun.com/repository/releases")
    maven(url = "https://maven.aliyun.com/repository/snapshots")
    maven(url = "https://maven.aliyun.com/repository/gradle-plugin")
    google()
    mavenCentral()
    }
    }
  1. gradle wrapper配置

手动获取gradle-8.0-bin.zip,并放在本地某个目录下, 例如~/.gradle/wrapper/gradle-8.0-bin.zip, 修改配置如下

webapp3/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

distributionBase=GRADLE_USER_HOME
# distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionUrl=file:///~/.gradle/wrapper/gradle-8.0-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

````

## 8. 启动Android应用

```bash

npm run tauri android dev

如果Android SDK配置没有问题,并且项目能顺利通过。该命令会自动打开Android 模拟器,并将Android运行在模拟器中。

9. 编译apk和aab安装包

1
2
3

npm run tauri android build

10. 生成签名

生成签名。参考链接:https://next--tauri.netlify.app/next/guides/distribution/sign-android/ 根据这个链接,我们需要先生成一个签名。对于windows,使用下面这个命令来生成(注意keystore里面的用户名改成你的,最好是全英语)。

对于windows,使用下面这个命令来生成(注意keystore里面的用户名改成你的,最好是全英语)。

1
2
3

keytool -genkey -v -keystore %userprofile%\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload

对于Mac/Linux 使用下面这个命令来生成

1
2
3

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload

修改 [project]/src-tauri/gen/android/app/build.gradle.kts file.

添加两个imports

1
2
import java.util.Properties
import java.io.FileInputStream

加载keyProperties

1
2
3
4
5
6
7
val keyPropertiesFile = rootProject.file("key.properties")
val keyProperties = Properties()
keyProperties.load(FileInputStream(keyPropertiesFile))

android {
...
}

配置signingConfigs

1
2
3
4
5
6
7
8
9
10
11
12
13
signingConfigs {
create("release") {
keyAlias = keyProperties["keyAlias"] as String
keyPassword = keyProperties["keyPassword"] as String
storeFile = file(keyProperties["storeFile"] as String)
storePassword = keyProperties["storePassword"] as String
}
}

buildTypes {
...
}

打包时使用签名信息

1
2
3
4
5
6
7
buildTypes {
...
getByName("release") {
...
signingConfig = signingConfigs.getByName("release")
}
}

这样创建release build时会自动带上签名信息

11. troubleshooting

11.1. issue 1: 在做Android开发时经常出现android adb devices offline,

重启adb服务

1
2
3
4

adb kill-server

adb start-server

12. 参考文档

Tauri 2.0.0-alpha.4 Released

Windows 11环境下使用Tauri2.0编译安卓apk