## Why

phase-2a/2b/2c 跑通了全屏/容器类广告（TurboModule 模式）。phase-2d 实现 **Banner**——**首个 Fabric 视图组件**：广告作为 `<ATBannerViewComponent>` **内嵌进 RN 布局**，由 Fabric ViewManager 渲染原生 banner view。这是和前面根本不同的新机制（codegenNativeComponent + ViewManager + 视图生命周期），也是 phase-2e Native 的前置。本期 **Android 完整实现**（真实 banner，ADX 源），**iOS 仅 stub view + log**。

Banner 特点：**视图内嵌 + 自动刷新**（策略开启时 banner 周期性刷新，有 AutoRefresh 成功/失败回调）+ **生命周期**（不可见停刷新、unmount 销毁）。

## What Changes

- **L1（命令式 + Fabric 组件，SPACE §4.9）**：
  - `src/banner/ATBannerView.ts`（命令式类）：`setPlacementId` / `loadAd(adRequest?: ATAdRequest)` / `setShowConfig(ATShowConfig)` / `setLocalExtra` / `setTKExtra` / `checkAdStatus():Promise` / `checkValidAdCaches():Promise` / `entryAdScenario(...tkExtra?)` / `destroy` + `setBannerAdListener`/`setAdRevenueListener`/`setAdMultipleLoadedListener`/`setAdSourceStatusListener`。
  - `src/banner/ATBannerViewComponent.tsx`（React 封装）：props `placementID/sceneID/extraMap/isAdaptiveHeight/width/height/onAdEvent`（§17.4.12）。
- **L2 Fabric 组件 spec**：`src/specs/ATBannerViewNativeComponent.ts`（`codegenNativeComponent`）；**codegenConfig `type: "modules"→"all"`**。命令式桥方法 `loadBannerAd/checkBannerLoadStatus/getBannerValidAds/entryBannerScenario`（§7.4）。
- **L3 Android**：移植 Flutter banner 四件套（包名 `com.anythink.reactnative.banner`）：`ATAdBannerManger→ATBannerManager`、`ATBannerHelper`、`ATBannerViewFactory/ATAndroidBannerView → ATBannerViewManager`（Fabric ViewManager）+ 原生 banner view。**三层结构**：Fabric 容器(绑 props) → UIComponent 中间层(attach/detach/加载/生命周期) → 原生 `ATBannerView`。
- **L3 iOS（stub）**：banner ViewManager + view 空实现 + NSLog。
- **常量**：`Const.ts` 补 `BannerCallback` 15 个（含 `bannerAdTapCloseButton`/`bannerAdAutoRefreshSucceed`/`bannerAdAutoRefreshFail`；sync-const-check 守门）。
- **事件（V1）**：仍经唯一 `ATReactNativeEventEmitter`（callName `BannerCall`）→ `ATAdEvents` 按 placementID 分发；组件 `onAdEvent` 在 JS 侧按本视图 placementID 过滤回调。**Direct/per-view 事件 V1 不做**（future-note）。
- **生命周期**：`onDetachedFromWindow→停自动刷新`；组件 unmount→`destroy`。**detach≠destroy**。
- **Example**：页面内嵌 `<ATBannerViewComponent>`（可展示/移除）；`sdkConfig.ts` 填 ADX banner 位 `b5fdc16d5a63fc`。
- **错误语义**：load 失败只走 Event（`bannerAdFailToLoadAD`+requestMessage），禁止 `Promise.reject`；未 init 调命令式桥方法 reject `SDK_NOT_INITIALIZED`。

**本 Phase 不做**：Native 自渲染（2e）；iOS 真实 Banner；`showInRectangle/showInPosition/hide/remove`（Flutter 独有）；Direct per-view 事件。

## Capabilities

### New Capabilities
- `banner-ad`: Banner 的 L1 命令式 API + Fabric 组件（`<ATBannerViewComponent>`）、Android Fabric ViewManager（三层结构 + 生命周期停刷新/销毁）、统一事件回调（含自动刷新/AdSource）、Example 内嵌演示与对拍。

### Modified Capabilities
<!-- 无：复用 native-event-bridge / sdk-core-init 等能力；codegenConfig type 改 all 属构建配置不改 spec -->

## Impact

- **新增**：`src/banner/ATBannerView.ts` + `ATBannerViewComponent.tsx`；`src/specs/ATBannerViewNativeComponent.ts`；`android/.../banner/`（Manager/Helper/ViewManager + view）；`ios/.../`（banner stub view）；`src/constants/Const.ts` +BannerCallback；`example` 内嵌 Banner。
- **构建配置**：`package.json` codegenConfig `type: "all"`。
- **复用（不改）**：`ATReactNativeEventEmitter`、`ATInitManager`、`BridgeJsonMapUtil`、`RNMapUtil`、`Utils`、`ATAdEvents`、ADX 依赖、已对齐的 load/checkAdStatus/setLocalExtra 模式。
- **不触及**：phase-0/1/2a/2b/2c 已交付能力。
