附录 A:源码导航与阅读顺序
1. 主线文件地图
| 顺序 | 文件 | 先看什么 |
|---|---|---|
| 1 | apps/mobile/App.tsx | renderer provider 的注册位置 |
| 2 | packages/kit/src/views/Home/NativeHomeRendererProvider.tsx | kit 与 app 的解耦 |
| 3 | packages/kit/src/views/Home/NativeHomePageView.native.tsx | 页面抽象如何取 renderer |
| 4 | apps/mobile/src/home/MobileNativeHomeRenderer.tsx | snapshot、slots、intent 总装配 |
| 5 | apps/mobile/src/home/mobileNativeHomeViewModelAdapter.ts | payload 到 sections/items 的转换 |
| 6 | packages/native-components/src/HomeContainer.types.ts | public wire contract |
| 7 | packages/native-components/src/HomeContainerProtocol.ts | intent/state validator |
| 8 | packages/native-components/src/HomeContainer.native.tsx | Nitro host、slot flatten、ref |
| 9 | packages/native-components/src/HomeContainer.nitro.ts | HybridView props/methods |
| 10 | packages/native-components/nitro.json | autolinking |
| 11 | packages/native-components/android/.../HomeContainerModels.kt | Android JSON decoder/invariant |
| 12 | packages/native-components/android/.../HomeContainerView.kt | Android engine/gesture/pager |
| 13 | packages/native-components/android/.../HomeContainerSurfaceView.kt | Android slot reparent |
| 14 | packages/native-components/ios/HomeContainerModels.swift | iOS decoder/invariant |
| 15 | packages/native-components/ios/HomeContainerView.swift | iOS engine/nested scroll |
| 16 | packages/native-components/ios/HomeContainerSurfaceComponentView.mm | iOS slot reparent/hit test |
| 17 | packages/kit/src/views/Home/model/cache/homeDisplaySnapshotTypes.ts | cache schema |
| 18 | packages/kit/src/views/Home/model/cache/homeDisplaySnapshotPersistQueue.ts | generation/commit |
| 19 | packages/kit/src/views/Home/nativeHomePortfolioRequestLifecycle.ts | owner/epoch/single-flight |
| 20 | .github/workflows/native-home-contract.yml | CI contract boundary |
2. 按问题检索
| 你想回答的问题 | 推荐 grep 关键词 |
|---|---|
| state 何时进入 native? | initialStateJson, setState, submitInitialState, submitState |
| tab 为什么不立刻发事件? | pendingPager, completePagerSelectionIfIdle, PagerTransitionState |
| slot 为什么没有显示? | mountedSlotKeys, slotHostView, parkSlot, ownsSlot |
| 旧账户为什么不会覆盖新账户? | scopeKey, sessionId, epoch, ownerChanged, prepareViewportForOwnerChange |
| refresh 为什么会结束? | requestId, completeRefresh, HOME_REFRESH_FEEDBACK_DURATION_MS |
| cache 为什么算 miss? | loadPreparedHomeDisplaySnapshot, shell.kind, critical, manifest |
| AllNetworks 为什么判错? | isSameAllNetworksAccountData, expectedRequestCount, failureCount |
3. 上游链接
源码上游:OneKeyHQ/app-monorepo。本文基于 2026-07-31 快照,部分路径在上游未来版本中可能变化。
4. 本地验证命令
在完整 app-monorepo 源码根目录:
bash
yarn workspace @onekeyhq/native-components lint
development/scripts/test-home-container-protocol-ios.sh
development/scripts/test-home-container-protocol-android.sh
yarn jest apps/mobile/src/home/mobileNativeHomeViewModelAdapter.test.ts
yarn jest packages/native-components/src/HomeContainerProtocol.test.ts文档站本身:
bash
npm install
npm run docs:build
npm run docs:preview