2026-06-06
一、问题背景
APlay 的 C++ SDK 通过一层 Android.mk 风格的 CMakeHelper 来组织模块。业务侧不用直接写 add_library()、target_link_libraries(),而是用 LOCAL_MODULE、LOCAL_INTERFACE_LIBRARIES、LOCAL_OBJECT_LIBRARIES 这类变量描述 target 关系。
Android SDK 的 JNI 入口目标是 APla…
2026-06-05
背景
在 UxPlay 的 PR #523 中,我们用内置的 mDNS responder 替换了 Avahi 依赖。PR 的 reviewer 提出了一个架构建议:是否应该把 mDNS 功能拆成独立进程,让用户自己选择用什么 mDNS 实现(Avahi、mDNSResponder 等)?
这个建议本身很合理——桌面场景下确实可以这样分工。但当目标平台变成 Android、HarmonyOS、RTOS 和裸embedded Linux…
2026-06-04
在 APlay 项目中,mDNS 服务发现是 AirPlay/RAOP 设备被发现的基础。本文介绍的 AirPlay mDNS harness 借助一个轻量的验证框架,无需真实硬件,在单机上完成了 mDNS 协议实现的验证。本文从流程、代码到协议细节,完整解析这个"模拟设备"是如何工作的。
背景:为什么需要模拟设备
APlay 是一个支持 AirPlay/RAOP 协议的服务端实现。AirPlay 设备被发现依赖 mDNS(Multic…
2026-06-04
一、为什么要再封一层 CMake
CMake 很强,但刚开始接触时也很容易写乱。
比如我们想做一件很普通的事:写一个 hello object library,再写一个 basic_hello_world 可执行程序去使用它。原生 CMake 可能会这样写:
add_library(hello OBJECT hello/src/hello.cpp)
target_include_directories(hello PUBLIC hell…
2026-05-26
大模型已经很会写代码了,但真正用起来以后,很多人会遇到一个尴尬问题:它能很快生成一大堆东西,却不一定稳定、可维护、符合项目约定。
第一次看起来很惊艳,第二次开始风格漂移,第三次改坏旧逻辑,第四次你发现自己在给 AI 生成的代码收拾现场。于是效率提升没有想象中那么大,问题从“我写代码慢”变成了“我审 AI 代码很累”。
Harness Engineering 要解决的就是这个问题。
它不是一个新框架,也不是某个插件,而是一种使用 AI A…