YP.Lam | Flutter + Go 跨平台应用开发

Flutter + Go 跨平台应用开发

Flutter 是由 Google 开发的开源 UI 软件开发工具包,用于构建跨平台的高性能应用程序。通过一套代码库,开发者可以同时为 iOS、Android、Web 和桌面平台创建原生应用。通常情况下,Dart 代码会通过 MethodChannel 的方式与各平台原生代码进行交互,而原生代码通常也是根据不同平台由 Java,Swift,C++ 等语言编写。除此以外,一些与平台相关性不大,但使用 Dart 语言实现困难的跨平台代码,则适合使用 Rust 或者 Go 等编程语言实现,本文章记录 Flutter + Go 实现跨平台应用开发。

可以通过以下命令创建一个支持多平台的插件:

flutter create --org com.yplam --platforms=android,ios,linux,windows,macos -a java flutter_abc -t plugin

Flutter 插件模板默认会生成 getPlatformVersion 方法,可以在编辑器中全局搜索该方法名查看各平台的接入方式,并且在此基础上修改。

编写 Go 代码,代码的组织与通常的 Go 项目区别不大,个人经验是项目根目录只包含跨平台可用的导出函数,或者针对每个平台编写对应的导出文件。

譬如针对桌面平台导出 C 静态库,则编写独立的 main.go,使用 export 导出函数:

package main

import "C"


//export Run
func Run(fn *C.char) int32 {
    return 0
}

//export Stop
func Stop() {
}

func main() {}

然后使用以下命令生成静态库与对应头文件:

GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build -buildmode=c-archive -o ./libs/linux_amd64/libabc.a ./cmd/libs/main.go
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc go build -buildmode=c-archive -o ./libs/windows_amd64/libabc.a ./cmd/libs/main.go

然后更改插件的 linux/CMakeLists.txt 或者 windows/CMakeLists.txt, 把 C 库加到项目

set(ABC_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib")
link_directories(${ABC_LIB_DIR})
target_link_libraries(${PLUGIN_NAME} PRIVATE ${ABC_LIB_DIR}/libabc.a)

然后即可在 xxx_plugin.cc 中 include 头文件,以及调用相关函数。

Android 与 iOS 可直接使用 gomobile 生成对应的库:

# go install golang.org/x/mobile/cmd/gomobile@latest   
# gomobile init        

gomobile bind -v -target android -o ./libs/android/libabc.aar -ldflags="-w -s"  ./

# ios 需要在Xcode环境打包
gomobile bind -v -target ios -o ./libs/ios/Libabc.xcframework -ldflags="-w -s" ./

针对 ios,需要将 xcframework 添加到项目(未详细测试,请参考网上文档)。