From 144fd80f650d9f049976bc9f4be21135b768dfeb Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Mon, 27 Jul 2026 11:56:42 +0800 Subject: [PATCH] fix(update): generate RN Android init metadata --- docs/IMPLEMENTATION_HANDOFF.md | 8 ++- packages/update/android/xuqm-bundles.gradle | 65 +++++++++++++++++++++ packages/update/scripts/xuqm-rn.test.mjs | 9 +++ 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/docs/IMPLEMENTATION_HANDOFF.md b/docs/IMPLEMENTATION_HANDOFF.md index cab16e5..2eccb1f 100644 --- a/docs/IMPLEMENTATION_HANDOFF.md +++ b/docs/IMPLEMENTATION_HANDOFF.md @@ -460,6 +460,8 @@ pnpm --dir packages/update test variant 都从宿主唯一 `src/assets/config/*.xuqmconfig` 生成 `assets/config/config.xuqmconfig`。Metro Debug 不生成插件 Bundle;Release 或 `USE_METRO=false` 才继续执行完整 Bundle/资源任务。 -- update 定向测试 46 项通过(CLI/打包 28,领域 18),Prettier 通过。尚需 Jenkins - 发布新的 update alpha,并在 App4 改用该 Nexus 版本后执行 Android Debug/Release - 宿主构建和模拟器日志复核。 +- 同一脚本为每个 Android variant 生成自动初始化、buildId 与 BugCollect 构建开关 + 元数据。RN 宿主无需额外应用 Android `com.xuqm.common` 插件;Debug 自动上报 + 保持关闭,Release 根据统一构建参数决定。 +- `@xuqm/rn-update@0.5.0-alpha.15` 已由 Jenkins 发布。App4 的 Debug 构建已证明 + 签名配置进入 APK;本次元数据修复仍需发布下一 alpha 后完成模拟器日志复核。 diff --git a/packages/update/android/xuqm-bundles.gradle b/packages/update/android/xuqm-bundles.gradle index b4b1c82..1196e39 100644 --- a/packages/update/android/xuqm-bundles.gradle +++ b/packages/update/android/xuqm-bundles.gradle @@ -10,6 +10,7 @@ import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskAction @@ -127,6 +128,45 @@ abstract class CopyXuqmConfigTask extends DefaultTask { } } +/** + * 为 RN 宿主生成 Android SDK 自动初始化所需的唯一 Manifest 元数据。 + * + * RN 使用本脚本完成同一份配置驱动接入,不要求宿主再声明 Android Gradle 插件。 + * 元数据名称属于 Android SDK 与 RN 桥接的内部协议,不进入宿主业务代码。 + */ +abstract class GenerateXuqmHostManifestTask extends DefaultTask { + @Input + abstract Property getBuildId() + + @Input + abstract Property getBugCollectBuildEnabled() + + @Input + abstract Property getBugCollectAutomaticEnabled() + + @OutputFile + abstract RegularFileProperty getOutputFile() + + @TaskAction + void generate() { + def manifest = outputFile.get().asFile + manifest.parentFile.mkdirs() + manifest.setText( + """ + + + + + + + + +""", + "UTF-8", + ) + } +} + if (!plugins.hasPlugin("com.android.application")) { throw new GradleException("xuqm-bundles.gradle must be applied to an Android application module") } @@ -248,6 +288,31 @@ def prepareXuqmConfig = tasks.register( } androidComponents.onVariants(androidComponents.selector().all()) { variant -> + def variantName = variant.name + def variantSuffix = variantName.substring(0, 1).toUpperCase(Locale.ROOT) + + variantName.substring(1) + def bugCollectEnabled = xuqmBugCollectMode.map { it != "disabled" } + def prepareXuqmHostManifest = tasks.register( + "prepareXuqmHostManifest${variantSuffix}", + GenerateXuqmHostManifestTask, + ) { + group = "xuqm" + description = "Generates Xuqm initialization metadata for ${variantName}." + buildId.set(xuqmBuildId) + bugCollectBuildEnabled.set(bugCollectEnabled) + bugCollectAutomaticEnabled.set( + bugCollectEnabled.map { enabled -> enabled && variant.buildType == "release" }, + ) + outputFile.set( + layout.buildDirectory.file( + "generated/xuqm/${variantName}/AndroidManifest.xml", + ), + ) + } + variant.sources.manifests.addGeneratedManifestFile( + prepareXuqmHostManifest, + { task -> task.outputFile }, + ) variant.sources.assets?.addGeneratedSourceDirectory( prepareXuqmConfig, { task -> task.assetsOutputDirectory }, diff --git a/packages/update/scripts/xuqm-rn.test.mjs b/packages/update/scripts/xuqm-rn.test.mjs index be8ad7b..ecfca6c 100644 --- a/packages/update/scripts/xuqm-rn.test.mjs +++ b/packages/update/scripts/xuqm-rn.test.mjs @@ -32,6 +32,15 @@ test('Gradle models and forwards the exact embedded release identity', () => { assert.match(gradle, /environment\("XUQM_BUILD_ID", buildId\.get\(\)\)/) assert.match(gradle, /environment\("XUQM_BUGCOLLECT_MODE", bugCollectMode\.get\(\)\)/) assert.match(gradle, /abstract class CopyXuqmConfigTask extends DefaultTask/) + assert.match(gradle, /abstract class GenerateXuqmHostManifestTask extends DefaultTask/) + assert.match(gradle, /com\.xuqm\.common_plugin_applied/) + assert.match(gradle, /com\.xuqm\.build_id/) + assert.match(gradle, /com\.xuqm\.bugcollect_build_enabled/) + assert.match(gradle, /com\.xuqm\.bugcollect_automatic_enabled/) + assert.match( + gradle, + /variant\.sources\.manifests\.addGeneratedManifestFile\(\s*prepareXuqmHostManifest/, + ) assert.match( gradle, /variant\.sources\.assets\?\.addGeneratedSourceDirectory\(\s*prepareXuqmConfig/,