## Context

在 phase-0 脚手架（`project-scaffold`）的地基上，接入原生 Core 并打通"初始化 + 双向事件"。架构/方法表权威在 SPACE，本文**只引用不复制**：

- TurboModule 桥方法（init 模块 / Codegen Spec 约定）：SPACE **§7.0、§7.1**
- iOS 桥接层设计（EventEmitter 主线程 emit、Delegate 模式）：SPACE **§9**（§12）
- 登记主表（callName / payload 根字段 / Init callbackName）：SPACE **§17.2、§17.3.1**
- 线程模型 / putFilter stub / API 验证：`docs/RN-SDK-开工前调研补遗.md §一/§二`
- 执行步骤逐条：实施规范 **Phase 1**

## Goals / Non-Goals

**Goals:**
- `ATSDK` 初始化全链路：example init → `ATInitManager` → 原生 `ATSDK.init`，无 crash，后续广告 API 可调。
- os_fw=5（init 内 `setSystemDevFragmentType("rn")`）；日志双开（SDK + MsgTools，TAG `ATRNBridge`）。
- 双向通道：`InitCallName` 事件全链路（native → `ATReactNativeEventEmitter` → JS `ATAdEvents` → listener），证明 JS↔Native 双向通信。
- L1 `ATSDK` 覆盖 §4.3 核心子集；`ATAdEvents` 订阅 8 callName、按 placementID 分发。
- 原生 Core 依赖接入（Android compileOnly / example implementation）。

**Non-Goals:**
- 任意广告 load/show（phase-2 起）。
- Banner/Native Fabric（spec 留空）。
- §4.3 Core 全量（平台过滤、收益、setAdSourcePrivacyPolicy 全量等 → phase-3 补齐）。
- iOS 真实业务实现（本期 iOS 仅 stub + 打 log）。

## Decisions

- **通信机制 = TurboModule（下行）+ NativeEventEmitter（上行）**；`BridgeJsonMapUtil` 是下行复杂参数的 JSON 解析器，**非通信机制**。
- **下行数据格式 = 结构化对象**：Codegen 把 TS object marshal 成 `ReadableMap`/`NSDictionary`，**不让开发者传 JSON 字符串**。理由：RN 惯用 + Codegen 类型检查。
  - 复杂嵌套（`filterSpec`/`atAdRequest`/`sharedPlacementConfig`）：桥内 `ReadableMap →(readableMapToJsonString)→ JSON字符串 → BridgeJsonMapUtil.*FromJson(str)`，**1:1 复用 Flutter 解析逻辑**（Flutter 也是 Map→`flutterMapToJsonString`→parse）。
  - 简单参数（placementID=string、customMap/extraDic=object→ReadableMap 直接转 HashMap）不经 BridgeJsonMapUtil。
  - 例外：`policyJson` 原生要 JSON 字符串 blob，保持 string 透传。`putFilter` key 用 `filterSpec`（非 Flutter 的 `extraDic`）。
- **线程（命门）**：`ATReactNativeEventEmitter` 一律主线程 emit。iOS 重写自 `ATFSendSignalManger`，**必须保留 `if(![NSThread isMainThread]) dispatch_async(dispatch_get_main_queue())` 守护**；Android 原生已切主线程，emit 前再兜底 `Handler(mainLooper).post`。
- **InitManager 启动顺序固定**（不可乱）：`setNetworkLogDebug` → `GlobalAdListeners.install()`（注册 ATAdEvents）→ （可选 channel/customMap）→ `ATSDK.init`。
- **iOS 范围**：各桥方法**可空实现 + 打 log**（证明路由通），结构/EventEmitter/线程守护就位；真实业务 iOS 同事后补。
- **Core 依赖**：插件 `compileOnly`（不打包 Core），example 宿主 `implementation` 引完整 Core；Maven `https://jfrog.takuad.com/artifactory/china_sdk`，坐标 `com.anythink.sdk:core-taku:6.5.73.3`。
- **错误语义**：未 init 调广告桥方法 → reject `SDK_NOT_INITIALIZED`；参数非法 → reject `INVALID_*`；广告 load/show 失败只走 Event（phase-1 奠基）。

## Risks / Trade-offs

- [iOS 丢掉主线程守护 → 原生子线程回调 emit 给 JS crash] → iOS EventEmitter 重写必须保留 dispatch_async(main)；review 阶段专门核查。
- [BridgeJsonMapUtil import com.anythink.core.api.* 编译失败] → 本期已接入 Core compileOnly，编译可过；解析逻辑不改。
- [example 宿主未引完整 Core → init 运行时崩] → example build.gradle 用 implementation 引完整 Core/Network，非 compileOnly。
- [os_fw=5 未生效] → init 内确保 `setSystemDevFragmentType("rn")` 在 `ATSDK.init` 之前/之中；P1-F05 抓包验证。
- [iOS stub 被误当完整实现] → tasks/spec 明确 iOS 本期 stub+log，验收 iOS 列只验"编译过 + 路由 log 可见"。
- [测试凭据缺失致 init 无法验证] → 已从 app-china placementId.json 取得 appId/appKey，填入 sdkConfig.ts。
