Flutter Rust Bridge 项目 Android 平台集成指南

Flutter Rust Bridge 项目 Android 平台集成指南

flutter_rust_bridge High-level memory-safe binding generator for Flutter/Dart <-> Rust flutter_rust_bridge 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_rust_bridge

前言

在 Flutter 项目中集成 Rust 代码时,Android 平台的配置是一个关键环节。本文将详细介绍如何在 Flutter Rust Bridge 项目中为 Android 平台设置构建环境,帮助开发者顺利完成跨语言调用。

Android 集成方案比较

在 Android 平台上,我们有几种不同的集成方案可供选择:

  1. Ivy 仓库方案

    • 优点:工作效果良好
    • 缺点:无法在本地模拟器或 CI 环境中测试更改
  2. 原生 Groovy & Gradle 方案

    • 理论上可行
    • 缺点:需要在 Groovy/Gradle 中编写大量逻辑,过程繁琐
  3. 启动 OS Shell 方案

    • 类似 iOS 和 macOS 的实现方式
    • 缺点:不兼容 Windows 开发环境
  4. CMake 方案

    • 通过 Gradle 调用 CMake 来获取和处理 Android 二进制文件
    • 虽然看起来有些非常规,但具备跨平台能力
    • 可以复用 Windows/Linux 的代码逻辑

基于上述分析,我们推荐使用 CMake 方案,这也是本文重点介绍的内容。

CMake 配置详解

/packages/flutter_library_name/android/CMakeLists.txt 文件中,Android 的 CMake 配置与其他平台有所不同:

set(LibraryVersion "library_name-v0.0.0") # 自动生成,请勿编辑
set(PROJECT_NAME "project_name")

# 此文件不执行任何构建操作
# 仅负责下载和解压 Android 二进制文件
# 这种处理方式比在 Groovy/Gradle 中实现更简洁且跨平台

cmake_minimum_required(VERSION 3.10)
project(PROJECT_NAME)

# 下载二进制文件(如果不存在)
set(LibRoot "${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs")
set(ArchivePath "${CMAKE_CURRENT_SOURCE_DIR}/${LibraryVersion}.tar.gz")
if(NOT EXISTS ${ArchivePath})
  file(DOWNLOAD
    "https://your.domain/repo/releases/download/${LibraryVersion}/android.tar.gz"
    ${ArchivePath}
    TLS_VERIFY ON
  )
endif()

# 解压二进制文件(覆盖现有文件)
file(REMOVE_RECURSE ${LibRoot})
file(MAKE_DIRECTORY ${LibRoot})
execute_process(
  COMMAND ${CMAKE_COMMAND} -E tar xzf ${ArchivePath}
  WORKING_DIRECTORY ${LibRoot}
)

配置说明

  1. 将所有的 library_name 替换为你的库名称
  2. 更新 URL 中的账户和仓库名称
  3. 此配置会下载预编译的二进制文件并解压到指定目录

Gradle 配置修改

修改 build.gradle 文件中的 android 部分:

android {
    compileSdkVersion 31

    defaultConfig {
        minSdkVersion 16
    }

    // 触发 CMakeLists.txt 中的二进制文件下载/更新
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

Git 忽略配置

android/.gitignore 文件中添加以下内容:

# 忽略 Rust 生成的二进制文件
src/main/jniLibs/
*.tar.gz

Android 构建脚本

创建 /scripts/build-android.sh 构建脚本:

#!/bin/bash

# 初始化构建目录
BUILD_DIR=platform-build
mkdir $BUILD_DIR
cd $BUILD_DIR

# 创建 jniLibs 目录
JNI_DIR=jniLibs
mkdir -p $JNI_DIR

# 设置 cargo-ndk 环境
cargo install cargo-ndk
rustup target add \
        aarch64-linux-android \
        armv7-linux-androideabi \
        x86_64-linux-android \
        i686-linux-android

# 构建 Android 库
cargo ndk -o $JNI_DIR \
        --manifest-path ../Cargo.toml \
        -t armeabi-v7a \
        -t arm64-v8a \
        -t x86 \
        -t x86_64 \
        build --release 

# 打包动态库
cd $JNI_DIR
tar -czvf ../android.tar.gz *
cd -

# 清理临时文件
rm -rf $JNI_DIR

脚本功能说明

  1. 创建必要的构建目录结构
  2. 安装并配置 cargo-ndk 工具
  3. 添加 Android 平台所需的 Rust 目标
  4. 构建所有支持的 Android ABI 架构
  5. 将生成的库文件打包为 tar.gz 归档
  6. 清理临时文件

最佳实践建议

  1. 版本管理:确保 LibraryVersion 与你的发布版本保持一致
  2. 安全下载:TLS_VERIFY ON 保证了下载过程的安全性
  3. ABI 兼容性:构建脚本中包含了主流 Android ABI 架构的支持
  4. 构建优化:使用 --release 标志确保生成优化后的二进制文件

常见问题排查

  1. CMake 版本问题:确保系统中安装的 CMake 版本不低于 3.10
  2. 网络连接问题:检查下载 URL 是否可访问
  3. 权限问题:确保构建脚本有执行权限
  4. 路径问题:检查所有文件路径是否正确

通过以上配置,你的 Flutter 项目就可以成功集成 Rust 代码并在 Android 平台上运行了。这种方案虽然看起来有些非常规,但实践证明它是目前最可靠且跨平台的解决方案。

flutter_rust_bridge High-level memory-safe binding generator for Flutter/Dart <-> Rust flutter_rust_bridge 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_rust_bridge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舒京涌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值