news 2026/10/28 1:27:20

如何从源码构建fqapp:Rust核心NDK交叉编译到APK打包的完整开发者教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何从源码构建fqapp:Rust核心NDK交叉编译到APK打包的完整开发者教程

【免费下载链接】fqapp

内容聚合 Android 客户端:小说/短剧/漫剧/听书/漫画,Flutter UI + 进程内 Rust 核心,无自建服务器、无需 root

项目地址:https://gitcode.com/gh_mirrors/fq/fqapp
点击查看免费下载

本文是一份面向新手开发者的 fqapp(什锦铺)源码构建完整指南。fqapp 是一个小说/短剧/漫剧/听书/漫画内容聚合 Android 客户端,采用 Flutter UI + 进程内 Rust 核心的混合架构,无需自建服务器、无需 root。文章将带你走通从环境准备、Rust 核心 NDK 交叉编译,到最终 APK 打包、真机验证的全过程。

一、动手之前:先看懂这个混合架构

在敲第一条构建命令前,花两分钟理解项目结构,能帮你少走很多弯路:

目录作用
lib/Flutter UI、数据模型与本地状态
rust/Rust 原生核心fqapi_core源码(签名、解密、设备池、分发器)
native/自行实现的 CENC MP4 流式解密 C 库,Gradle 构建时由 CMake 自动编译
scripts/构建、验证与资源生成脚本
android/Android 工程与 JVM 测试

构建链路只有三件事:Rust 源码 →libfqapi_core.so(NDK 交叉编译)、C 源码 →libshortplay_crypto.so(CMake 自动生成)、两者打进 APK。架构与部署细节可查阅官方开发者文档 DEVELOPMENT.md。

📦 注意:仓库不含任何预编译二进制,两个.so都必须由你自己构建生成——这正是本教程的重点。

二、构建环境准备:工具链版本清单

fqapp 对工具链版本有严格固定的要求,版本表如下:

工具版本用途
Flutter3.44.6 (stable)构建 App
Dart SDK3.12+随 Flutter 自带
Ruststable编译原生核心fqapi_core
flutter_rust_bridge2.13.0生成 Flutter/Rust 绑定
Android SDK36 + Build-Tools编译 APK
JDK17Android Gradle 构建
Android NDK28.2.13676358交叉编译 Rust 核心与 C 解密库
CMake3.22.1Android 构建自动编译 C 库

用 SDK Manager 安装缺失组件:

sdkmanager "platforms;android-36" sdkmanager "ndk;28.2.13676358" sdkmanager "cmake;3.22.1"

⚠️NDK 版本必须精确匹配28.2.13676358。构建脚本会硬性校验版本号,指向其它 NDK 会直接报错退出,不会静默回退到"最新安装的 NDK"——这是刻意设计,防止工具链悄悄改变导致构建结果不可复现。

三、克隆仓库与获取依赖

git clone https://gitcode.com/gh_mirrors/fq/fqapp cd fqapp flutter pub get --enforce-lockfile

--enforce-lockfile会强制使用 pubspec.lock 中锁定的依赖版本,保证多人构建结果一致。

四、NDK 交叉编译 Rust 核心:一条命令生成 libfqapi_core.so

这是整个构建里最关键的一步。项目提供了单一入口脚本:

  • Linux / macOS:scripts/build_rust_backend.sh
  • Windows PowerShell:scripts/build_rust_backend.ps1
./scripts/build_rust_backend.sh

脚本内部自动完成四件事:

  1. 生成绑定:运行flutter_rust_bridge_codegen generate,按 flutter_rust_bridge.yaml 的配置生成 Dart/Rust 双向 FFI 绑定(输入rust/src/api,输出lib/src/rust/);
  2. 交叉编译:用 NDK 自带的 clang 工具链编译aarch64-linux-android(arm64-v8a)与armv7-linux-androideabi(armeabi-v7a)两个目标;
  3. 自动归位:把libfqapi_core.so复制到android/app/src/main/jniLibs/<abi>/,供 Gradle 直接打包;
  4. 打印 SHA-256:方便你核对产物。

常用开关(绑定已是最新时可加速):

./scripts/build_rust_backend.sh --skip-codegen # 跳过绑定生成 ./scripts/build_rust_backend.sh --profile debug # 调试配置 ./scripts/build_rust_backend.sh --host-lib # 额外构建桌面 cdylib

Cargo 按目标缓存编译结果,没有改动 Rust 源码时重建会很快。

C 解密库:不需要你手动编译

native/下的 CENC 流式解密库由 Gradle 的externalNativeBuild通过 native/CMakeLists.txt 在 APK 构建阶段自动编译并打包,同样显式设置了 16 KiB ELF 页对齐参数,无需任何额外操作。

五、构建 APK:debug 与 release 两种姿势

# 当前 Rust 核心主要面向 arm64 设备,显式指定目标 ABI flutter build apk --debug --target-platform android-arm64 flutter build apk --release --target-platform android-arm64

生成结果位于build/app/outputs/flutter-apk/app-debug.apk(或app-release.apk)。

🛑release 构建不要加--no-pub:integration_test在dev_dependencies里,flutter test会把它写进插件注册表,跳过 pub 步骤后 Gradle 会报package dev.flutter.plugins.integration_test does not exist。

六、安装到真机并验证

# 真机开启 USB 调试连接后 adb install -r build/app/outputs/flutter-apk/app-debug.apk adb shell am start -n com.fqapp.fqapp/.MainActivity

首次启动流程:App 将 config.json、过滤器等资源部署到应用私有目录,通过 flutter_rust_bridge 在进程内初始化 Rust 核心,轮询/health健康检查通过后进入主界面。

几个实用调试命令:

# 查看后端日志 adb shell run-as com.fqapp.fqapp cat files/backend/backend.log # loopback 端口转发(核心默认监听 127.0.0.1:18921) adb forward tcp:18080 tcp:18921 curl http://127.0.0.1:18080/health # Flutter 日志 adb logcat -s flutter

如果内容解密乱码,一般是设备池过期,删除files/backend/config/device_pool.json后重启 App 即可自动重注册。

七、构建后验证:测试与 16 KiB 对齐检查

# 按模块秒级跑测试(子串匹配测试文件名) ./scripts/test_quick.sh home ./scripts/test_quick.sh --all # 交付前收尾全量 # Rust 核心测试 cargo test --manifest-path rust/Cargo.toml --locked # 检查 .so 的 ELF 16 KiB 对齐 node scripts/check_native_alignment.cjs android/app/src/main/jniLibs/arm64-v8a/libfqapi_core.so

scripts/test_quick.sh 支持按模块名快速迭代,拼错的模块词会直接报错,不会静默少跑。

八、常见构建错误速查表

问题解决方案
找不到 NDK 28.2.13676358sdkmanager "ndk;28.2.13676358",或设置ANDROID_NDK_HOME指向它
Unable to locate Android SDKflutter config --android-sdk <路径>
Flutter requires Android SDK 36sdkmanager "platforms;android-36"
Could not close incremental caches项目已在gradle.properties关闭 Kotlin 增量编译,无需处理
偶发The settings are not yet available for buildGradle 9.1.0 偶发 bug,重跑即可恢复
maven.google.com 超时仓库已配置阿里云镜像(见 android/settings.gradle.kts)

九、不想本地配环境?看看 CI 云端编译

.github/workflows/android-apk.yml 固定了与上文一致的 Flutter 3.44.6、Rust 工具链、flutter_rust_bridge 2.13.0、JDK 17、NDK 28.2.13676358 和 CMake 3.22.1。推送代码或手动触发 Run workflow 后,可在运行记录的Artifacts中下载app-release.apk(含 SHA-256 与签名报告,保留 14 天)。CI 每次都会完整跑 Rust 测试、Flutter 静态分析、全量单元/组件测试并验证最终 APK。

总结

fqapp 源码构建的核心路径可以浓缩为一句话:

flutter pub get→scripts/build_rust_backend.*交叉编译 Rust 核心 →flutter build apk --target-platform android-arm64→ 真机验证。

C 解密库由 CMake 自动接管,CI 帮你兜底验证,整条链路没有自建服务器、不需要 root,也无需任何私有检出。祝你构建顺利,构建产物跑起来的那一刻,就是理解这个项目架构最好的方式。

【免费下载链接】fqapp

内容聚合 Android 客户端:小说/短剧/漫剧/听书/漫画,Flutter UI + 进程内 Rust 核心,无自建服务器、无需 root

项目地址:https://gitcode.com/gh_mirrors/fq/fqapp
点击查看免费下载
上一篇:终极指南:如何使用Nrfr免Root安全修改SIM卡国家码,轻松解决国际漫游难题
下一篇:三步画出笔线段中枢:ChanlunX 缠论可视化插件上手笔记

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 1:27:19

(最新)基于Springboot医院急诊(病房)管理系统【附源码+文档】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:16:23

【HarmonyOS】元服务开发

1 前言 在万物互联的今天&#xff0c;终端设备不断增多&#xff0c;app数量也是呈指数级上升&#xff0c;导致终端设备中的许多应用变得冗余&#xff0c;有些甚至使用一次后就再也没有打开过&#xff0c;所以迫切需要一种“即开即用”的应用软件。HarmonyOS中的元服务正是基于H…

作者头像 李华
网站建设 2026/10/28 1:15:30

CentOS 7源码编译keepalived-1.2.13双机热备与VIP漂移排障

简介&#xff1a;这是 keepalived-1.2.13.tar.gz 开源软件源码包&#xff0c;面向网络运维、系统管理员与高可用架构学习者&#xff0c;聚焦 VRRP 虚拟路由冗余协议、服务健康检查与 LVS 负载均衡支撑&#xff0c;可用于搭建主备故障切换实验环境、研读 1.2.13 版本的实现细节并…

作者头像 李华
网站建设 2026/10/28 1:14:48

【傻呱呱】云服务器开启ssh的root权限登录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:13:02

STM32C5嵌入式开发实战:从固件到上位机的完整软件链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华