Skip to content

Android 信号 KSP 注解改造

使用 @UnityMessage 注解 + KSP 编译期生成注册码,替代手写信号注册,减少模板代码。

背景

Unity 与 Android 原生之间的双向通信需要"信号注册"——每个信号都要在两端各写一遍模板代码:

kotlin
// 手写注册(重复劳动)
SignalDispatcher.register("unity_map_center", MapCenterHandler())
SignalDispatcher.register("unity_camera_state", CameraStateHandler())
SignalDispatcher.register("unity_layer_switch", LayerSwitchHandler())
// ... 20+ 个信号

每增加一个新信号,需要:

  1. Unity 端定义信号名
  2. Android 端注册 handler
  3. 两端各维护一份信号清单

容易遗漏、容易拼错。

方案

@UnityMessage 注解

kotlin
@UnityMessage("unity_map_center")
class MapCenterHandler : SignalHandler {
    override fun handle(data: String) {
        // 处理 Unity 发来的地图中心数据
    }
}

KSP 编译期代码生成

kotlin
// KSP Processor
class UnityMessageProcessor : SymbolProcessor {
    override fun process(resolver: Resolver): List<KSAnnotated> {
        val symbols = resolver.getSymbolsWithAnnotation("UnityMessage")
        // 生成注册代码:
        // SignalDispatcher.register("unity_map_center", MapCenterHandler())
        val file = FileSpec.builder("com.xpeng.signal", "SignalRegistry")
            .addFunction(generateRegisterFunction(symbols))
            .build()
        file.writeTo(codeGenerator)
    }
}

编译后自动生成 SignalRegistry.kt

kotlin
// 自动生成,勿手动修改
fun registerAllSignals() {
    SignalDispatcher.register("unity_map_center", MapCenterHandler())
    SignalDispatcher.register("unity_camera_state", CameraStateHandler())
    // ... 全部自动生成
}

收益

  • 新增信号:加一个 @UnityMessage 注解即可,零注册代码
  • 编译期检查:信号名拼写错误在编译时就能发现
  • 代码量减少 ~60%(不需要手写注册模板)

公开版深化

案例定位

Android 信号 KSP 注解改造不是孤立笔记,而是AI 与工具链能力下的一个可复用案例。它服务于“小鹏一张图 / SR 渲染引擎”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

使用 @UnityMessage 注解 + KSP 编译期生成注册码,替代手写信号注册,减少模板代码。

这篇文章已经覆盖 背景、方案、收益。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 代码量减少 ~60%(不需要手写注册模板)

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

公开版深化

案例定位

Android 信号 KSP 注解改造不是孤立笔记,而是AI 与工具链能力下的一个可复用案例。它服务于“小鹏一张图 / SR 渲染引擎”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

使用 @UnityMessage 注解 + KSP 编译期生成注册码,替代手写信号注册,减少模板代码。

这篇文章已经覆盖 背景、方案、收益。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 代码量减少 ~60%(不需要手写注册模板)

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

公开版深化

案例定位

Android 信号 KSP 注解改造不是孤立笔记,而是AI 与工具链能力下的一个可复用案例。它服务于“小鹏一张图 / SR 渲染引擎”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

使用 @UnityMessage 注解 + KSP 编译期生成注册码,替代手写信号注册,减少模板代码。

这篇文章已经覆盖 背景、方案、收益。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 代码量减少 ~60%(不需要手写注册模板)

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

企业级技术案例库 · 内容先审计再发布