5.4 Android 工程目录与构建
原文链接: Prerequisites 与 Google Play
5.4 Android 工程目录与构建
Tauri 的 Android 支持不是“用模拟器包个网页”,而是生成一个真正的 Android Studio/Gradle 工程。你的 Rust 代码会被编译成原生 .so 库,由 Kotlin Activity 加载。
一句话流程
1
2
3
4
5
6
7
8
9
10
| 前端静态资源
│
▼
Rust 编译为 .so(每 ABI 一个)
│
▼
Gradle 把 .so + 资源 + AndroidManifest 打包
│
▼
APK / AAB
|
初始化 Android 工程
确保已经完成 2.2 移动端环境配置,然后:
1
| npm run tauri android init
|
之后常见的开发命令:
1
2
3
4
5
6
7
8
9
10
11
| # 在已连接设备或模拟器上运行
npm run tauri android dev
# 打开 Android Studio 调试
npm run tauri android dev --open
# 构建可安装 APK
npm run tauri android build -- --apk
# 构建上架 Google Play 的 AAB
npm run tauri android build -- --aab
|
使用 Cargo 版 CLI 时对应 cargo tauri android ...,用 pnpm/yarn/bun 时命令前缀略有不同,功能相同。
Android 工程目录
执行 init 后,src-tauri/gen/android/ 内是一个标准 Gradle 多模块工程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| src-tauri/gen/android/
├── settings.gradle # 模块与仓库设置
├── build.gradle.kts # 根构建配置
├── buildSrc/ # 自定义 Rust Gradle 插件
│ └── src/main/kotlin/
│ ├── RustPlugin.kt
│ └── BuildTask.kt
├── gradle.properties
├── gradlew / gradlew.bat # Gradle wrapper
├── gradle/wrapper/ # 固定 Gradle 版本
└── app/
├── build.gradle.kts # 应用模块构建配置
├── proguard-rules.pro
└── src/main/
├── AndroidManifest.xml # 应用声明
├── MainActivity.kt # 原生 Activity
└── res/ # Android 资源与图标
|
原生入口 MainActivity.kt
生成的 Kotlin 文件大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
| package com.example.app
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
class MainActivity : TauriActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// 让界面内容延伸到状态栏后方
enableEdgeToEdge()
super.onCreate(savedInstanceState)
}
}
|
关键点:
- 上面的
com.example.app 只是示例,实际生成时会被替换成你在 tauri.conf.json 里填写的 identifier; TauriActivity 是 Tauri 提供的基类,负责创建 WebView、连接 Rust;- 你通常不需要在这里写业务代码;
- 需要原生权限、多窗口或启动参数时,才改动这里或
AndroidManifest.xml。
AndroidManifest.xml 常见改动
1
2
3
4
5
6
7
8
9
| <!-- 节选:实际文件会包含完整的 <manifest> 结构 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 需要系统权限时在这里声明,例如相机、网络、存储 -->
<uses-permission android:name="android.permission.CAMERA" />
<application>
<activity android:name=".MainActivity" />
</application>
</manifest>
|
网页里的摄像头/定位等 API 是否可用,还取决于 Android 版本、运行时权限弹窗以及 WebView 是否放行,不只是声明 manifest 这么简单。
Rust 如何被打进去?
app/build.gradle.kts 会应用模板自定义的 rust 插件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("rust") // Tauri 自定义插件:调用 cargo 构建 .so
}
android {
namespace = "<你的应用 identifier>"
defaultConfig {
applicationId = "<你的应用 identifier>"
minSdk = 24 // Tauri 最低支持 Android 7.0 (SDK 24)
}
}
rust {
rootDirRel = "../../.." // 从 gen/android/app 指向 src-tauri 的 Cargo 工程
}
|
Android 专属配置
大部分 Android 构建参数仍通过 tauri.conf.json 控制。例如调整最低系统版本和 versionCode:
1
2
3
4
5
6
7
8
| {
"bundle": {
"android": {
"minSdkVersion": 28,
"versionCode": 100
}
}
}
|
不写 versionCode 时,Tauri 会按主配置中的 version 推导(major * 1000000 + minor * 1000 + patch)。应用商店需要递增 versionCode,正式上架时建议显式配置。
产物目录
构建后,真正有用的文件在 Gradle 的 outputs 下:
1
2
3
4
5
6
7
| src-tauri/gen/android/app/build/outputs/
├── apk/
│ └── universal/release/
│ └── app-universal-release.apk
└── bundle/
└── universalRelease/
└── app-universal-release.aab
|
官方文档明确给出的 AAB 路径是:
1
| src-tauri/gen/android/app/build/outputs/bundle/universalRelease/app-universal-release.aab
|
--split-per-abi 可以按架构拆分产物,方便测试,但 Google Play 通常更喜欢上传通用 AAB,由商店自己分发各 ABI。
Android 平台特有问题
- 架构选择:默认构建四种 ABI(arm64-v8a、armeabi-v7a、x86_64、x86)。只要联网下载依赖没问题,时间会更久。
- 最低版本:Tauri 要求 Android SDK 24(Android 7.0)以上,可在
bundle.android.minSdkVersion 调高。 - 16KB 内存页:Google 对新版提交有 16KB 页对齐要求,建议保持 NDK 28+。
- 真机调试:在开发者选项中开启 USB 调试。
- 图标:重新生成图标用
npm run tauri icon ./app-icon.png,图标会直接放进 gen/android/app/src/main/res/。
下一步
看完 Android,再看苹果系工程 5.5 iOS 工程目录与构建。