# Tasks — 新老架构双兼容（双端上线）

> 📐 执行细节：[`docs/superpowers/plans/2026-06-15-old-arch-compat.md`](../../../docs/superpowers/plans/2026-06-15-old-arch-compat.md)
> 📐 **上线必读（双端 0.72↔0.85）**：[`docs/OLD-ARCH-COMPAT-上线必读.md`](../../OLD-ARCH-COMPAT-上线必读.md)
> 📐 iOS：[`docs/iOS-双架构方案对比.md`](../../iOS-双架构方案对比.md)
> 🔑 **上线门禁**：Android + iOS 均完成 + 0.72.5/0.85 联调 + peerDep `"*"` → 才可发版
> 🔑 桥方法 **92**（`NativeATBridge.ts` = Android = iOS）

## 0. 前置验证（Day 0，与编码并行启动）

- [x] 0.1 取得 0.72.5 `node_modules/react-native`（`/tmp/RN0725/...`，实测 0.72.5）
- [x] 0.2 ✅验证点 #1 通过：`requireModule` 非 Bridgeless 时**优先** `NativeModules[name]` → JS 零改动成立，`NativeATBridge.ts` 不动
- [x] 0.3 ✅验证点 #3 通过：`codegenNativeComponent` 末尾 `requireNativeComponent`，0.72.5 非 Bridgeless → 视图旧架构可渲染，组件 spec 不动

## 1. 构建总闸（Android gradle + iOS podspec 可并行）

- [x] 1.1 Android `build.gradle`：`isNewArchitectureEnabled`、条件 codegen、sourceSets、`buildConfigField`
- [x] 1.2 iOS `ATReactNativeBridge.podspec`（实测已做：if respond_to? + RCT_NEW_ARCH 分支）：对齐 MAX 条件依赖（Task 7.6，可与 1.1 并行）

## 2. Android — Impl + Package

- [x] 2.1 建 newarch/oldarch 目录；提取 `ATBannerContainer`/`ATNativeContainer`；修 `ATNativeHelper` 5 处引用
- [x] 2.2 抽 `ATBannerViewManagerImpl` / `ATNativeAdViewManagerImpl`
- [x] 2.3 Package（实测已是 TurboReactPackage + BuildConfig + 7参，仅确认）：**`extends TurboReactPackage`**（🔴 0.72 必需）+ `BuildConfig` 动态 `isTurboModule` + `ReactModuleInfo` 7 参（不兼容则 Package 分目录）

## 3. Android — Bridge（92 方法）

- [x] 3.1 newarch Module `git mv`
- [x] 3.2 oldarch Module AI 逐方法翻译 + 对照表
- [x] 3.3 `scripts/verify-arch-parity.mjs`（**双端校验**：以 TS 真相源 `NativeATBridge.ts` 为基准，对账 Android oldarch/newarch + iOS .mm 三端方法集 + 暴露宏/同步标记；文件不存在的端自动跳过，故 Android 先落地即可用、iOS 落地后自动纳入）
- [x] 3.4 `package.json` 注册 `verify:arch-parity`

## 4. Android — ViewManager ×2

- [x] 4.1–4.4 Banner/Native newarch 改 + oldarch 手写（含 Native `receiveCommand` 双重重载）

## 5. Android — EventEmitter

- [x] 5.1 确认 `RCTDeviceEventEmitter` 零改动（实测：DeviceEventManagerModule.RCTDeviceEventEmitter，无 codegen 依赖）

## 6. Android — 联调

- [ ] 6.1 0.85 `newArchEnabled=true` 回归
- [x] 6.2 0.72.5 `newArchEnabled=false` 编译 + 客户工程集成（真机实证：Pixel 6 Pro 装机 App 不崩、Module 旧架构真注册、同步桥 getSDKVersionName 返 UA_6.5.73；暴露并修复 3 坑见上线必读「客户集成」）
- [ ] 6.3 验证点 #2：自渲染 `findViewById`（视图类 ViewManager 旧架构已间接验证——Banner 真渲染；但自渲染 AssetView 绑定需 Native 拿到货才能验，本次 Native 池空未填充，待补）
- [x] 6.4 五类广告冒烟（0.72.5 旧架构真机实测）：
  - **激励 ✅** init→load→show 真展示快手 ADN 激励视频（含二次挽留弹窗）
  - **插屏 ✅** load→show 真展示快手插屏（下载页 + 关闭）
  - **Banner ✅**（视图类）真展示「情感咨询平台」素材 —— 证 codegenNativeComponent 旧架构 fallback 渲染通
  - **开屏 ⚠️** 桥通（isAdReady 返 false、Promise 异步桥旧架构正常返值），但测试位本次未填充未展示
  - **Native ✅**（视图类）模板位真展示「1688 低价好物」素材 —— 修复 codegenNativeCommands 顶层 import 旧架构崩 bug 后通（见下）
  - **开屏 ⚠️** 桥通（isAdReady 返 false、Promise 异步桥旧架构正常返值），测试位本次未填充未展示
  - 结论：架构层面（命令式桥 + Promise 桥 + 视图类 codegen fallback + commands）四类真展示全通；开屏仅填充未到位，与双架构兼容无关
  - 🐛 **真机抓到并修复 2 个 bug**（静态验证全过、仅真机暴露）：
    1. **旧架构 Native 崩**：`src/specs/ATNativeAdViewNativeComponent.ts` 顶层 `import { codegenNativeCommands } from 'react-native'`，该 API RN 0.72 不从顶层导出→`undefined`→Native 组件加载即崩。修：深层 import（对齐 Banner）+ 补 strict-api shim。
    2. **回调全哑（新旧架构通病，更严重）**：`ATAdEvents.init()`（建 NativeEventEmitter 订阅）生产代码从未调用，所有广告回调（onLoaded/onShow/onClick/onReward/曝光/点击）JS 全收不到；广告能 load/show 但回调断链。修：`ATSDK.init()` 内补 `ATAdEvents.init()`。真机验证：修前 JS `[ATRN-JS] AdEvents:` 零输出，修后各回调按 placementId 正常分流到 JS。

## 7. iOS 双架构（**上线必做，与 §2–6 并行**）

- [ ] 7.1 Bridge `.h`：`#ifdef` codegen / 协议
- [ ] 7.2 Bridge `.mm`：92×`RCT_EXPORT_METHOD` + `RCT_EXPORT_MODULE`；`getTurboModule` / `registerComponentViewClass` `#ifdef`
- [ ] 7.3 新增 `ATBannerViewManager` / `ATNativeAdViewManager`（参考库范式）
- [ ] 7.4 `ATRNBannerView` / `ATRNNativeAdView`：基类 `#ifdef`；保留 Fabric 块
- [ ] 7.5 EventEmitter 默认不动
- [ ] 7.6 podspec（若 1.2 未完成则在此完成）
- [ ] 7.7 0.72.x + 0.85 iOS 真机；`yarn verify:arch-parity` 双端绿（iOS 92×宏落地后脚本自动纳入对账）
- [ ] 7.8 **双端联合冒烟**（0.72.5 客户工程 Android+iOS）

## 8. 发布收口（上线前）

- [ ] 8.1 `peerDependencies` → `"react": "*", "react-native": "*"`（对齐 MAX）
- [ ] 8.2 修订验收标准/实施规范（old-arch 例外条款）
- [ ] 8.3 客户集成说明（maven 仓库、`newArchEnabled`、iOS 旧架构 pod）
- [ ] 8.4 文首「上线门禁清单」全部勾选

## 9. 独立后续（不进上线门禁）

- [ ] 9.1 iOS 自渲染 `updateAssetView` 与 Android 视觉对齐
- [ ] 9.2 iOS `nativeAdOnResume`/`OnPause` 补实现（现 stub）
