CLAUDE.md 7.0 KB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

CLAUDE.md 自动同步声明

  • 忽略细微修改,对变量名、注释、小范围格式等不影响架构或逻辑的变更,无需同步更新。
  • CLAUDE.md 内容关联同步
    • 新增对外暴露的接口、模块时,Claude 必须在此文件中添加相应的描述。
    • 若本文件中描述的内容(如模块职责、接口定义等)在代码中被修改、重命名或移除,Claude 必须同时在此文件中反映这些更改。
    • 修改内容如在原 CLAUDE.md 中未涉及,则无需添加新内容。
  • 数量限制
    • 根目录 CLAUDE.md 控制在400行内
    • 模块内 CLAUDE.md 控制在300行内
    • 超出行数限制时,优先保留核心架构和规范内容,删除冗余或重复信息。

角色

你是一个资深的 Android 架构专家,尤其擅长Kotlin+Jetpack技术栈。

编码风格要求

  • 遵循 Kotlin 官方代码规范
  • 遵循单一职责原则(每个类只负责一件事)
  • 避免冗余注释,保持代码简洁清晰

项目约定

  • 异步操作使用协程,通过 frame/coroutine 模块使用
  • 网络请求、文件操作、事件处理返回结果使用 RLT类(result),RLT类封装在 frame/zero 中
  • 日志必须使用 AppBase.log 进行输出
    • AppBase 导入方式 import com.adealink.frame.base.AppBase
    • AppBase.log.d(tag, msg) - 调试日志(Debug)
    • AppBase.log.i(tag, msg) - 信息日志(Info),会保留到线上,要求重要步骤或重要信息才使用该级别的日志
    • AppBase.log.e(tag, msg) - 错误日志(Error,无异常)
    • AppBase.log.e(tag, msg, exception) - 错误日志(Error,带异常对象)
  • 编写与业务无关的公共功能,优先调用 frame/util 模块中已有的工具类,若不存在对应逻辑,请将该逻辑封装为新的工具方法或类

项目架构

这是一个模块化的Android框架库,采用多模块架构设计。项目分为两大类别:

  • frame/: 核心框架模块
  • external/: 第三方库集成模块

frame 代码目录结构

基础架构模块(Framework Core):

  • frame/base: 基于 RLT 状态管理的项目基础,所有其他模块的依赖基础
  • frame/mvvm: MVVM 架构扩展,提供 ViewModel 和 LiveData 支持
  • frame/coroutine: Kotlin 协程工具封装
  • frame/data: 自定义数据结构和类型转换
  • frame/util: 通用工具类集合
  • frame/spi: 服务发现和依赖注入框架(Service Provider Interface)
  • frame/startup: 应用启动初始化框架(统一管理模块初始化顺序)
  • frame/bom: 统一依赖版本管理(Bill of Materials)

网络与存储(Network & Storage):

  • frame/network: 基于 Retrofit 的网络请求框架
  • frame/storage: 统一的存储管理(文件存储、SharedPreferences)
  • frame/oss: 对象存储服务封装(支持阿里云 OSS、腾讯 COS)
  • frame/cachebean: 缓存数据模型定义及持久化管理
  • frame/download: 下载管理器封装(多线程断点续传、任务调度)

UI组件(UI & Visual Components):

  • frame/effect: 动画效果播放框架(支持 SVGA、VAP 等格式)
  • frame/effectpreview: 动画效果预览与编辑工具
  • frame/image: 图片加载框架(基于 Fresco)
  • frame/commonui: 公共 UI 组件库
  • frame/dot: 红点提醒系统
  • frame/guide: 新手引导与引导浮层组件
  • frame/media: 音视频媒体播放、录制与处理封装

实时通信(RTC & 音视频):

  • frame/agorartc: 声网 RTC SDK 封装
  • frame/trtc: 腾讯云 RTC SDK 封装
  • frame/volcrtc: 火山引擎 RTC SDK 封装
  • frame/zegortc: 即构 RTC SDK 封装
  • frame/room: 统一的房间信令管理
  • frame/audio: 音频播放与录制管理
  • frame/sound: 音效与提示音管理模块

系统与服务(System & Platform):

  • frame/router: 基于注解的页面路由框架
  • frame/security: 应用安全检测和防护功能
  • frame/deviceid: 设备唯一标识管理
  • frame/locale: 多语言本地化支持和位置定位
  • frame/log: 统一日志采集与打印框架
  • frame/crash: 崩溃捕获与上报
  • frame/statistics: 埋点与数据统计上报框架
  • frame/apm: 性能监控系统(内存、卡顿、CPU、FPS 等)
  • frame/tceffect: 腾讯特效 SDK 封装

平台集成与外部服务(Integration & Cloud Service):

  • frame/googleservice: Google 服务集成(Firebase、FCM 等)
  • frame/push: 多厂商推送统一封装(华为、小米、OPPO、FCM)
  • frame/share: 第三方分享与社交平台封装
  • frame/game: 游戏 SDK 封装或小游戏容器集成
  • frame/zero: 零配置接入工具包(用于快速初始化)
  • frame/bundletool: Android App Bundle 构建与动态模块拆分工具
  • frame/aab: AAB(Android App Bundle)打包支持工具
  • frame/asr: 语音识别(ASR)模块

开发与测试支持(Dev & Debug):

  • frame/debug: 调试工具(悬浮窗、日志面板、环境切换)
  • frame/trace: 性能追踪和调试分析(函数耗时、启动性能)

external 代码目录结构

  • external/androidautosize: AndroidAutoSize 屏幕适配库集成
  • external/animplayer: 腾讯 VAP(Video Animation Player),用于播放酷炫动画的实现方案
  • external/SVGAPlayer: SVGA 动画播放器集成
  • external/retrofit: Retrofit 网络请求库集成
  • external/drawee: Fresco DraweeView 图片渲染库集成
  • external/libcocos2dx: Cocos2d-x 游戏引擎集成
  • external/tcturing: 腾讯图灵盾风险识别

开发规范

  1. 模块独立性: 每个frame模块都应该可以独立编译和使用
  2. 依赖方向: 框架模块之间避免循环依赖
  3. base模块: 是所有其他模块的基础依赖,包含核心的状态管理和通用功能

常用代码路径

  • 主要业务逻辑:frame/*/src/main/java/com/adealink/
  • 资源文件:frame/*/src/main/res/
  • 第三方集成:external/*/src/main/java/

代码核心架构规范

1. 接口-工厂-初始化

适用场景:

  • 模块需要全局访问

    // 1. 定义模块能力的核心接口
    interface IModuleName {
    fun primaryAction()
    fun secondaryAction()
    }
    
    // 2. 用于依赖注入的配置接口
    interface IModuleConfig {
    val requiredDependency: Type
    val optionalSetting: String
    }
    
    // 3. 创建实例的工厂函数,管理类可以 *Manager 规则命名
    @Synchronized
    fun createModule(config: IModuleConfig): IModuleName {
    return ModuleImpl(config)
    }
    
    // 4. 模块全局初始化函数
    fun initModule(initiator: (() -> IModuleName)) {
    ModuleImpl.initiator = initiator
    }
    
    // 5. 内部实现类(带惰性单例)
    internal class ModuleImpl(val config: IModuleConfig) : IModuleName {
    companion object {
        var initiator: (() -> IModuleName)? = null
        var instance: IModuleName? = null
            get() = field ?: initiator?.invoke()?.also { field = it }
                ?: throw IllegalArgumentException("Module not initialized")
    }
    }