# Android AAR 与 RN Test Host 标准流水线 本目录固定 QBIN V4 Android Test Host 的交付链。Linux 是唯一的 AAR/RN package 生产端;Windows 11 只消费 Linux bundle 并构建 Test Host APK。正式实现不改变 Core、Renderer、QBIN、Binding 业务语义。 当前固定版本: - RN package:`13.4.1-particle.3` - Native AAR:`13.4.1-particle.3` - Maven coordinate:`cc.navsea.maplibre:android-sdk-particle-opengl:13.4.1-particle.3` 以后正常流程只有: ```text Linux: linux_build_publish.sh ↓ build-manifest.json Windows: windows_build_testhost.ps1 -DryRun windows_build_testhost.ps1 ``` 版本升级时,必须先显式同步更新 `platform/android/VERSION` 和 `packages/maplibre-particle-rn/package.json` 的 `version`。Linux 脚本只做完全相等的 fail-closed 校验,绝不猜测、覆盖或修复版本;Windows 也只接受 `particle.3` 或更高的显式 particle 版本。 ## Linux:生产 bundle 在仓库根目录运行: ```bash tools/particle_android_pipeline/linux_build_publish.sh ``` 脚本先记录 HEAD、分支与 dirty 条目数(只报告,不清理),解析 Android SDK(`ANDROID_HOME`、`ANDROID_SDK_ROOT`,再到 `platform/android/local.properties`),并只为已存在且被 Git ignore 的 Gradle `local.properties` 写同一 SDK 路径。它固定运行 OpenGL Release 的四 ABI `make apackage`,随后运行: ```text :MapLibreAndroid:publishOpenglreleasePublicationToMavenLocal ``` 所有 noisy build/typecheck/package 命令都经 build-output-throttle;找不到其 `run_limited.py` 即失败,可用 `BUILD_OUTPUT_THROTTLE=/绝对路径/run_limited.py` 显式指定。默认路径是本项目 Codex 环境的 skill 路径。 脚本验证 Maven Local 的 `.aar/.pom/.module`、POM 版本与 `13.4.1-particle.2` 历史目录字节不变;之后 typecheck RN package、生成 npm tgz。成功 bundle 写入(并由 Git ignore): ```text artifacts/maplibre-particle// android-sdk-particle-opengl-.aar android-sdk-particle-opengl-.pom android-sdk-particle-opengl-.module navsea-maplibre-particle-rn-.tgz build-manifest.json ``` 每个文件都带 bytes/SHA-256;manifest 另有 HEAD、branch、dirty 状态、版本、Maven coordinate、时间、四 ABI、renderer 和 Linux validation result。目录已有同版本 handoff 文件时立即失败,避免覆盖历史 AAR/tgz。 如果 Native `.3` 已由一次受控完整构建发布到 Maven Local,且仅需补建可传输的 handoff bundle,可显式使用: ```bash tools/particle_android_pipeline/linux_build_publish.sh --reuse-existing ``` 这会在 manifest 明确标成 `PASS_REUSED_EXISTING_MAVEN_LOCAL`,不宣称重新构建;正常发布仍必须使用无参数命令。无写入的检查用 `--preflight`。 ## Windows 11:消费 manifest 并构建 Test Host 将整个 Linux `` bundle 原样传到 Windows 后,在 PowerShell 运行: ```powershell tools\particle_android_pipeline\windows_build_testhost.ps1 ` -ManifestPath C:\handoff\13.4.1-particle.3\build-manifest.json -DryRun tools\particle_android_pipeline\windows_build_testhost.ps1 ` -ManifestPath C:\handoff\13.4.1-particle.3\build-manifest.json ``` `-DryRun` 只校验 manifest 与 bundle 文件 SHA-256,并打印版本、AAR、tgz、Test Host 路径、Maven Local 和 Gradle 命令,不写 Maven Local、不改 package、不跑 npm/Gradle。 正常 Windows 流程以 manifest 为唯一 artifact/version 输入:校验 RN/Native/Maven coordinate、把 AAR/POM/module 安装到 Windows Maven Local(同路径已有不同 SHA 即失败)、在 clean Test Host tracked source 上同步 manifest `gitHead` 的源码/fixture、把 RN dependency 固定到 manifest tgz、把 native substitution(含已生成 Android `build.gradle` 的旧 marker)固定到 manifest coordinate、执行 `npm install --ignore-scripts`、明确执行 Expo Android prebuild,并构建 `:app:assembleDebug`。会输出 APK 绝对路径、bytes 与 SHA-256。 脚本不清理 checkout,也拒绝 dirty 的 Test Host tracked source;不会改写 Windows 用户自有 SDK 或 Gradle `local.properties`。默认绝不调用 ADB。只有显式 `-Install` 才会安装,只有 `-Install -Run` 才会启动,且两者固定 `adb -s 192.168.1.146`。 Linux 不运行 Windows/APK/ADB/设备步骤;本机没有 `pwsh` 时,只能记录 Windows 脚本未在 Linux 解析,不能把它写成 PASS。