docs: record STEP-060B Gate C Maven alignment

This commit is contained in:
OpenAI Codex
2026-09-07 19:32:16 +08:00
parent 48b93b8609
commit e0da7f0c0c
7 changed files with 83 additions and 15 deletions

View File

@@ -19,3 +19,5 @@ Starting HEAD:`6a99f1a1424ce7e30c26e825251df956a46bf4c4`,分支 `particle/ma
执行 `npm ci --ignore-scripts --no-audit --no-fund`、throttle 下 `npx tsc --noEmit`、Node config syntax、package/lock 检查、Spec/override 一一检查、yarn 残留搜索与 `git diff --check`。未执行 Android Gradle、custom publish、Expo prebuild、APK、ADB、设备测试或 Jest。
Bridge 继续按 `reactTag → Fabric UIManager → MLRNMapView → MapLibreMap → map-owned WeatherRuntime` 工作;无 Adapter/Normalizer/第二 registry,未实现 Binary Field。
STEP-060B 补充:Test Host prebuild 观察到的 Gradle/AGP/NDK/SDK 值只描述其生成工程;Gate C 封存 Linux 环境继续是 current custom OpenGL AAR 的唯一构建基线,Maven Local 是两者之间的 handoff。

View File

@@ -0,0 +1,19 @@
# STEP-060B Gate C 封存环境与 Custom AAR 接入修正
状态:完成(`IMPLEMENTED / WAITING_USER_GATEC_AAR_BUILD_AND_ANDROID_VALIDATION`)
## 基线与目标
Starting HEAD:`80f360be7849be3e63557c4e074ee3a0fc02e15f`,分支 `particle/main`。Gate C 是 MapLibre Native custom AAR 的封存 Linux 编译环境;STEP-060 的 Maven Local 是 Test Host handoff,两者不互相改写。
## 完成项
- [x] publication 源码确认:group `org.maplibre.gl`、version `13.4.1`、OpenGL Release component 与 `openglrelease` publication,精确任务为 `publishOpenglreleasePublicationToMavenLocal`。
- [x] MLRN 11.3.6 由 `nativeVariant/nativeVersion` 解析 `android-sdk-opengl:13.4.1`;Bridge 的直接依赖相同。
- [x] Maven Local 位于首位且 Maven Central 排除唯一 custom module `org.maplibre.gl:android-sdk-opengl`。AAR 缺失 fail-closed,同时不阻断 MLRN 的 turf/annotation/scalebar 辅助 artifacts。
- [x] 文档要求 Gate C 环境从当前 HEAD 生成 OpenGL Release AAR,核对 mtime/SHA/classes,再用精确 publication task 发布。
- [x] 旧 2026-08-29 AAR SHA `5c67d275…f85e5c` 仅作历史 Gate C 证据,不得用于含 WeatherRuntime 的当前验证。
## 未执行与下一步
未执行 Android Gradle、AAR build/publish、Expo prebuild、APK/ADB/设备或 Jest。用户必须先在 Gate C 环境完成 current HEAD AAR build → Maven Local publication → clean prebuild → Test Host Android compile/install → Phase A/B/lifecycle 验收,之后才可进入 STEP-061。

View File

@@ -2,14 +2,16 @@
本说明只列出人工步骤;Codex 未执行 Android Gradle、发布、安装或 ADB。
1. 确认当前为 `particle/main`,并记录 `git rev-parse HEAD`。
2. 移走或清理 `~/.m2/repository/org/maplibre/gl/android-sdk-opengl/13.4.1/` 的旧 artifact,避免相同版本号造成 provenance 混淆。
3. 手工发布当前 HEAD 的 custom OpenGL SDK:`cd platform/android && ./gradlew :MapLibreAndroid:publishToMavenLocal`。确认 Maven Local AAR/POM 是当前构建产物。
4. `cd integration/react-native/MapLibreParticleRNTestHost && npm ci && npx expo prebuild --platform android --clean`。`package-lock.json` 已在无 `--legacy-peer-deps` 的 npm dry-run 下解析;不要改用 Yarn 或生成 `yarn.lock`。
5. 检查生成 root Gradle 有 `MapLibreParticleRNTestHost custom OpenGL SDK` 标记、`nativeVersion=13.4.1`、`nativeVariant=opengl`,且 Maven Central 对 `org.maplibre.gl` 被排除;缺 custom AAR 时 resolution 必须失败而非 fallback。
6. 首次 prebuild 后实际记录 Gradle wrapper、AGP、Kotlin plugin、min/compile/targetSdk、NDK、JDK、Hermes 与 New Architecture。`8.5.0/8.14.3/2.1.20/27.1.12297006/24/36/36` 在此之前只是验收目标,不是已验证值。
7. 再按实际生成工程编译/安装 Test Host。启动后确认单一地图正常加载;style ready 后应显示 reactTag 和 `WAITING_FOR_FIELDS`,不提交 field 时粒子/色场为空是预期。
8. 对同一 reactTag 依次验证 Phase A:getState、enable、WeatherColor visible、particle visible、FPS 30 均得到结构化 Native result。
9. 验证 Phase B:PLAY/PAUSE、HALF/NORMAL/DOUBLE、epoch-ms seek、stops、独立 particle/trail RGBA、count/line/length/opacity/fade/WeatherColor opacity。不得出现 JS `PLAYING/PAUSED` 第二状态机。
10. 重载 style:旧 Runtime 必须 disposed;style ready attach 的新 Runtime 正常工作。remount Map 后,用旧 reactTag 调用必须返回 `MAP_VIEW_NOT_FOUND`,不得命中新 Map。
11. 卸载 Host:确认 view detach dispose;无持续 Handler wake、无全局 current map。STEP-061 前不要尝试 number[]、JSON/base64 大 field。
1. 确认当前为 `particle/main`,并记录 `git rev-parse HEAD`。Gate C 封存 Linux 环境是 custom MapLibre Native AAR 的构建环境;不要为 Test Host 生成工程的版本修改它。
2. 移走或清理 `~/.m2/repository/org/maplibre/gl/android-sdk-opengl/13.4.1/` 的旧 artifact,避免同坐标 provenance 混淆。2026-08-29 旧 AAR 的 SHA-256 是 `5c67d2751fafe211a0df4b82deded09ab1c07cf6ca0f4a12a880283287f85e5c`,只能作为 Gate C 历史证据。
3. 在 Gate C 封存 Linux 环境重新生成当前 HEAD OpenGL Release AAR:`cd platform/android && RENDERER=opengl BUILDTYPE=Release make apackage`。路径必须为 `MapLibreAndroid/build/outputs/aar/MapLibreAndroid-opengl-release.aar`。
4. 核对新 AAR 的 mtime、SHA-256(必须不同于旧证据),并从 classes.jar 确认含当前 `org/maplibre/android/maps/WeatherRuntime.class` 与 `MapLibreMap.class`。
5. 使用源码定义的精确 publication task 发布:`./gradlew :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal`。核对 Maven Local 出现 `org/maplibre/gl/android-sdk-opengl/13.4.1/`,且 AAR、POM、module metadata 都来自当前构建。
6. `cd integration/react-native/MapLibreParticleRNTestHost && npm ci && npx expo prebuild --platform android --clean`。`package-lock.json` 已在无 `--legacy-peer-deps` 的 npm 安装下通过;不要改用 Yarn 或生成 `yarn.lock`。本次 plugin 变更后必须 clean prebuild。
7. 检查生成 root Gradle 有 `MapLibreParticleRNTestHost custom OpenGL SDK`、`nativeVersion=13.4.1`、`nativeVariant=opengl`;Maven Central 必须排除精确 custom module `org.maplibre.gl:android-sdk-opengl`,使该 AAR 缺失时失败而非 fallback。MLRN 的 turf/annotation/scalebar 不是 custom SDK,不应被这个模块级排除误伤。
8. 首次 prebuild 后实际记录 Test Host 的 Gradle wrapper、AGP、Kotlin plugin、min/compile/targetSdk、NDK、JDK、Hermes 与 New Architecture。当前观察到的 `9.3.1/8.12.0/2.1.20/24/36/36/27.1.12297006` 属于 Test Host 生成工程,不等于 Gate C 环境。
9. 再按实际生成工程编译/安装 Test Host。启动后确认单一地图正常加载;style ready 后应显示 reactTag 和 `WAITING_FOR_FIELDS`,不提交 field 时粒子/色场为空是预期。
10. 对同一 reactTag 依次验证 Phase A:getState、enable、WeatherColor visible、particle visible、FPS 30 均得到结构化 Native result。
11. 验证 Phase B:PLAY/PAUSE、HALF/NORMAL/DOUBLE、epoch-ms seek、stops、独立 particle/trail RGBA、count/line/length/opacity/fade/WeatherColor opacity。不得出现 JS `PLAYING/PAUSED` 第二状态机。
12. 重载 style:旧 Runtime 必须 disposed;style ready attach 的新 Runtime 正常工作。remount Map 后,用旧 reactTag 调用必须返回 `MAP_VIEW_NOT_FOUND`,不得命中新 Map。
13. 卸载 Host:确认 view detach dispose;无持续 Handler wake、无全局 current map。通过上述 Android 验收后才进入 STEP-061;此前不要尝试 number[]、JSON/base64 大 field。

View File

@@ -0,0 +1,39 @@
# STEP-060B Gate C 封存环境与 Custom AAR 接入修正 — Codex 完成报告
状态:`IMPLEMENTED / WAITING_USER_GATEC_AAR_BUILD_AND_ANDROID_VALIDATION`
## 实际完成
1. 以 `粒子开发记录.md` 的 STEP-000 为 Gate C 事实来源:Ubuntu 24.04 x86_64、Linux OpenGL/mbgl-render/mbgl-render-test-runner,以及 Android OpenGL/Vulkan Debug `apackage` 均为已封存的 MapLibre Native 编译环境历史。没有修改它。
2. publication 源码核对:`MapLibreAndroid` apply `maplibre.gradle-publish`;`openglRelease` 被发布;`openglrelease` publication 的 artifactId 是 `android-sdk-opengl`;artifact settings group 是 `org.maplibre.gl`、VERSION 是 `13.4.1`。因此精确 Maven Local task 是 `:MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal`。
3. 旧 `MapLibreAndroid-opengl-release.aar` 仍在约定路径,mtime 为 2026-08-29,SHA-256 为 `5c67d2751fafe211a0df4b82deded09ab1c07cf6ca0f4a12a880283287f85e5c`;classes.jar 有旧 MapLibreMap、没有 WeatherRuntime,不能用于当前验证。
4. MLRN 11.3.6 实际 Gradle 模板用 root extras `nativeVariant/nativeVersion` 解析 `org.maplibre.gl:android-sdk-${variant}:${version}`。Test Host plugin 固定 `opengl`/`13.4.1`;Bridge 直接依赖同一 `org.maplibre.gl:android-sdk-opengl:13.4.1`。
5. 修正 plugin repository rule:此前排除整个 `org.maplibre.gl` 会阻断 MLRN 所需 `android-sdk-turf` 与 plugins。现在 Maven Local 仍在首位,但 Maven Central 只排除唯一 custom module `android-sdk-opengl`。因此 custom SDK 没有 Maven Central fallback,且没有新增 flatDir/files/第二 Maven repository route。
6. 文档明确 Gate C AAR build 与 Test Host generated Android toolchain 是不同层次。Test Host 首次 prebuild 观察到 `Gradle 9.3.1 / AGP 8.12.0 / Kotlin 2.1.20 / SDK 24/36/36 / NDK 27.1.12297006 / Hermes ON / New Architecture ON`,不反向修改 Gate C。package declaration 是 npm 10.9.4,而当前 shell 实际为 Node 24.20.0/npm 11.19.0;先前 `npm ci` 已通过。
## 修改文件
- `integration/react-native/MapLibreParticleRNTestHost/plugins/withParticleNativeAndroid.js`
- `integration/react-native/MapLibreParticleRNTestHost/README.md`
- `docs/60_测试/STEP-060_RNTestHost_Android人工编译与验收_v1.md`
- `docs/50_Step记录/STEP-060A_RNTestHost编译前修正_v1.md`
- `docs/50_Step记录/STEP-060B_GateC封存环境与CustomAAR接入修正_v1.md`
- `docs/报告/STEP-060_RNTestHost与WeatherRuntime薄桥接_Codex完成报告_v1.md`
- `粒子开发记录.md` 与本报告。
## 验证
- publication group/artifact/version/component/task、MLRN/Bridge exact coordinate、old AAR SHA/mtime/classes:静态核对 PASS。
- `NativeWeatherRuntimeBridge.ts` 与 Kotlin 20 个 Codegen override:静态一致性 PASS。
- throttle 下 `npx tsc --noEmit`、Node plugin syntax、package/lock、无受控 yarn.lock、无 flatDir/files/第二 dependency route、`git diff --check`:PASS。
## 未执行 / 风险
没有执行 Android Gradle build/assemble/publish、Expo prebuild、APK/AAB、ADB、设备/模拟器或 Jest。当前 HEAD 的新 AAR、Maven Local POM/module metadata、Test Host 实际 resolution、Android codegen/compile 与 Phase A/B 尚未验证,必须由用户按更新人工说明完成。用户手工生成的 `integration/react-native/MapLibreParticleRNTestHost/android/` 保持 untracked,未删除、修改或提交。
## Git
- Starting HEAD:`80f360be7849be3e63557c4e074ee3a0fc02e15f`
- 功能 commit:`48b93b8609457b280de1034fe1dedc57cb3971e2`(`fix: align RN test host with Gate C Maven handoff`)
- 文档 commit:待提交
- Final HEAD / Remote HEAD / push:待提交后回填。

View File

@@ -8,7 +8,7 @@ Starting HEAD:`b535d98263af58ac86845f15bb7c51bd85b59519`。
1. RN Test Host 最终目录为 `integration/react-native/MapLibreParticleRNTestHost/`。固定 RN `0.85.2`、React `19.2.5`、Expo `56.0.4`、TypeScript `5.9.3`、MLRN `11.3.6`;New Architecture 已由 Expo config 请求,但 Android prebuild/生成工程尚未验证。
2. MLRN `11.3.6` 实际 Android `build.gradle` 按 root extra `org.maplibre.reactnative.nativeVersion/nativeVariant` 解析 `android-sdk-<variant>`。Test Host config plugin 固定 `13.4.1`/`opengl`。
3. plugin 在 Android project 配置完成后清除各 project repositories,设置 Maven Local、Google 与 Maven Central(后者排除 `org.maplibre.gl`)。因此 custom `android-sdk-opengl:13.4.1` 缺失即依赖失败,不会从普通官方 SDK fallback;artifact 的字节来源仍须用户手工发布/检查。
3. STEP-060B 将 plugin 的 Maven Central 排除收敛为 custom module `org.maplibre.gl:android-sdk-opengl`,并将 Maven Local 排在首位。因此 custom `android-sdk-opengl:13.4.1` 缺失即依赖失败,不会从普通官方 SDK fallback;MLRN 的独立 turf/annotation/scalebar artifacts 不会因全 group 排除而失去正常来源。artifact 的字节来源仍须用户手工发布/检查。
4. MLRN 的共享 `ReactTagResolver` 实例由 `MLRNPackage` 私有持有,不能安全注入外部模块。Bridge 没有复制其 `mViews`:使用 React Native/Fabric 的公开 `UIManagerHelper.getUIManager(...).resolveView(reactTag)`,验证结果是具体 `MLRNMapView`。
5. 从该具体 View 读取 MLRN 公开只读 `mapLibreMap`;不存在 global/current map。
6. `MapLibreMap` 新增唯一 map-owned `WeatherRuntime` attachment seam。Bridge 不维护 Map→Runtime 表:style replacement 通过 `MapLibreMap.setStyle()` dispose,View detach listener dispose,React `useEffect` unmount 也调用 detach;下一次 style ready attach 必定创建新 facade。

View File

@@ -11,18 +11,19 @@
## Custom SDK 来源(手工执行)
Test Host 的 Expo plugin 会把 `org.maplibre.gl` 从 Maven Central 排除,只允许 Maven Local。因此未先发布本仓库 custom artifact 时,Android dependency resolution 必须失败,不能悄悄使用官方 SDK。
Gate C 封存环境负责生成 custom AAR;Test Host 只负责 Maven Local handoff。Expo plugin 对唯一 custom 坐标 `org.maplibre.gl:android-sdk-opengl` 排除 Maven Central,而将 Maven Local 排在首位。因此未先发布本仓库 custom SDK 时 dependency resolution 必须失败,不能悄悄使用官方 SDK;MLRN 的独立 turf/annotation/scalebar 依赖不被这个 SDK-only 排除误伤。
```bash
cd /mnt/sda1/MapLibreParticleLab/platform/android
./gradlew :MapLibreAndroid:publishToMavenLocal
RENDERER=opengl BUILDTYPE=Release make apackage
./gradlew :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal
cd /mnt/sda1/MapLibreParticleLab/integration/react-native/MapLibreParticleRNTestHost
npm ci
npx expo prebuild --platform android --clean
npx expo run:android
```
上述 Android 命令是用户手工验收步骤;本 Step 的 Codex 没有执行。发布前应检查 Maven Local 中 `org/maplibre/gl/android-sdk-opengl/13.4.1/` 的 AAR 来自当前 particle/main build,而非历史官方 artifact。
上述 Android 命令必须在 Gate C 封存 Linux 环境由用户手工执行;本 Step 的 Codex 没有执行。先移走 Maven Local 的旧同版本 artifact,再检查当前 HEAD 新 AAR 的 mtime/SHA-256、`WeatherRuntime`/`MapLibreMap` classes 和发布后的 AAR/POM/module metadata。2026-08-29 的旧 AAR(SHA-256 `5c67…f85e5c`)只可作 Gate C 历史证据,不能用于 STEP-060。
## Bridge 与生命周期

View File

@@ -509,3 +509,8 @@ WeatherColorLayer 的 `ParticleGpuValidationUBO` designated initializer 补齐 `
- 按 RN 0.85.2 当前 Codegen 模板为 TurboModule 的 20 个必选 Kotlin Spec 方法补齐 `override`,消除首次 Android 编译的确定 blocker。
- Test Host package manager 统一为 npm/package-lock;实际 `npm ci --ignore-scripts` 不需 legacy peer deps。文档将 Android toolchain 数值改为首次 prebuild 前的验收目标,待生成工程实测。
# 2026-09-07 — STEP-060B Gate C 封存环境与 Custom AAR 接入修正
- Gate C 继续只表示 MapLibre Native custom AAR 的封存 Linux 编译环境;STEP-060 Maven Local 继续是 RN Test Host handoff,不因 Expo 生成工程的 Gradle/AGP/NDK 数字反向修改 Gate C。
- publication 源码确认 custom OpenGL 坐标 `org.maplibre.gl:android-sdk-opengl:13.4.1` 与精确 Maven Local task `publishOpenglreleasePublicationToMavenLocal`。plugin 将 Central 排除收敛到该唯一 custom module,确保 AAR 缺失 fail-closed,且不阻断 MLRN turf/plugins 辅助依赖。