ARTICLE DETAIL

资讯详情

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

MNN TTS Android Demo 构建与调试实战:build.sh、Gradle 与 ADB 全流程速查

MNN TTS Android Demo 构建与调试实战:build.sh、Gradle 与 ADB 全流程速查 MNN TTS Android Demo 构建与调试实战build.sh、Gradle 与 ADB 全流程速查【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN本篇围绕 MNN 仓库中 TTS 框架的 Android Demo 快速参考文档QUICKREF.md展开系统讲解apps/frameworks/mnn_tts/demo/android目录下的 APK 构建方式、Gradle/CMake 关键配置、安装启动与日志调试命令以及常见构建故障的排查路径。读完后你可以直接在该仓库中复现从源码到设备的完整链路先构建 MNN 核心库再用build.sh或./gradlew产出 arm64-v8a 的 Debug/Release APK并熟练使用 ADB 完成安装、启动、抓日志与 APK 内容检查。一、Demo 在 MNN TTS 框架中的位置MNN TTS 是 MNN 仓库apps/frameworks/mnn_tts下的文本转语音TTS框架围绕 MNN 推理引擎提供多套语音合成实现。从 CMakeLists.txt 的开关定义可以确认框架支持三套可独立开关的合成器option(BUILD_BERTVITS2 Build BertVit2 TTS ON) option(BUILD_PIPER Build PIPER TTS OFF) option(BUILD_SUPERTONIC Build Supertonic TTS ON) option(BUILD_ANDROID Build for Android OFF)其中BUILD_ANDROID会在检测到ANDROID编译定义时自动置为 ONCMakeLists.txt 第 13-15 行这正是 Android Demo 构建链路的核心入口。整个工程的模块依赖关系为:appDemo 应用→:mnn_tts库模块编译libmnn_tts.so→libMNN.soMNN 核心引擎需预先构建。settings.gradle 中明确体现了这种组织方式rootProject.name MNNTTSDemo include :mnn_tts project(:mnn_tts).projectDir new File(../../android)即 Demo 工程根目录是demo/android但:mnn_tts库模块实际指向上一级的 android 目录含 JNI 源码与 TtsService.kt。二、构建工具链与设备要求快速参考文档给出的工具版本矩阵如下其中 NDK、CMake、Kotlin 版本均已在仓库源码中得到印证工具版本仓库印证位置Android StudioArctic Fox 及以上文档声明—Gradle8.9Wrapper 管理文档声明gradle-wrapper.propertiesNDK27.2.12479018android/build.gradle 第 18 行ndkVersionCMake3.22.1android/build.gradle 第 47-52 行Kotlin1.9.22demo build.gradle 第 3 行JDK17文档声明—设备与应用要求对应 build.gradle 的 defaultConfig最低版本Android 5.0API 21minSdk 21目标版本Android 14API 35compileSdk 35、targetSdk 35架构仅 ARM64arm64-v8a由 ABI 拆分配置锁定splits { abi { enable true reset() include arm64-v8a // 仅构建 ARM64 版本 universalApk false // 不生成通用 APK } }库模块同样在ndk.abiFilters中限定arm64-v8aandroid/build.gradle 第 36-38 行。需要说明的是虽然文档标注无特殊权限要求但从 AndroidManifest.xml 看应用为注册系统 TTS 服务声明了MODIFY_AUDIO_SETTINGS、RECORD_AUDIO与外部存储读写等权限并声明了TTS_SERVICEintent 查询这些是系统 TTS 集成的常规声明并非运行时动态申请的敏感权限。三、快速构建build.sh 与 Gradle 命令3.1 使用构建脚本推荐build.sh 是封装好的入口脚本支持四个子命令cd apps/frameworks/mnn_tts/demo/android ./build.sh # 构建 Debug APK默认参数 ./build.sh release # 构建 Release APK ./build.sh install # 构建并安装到设备 ./build.sh clean # 清理构建脚本内部逻辑值得了解前置检查check_prerequisites第 28-54 行依次校验 MNN 库../../../project/android/build_64/lib/libMNN.so是否存在、java是否安装、gradlew是否存在。缺少libMNN.so时会直接退出并提示先执行 project/android/build_64.sh 构建 MNN 核心库Debug 构建调用./gradlew assembleDebug构建成功后打印 APK 路径与大小Release 构建调用./gradlew assembleRelease产物为未签名包脚本会明确警告Release APK 未签名需要签名后才能发布第 82-88 行install 命令先通过adb devices检测已授权设备若无设备则提示检查 USB 调试与授权状态若 APK 尚不存在会先触发 Debug 构建再通过./gradlew installDebug安装并打印启动命令。3.2 直接使用 Gradle 命令./gradlew assembleDebug # 构建 Debug ./gradlew assembleRelease # 构建 Release ./gradlew installDebug # 安装 Debug ./gradlew clean # 清理一个细节是 Demo 的build.gradle中定义了 downloadAndUnzipNativeLibs 任务preBuild之前会自动从 CDN 下载并解压 arm64-v8a 原生库sherpa-mnn 相关且当src/main/jniLibs/arm64-v8a/libsherpa-mnn-jni.so已存在时会通过onlyIf跳过下载——这解释了为何重复构建不必每次联网。四、构建输出构建类型APK 路径相对 Demo 目录大小Debugbuild/outputs/apk/debug/MNNTTSDemo-arm64-v8a-debug.apk约 15 MBReleasebuild/outputs/apk/release/MNNTTSDemo-arm64-v8a-release-unsigned.apk约 8 MB两个文件名均可在 build.sh 中得到印证Release 包名带有unsigned后缀。五、安装、启动与日志文档给出的 ADB 命令集合完整可用包名com.alibaba.mnn.tts.demo主 Activity.MainActivity均与 AndroidManifest.xml 一致# 安装 adb install -r build/outputs/apk/debug/MNNTTSDemo-arm64-v8a-debug.apk # 卸载 adb uninstall com.alibaba.mnn.tts.demo # 启动 adb shell am start -n com.alibaba.mnn.tts.demo/.MainActivity # 停止 adb shell am force-stop com.alibaba.mnn.tts.demo # 查看日志MNN_TTS 标签 崩溃堆栈 adb logcat -s MNN_TTS:* AndroidRuntime:E # 清除数据 adb shell pm clear com.alibaba.mnn.tts.demo除MainActivity外Manifest 还声明了两个对理解 Demo 能力很有用的组件系统 TTS 服务 MnnTtsService注册android.intent.action.TTS_SERVICE携带xml/tts_engine元数据和配套的设置界面MnnTtsSettingsActivity。也就是说该 Demo 除了自身界面外还可以作为系统 TTS 引擎被其他应用调用adb logcat抓MNN_TTS标签时两条路径的日志都会出现。六、调试技巧6.1 查看依赖与任务./gradlew tasks # 查看所有任务 ./gradlew build # 完整构建 ./gradlew clean build # 清理并构建 ./gradlew assembleDebug --info # 详细构建日志 ./gradlew assembleDebug --scan # 构建分析 ./gradlew app:dependencies # 查看依赖树 ./gradlew :mnn_tts:tasks # 查看库模块任务6.2 检查 APK 内容unzip -l build/outputs/apk/debug/MNNTTSDemo-arm64-v8a-debug.apk aapt dump badging build/outputs/apk/debug/MNNTTSDemo-arm64-v8a-debug.apk用unzip -l可以确认libMNN.so、libmnn_tts.so、libc_shared.so三个原生库是否都打入jniLibs/arm64-v8aaapt dump badging可校验包名、min/target SDK 等元信息。七、故障排查7.1 问题MNN 库未找到CMake 通过 IMPORTED target 的方式直接引用本地构建产物CMakeLists.txt 第 17-30 行set(MNN_SOURCE_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../../) set(MNN_INSTALL_ROOT ${MNN_SOURCE_ROOT}/project/android/build_64) set(LIB_PATH ${MNN_INSTALL_ROOT}/lib)因此若libMNN.so不存在构建会在配置阶段失败。处理步骤# 检查库是否存在 ls -la ../../../project/android/build_64/lib/libMNN.so # 如果不存在构建 MNN 库 cd ../../../project/android ./build_64.sh注意 CMake 对libMNN_Express.so采取存在则链接的兼容策略第 32-36 行该库可选。7.2 问题NDK 未配置在 Demo 工程根目录创建或编辑local.propertiesecho ndk.dir$HOME/Library/Android/sdk/ndk/27.2.12479018 local.properties echo sdk.dir$HOME/Library/Android/sdk local.propertiesndk.dir必须指向 android/build.gradle 中锁定的27.2.12479018版本否则 AGP 会报 NDK 版本不匹配。7.3 问题Gradle 同步失败./gradlew clean rm -rf .gradle build ./gradlew build --refresh-dependencies另外 gradle.properties 中配置了-Xmx2048m的 JVM 参数与 AndroidX/Jetifier 开关若公司网络无法访问 google()/mavenCentral() 仓库settings.gradle 第 13-19 行同步失败时首先考虑网络与代理。7.4 问题ABI 不匹配INSTALL_FAILED_NO_MATCHING_ABIS由于splits.abi与ndk.abiFilters均只包含arm64-v8a该 APK 无法安装到 32 位设备。请确认测试设备为 ARM64 架构或在库模块的abiFilters与 Demo 的include中追加其他 ABI同时需要对应 ABI 的libMNN.so。7.5 CMake 构建失败的通用检查项结合 BUILD.md 的说明依次检查NDK 版本是否为 27.2.12479018、CMake 版本是否 3.22.1、libMNN.so是否存在。另有一个容易被忽略的点Android 构建会额外追加链接选项-Wl,-z,max-page-size16384CMakeLists.txt 第 110-113 行以支持 16KB 内存页大小配合 android/build.gradle 传入的-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZESON若目标设备使用 16KB 页大小这两处配置是运行正常的关键前提。八、构建耗时参考文档给出的耗时基线首次完整构建含 CMake 编译原生代码量级供参考操作预计时间Clean约 5 秒首次构建约 2-3 分钟增量构建约 30-60 秒安装到设备约 10 秒九、关键文件速查以仓库实际结构为准Demo 相关的关键文件如下文档原始清单中把 CMakeLists.txt 列在 demo/android 下实际它位于框架根目录由:mnn_tts模块引用apps/frameworks/mnn_tts/ ├── CMakeLists.txt # 原生代码构建配置含 BUILD_BERTVITS2 等开关 ├── android/ # :mnn_tts 库模块 │ ├── build.gradle # 库模块配置NDK/CMake/prefab │ ├── src/.../TtsService.kt │ └── test/test_mnn_tts.cpp # 库模块 C 测试 ├── include/ # TTS SDK C 头文件mnn_tts_sdk.hpp 等 ├── src/ │ ├── android/tts_service_jni.cpp # Android JNI 桥接 │ ├── bertvits2/ # BertVits2 合成实现 │ └── supertonic/ # Supertonic 合成实现 └── demo/android/ # Demo 应用:app ├── build.sh # 构建脚本debug/release/clean/install ├── build.gradle # 应用构建配置AGP 8.7.3 / Kotlin 1.9.22 ├── settings.gradle # 项目设置include :mnn_tts ├── gradle.properties # AndroidX/Jetifier/JVM 参数 ├── QUICKREF.md / BUILD.md / README.md # 快速参考 / 构建文档 / 快速开始 └── src/main/ ├── java/.../MainActivity.kt 等 Kotlin 源码 ├── res/ # 资源文件 └── AndroidManifest.xml # 清单文件含 TTS 服务声明配套文档可继续深入BUILD.md 提供了 Android Studio 图形化构建流程与 Release 混淆/资源缩减建议README.md 给出最简构建三步clean → assembleDebug → installDebug。十、小结MNN TTS Android Demo 的构建链路可以归纳为三步先构建 MNN 核心库在 project/android 下执行./build_64.sh产出build_64/lib/libMNN.so可选附带libMNN_Express.so再构建 Demo在demo/android下执行./build.sh或./gradlew assembleDebugCMake 以 IMPORTED 方式链接核心库并编译libmnn_tts.soGradle 产出仅含 arm64-v8a 的 APK最后上机验证adb install -r安装adb shell am start启动adb logcat -s MNN_TTS:*观察合成链路日志。掌握这套从 CMake 开关、ABI 拆分到 ADB 验证的完整方法后同样的思路也可用于仓库中其他依赖project/android构建产物的 Android 子工程。【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表