ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

lnd 移动端库构建指南:iOS/Android 集成、gRPC 绑定与 proto 生成全流程

lnd 移动端库构建指南:iOS/Android 集成、gRPC 绑定与 proto 生成全流程 区块链【免费下载链接】lndLightning Network Daemon ⚡️项目地址https://gitcode.com/gh_mirrors/ln/lnd点击查看免费下载导读本文基于 lnd 仓库 mobile/README.md 及 mobile/ 目录下的真实构建脚本与源码系统讲解如何将 Lightning Network Daemon 编译为可嵌入 iOS 与 Android 应用的移动端原生库Lndmobile.xcframework与Lndmobile.aar并围绕其核心机制展开为什么必须从$GOPATH构建、gomobile bind如何生成跨平台绑定、RPC 序列化协议如何通过 protoc 插件falafel产出 Swift/Java 代码以及 LND v0.15 之后所有 RPC 方法名如何加上了子服务前缀。读完本文你将能够独立完成从环境准备、库编译到在 Xcode / Android Studio 中消费移动端 gRPC 绑定的完整闭环。一、构建前置条件工具链盘点构建移动端库需要一套与 lnd 主程序不同的交叉编译工具链核心是 Go 官方维护的 gomobile 工具。完整的依赖清单如下平台必需工具用途iOSmacOS Xcode 或 Command Line Tools提供xcrun、clang等 Apple 工具链供gomobile bind -targetios交叉编译AndroidAndroid Studio 或 Command Line Tools Android NDK提供 NDK 工具链供gomobile bind -targetandroid交叉编译通用Go见下文lnd 本身是 Go 项目gomobile 也是 Go 工具通用Docker Desktop在 lnrpc/Dockerfile 容器内编译 protobuf 定义与生成 RPC 桩代码通用make执行 Makefile 中定义的ios/android/mobile/rpc等目标环境自检命令make --version如果make可用该命令会正常输出版本信息而不报错。1. Go 与 Go mobile按 docs/INSTALL.md 中“Building a Development Version from Source”一节的说明安装 Go。随后通过go install安装并初始化 gomobilego install golang.org/x/mobile/cmd/gomobile gomobile init其中gomobile init会在本机准备移动端交叉编译所需的 NDK 工具链Android 侧与 Apple 工具链iOS 侧。2. 为什么必须从 $GOPATH 构建gomobile目前只支持从$GOPATH构建项目。但 Go Modules 引入后源码默认不再安装到$GOPATH/src下因此需要手动把仓库克隆到 GOPATH 中的标准位置git clone https://github.com/lightningnetwork/lnd.git $GOPATH/src/github.com/lightningnetwork/lnd然后进入该目录cd $GOPATH/src/github.com/lightningnetwork/lnd主网运行不建议从 master 分支构建master 属于开发分支可能包含尚未发布的破坏性变更。推荐切换到最新的 tagged releasegit checkout $(git describe --match v[0-9]* --abbrev0)该命令利用git describe自动解析仓库中最近一个形如v[0-9]*的标签并检出确保构建的是经过发布验证的版本。二、构建库make ios / make android / make mobile源码就位、gomobile 初始化完成后即可一键产出平台产物。iOSmake ios生成的 Xcode framework 位于mobile/build/ios/Lndmobile.xcframeworkAndroidmake android生成的 AAR 库文件位于mobile/build/android/Lndmobile.aarTipmake mobile会依次执行ios与android两个目标一次性构建双端库。Makefile 背后的构建细节从 Makefile 中可以确认产物路径与交叉编译参数IOS_BUILD : $(IOS_BUILD_DIR)/Lndmobile.xcframeworkMakefile#L22其中MOBILE_BUILD_DIR : ${GOPATH}/src/$(MOBILE_PKG)/build即输出目录被固定在 GOPATH 下Makefile#L20这与 gomobile 的 GOPATH 限制保持一致。ios目标实际执行的命令是Makefile#L490-L493$(GOMOBILE_BIN) bind -targetios,iossimulator \ -tagsmobile $(DEV_TAGS) $(RPC_TAGS) \ -ldflags $(RELEASE_LDFLAGS) -v -o $(IOS_BUILD) $(MOBILE_PKG)注意-targetios,iossimulator同时生成真机与模拟器架构而make macos使用-targetmacosmake apple则覆盖ios,iossimulator,macos三端Makefile#L484-L499。android目标Makefile#L502-L505使用-targetandroid -androidapi 21即最低支持 Android 5.0API 21并附带额外的链接参数ANDROID_EXTLDFLAGS : -extldflags -Wl,-z,max-page-size16384Makefile#L28——这是为支持 16KB 内存页大小的新设备所做的适配见Makefile#L25-L27的注释。ios/android/macos/apple均依赖mobile-rpc目标Makefile#L474-L476mobile-rpc: cd ./lnrpc; COMPILE_MOBILE1 SUBSERVER_PREFIX1 ./gen_protos_docker.sh即每次构建库之前会先在 Docker 容器内重新编译移动端 RPC 桩代码且SUBSERVER_PREFIX1会在生成时启用方法名前缀详见下文“调用 API”一节。移动端运行配置示例仓库在 mobile/sample_lnd.conf 中提供了适合移动端场景的 lnd 配置骨架[Application Options] debuglevelinfo maxbackoff2s nolisten1 norest1 tlsdisableautofill1 [Routing] routing.assumechanvalid1 [Bitcoin] bitcoin.active1 bitcoin.testnet1 bitcoin.nodeneutrino要点解读nolisten1/norest1移动端不对外提供 P2P 监听与 REST 接口仅通过内存 gRPC 通道与应用内通信tlsdisableautofill1避免 lnd 自动填充证书域名为本地主机名减少移动端沙盒权限问题bitcoin.nodeneutrino移动端使用轻量级 Neutrino 客户端同步区块头无需全节点。三、移动端启动 APIStart 与内存 gRPC 监听器生成的库暴露了 Go 层绑定入口核心实现在 mobile/bindings.go 的Start函数bindings.go#L36。其工作方式func Start(extraArgs string, rpcReady Callback)单例约束通过atomic.CompareAndSwapInt32保证同一时刻只有一个 lnd 实例被启动bindings.go#L40-L44重复调用会直接通过rpcReady.OnError返回lnd already started。参数注入extraArgs以空格分隔的命令行参数字符串传入例如extraArgs --bitcoin.testnet --lnddir\/tmp/folder name/\ --profile5050Start内部按--切分、去除空白后重新拼装并追加到os.Argsbindings.go#L53-L68随后走与桌面版一致的lnd.LoadConfig配置加载流程。关键约束移动端必读在移动平台上--lnddir必须设置为当前 App 的沙盒目录以确保 lnd 拥有写入配置、钱包与日志的权限bindings.go#L33-L35。内存 gRPC 通道移动端并不会开放本地 TCP 端口而是通过RecreateListeners()重建内存 gRPC 监听器bindings.go#L49并以lnd.ListenerCfg{RPCListeners: ...}注入bindings.go#L98-L103使应用与 lnd 在同一进程内以 gRPC 通信。就绪回调lnd 内部 RPC 服务器就绪后会触发rpcListening通道Start在收到信号后调用rpcReady.OnResponse([]byte{})bindings.go#L149-L157客户端据此得知可以开始发 RPC 请求。鉴权选项默认按 admin 权限含 macaroon配置拨号选项而WalletUnlocker与StateService因可能在 macaroon 尚未就绪时被调用使用不带 macaroon 的受限选项bindings.go#L127-L145。四、生成 proto 定义移动端 RPC 绑定的根基移动端库本质上是一层 Go 语言实现的 gRPC 服务器lnd 本体 一组供 Swift/Java 调用的绑定。调用任一 RPC 时请求体必须是序列化后的 proto 消息响应同理。因此必须为 iOS/Android 分别生成 protobuf 定义。生成机制总览移动端绑定的生成由 mobile/gen_bindings.sh 完成它依赖 lightninglabs 的 falafel 插件当前版本v0.9.2见 lnrpc/Dockerfile脚本首先校验 falafel 已安装且版本匹配gen_bindings.sh#L5-L26然后将lightning.proto、walletunlocker.proto、stateservice.proto及全部子服务器 protoautopilot、chainnotifier、invoices、neutrino、peers、router、signer、verrpc、walletkit、watchtower、wtclient 等见gen_bindings.sh#L42逐一交给 protoc falafel 生成绑定代码通过listenerslightninglightningLis ...参数gen_bindings.sh#L36把每个 gRPC 服务映射到内存监听器lightningLis这正是Start中注入的内存监听器当SUBSERVER_PREFIX1时启用api_prefix1为所有方法名前缀子服务名解决子服务间的方法名冲突gen_bindings.sh#L57-L64。下面按平台说明两种官方生成路径。iOS生成 Swift 绑定iOS 侧的标准流程如下。第 1 步修改 lnrpc/gen_protos.sh在第一个protoc调用中追加--swift_out.参数使 protoc 额外输出 Swift 代码。第 2 步修改 lnrpc/Dockerfile 以启用 Swift protobuf 插件README 针对旧版基础镜像给出了如下改动当前仓库 Dockerfile 已是golang:1.27.1-bookworm需按此思路自行调整将基础镜像替换为FROM swift:focal以便在容器内使用 SwiftUbuntu Focal 没有clang-format1:7.0*包需改为clang-format1:10.0*在下一行安装 Go 并设置环境变量RUN apt-get install -y wget \ wget -c https://dl.google.com/go/go1.27.1.linux-amd64.tar.gz -O - \ | tar -xz -C /usr/local ENV GOPATH/go ENV PATH$PATH:/usr/local/go/bin:/go/bin在 Dockerfile 末尾CMD之前追加一条RUN下载并编译最新 tagged 版本的 Swift protobufRUN git clone https://github.com/apple/swift-protobuf.git \ cd swift-protobuf \ git checkout $(git describe --tags --abbrev0) \ swift build -c release \ mv .build/release/protoc-gen-swift /bin第 3 步运行make rpc该目标定义于Makefile#L448-L450实际执行cd ./lnrpc; ./gen_protos_docker.sh重新生成全部 RPC 桩。第 4 步生成的 Swift 文件分散在各子目录中如需统一收集到 framework 同目录可执行find . -name *.swift -print0 | xargs -0 -I {} mv {} mobile/build/ios最后把Lndmobile.xcframework与所有 Swift 文件加入 Xcode 工程并在工程中引入 Swift Protobuf 运行时库以支持生成的代码。Android两条生成路径方式一直接输出 Java 桩在 lnrpc/gen_protos.sh 的第一个protoc调用中追加--java_out.然后运行make rpc。这种方式最简单但将 Java 类生成与库构建耦合在一起可维护性一般。方式二官方推荐protobuf-gradle-plugin 方案这种方式在 Android 工程内完成 proto 编译与移动端库解耦推荐使用安装 protobuf 插件在 App 的顶层build.gradle中声明插件 classpathclasspath com.google.protobuf:protobuf-gradle-plugin:0.8.17创建 proto 目录在app/src/main下新建proto文件夹目录结构如下对应仓库截图 mobile/docs/proto_folder.png显示src/main下包含java、proto、test与AndroidManifest.xml。引入 AAR将构建好的Lndmobile.aar放入 App 模块的libs目录。配置模块build.gradleplugins { id com.google.protobuf } android { sourceSets { main { proto { } } } } dependencies { implementation fileTree(dir: libs, include: [*.jar]) implementation com.google.protobuf:protobuf-javalite:${rootProject.ext.javalite_version} } protobuf { protoc { artifact com.google.protobuf:protoc:${rootProject.ext.protoc_version} } generateProtoTasks { all().each { task - task.builtins { java { option lite } } } } }其中protobuf-javalite使用 Lite 运行时显著减小 APK 体积protoc版本号通过rootProject.ext.protoc_version统一管理。复制 proto 源文件将lnd/lnrpc下的全部.proto文件按目录结构复制到 App 的proto文件夹。构建工程等待 Gradle 在build目录中生成 Java proto 类即可在代码中组装/解析 RPC 消息。附AAR 无法打入 App Bundle 的规避方案如果 Android Studio 提示 AAR 文件无法被打入app-bundle官方给出了独立 Gradle 模块的 workaround新建一个独立的 Gradle 模块清空其中内容只保留 AAR 文件与build.gradle——模块根目录结构见仓库截图 mobile/docs/separate_gradle_module.png包含build.gradle、Lndmobile.aar与Lndmobile-sources.jarbuild.gradle只保留两行configurations.maybeCreate(default) artifacts.add(default, file(Lndmobile.aar))在 App 模块的dependencies中改为依赖该模块而非libs文件夹implementation project(:lndmobile, { default })五、调用 APIv0.15 的子服务方法名前缀从 LND v0.15 起所有 API 方法在生成的绑定中都带上了子服务器subserver名称前缀。这一改动是为了支持存在方法名冲突的子服务。例如QueryScores→AutopilotQueryScoresGetBlockHeader→NeutrinoKitGetBlockHeader此前缀行为由gen_bindings.sh中的api_prefix选项控制gen_bindings.sh#L57-L64并在 Makefile 的mobile-rpc目标中通过SUBSERVER_PREFIX1默认开启Makefile#L476。因此在编写移动端调用代码时必须使用带子服务前缀的完整方法名否则会因找不到方法而调用失败。六、API 文档指引LND gRPC API Reference涵盖全部 RPC 方法的请求/响应消息结构与调用说明是移动端开发时最常用的查询入口对应原文档中api.lightning.community链接指向的内容。LND Builders Guide面向应用集成者的上手指南对应原文档中docs.lightning.engineering链接指向的内容。两者与 lnrpc/ 下的.proto源文件相互印证所有服务与消息定义均可在仓库内直接查阅例如 lnrpc/lightning.proto、lnrpc/routerrpc/router.proto 等。结语lnd 的移动端集成路径可以概括为三条主线GOPATH 约束下的 gomobile 交叉编译、基于 falafel 插件的移动端 RPC 绑定生成、v0.15 起的子服务方法名前缀约定。掌握了 Makefile 中的ios/android/mobile目标、mobile/bindings.go 的Start启动契约以及 mobile/gen_bindings.sh 与 lnrpc/gen_protos.sh 的生成逻辑即可在自有 App 中复刻出与官方完全一致的 Lightning 移动端能力。需要再次强调的是移动端必须将--lnddir指向 App 沙盒目录并以内存 gRPC 通道承载全部 RPC 调用。赞分享区块链【免费下载链接】lndLightning Network Daemon ⚡️项目地址https://gitcode.com/gh_mirrors/ln/lnd点击查看免费下载相关推荐16GB显存也能玩MiniMax-H3-nvfp4-INT4-INT8-Convrot INT4模型本地部署教程16GB显存也能玩MiniMax H3 nvfp4 INT4 INT8 Convrot INT4模型本地部署教程 MiniMax H3 nvfp4 INT4大模型基础模型多模态模型量化本地部署Jina 项目 protobuf 构建指南多版本 proto 与 gRPC Python 接口的生成全流程Jina 项目 protobuf 构建指南多版本 proto 与 gRPC Python 接口的生成全流程 protobuf 是 Jina 各组件Gatew后端人工智能模型推理服务微服务llama.cpp移动端部署Android/iOS集成指南llama.cpp移动端部署Android/iOS集成指南 概述 llama.cpp作为Facebook LLaMA模型的C/C移植版本在移动端部署方面人工智能大模型模型推理服务推理引擎本地部署后端上一篇猫抓浏览器扩展终极视频下载工具完全指南下一篇FlatBuffers与量子计算低延迟数据处理新领域创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表