## 1. 依赖（复用 phase-2a，无新增）

- [x] 1.1 确认开屏 API 在 core-taku:6.5.73.3（splashad 包）+ ADX 已配，无需改 gradle

## 2. L2 Codegen Spec 扩展（`src/specs/NativeATBridge.ts`）

- [x] 2.1 加开屏方法：`loadSplash(placementID, settings)`、`showSplash(placementID, scenario): Promise`、`showSplashWithConfig(placementID, showConfig): Promise`（showConfig 含 heightRatio/heightPx/scenario）、`splashReady(placementID): boolean`、`entrySplashScenario(placementID, scenario)`
- [x] 2.2 无 Auto / 无 checkValidAdCaches（开屏特性）

## 3. 常量

- [x] 3.1 `src/constants/Const.ts` 补 `SplashCallback` 15 个 callbackName（与 Const.java 对齐；特有 timeout/showFailed，无 video/reward/again）；index.tsx 导出
- [x] 3.2 sync-const-check 通过

## 4. L3 Android — 移植开屏桥（splash/）

- [x] 4.1 移植 `ATAdSplashManger → ATSplashManager`（路由 + `ConcurrentHashMap<placementId, Helper>` + Promise/init/Activity 门控 + RN 类型转换），包名 `com.anythink.reactnative.splash`
- [x] 4.2 移植 `ATSplashHelper`（类名不变）：持 `ATSplashAd` + `ATSplashExListener` + AdSource listener；onAdLoaded(isTimeout) 经 extra 透传 isTimeout；回调经 `emit(SplashCall, callbackKey, pid, adInfo→Map, errMsg, extra)`，用 `Const.CallbackMethodCall.SplashCall`
- [x] 4.3 **容器管理**：showSplash 解析 heightRatio/heightPx → 主线程往 android.R.id.content 加指定高度 FrameLayout（不传则全屏）→ ATSplashAd.show(activity, container[, scenario])；onAdDismiss/showFailed 主线程移除容器；show 前移除旧容器防泄漏
- [x] 4.4 load 超时：settings 含 fetchAdTimeout 时用带 timeout 的 ATSplashAd 构造
- [x] 4.5 ATReactNativeBridgeModule 加开屏方法路由 + 构造注入 Manager context；未 init→reject SDK_NOT_INITIALIZED；show 无 Activity→reject ACTIVITY_NULL

## 5. L1 TypeScript

- [x] 5.1 `src/splash/ATSplashAd.ts`：load(settings 含 fetchAdTimeout)/show(scenario?)/showWithConfig(heightRatio/heightPx)/isAdReady/setAdListener/entryAdScenario（typed listener：onLoaded(isTimeout)/onLoadFail/onTimeout/onShow/onShowFailed/onClick/onClose/onDeeplink + onEvent；**无** video/reward/again/Auto/checkValidAdCaches）
- [x] 5.2 `setAdListener` 经 `ATAdEvents.setAdListener` 注册；`src/index.tsx` 导出 ATSplashAd

## 6. L3 iOS（stub + log）

- [x] 6.1 `ATReactNativeBridge.mm` 加开屏方法 stub + NSLog；splashReady 返回 false；保留线程守护

## 7. Example

- [x] 7.1 `example/src/config/sdkConfig.ts` placements 加开屏位 `splash: b5fdc16eb9e2ee`
- [x] 7.2 Home 加开屏按钮（复用 `AdActionButton`）+ SplashManager（同款，show 后等 close 回 idle）；可演示半屏（heightRatio）

## 8. 单测

- [x] 8.1 `ATSplashAd.test.ts`：loadSplash 参数含 placementID（mock TurboModule）（S-Q01）
- [x] 8.2 Event 分发：mock SplashCall → 对应 placement listener 收到正确 callbackName（含 loaded 的 isTimeout）

## 9. 验证（你本机编译 + 对拍）

- [x] 9.1 Android：`yarn example android` 编译绿；开屏 load → show（容器内）→ close 全链路
- [x] 9.2 load 失败/超时走 Event + requestMessage（S-F05）；半屏容器不全屏错乱（S-F02）；关闭无泄漏（S-F03）
- [x] 9.3 iOS：pod install + `yarn example ios` 编译过、NSLog 路由可见
- [x] 9.4 jest 单测过；tsc/prettier/sync-const-check 绿
- [x] 9.5 对照验收 §七 S-F/D/Q/C 逐条；更新实施规范 §十二 Phase 2-C → ✅
