多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Open Headunit 开源构建完全指南:Gradle、NDK 与 FFmpeg 集成的踩坑全记录

Open Headunit 开源构建完全指南:Gradle、NDK 与 FFmpeg 集成的踩坑全记录 Open Headunit 开源构建完全指南Gradle、NDK 与 FFmpeg 集成的踩坑全记录【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一个开源的 Android Auto 车机应用能把你的安卓平板或手机变成 Android Auto 接收端Headunit 主机。想自己从源码构建 APK这篇文章带你走通 Gradle 多模块配置、NDK/CMake 原生编译与 FFmpeg HEVC 软解集成的全过程并逐一记录新手最容易踩的 7 个坑照着做基本可以一次构建成功。一、先看懂项目结构为什么构建会难Open Headunit 不是纯 Kotlin 项目它的构建链横跨三层层级技术作用应用层Kotlin Gradle 多模块UI、连接、协议AAAP原生层C/C NDK CMakeUSB 通信、FFmpeg 视频软解资源层预编译 .sojniLibslibusb、libavcodec 等模块划分定义在 settings.gradle.kts只有:app和:contract两个模块其中 contract/build.gradle.kts 是一个极简的 Android Library负责对外 Intent 契约。构建配置都集中在 app/build.gradle.kts 里建议先通读一遍再动手。二、一键安装步骤构建环境准备清单2.1 版本要求先对表避免后面报错工具项目锁定版本出处Gradle8.13Wrapper 自动下载gradle/wrapper/gradle-wrapper.propertiesAndroid Gradle Plugin8.13.2build.gradle.ktsKotlin1.9.22build.gradle.ktscompileSdk / targetSdk36app/build.gradle.ktsNDK29.0.14206865app/build.gradle.ktsCMake3.22.1app/src/main/cpp/CMakeLists.txt⚠️坑 1JDK 版本AGP 8.x 系列强制要求JDK 17。用 JDK 11 会直接在配置阶段报Unsupported class file major version。在 Android Studio 中检查Settings → Build Tools → Gradle → Gradle JDK选择 17 即可。2.2 拉取代码git clone https://gitcode.com/GitHub_Trending/he/open-headunit cd open-headunit三、NDK 与 CMake两个原生库的构建内幕项目的原生部分只有一个 CMake 工程app/src/main/cpp/CMakeLists.txt它编译两个目标usbhelper—— 对 libusb 的 JNI 包装usbhelper.c链接预编译的libusb1.0.so用于替代系统 USB 通道、提升老车机兼容性hur_soft_hevc—— FFmpeg HEVCH.265软件解码器ffmpeg_hevc_decoder.cpp使用 C17 编译并开启了-Wall -Wextra -Werror警告即报错代码改动时务必保证无警告。⚠️坑 2NDK 版本被写死ndkVersion 29.0.14206865是精确到小数的。本地没装这个版本时构建会提示下载失败。在 SDK Manager 里安装NDK (Side by side) 29.0.14206865或临时注释该行让它使用默认版本。同理CMake 3.22.1也必须在 SDK Manager 中安装否则externalNativeBuild阶段直接失败。FFmpeg 集成的优雅降级设计重点踩坑区CMake 脚本里有一段非常巧妙也常被误判为报错的逻辑构建时会检查jniLibs/你的ABI下是否存在libavcodec.so、libavutil.so、libswscale.so三个 FFmpeg 库存在 → 定义HUR_HAVE_FFMPEG1完整链接 FFmpeg编译出可用的 HEVC 软解不存在 → 定义HUR_HAVE_FFMPEG0仍然编译通过只是运行时没有软解能力。⚠️坑 3日志里出现 HUR FFmpeg for xxx: FALSE 不是错误仓库只为arm64-v8a提供了 FFmpeg 预编译库见app/src/main/jniLibs/arm64-v8a/其他 ABIarmeabi-v7a、x86 等只有 libusb。所以 x86 模拟器上构建时看到FALSE属正常现象。如果你的车机不支持 H.265 硬解没有这个库就会出现卡在 Android is starting的问题——arm64 车机用户建议保留该库。自己重编 FFmpeg 的正确姿势如果 ABI 缺失或想升级版本参考 app/src/main/cpp/ffmpeg/README.md 中给出的推荐配置只启用hevc解码器、解析器和 swscale其余全部关闭--disable-everything --enable-decoderhevc ...并加上关键的链接参数--extra-ldflags-Wl,-z,max-page-size16384⚠️坑 416KB 内存页对齐Android 15 的隐形杀手CMake 里通过-Wl,-z,max-page-size16384强制 16KB 页对齐CMakeLists.txt 第 6 行。这是 Android 15 新 ABI 要求自己重编的 libusb / FFmpeg 如果不带这个参数装到 16KB 页大小的设备上会直接崩溃且报错信息极难排查。重编时务必带上。四、Gradle 配置详解这些设置都在防什么4.1 渠道风味Product Flavorsapp/build.gradle.kts 定义了distribution维度的两个风味playstoreminSdk 21使用 Conscrypt 2.6.116KB 对齐版本符合商店合规githubminSdk 16下探到更老的安卓车机使用 Conscrypt 2.5.3。⚠️坑 5构建变体选错给老车机刷机请用github风味如assembleGithubDebug给较新设备用playstore风味。两者的res/raw/资源也不同如 DummyVpnService.kt 仅存在于 github 源码集构建前在 Build Variants 面板选对。4.2 其他值得注意的配置gradle.properties 中org.gradle.jvmargs-Xmx4096m给了 4GB 堆内存——这个项目资源较多内存不足会触发 OOMandroid.ndk.suppressMinSdkVersionError21则是用来压制 NDK 对 minSdk 16 的警告坑 6见下文。copyRootAssets任务会把 CHANGELOG.md 和 LICENSE 打进 assets用于应用内关于页面展示构建时会自动执行git rev-parse把提交号写入BuildConfig.GIT_SHA脏工作区带-dirty后缀——所以机器上必须装有 git否则只是回退为unknown不影响构建。⚠️坑 6NDK minSdk 警告刷屏若你本地 NDK 最低要求 API 21而项目 minSdk 是 16会看到一堆Native build failed警告。项目已用android.ndk.suppressMinSdkVersionError21抑制若升级 NDK 后仍有警告可在 gradle.properties 中把它改成本地 NDK 要求的值。五、打正式包签名密钥配置最后一道坎构建 release 包需要 keystore项目支持三种提供方式优先级从高到低见 app/build.gradle.kts根目录key.properties或secrets.properties文件环境变量HEADUNIT_KEYSTORE_PASSWORD/HEADUNIT_KEY_PASSWORDREADME.md 有 Mac 下的配置示例仓库根目录自带的 keystore.jkc。没有密钥时用 keytool 生成一个自己的keytool -genkey -v -keystore headunit-release-key.jks \ -alias headunit-revived -keyalg RSA -keysize 2048 -validity 10000⚠️坑 7release 构建偷跑成未签名注意逻辑找不到有效 keystore 时 release 不会报错而是悄悄跳过签名产出一个无法安装的 APK。构建完记得验证app/build/outputs/apk/*/下的包是否能正常安装。另外根目录的 copyCert.sh 是空文件占位脚本不要指望它帮你导入 SSL 证书应用内通信证书实际位于app/src/main/res/raw/cert和privkey。六、构建与验证一条命令出包环境就绪后在项目根目录执行# 调试包推荐新手先用这个验证环境 ./gradlew assembleGithubDebug # 正式包需先配好签名 ./gradlew assembleGithubRelease构建成功后把 APK 装到车机进入设置运行自动优化向导它会推荐最适合你硬件的分辨率、DPI 与视频编码H.264/H.265。若设备 H.265 解码异常把视频编码切到 H.264 即可。下面这张就是应用内置的视频测试图可用于验证投射画面的色彩与几何是否正确测试素材见 screentest.png七、踩坑速查表TL;DR#症状原因解法1Unsupported class file major versionJDK 版本低换 JDK 172NDK/CMake 下载失败版本未安装SDK Manager 装 NDK 29.0.14206865 CMake 3.22.13HUR FFmpeg: FALSE当前 ABI 无 FFmpeg 库arm64 车机保留 arm64-v8a 库其余 ABI 属正常降级4Android 15 设备崩溃16KB 页未对齐重编原生库时加-Wl,-z,max-page-size163845老车机装不上选错 flavor使用 github 风味minSdk 166NDK minSdk 警告刷屏NDK 最低 API 21gradle.properties中抑制项调值7release APK 装不了未签名配置 keystore见第五节延伸阅读原生工程入口app/src/main/cpp/CMakeLists.txtFFmpeg 目录布局与构建参数app/src/main/cpp/ffmpeg/README.md依赖清单与渠道风味app/build.gradle.kts多模块声明settings.gradle.kts全局 Gradle 属性gradle.properties按这份指南走完你应该已经能在本地稳定复现 Open Headunit 的完整构建链路。老车机改造路上一个能自己编译、自己改动的源码就是最可靠的后备轮胎。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表