@leonxin/meetgames 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -0
- package/bundled/android/sample.txt +1 -0
- package/dist/android/adapter.d.ts +3 -0
- package/dist/android/adapter.d.ts.map +1 -0
- package/dist/android/adapter.js +8 -0
- package/dist/android/adapter.js.map +1 -0
- package/dist/android/assembleIntegrationJson.d.ts +8 -0
- package/dist/android/assembleIntegrationJson.d.ts.map +1 -0
- package/dist/android/assembleIntegrationJson.js +31 -0
- package/dist/android/assembleIntegrationJson.js.map +1 -0
- package/dist/android/detect.d.ts +11 -0
- package/dist/android/detect.d.ts.map +1 -0
- package/dist/android/detect.js +87 -0
- package/dist/android/detect.js.map +1 -0
- package/dist/android/downloadGoogleServicesJson.d.ts +20 -0
- package/dist/android/downloadGoogleServicesJson.d.ts.map +1 -0
- package/dist/android/downloadGoogleServicesJson.js +43 -0
- package/dist/android/downloadGoogleServicesJson.js.map +1 -0
- package/dist/android/fetchRemoteConfig.d.ts +5 -0
- package/dist/android/fetchRemoteConfig.d.ts.map +1 -0
- package/dist/android/fetchRemoteConfig.js +24 -0
- package/dist/android/fetchRemoteConfig.js.map +1 -0
- package/dist/android/gradle.d.ts +30 -0
- package/dist/android/gradle.d.ts.map +1 -0
- package/dist/android/gradle.js +87 -0
- package/dist/android/gradle.js.map +1 -0
- package/dist/android/manifest.d.ts +10 -0
- package/dist/android/manifest.d.ts.map +1 -0
- package/dist/android/manifest.js +45 -0
- package/dist/android/manifest.js.map +1 -0
- package/dist/android/meetSdkRemoteGradle.d.ts +86 -0
- package/dist/android/meetSdkRemoteGradle.d.ts.map +1 -0
- package/dist/android/meetSdkRemoteGradle.js +479 -0
- package/dist/android/meetSdkRemoteGradle.js.map +1 -0
- package/dist/android/snapchatManifestPlaceholders.d.ts +15 -0
- package/dist/android/snapchatManifestPlaceholders.d.ts.map +1 -0
- package/dist/android/snapchatManifestPlaceholders.js +53 -0
- package/dist/android/snapchatManifestPlaceholders.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +291 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/fetchConfigWrite.d.ts +10 -0
- package/dist/config/fetchConfigWrite.d.ts.map +1 -0
- package/dist/config/fetchConfigWrite.js +21 -0
- package/dist/config/fetchConfigWrite.js.map +1 -0
- package/dist/config/loadAndroidIntegration.d.ts +4 -0
- package/dist/config/loadAndroidIntegration.d.ts.map +1 -0
- package/dist/config/loadAndroidIntegration.js +34 -0
- package/dist/config/loadAndroidIntegration.js.map +1 -0
- package/dist/config/loadManifest.d.ts +3 -0
- package/dist/config/loadManifest.d.ts.map +1 -0
- package/dist/config/loadManifest.js +33 -0
- package/dist/config/loadManifest.js.map +1 -0
- package/dist/config/meetSdkDefaultConfig.d.ts +5 -0
- package/dist/config/meetSdkDefaultConfig.d.ts.map +1 -0
- package/dist/config/meetSdkDefaultConfig.js +15 -0
- package/dist/config/meetSdkDefaultConfig.js.map +1 -0
- package/dist/config/meetSdkRemoteConfig.d.ts +240 -0
- package/dist/config/meetSdkRemoteConfig.d.ts.map +1 -0
- package/dist/config/meetSdkRemoteConfig.js +892 -0
- package/dist/config/meetSdkRemoteConfig.js.map +1 -0
- package/dist/config/topsdkFeatureModules.d.ts +19 -0
- package/dist/config/topsdkFeatureModules.d.ts.map +1 -0
- package/dist/config/topsdkFeatureModules.js +47 -0
- package/dist/config/topsdkFeatureModules.js.map +1 -0
- package/dist/contracts/types.d.ts +95 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +2 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/core/engine.d.ts +3 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +18 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/patch.d.ts +2 -0
- package/dist/core/patch.d.ts.map +1 -0
- package/dist/core/patch.js +61 -0
- package/dist/core/patch.js.map +1 -0
- package/dist/core/pipeline.d.ts +12 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +102 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/previewPatches.d.ts +8 -0
- package/dist/core/previewPatches.d.ts.map +1 -0
- package/dist/core/previewPatches.js +25 -0
- package/dist/core/previewPatches.js.map +1 -0
- package/dist/core/reporter.d.ts +3 -0
- package/dist/core/reporter.d.ts.map +1 -0
- package/dist/core/reporter.js +24 -0
- package/dist/core/reporter.js.map +1 -0
- package/dist/core/resolveFetchChannelType.d.ts +27 -0
- package/dist/core/resolveFetchChannelType.d.ts.map +1 -0
- package/dist/core/resolveFetchChannelType.js +54 -0
- package/dist/core/resolveFetchChannelType.js.map +1 -0
- package/dist/core/workspace.d.ts +5 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +24 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/entry.d.ts +3 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +7 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/channelConfig.d.ts +7 -0
- package/dist/ios/channelConfig.d.ts.map +1 -0
- package/dist/ios/channelConfig.js +51 -0
- package/dist/ios/channelConfig.js.map +1 -0
- package/dist/ios/codeUtils.d.ts +15 -0
- package/dist/ios/codeUtils.d.ts.map +1 -0
- package/dist/ios/codeUtils.js +166 -0
- package/dist/ios/codeUtils.js.map +1 -0
- package/dist/ios/detect.d.ts +3 -0
- package/dist/ios/detect.d.ts.map +1 -0
- package/dist/ios/detect.js +65 -0
- package/dist/ios/detect.js.map +1 -0
- package/dist/ios/fileManager.d.ts +12 -0
- package/dist/ios/fileManager.d.ts.map +1 -0
- package/dist/ios/fileManager.js +46 -0
- package/dist/ios/fileManager.js.map +1 -0
- package/dist/ios/infoPlist.d.ts +11 -0
- package/dist/ios/infoPlist.d.ts.map +1 -0
- package/dist/ios/infoPlist.js +48 -0
- package/dist/ios/infoPlist.js.map +1 -0
- package/dist/ios/integrate.d.ts +12 -0
- package/dist/ios/integrate.d.ts.map +1 -0
- package/dist/ios/integrate.js +263 -0
- package/dist/ios/integrate.js.map +1 -0
- package/dist/ios/pbxprojEditor.d.ts +20 -0
- package/dist/ios/pbxprojEditor.d.ts.map +1 -0
- package/dist/ios/pbxprojEditor.js +198 -0
- package/dist/ios/pbxprojEditor.js.map +1 -0
- package/dist/ios/pluginConfig.d.ts +6 -0
- package/dist/ios/pluginConfig.d.ts.map +1 -0
- package/dist/ios/pluginConfig.js +64 -0
- package/dist/ios/pluginConfig.js.map +1 -0
- package/dist/ios/reserved.d.ts +4 -0
- package/dist/ios/reserved.d.ts.map +1 -0
- package/dist/ios/reserved.js +6 -0
- package/dist/ios/reserved.js.map +1 -0
- package/dist/ios/sdkBundle.d.ts +7 -0
- package/dist/ios/sdkBundle.d.ts.map +1 -0
- package/dist/ios/sdkBundle.js +30 -0
- package/dist/ios/sdkBundle.js.map +1 -0
- package/dist/ios/template.d.ts +3 -0
- package/dist/ios/template.d.ts.map +1 -0
- package/dist/ios/template.js +24 -0
- package/dist/ios/template.js.map +1 -0
- package/dist/ios/types.d.ts +43 -0
- package/dist/ios/types.d.ts.map +1 -0
- package/dist/ios/types.js +11 -0
- package/dist/ios/types.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +139 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/service.d.ts +49 -0
- package/dist/mcp/service.d.ts.map +1 -0
- package/dist/mcp/service.js +113 -0
- package/dist/mcp/service.js.map +1 -0
- package/dist/mcp-entry.d.ts +3 -0
- package/dist/mcp-entry.d.ts.map +1 -0
- package/dist/mcp-entry.js +7 -0
- package/dist/mcp-entry.js.map +1 -0
- package/dist/ops/fileStore.d.ts +17 -0
- package/dist/ops/fileStore.d.ts.map +1 -0
- package/dist/ops/fileStore.js +55 -0
- package/dist/ops/fileStore.js.map +1 -0
- package/dist/ops/handlers.d.ts +10 -0
- package/dist/ops/handlers.d.ts.map +1 -0
- package/dist/ops/handlers.js +268 -0
- package/dist/ops/handlers.js.map +1 -0
- package/dist/platforms/android/adapter.d.ts +3 -0
- package/dist/platforms/android/adapter.d.ts.map +1 -0
- package/dist/platforms/android/adapter.js +8 -0
- package/dist/platforms/android/adapter.js.map +1 -0
- package/dist/platforms/android/detect.d.ts +3 -0
- package/dist/platforms/android/detect.d.ts.map +1 -0
- package/dist/platforms/android/detect.js +79 -0
- package/dist/platforms/android/detect.js.map +1 -0
- package/dist/platforms/android/gradle.d.ts +30 -0
- package/dist/platforms/android/gradle.d.ts.map +1 -0
- package/dist/platforms/android/gradle.js +83 -0
- package/dist/platforms/android/gradle.js.map +1 -0
- package/dist/platforms/android/manifest.d.ts +7 -0
- package/dist/platforms/android/manifest.d.ts.map +1 -0
- package/dist/platforms/android/manifest.js +24 -0
- package/dist/platforms/android/manifest.js.map +1 -0
- package/dist/platforms/ios/adapter.d.ts +3 -0
- package/dist/platforms/ios/adapter.d.ts.map +1 -0
- package/dist/platforms/ios/adapter.js +8 -0
- package/dist/platforms/ios/adapter.js.map +1 -0
- package/dist/platforms/ios/detect.d.ts +8 -0
- package/dist/platforms/ios/detect.d.ts.map +1 -0
- package/dist/platforms/ios/detect.js +67 -0
- package/dist/platforms/ios/detect.js.map +1 -0
- package/dist/platforms/ios/plist.d.ts +11 -0
- package/dist/platforms/ios/plist.d.ts.map +1 -0
- package/dist/platforms/ios/plist.js +24 -0
- package/dist/platforms/ios/plist.js.map +1 -0
- package/dist/platforms/ios/podfile.d.ts +7 -0
- package/dist/platforms/ios/podfile.d.ts.map +1 -0
- package/dist/platforms/ios/podfile.js +15 -0
- package/dist/platforms/ios/podfile.js.map +1 -0
- package/dist/remote/fetchJson.d.ts +5 -0
- package/dist/remote/fetchJson.d.ts.map +1 -0
- package/dist/remote/fetchJson.js +24 -0
- package/dist/remote/fetchJson.js.map +1 -0
- package/dist/remote/topsdkDownloadSdkConfig.d.ts +23 -0
- package/dist/remote/topsdkDownloadSdkConfig.d.ts.map +1 -0
- package/dist/remote/topsdkDownloadSdkConfig.js +56 -0
- package/dist/remote/topsdkDownloadSdkConfig.js.map +1 -0
- package/dist/remote/topsdkGetSdkConfig.d.ts +46 -0
- package/dist/remote/topsdkGetSdkConfig.d.ts.map +1 -0
- package/dist/remote/topsdkGetSdkConfig.js +95 -0
- package/dist/remote/topsdkGetSdkConfig.js.map +1 -0
- package/dist/remote/topsdkSign.d.ts +6 -0
- package/dist/remote/topsdkSign.d.ts.map +1 -0
- package/dist/remote/topsdkSign.js +10 -0
- package/dist/remote/topsdkSign.js.map +1 -0
- package/docs/ANDROID.md +133 -0
- package/docs/API.md +47 -0
- package/docs/CURSOR-MCP-SETUP.md +72 -0
- package/docs/MCP-SKILL.md +63 -0
- package/docs/README.md +12 -0
- package/docs/api/downloadSDKConfig.md +96 -0
- package/docs/api/getChannelConfig-meetgames.md +106 -0
- package/docs/api/getSDKConfig.md +38 -0
- package/docs//346/212/200/346/234/257/346/226/271/346/241/210/350/260/203/347/240/224.md +329 -0
- package/docs//351/234/200/346/261/202/346/226/207/346/241/243.md +320 -0
- package/fixtures/api-samples/getChannelConfig-meetgames.sample.json +123 -0
- package/fixtures/meetsdk-remote-config.download-shape.json +20 -0
- package/fixtures/meetsdk-remote-config.mock.json +69 -0
- package/fixtures/recipes/android-default.fixture.yaml +15 -0
- package/fixtures/recipes/android-integration.fixture.json +29 -0
- package/fixtures/topsdk-config-reference.json +39 -0
- package/meetsdk-android.json +151 -0
- package/package.json +61 -0
- package/recipes/android-default.yaml +15 -0
- package/recipes/integrate-default.yaml +16 -0
- package/recipes/ios-default.yaml +5 -0
- package/schema/android-integration.schema.json +65 -0
- package/schema/manifest.schema.json +45 -0
- package/schema/meetsdk-remote-config.schema.json +45 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# meet-sdk-tool 技术方案调研
|
|
2
|
+
|
|
3
|
+
| 项 | 内容 |
|
|
4
|
+
|----|------|
|
|
5
|
+
| 文档版本 | v1.2 |
|
|
6
|
+
| 产品目标 | 优化 SDK 接入流程,减少 CP 步骤,提高接入效率 |
|
|
7
|
+
| 关联 PRD | [需求文档.md](./需求文档.md) |
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 调研结论
|
|
12
|
+
|
|
13
|
+
| 决策项 | 结论 |
|
|
14
|
+
|--------|------|
|
|
15
|
+
| 开发语言 | **TypeScript**(Node >= 18) |
|
|
16
|
+
| Gradle 编辑(现阶段) | **Groovy DSL**(`build.gradle`):正则 + `{`/`}` 括号匹配 + `// >>> TOPSDK` 标记块 upsert |
|
|
17
|
+
| Gradle 编辑(规划) | **仅 Groovy DSL** 改用 AST 改写;**明确不支持** `build.gradle.kts`(Kotlin DSL) |
|
|
18
|
+
| 游戏源码诊断(规划) | Java / Kotlin / ObjC AST(与 Gradle 解析栈分离) |
|
|
19
|
+
| 配置来源 | gp-sdk 新接口 **`GET console/openSDK/downloadSDKConfig`**(唯一拉参入口) |
|
|
20
|
+
| 配置形态 | 工程根 `meetsdk-remote-config.json` + 工具内置 `meetsdk-android.json` |
|
|
21
|
+
| 交付形态 | **CLI** + **MCP**(Cursor MVP) |
|
|
22
|
+
| 宿主 | **仅纯原生**;不支持 Unity / Unreal;**支持 CI 流水线** |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. 业务目标与技术映射
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
flowchart TB
|
|
30
|
+
subgraph goals [产品能力]
|
|
31
|
+
P1[参数自动配置]
|
|
32
|
+
P2[SDK 自动导入]
|
|
33
|
+
P3[接口调用诊断]
|
|
34
|
+
P4[接入客服]
|
|
35
|
+
end
|
|
36
|
+
subgraph tool [meet-sdk-tool 当前]
|
|
37
|
+
FC[fetch-config]
|
|
38
|
+
IG[integrate / setup]
|
|
39
|
+
DR[doctor 环境探测]
|
|
40
|
+
MCP[MCP tools]
|
|
41
|
+
end
|
|
42
|
+
subgraph backlog [规划]
|
|
43
|
+
GAST[Groovy Gradle AST 编辑]
|
|
44
|
+
SAST[游戏源码 AST 诊断]
|
|
45
|
+
FAQ[文档问答 Agent]
|
|
46
|
+
PH[Manifest placeholders]
|
|
47
|
+
end
|
|
48
|
+
P1 --> FC --> IG
|
|
49
|
+
P2 --> IG
|
|
50
|
+
P3 -.-> SAST
|
|
51
|
+
P2 -.-> GAST
|
|
52
|
+
P4 -.-> FAQ
|
|
53
|
+
P1 -.-> PH
|
|
54
|
+
MCP --> FC
|
|
55
|
+
MCP --> IG
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
| 产品功能 | 技术实现 | 状态 |
|
|
59
|
+
|----------|----------|------|
|
|
60
|
+
| 接口拉参 + 自动写入 Gradle | `downloadSDKConfig` → `meetSdkRemoteGradle` resValue/依赖 upsert | ✅ |
|
|
61
|
+
| 按后台版本/模块导入 SDK | `meetsdk-android.json` merge + `topsdkFeatureModules` | ✅ |
|
|
62
|
+
| 接口调用诊断 | 游戏源码 AST 扫描调用点与签名 | ⏳ |
|
|
63
|
+
| Gradle AST 编辑(仅 Groovy) | 替代 `findBlockRange` + 行级正则 upsert | ⏳ |
|
|
64
|
+
| 接入客服 | RAG + FAQ / SDK 文档 | ⏳ |
|
|
65
|
+
| CI 无人值守接入 | 非交互 CLI `setup` | ✅ |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 3. 方案对比
|
|
70
|
+
|
|
71
|
+
### 3.1 Gradle 编辑:现阶段正则 vs 规划 Groovy AST
|
|
72
|
+
|
|
73
|
+
**范围约定**:集成目标文件为 **Groovy DSL** 的 `build.gradle`(及根工程 `settings.gradle` 等 Groovy 脚本中的约定块)。**不支持** `build.gradle.kts`;若工程仅为 Kotlin DSL,`integrate` 应失败并提示改用 Groovy 或人工接入。
|
|
74
|
+
|
|
75
|
+
| 方案 | 优点 | 缺点 | 结论 |
|
|
76
|
+
|------|------|------|------|
|
|
77
|
+
| **正则 + 括号匹配 + 标记块(现阶段)** | 实现快、纯 TS、已上线、可 dry-run、Vitest 好测 | 非 Groovy 语义;极端脚本可能误匹配 | **当前采用**(`src/android/gradle.ts`、`meetSdkRemoteGradle.ts`) |
|
|
78
|
+
| **Groovy AST(规划)** | 准确定位 `defaultConfig`、`dependencies` 内 `resValue`/`implementation` 等调用 | 需引入 Groovy 解析(Tree-sitter-groovy 或 JVM Groovy AST);改完需处理格式化 | **M4+ 仅 Groovy**,替代块定位与行级 upsert |
|
|
79
|
+
| Kotlin DSL AST | 覆盖 `.kts` 工程 | 与 Groovy 两套栈;当前产品**明确不做** | **不采用** |
|
|
80
|
+
| 全量模板覆盖 build.gradle | 简单 | 破坏 CP 自定义片段 | 不采用 |
|
|
81
|
+
|
|
82
|
+
PRD「AST 替代正则」指 **后续 Groovy Gradle 编辑** 与 **游戏源码接口诊断**;现阶段以正则方案交付,幂等语义仍保留 `// >>> TOPSDK … START/END` 标记块(AST 阶段可改为「按语义键合并 AST 节点」)。
|
|
83
|
+
|
|
84
|
+
### 3.2 配置拉取接口
|
|
85
|
+
|
|
86
|
+
| 接口 | 路径 | 鉴权 | 返回 | 工具 |
|
|
87
|
+
|------|------|------|------|------|
|
|
88
|
+
| 老接口 | `GET /openSDK/getSDKConfig` | sign + timestamp | `channelAuthConfig` 片段 | 库内保留映射,CLI 不用 |
|
|
89
|
+
| **新接口(采用)** | `GET /console/openSDK/downloadSDKConfig` | 仅 `appId` + `channelType` | 完整 `meetsdk-remote-config.json` | **`fetch-config`** |
|
|
90
|
+
| 老接口 | `GET /openSDK/getSDKConfig` | sign | `channelAuthConfig` 片段 | 不用于 CLI 拉参 |
|
|
91
|
+
|
|
92
|
+
JSON 内渠道字段:**根级 `channel` only**(无 `channelType`、无 `topsdk.channel`)。
|
|
93
|
+
|
|
94
|
+
MG 后台另需:三方配置文件 OSS **原文件**存取、SDK 版本配置(与 `meetsdk-android.json` 合并),不另设与 `downloadSDKConfig` 并列的拉参 URL。
|
|
95
|
+
|
|
96
|
+
### 3.3 与旧工具关系
|
|
97
|
+
|
|
98
|
+
| 工具 | 配置方式 | Gradle | iOS |
|
|
99
|
+
|------|----------|--------|-----|
|
|
100
|
+
| topsdk-tool-ios (Python) | getSDKConfig + sign | 弱 | 强 |
|
|
101
|
+
| sdk-integration-agent | 本地 JSON | 强(类似现工具) | - |
|
|
102
|
+
| **meet-sdk-tool** | downloadSDKConfig | 强 + MCP | 已实现 integrate |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 4. 系统架构
|
|
107
|
+
|
|
108
|
+
```mermaid
|
|
109
|
+
flowchart LR
|
|
110
|
+
MG[MG 后台]
|
|
111
|
+
GP[gp-sdk console]
|
|
112
|
+
OSS[三方文件 OSS]
|
|
113
|
+
CLI[meetgames CLI]
|
|
114
|
+
JSON[meetsdk-remote-config.json]
|
|
115
|
+
DEF[meetsdk-android.json]
|
|
116
|
+
APP[原生宿主工程]
|
|
117
|
+
|
|
118
|
+
MG -->|渠道配置| GP
|
|
119
|
+
MG -->|原文件| OSS
|
|
120
|
+
CLI -->|GET console/openSDK/downloadSDKConfig| GP
|
|
121
|
+
GP --> JSON
|
|
122
|
+
OSS -.->|URL 写入 JSON| JSON
|
|
123
|
+
CLI --> DEF
|
|
124
|
+
JSON --> CLI
|
|
125
|
+
DEF --> CLI
|
|
126
|
+
CLI -->|recipe ops| APP
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 4.1 模块职责(meet-sdk-tool)
|
|
130
|
+
|
|
131
|
+
| 模块 | 职责 |
|
|
132
|
+
|------|------|
|
|
133
|
+
| `src/remote/topsdkDownloadSdkConfig.ts` | 拉取远程 JSON |
|
|
134
|
+
| `src/config/meetSdkRemoteConfig.ts` | 解析、校验、合并默认配置 |
|
|
135
|
+
| `src/android/meetSdkRemoteGradle.ts` | 仓库 / 依赖 / resValue / applicationId |
|
|
136
|
+
| `src/ios/*` | Xcode 工程、SDK 拷贝、AppDelegate |
|
|
137
|
+
| `src/core/pipeline.ts` | recipe 执行、dry-run、patch |
|
|
138
|
+
| `src/mcp/*` | Agent 入口 |
|
|
139
|
+
| `recipes/integrate-default.yaml` | 默认集成步骤 |
|
|
140
|
+
|
|
141
|
+
### 4.2 配置文件分工
|
|
142
|
+
|
|
143
|
+
| 文件 | 内容 | 谁维护 |
|
|
144
|
+
|------|------|--------|
|
|
145
|
+
| `meetsdk-remote-config.json` | 每游戏/渠道:包名、channel、devicePlatform、appId/secret、各模块凭证 | MG / gp-sdk 下载 |
|
|
146
|
+
| `meetsdk-android.json` | SDK 版本、Maven 仓库、各模块固定 `dependencies`、Firebase classpath | 工具发版随包更新,版本号对齐 MG |
|
|
147
|
+
|
|
148
|
+
### 4.3 JSON 字段(与 PRD 对齐)
|
|
149
|
+
|
|
150
|
+
根级 **`channel`**(如 `GOOGLE`),**不再**使用根级 `channelType` 或 `topsdk.channel`。
|
|
151
|
+
|
|
152
|
+
`downloadSDKConfig` 服务端(`SdkConfigDownloadServiceImpl`):
|
|
153
|
+
|
|
154
|
+
- `channel_auth` 仅 `enable=true` 写入参数;
|
|
155
|
+
- `channel_payment` 仅 `enable=true` 开启 IAP 模块;
|
|
156
|
+
- 输出 `devicePlatform`(小写 `android` / `ios`)。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 5. Gradle 集成行为(参数 + SDK)
|
|
161
|
+
|
|
162
|
+
**脚本类型**:仅 **Groovy DSL**(`*.gradle`)。实现见 `src/android/gradle.ts`(`findBlockRange`、`replaceOrInsertManaged`)与 `src/android/meetSdkRemoteGradle.ts`。
|
|
163
|
+
|
|
164
|
+
### 5.1 参数配置(resValue)
|
|
165
|
+
|
|
166
|
+
工具在 App Module `defaultConfig` 中写入(模块开启时),例如:
|
|
167
|
+
|
|
168
|
+
| resValue 键 | 来源 |
|
|
169
|
+
|-------------|------|
|
|
170
|
+
| `top_channel_id` | 根级 `channel` |
|
|
171
|
+
| `top_app_id` | `topsdk.appId` |
|
|
172
|
+
| `facebook_app_id` 等 | `sdkModules.login.*` |
|
|
173
|
+
| `af_dev_key` | `sdkModules.analytics.appsflyer` |
|
|
174
|
+
|
|
175
|
+
**差异**:PRD 中 Snapchat 的 `addManifestPlaceholders([...])` **尚未实现**,仅写入 `snapchat_client_id` 等 resValue。
|
|
176
|
+
|
|
177
|
+
### 5.2 SDK 导入
|
|
178
|
+
|
|
179
|
+
- **根工程**:`allprojects.repositories` 或 `settings.gradle` / `dependencyResolutionManagement`(按工程结构探测)。
|
|
180
|
+
- **App 模块**:`def topsdk_version` / `def groupId`、`implementation "$groupId:ui:..."` 及可选模块。
|
|
181
|
+
- **去重**:`groupId:artifact` 为键,已存在则更新版本,不重复插入。
|
|
182
|
+
|
|
183
|
+
### 5.3 Firebase
|
|
184
|
+
|
|
185
|
+
- `firebase_file_url` 在 analytics.firebase 对象中;
|
|
186
|
+
- 集成时拉取或引用 URL(具体拷贝逻辑见 recipe / firebase 相关 op)。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 6. Gradle 编辑技术路线(正则 → Groovy AST)
|
|
191
|
+
|
|
192
|
+
### 6.1 阶段性决策(已确认)
|
|
193
|
+
|
|
194
|
+
| 阶段 | Gradle 集成 | Kotlin DSL |
|
|
195
|
+
|------|-------------|------------|
|
|
196
|
+
| **现阶段** | 正则 + `{`/`}` 深度匹配 + TOPSDK 标记块 + 行级键 upsert | **不支持**,不检测、不修改 `.kts` |
|
|
197
|
+
| **将来** | **Groovy AST** 定位并改写 `build.gradle` 等 | **仍不支持** |
|
|
198
|
+
|
|
199
|
+
### 6.2 现阶段实现(正则,非 AST)
|
|
200
|
+
|
|
201
|
+
| 机制 | 作用 |
|
|
202
|
+
|------|------|
|
|
203
|
+
| `findBlockRange(keyword)` | 正则 `\bkeyword\s*\{` + 括号深度,得到 `android` / `defaultConfig` / `dependencies` 范围 |
|
|
204
|
+
| `replaceOrInsertManaged` | 在块内查找 `// >>> TOPSDK … START/END`,有则替换,无则在块尾插入 |
|
|
205
|
+
| 行级正则 | `resValue` 第二参数名、`implementation` 的 `group:artifact` 等去重 |
|
|
206
|
+
| `mergeResValuesInDefaultConfigBlock` 等 | 先删同键旧行,再写新标记块 |
|
|
207
|
+
|
|
208
|
+
优点:纯 TypeScript、与 sdk-integration-agent 一致、可 dry-run、单测覆盖。
|
|
209
|
+
缺点:不理解 Groovy 表达式;非常规嵌套或 `.kts` 工程不适用。
|
|
210
|
+
|
|
211
|
+
### 6.3 规划:Groovy AST(仅 Groovy DSL)
|
|
212
|
+
|
|
213
|
+
候选实现路径(选型待定):
|
|
214
|
+
|
|
215
|
+
- **Tree-sitter-groovy**(Node):轻量,适合「找闭包 + 方法调用」;
|
|
216
|
+
- **Groovy AstBuilder**(JVM 子进程):语义完整,适合复杂改写。
|
|
217
|
+
|
|
218
|
+
迁移原则:
|
|
219
|
+
|
|
220
|
+
1. 对外行为不变:仍输出相同 `resValue` / `implementation` / 仓库行,仍支持 TOPSDK 标记块或等价幂等;
|
|
221
|
+
2. **不**为 `build.gradle.kts` 增加解析器;`doctor` / `integrate` 可对 `.kts` 给出明确「仅支持 Groovy DSL」提示;
|
|
222
|
+
3. 游戏 **Java/Kotlin 源码** 的接口诊断使用独立 AST 管线,不与 Gradle Groovy 解析强绑定。
|
|
223
|
+
|
|
224
|
+
### 6.4 什么是 AST(与正则对比)
|
|
225
|
+
|
|
226
|
+
**AST(Abstract Syntax Tree)** 把源码解析成语法树再查询/改写,而不是整文件当字符串匹配。
|
|
227
|
+
|
|
228
|
+
| 维度 | 现阶段(正则 + 标记块) | 规划(Groovy AST) |
|
|
229
|
+
|------|-------------------------|---------------------|
|
|
230
|
+
| 找 `defaultConfig` | `defaultConfig\s*\{` + 括号计数 | 按 Groovy `BlockStatement` / 闭包节点 |
|
|
231
|
+
| 改一条 `resValue` | 按资源名删行 + 插入标记块 | 改 `MethodCallExpression` 或增删语句节点 |
|
|
232
|
+
| `build.gradle.kts` | 不处理 | **仍不处理** |
|
|
233
|
+
| 接口诊断(游戏代码) | 不适用 | Java/Kotlin/ObjC AST(**另一子项目**) |
|
|
234
|
+
|
|
235
|
+
### 6.5 游戏源码 AST 诊断(规划,非 Gradle)
|
|
236
|
+
|
|
237
|
+
1. 解析宿主 **Java / Kotlin / ObjC** 源码;
|
|
238
|
+
2. 匹配 TOPSDK 公开 API;
|
|
239
|
+
3. 校验参数个数、类型等 **【规则集待 SDK 团队提供】**。
|
|
240
|
+
|
|
241
|
+
与 Gradle Groovy AST **分开排期**,可先做诊断、后做 Gradle AST 迁移。
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 7. 使用方式
|
|
246
|
+
|
|
247
|
+
### 7.1 CLI
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
meetgames fetch-config --project-root <原生工程根> \
|
|
251
|
+
--app-id <APP_ID> --channel-type GOOGLE --env test
|
|
252
|
+
|
|
253
|
+
meetgames setup --project-root <原生工程根> \
|
|
254
|
+
--app-id <APP_ID> --channel-type GOOGLE
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
| 说明 | |
|
|
258
|
+
|------|--|
|
|
259
|
+
| `channel-type` | 商店渠道枚举,对应 HTTP 参数 `channelType` |
|
|
260
|
+
| `app-secret` | **不必**在 fetch-config 传入;由 `downloadSDKConfig` 响应写入 JSON |
|
|
261
|
+
| CI | 设置 `TOPSDK_APP_ID`、`TOPSDK_CHANNEL_TYPE` 或依赖已提交的 JSON 缓存 |
|
|
262
|
+
|
|
263
|
+
### 7.2 MCP(MVP)
|
|
264
|
+
|
|
265
|
+
| 工具 | 作用 |
|
|
266
|
+
|------|------|
|
|
267
|
+
| `meetgames_setup` | fetch + integrate |
|
|
268
|
+
| `meetgames_fetch_config` | 仅拉 JSON |
|
|
269
|
+
| `meetgames_integrate_*` | 仅改工程 |
|
|
270
|
+
| `meetgames_doctor` | 工程类型探测 |
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 8. MG 后台与服务端改造要点
|
|
275
|
+
|
|
276
|
+
| 项 | 技术要点 |
|
|
277
|
+
|----|----------|
|
|
278
|
+
| 渠道配置下载 | 与 `downloadSDKConfig` 字节流一致,避免前端再拼 JSON |
|
|
279
|
+
| 三方文件 | 对象存储原文件 + 下载 URL 写入 JSON(如 `firebase_file_url`) |
|
|
280
|
+
| SDK 版本 | 后台配置 → 下发或随工具 `meetsdk-android.json` 同步策略 **【待与发版流程对齐】** |
|
|
281
|
+
| 后台改 JSON 字段 | 与工具约定根级 `channel`,避免回退 `topsdk.channel` |
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## 9. 风险与缓解
|
|
286
|
+
|
|
287
|
+
| 风险 | 缓解 |
|
|
288
|
+
|------|------|
|
|
289
|
+
| 测试环境未部署 `downloadSDKConfig` | 本机 gp-sdk;推动 test/pre 部署 |
|
|
290
|
+
| Gradle 仅为 `.kts` | 文档与 `doctor` 声明仅 Groovy;integrate 失败并提示 |
|
|
291
|
+
| Groovy AST 排期晚于正则上线 | 先正则交付;AST 仅 Groovy,不扩 Kotlin DSL |
|
|
292
|
+
| Unity/Unreal 误用 | 文档与 `doctor` 明确仅原生;CI 模板校验工程结构 |
|
|
293
|
+
| `appSecret` 进 git | PR 扫描 + 文档;CI 密钥注入 |
|
|
294
|
+
| 环境未部署 `downloadSDKConfig` | 推动 test/pre/prod 部署;本机 gp-sdk console 联调 |
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 10. 测试与 CI
|
|
299
|
+
|
|
300
|
+
| 层级 | 内容 |
|
|
301
|
+
|------|------|
|
|
302
|
+
| 单元 | Gradle upsert、JSON 解析、Manifest |
|
|
303
|
+
| 集成 | `test-projects/android-sample`、`pipeline.*.test.ts` |
|
|
304
|
+
| CI 建议 | `npm ci && npm test && meetgames setup --dry-run`(需 secrets 与 API 可用) |
|
|
305
|
+
|
|
306
|
+
**宿主限制**:流水线仅针对标准 Android **Groovy** Gradle / Xcode 原生工程;**不支持** `build.gradle.kts`;Unity / Unreal 不在支持矩阵内。
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## 11. 演进路线
|
|
311
|
+
|
|
312
|
+
| 优先级 | 项 |
|
|
313
|
+
|--------|-----|
|
|
314
|
+
| P0 | 全环境部署 `downloadSDKConfig`;MG 下载按钮与文件存取 |
|
|
315
|
+
| P0 | CI 模板(GitHub Actions / 内部 Jenkins) |
|
|
316
|
+
| P1 | Snapchat `addManifestPlaceholders` |
|
|
317
|
+
| P1 | 三方配置文件 OSS 原文件 + JSON 内 URL 字段稳定 |
|
|
318
|
+
| P2 | 游戏源码 AST 接口调用诊断 |
|
|
319
|
+
| P3 | **Groovy AST** 替代 Gradle 正则编辑(不支持 Kotlin DSL) |
|
|
320
|
+
| P3 | FAQ / 接入客服 Agent |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 12. 参考
|
|
325
|
+
|
|
326
|
+
- [ANDROID.md](./ANDROID.md) — CLI 与 Gradle 细节
|
|
327
|
+
- [API.md](./API.md) — HTTP 接口索引
|
|
328
|
+
- [MCP-SKILL.md](./MCP-SKILL.md) — Agent 调用顺序
|
|
329
|
+
- gp-sdk:`SdkConfigDownloadServiceImpl.java`
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# meet-sdk-tool 需求文档(PRD)
|
|
2
|
+
|
|
3
|
+
| 项 | 内容 |
|
|
4
|
+
|----|------|
|
|
5
|
+
| 文档版本 | v1.2 |
|
|
6
|
+
| 产品名称 | meet-sdk-tool / `meetgames` CLI |
|
|
7
|
+
| 关联方案 | [技术方案调研.md](./技术方案调研.md) |
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 产品目标
|
|
12
|
+
|
|
13
|
+
**优化 SDK 接入流程、减少 CP(游戏研发)操作步骤、提高 SDK 接入效率。**
|
|
14
|
+
|
|
15
|
+
| 维度 | 传统方式 | 目标方式 |
|
|
16
|
+
|------|----------|----------|
|
|
17
|
+
| 参数配置 | 发行方提供参数文档,研发手工写入工程 | 接口拉取参数,工具自动写入合适位置,**游戏研发无需参与** |
|
|
18
|
+
| SDK 导入 | 手工下载 SDK 或配置仓库与依赖 | 按 MG 后台版本配置自动导入,研发**无需**添加仓库、判断模块与版本 |
|
|
19
|
+
| 问题排查 | 联调阶段才发现调用位置/传参错误 | 工具诊断调用位置、参数个数与类型(规划) |
|
|
20
|
+
| 支持 | 查文档、群里提问 | FAQ / SDK 文档 + 联网问答(规划,MVP 后) |
|
|
21
|
+
|
|
22
|
+
**宿主范围(已确认)**:仅**纯原生** Android / iOS 工程;**不支持** Unity、Unreal 等引擎导出工程。可在 **CI 流水线**中执行 `meetgames setup` / `fetch-config` + `integrate`。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. 功能需求
|
|
27
|
+
|
|
28
|
+
### 2.1 参数配置(P0 — 已实现主体)
|
|
29
|
+
|
|
30
|
+
#### 传统方式
|
|
31
|
+
|
|
32
|
+
发行方提供参数文档 → 研发在 App Module 的 `build.gradle` 等位置手工添加,例如:
|
|
33
|
+
|
|
34
|
+
```gradle
|
|
35
|
+
// channel(渠道标识)
|
|
36
|
+
resValue('string', 'top_channel_id', 'GOOGLE')
|
|
37
|
+
// topsdk
|
|
38
|
+
resValue('string', 'top_app_id', '768172181700891686')
|
|
39
|
+
// facebook
|
|
40
|
+
resValue('string', 'facebook_app_id', '1759420478385706')
|
|
41
|
+
resValue('string', 'fb_login_protocol_scheme', 'fb1759420478385706')
|
|
42
|
+
resValue('string', 'facebook_client_token', 'b688f17167a5d198adae2d6d090d11f9')
|
|
43
|
+
// snapchat
|
|
44
|
+
resValue('string', 'snapchat_client_id', 'd485fabe-dda2-42d6-93f0-3a480a9c342f')
|
|
45
|
+
addManifestPlaceholders([
|
|
46
|
+
snapchat_scheme: "https",
|
|
47
|
+
snapchat_host: "wxa-1256944748.cos.ap-nanjing.myqcloud.com",
|
|
48
|
+
snapchat_path: "html/snapchat-callback.html"
|
|
49
|
+
])
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
#### 新方式
|
|
53
|
+
|
|
54
|
+
1. `fetch-config`:从后台拉取 `meetsdk-remote-config.json` 到工程根目录。
|
|
55
|
+
2. `integrate`:根据 JSON 中**已开启**的 `sdkModules`,在 App Module `build.gradle` 的 `defaultConfig` 内 **upsert** 对应 `resValue`(同名键存在则更新,不存在则插入)。
|
|
56
|
+
3. 同步将 `applicationId` 对齐远程 `packageName`。
|
|
57
|
+
|
|
58
|
+
**实现状态**
|
|
59
|
+
|
|
60
|
+
| 项 | 状态 |
|
|
61
|
+
|----|------|
|
|
62
|
+
| `top_channel_id` / `top_app_id` 等 resValue | ✅ |
|
|
63
|
+
| Facebook / Google / Twitter / Line / Naver / Kakao / TikTok 等 | ✅(按模块开关) |
|
|
64
|
+
| Snapchat `resValue` | ✅ |
|
|
65
|
+
| Snapchat `addManifestPlaceholders` | ✅(由 `login.snapchat.redirect` URL 本地解析 scheme/host/path,写入 `defaultConfig` TOPSDK 块) |
|
|
66
|
+
| 游戏研发零手工配参 | ✅(流水线或 Agent 执行 setup 即可) |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### 2.2 SDK 导入(P0 — 已实现主体)
|
|
71
|
+
|
|
72
|
+
#### 传统方式
|
|
73
|
+
|
|
74
|
+
- 项目根 `build.gradle` / `settings.gradle` 手工加 Maven 仓库(Google、MavenCentral、TopSdk 私服等)。
|
|
75
|
+
- App Module `build.gradle` 手工写 `topsdk_version`、`groupId` 与各 `implementation` 模块。
|
|
76
|
+
|
|
77
|
+
#### 新方式
|
|
78
|
+
|
|
79
|
+
- 远程 JSON 决定**接入哪些可选模块**(guest、email、facebook、google-iap、appsflyer 等)。
|
|
80
|
+
- 工具内置 [`meetsdk-android.json`](../meetsdk-android.json) 提供**固定** SDK 版本、仓库 URL、`classpath`、Firebase plugin、各模块 `dependencies`。
|
|
81
|
+
- `integrate` 合并后写入根工程与 App Module 的 Gradle(标记块 upsert,避免重复插入)。
|
|
82
|
+
|
|
83
|
+
**示例(由工具生成,非人工维护)**
|
|
84
|
+
|
|
85
|
+
```gradle
|
|
86
|
+
allprojects {
|
|
87
|
+
repositories {
|
|
88
|
+
google()
|
|
89
|
+
mavenCentral()
|
|
90
|
+
maven { url 'https://storage-sdk-gameplus.meetsocial.com/repository/TopSdk/' }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
dependencies {
|
|
95
|
+
def topsdk_version = "1.6.1.1" // 来自 meetsdk-android.json,可被远程 topsdk.version 覆盖
|
|
96
|
+
def groupId = "com.sino.topsdk"
|
|
97
|
+
implementation "$groupId:ui:$topsdk_version"
|
|
98
|
+
implementation "$groupId:guest:$topsdk_version" // 仅当 sdkModules.login.guest 开启
|
|
99
|
+
implementation "$groupId:facebook:$topsdk_version" // 仅当 login.facebook 开启
|
|
100
|
+
// ...
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**实现状态**:仓库、依赖、版本、按模块开关追加构件 ✅;版本以 MG / 内置 defaults 为准 ✅。
|
|
105
|
+
|
|
106
|
+
#### Gradle 编辑技术路线(已确认)
|
|
107
|
+
|
|
108
|
+
| 阶段 | 方式 | 支持范围 |
|
|
109
|
+
|------|------|----------|
|
|
110
|
+
| **现阶段** | 正则 + 花括号匹配 + `// >>> TOPSDK` 标记块(见 [技术方案调研 §6](./技术方案调研.md#6-gradle-编辑技术路线正则--groovy-ast)) | **Groovy DSL**:`build.gradle` 等 |
|
|
111
|
+
| **将来** | **Groovy AST** 解析与改写 | **仅 Groovy DSL** |
|
|
112
|
+
| **明确不做** | — | **`build.gradle.kts`(Kotlin DSL)** 不检测、不自动集成 |
|
|
113
|
+
|
|
114
|
+
若 CP 工程仅使用 Kotlin DSL,需改为 Groovy `build.gradle` 或人工接入;工具应在 `doctor` / `integrate` 中给出明确提示(实现可随 AST 阶段补齐)。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### 2.3 接口调用诊断(P1 — 规划中)
|
|
119
|
+
|
|
120
|
+
**目标**:在不联调的情况下,诊断 SDK 接口的**调用位置**、**参数个数**、**参数类型**是否正确。
|
|
121
|
+
|
|
122
|
+
**当前**:`meetgames doctor` 仅输出工程类型(Android / iOS)、路径等**环境探测**,**不包含** SDK API 静态分析。
|
|
123
|
+
|
|
124
|
+
**验收标准(规划)**:对指定 SDK 公开 API 扫描宿主源码,输出违规列表(文件、行号、期望签名)。技术方向见 [技术方案调研 §6.5](./技术方案调研.md#65-游戏源码-ast-诊断规划非-gradle)(与 Gradle Groovy AST 分开)。
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### 2.4 接入客服(P2 — 规划中 / MVP 外)
|
|
129
|
+
|
|
130
|
+
**目标**:基于 FAQ、SDK 文档与联网内容回答开发者接入问题(如 Cursor 插件内问答)。
|
|
131
|
+
|
|
132
|
+
**当前**:未在本仓库实现;可与 MCP 生态后续结合。
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 3. 使用方式
|
|
137
|
+
|
|
138
|
+
### 3.1 CLI(主路径)
|
|
139
|
+
|
|
140
|
+
减少交互;核心入参:
|
|
141
|
+
|
|
142
|
+
| 参数 | 说明 |
|
|
143
|
+
|------|------|
|
|
144
|
+
| `--project-root` | 游戏工程根路径 |
|
|
145
|
+
| `--app-id` | MG / TOPSDK 应用 ID |
|
|
146
|
+
| `--channel-type` | 商店渠道:`GOOGLE` / `APPLE` 等(HTTP 查询参数,非 android/ios) |
|
|
147
|
+
| `--env` | `prod` / `pre` / `test` |
|
|
148
|
+
|
|
149
|
+
说明:`downloadSDKConfig` **无需** CLI 传 `appSecret`,密钥由接口写入 JSON 的 `topsdk.appSecret`。旧文档中的 `--app-secret` 仅适用于已废弃的 `getSDKConfig` 签名流程。
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# 仅拉配置
|
|
153
|
+
meetgames fetch-config --project-root . \
|
|
154
|
+
--app-id "$SDK_APP_ID" --channel-type GOOGLE --env test
|
|
155
|
+
|
|
156
|
+
# 拉配置 + 集成(推荐流水线)
|
|
157
|
+
meetgames setup --project-root . \
|
|
158
|
+
--app-id "$SDK_APP_ID" --channel-type GOOGLE --env test
|
|
159
|
+
|
|
160
|
+
# 仅集成(已有 meetsdk-remote-config.json)
|
|
161
|
+
meetgames integrate --project-root . --dry-run
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 3.2 Cursor / Agent(MVP)
|
|
165
|
+
|
|
166
|
+
在 Cursor 等 IDE 中通过 **MCP** 调用(见 [MCP-SKILL.md](./MCP-SKILL.md)):
|
|
167
|
+
|
|
168
|
+
- `meetgames_setup`(推荐:拉取 + 集成)
|
|
169
|
+
- `meetgames_fetch_config` / `meetgames_integrate_*` / `meetgames_doctor`
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 4. 配置文件(`meetsdk-remote-config.json`)
|
|
174
|
+
|
|
175
|
+
由 **gp-sdk** 新接口拉取并落盘(见 §6)。工具只读该文件,不在 `topsdk` 内重复存放渠道。
|
|
176
|
+
|
|
177
|
+
### 4.1 字段约定(渠道在根级)
|
|
178
|
+
|
|
179
|
+
| 规则 | 说明 |
|
|
180
|
+
|------|------|
|
|
181
|
+
| **渠道** | 必须使用根级字段 **`channel`**(如 `"GOOGLE"`) |
|
|
182
|
+
| **禁止** | 不使用根级 `channelType`;不在 `topsdk` 下写 `channel` |
|
|
183
|
+
| **平台** | 根级 **`devicePlatform`**:`android` / `ios`(小写) |
|
|
184
|
+
| **应用凭证** | 仅 `topsdk.appId`、`topsdk.appSecret` |
|
|
185
|
+
|
|
186
|
+
### 4.2 示例结构
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"packageName": "com.meet.integrate.androidsample",
|
|
191
|
+
"channel": "GOOGLE",
|
|
192
|
+
"devicePlatform": "android",
|
|
193
|
+
"topsdk": {
|
|
194
|
+
"appId": "mock-topsdk-app-id",
|
|
195
|
+
"appSecret": "mock-app-secret-do-not-use-in-production"
|
|
196
|
+
},
|
|
197
|
+
"sdkModules": {
|
|
198
|
+
"login": {
|
|
199
|
+
"guest": {},
|
|
200
|
+
"email": {},
|
|
201
|
+
"facebook": {
|
|
202
|
+
"facebookAppId": "0000000000000000",
|
|
203
|
+
"fbLoginProtocolScheme": "fb0000000000000000",
|
|
204
|
+
"facebookClientToken": "mockfacebookclienttoken00000000"
|
|
205
|
+
},
|
|
206
|
+
"google": { "googleClientId": "mock-client-id.apps.googleusercontent.com" }
|
|
207
|
+
},
|
|
208
|
+
"payment": { "googleIap": {} },
|
|
209
|
+
"analytics": {
|
|
210
|
+
"appsflyer": { "enableDebugLog": true, "devKey": "MOCK_APPSFLYER_DEV_KEY" },
|
|
211
|
+
"facebookdata": {},
|
|
212
|
+
"firebase": { "firebase_file_url": "https://example.invalid/firebase/google-services.json" },
|
|
213
|
+
"adjust": { "appId": "MOCK_ADJUST_APP_ID" }
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
- 模块关闭:值为 `false`。
|
|
220
|
+
- 模块开启:值为 `{}` 或带业务字段的对象。
|
|
221
|
+
- 埋点 Facebook Data 子键为 **`facebookdata`**(非 `facebook`)。
|
|
222
|
+
- Schema:[schema/meetsdk-remote-config.schema.json](../schema/meetsdk-remote-config.schema.json)。
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 5. MG 后台需求(与工具配套)
|
|
227
|
+
|
|
228
|
+
| 编号 | 需求 | 说明 |
|
|
229
|
+
|------|------|------|
|
|
230
|
+
| BG-1 | 游戏配置页增加**下载渠道配置** | 「配置」进入渠道页;「下载」得到 `meetsdk-remote-config.json`(与工具 `fetch-config` 一致) |
|
|
231
|
+
| BG-2 | 三方配置文件**按文件**存取 | 上传保存源文件;下载返回源文件。避免仅存文本导致格式错乱、只能走接口拼文本 |
|
|
232
|
+
| BG-3 | 新增配置文件上传与**路径设置** | 如 `google-services.json`、Adjust 事件 JSON 等 OSS 路径 |
|
|
233
|
+
| BG-4 | 「SDK 下载」改为 **SDK 版本配置** | 版本由后台维护,工具侧通过 `meetsdk-android.json` 合并默认版本与依赖 |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 6. 服务端接口(gp-sdk console)
|
|
238
|
+
|
|
239
|
+
### 6.1 配置拉取(新接口,工具标准路径)
|
|
240
|
+
|
|
241
|
+
| 项 | 内容 |
|
|
242
|
+
|----|------|
|
|
243
|
+
| **新接口** | `GET {baseUrl}console/openSDK/downloadSDKConfig` |
|
|
244
|
+
| **Query** | `appId`、`channelType`(商店渠道,如 `GOOGLE` / `APPLE`) |
|
|
245
|
+
| **鉴权** | 无需 sign |
|
|
246
|
+
| **响应** | 响应体即为 `meetsdk-remote-config.json` 全文(附件下载) |
|
|
247
|
+
| **CLI** | `meetgames fetch-config` / `meetgames setup` |
|
|
248
|
+
|
|
249
|
+
示例:
|
|
250
|
+
|
|
251
|
+
```http
|
|
252
|
+
GET https://{api-sdk-gameplus-host}/console/openSDK/downloadSDKConfig?appId=791251136341225472&channelType=GOOGLE
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
响应 JSON **必须**含根级 `channel`(与 `channelType` 查询值一致)、`devicePlatform`,且 **`topsdk` 内不含 `channel`**。
|
|
256
|
+
|
|
257
|
+
### 6.2 老接口(不再用于一键集成拉参)
|
|
258
|
+
|
|
259
|
+
| 接口 | 说明 |
|
|
260
|
+
|------|------|
|
|
261
|
+
| `GET /openSDK/getSDKConfig` | 需 `appSecret` 签名;仅返回 `channelAuthConfig` 片段,**不是**完整 `meetsdk-remote-config.json` |
|
|
262
|
+
|
|
263
|
+
### 6.3 其它(与配置 JSON 分离)
|
|
264
|
+
|
|
265
|
+
三方配置文件(如 `google-services.json`)建议 OSS **原文件**上传下载;SDK 包版本由 MG 后台「SDK 版本配置」维护,与 `meetsdk-android.json` 合并策略见技术方案。**不**使用单独的 `home/sdk-download/downloadMeetSdkRemoteConfig` 作为本工具拉参入口。
|
|
266
|
+
|
|
267
|
+
### 6.4 组装规则(`downloadSDKConfig`)
|
|
268
|
+
|
|
269
|
+
- 仅 `enable=true` 的 `channel_auth` 写入登录参数;未启用项为 `false`。
|
|
270
|
+
- 根级 `channel`、`devicePlatform`;`topsdk` 仅 `appId` / `appSecret`。
|
|
271
|
+
- 支付、第三方数据平台按表与 enable 规则映射到 `sdkModules`。
|
|
272
|
+
|
|
273
|
+
详见 [api/downloadSDKConfig.md](./api/downloadSDKConfig.md)。
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## 7. 非功能需求
|
|
278
|
+
|
|
279
|
+
| 项 | 要求 |
|
|
280
|
+
|----|------|
|
|
281
|
+
| 语言 | TypeScript(Node >= 18) |
|
|
282
|
+
| 宿主 | 纯原生 Android / iOS |
|
|
283
|
+
| Android 构建脚本 | **Groovy DSL**(`build.gradle`);**不支持 Kotlin DSL**(`.kts`) |
|
|
284
|
+
| Gradle 编辑 | 现阶段正则 + 标记块;规划 **Groovy AST only** |
|
|
285
|
+
| CI | 支持非交互执行 `setup` / `integrate` |
|
|
286
|
+
| 安全 | `appSecret` 不得提交公开仓库;流水线用密钥注入 **【组织规范待统一】** |
|
|
287
|
+
| 可审计 | `integrate --dry-run` 输出 patch |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 8. 验收标准
|
|
292
|
+
|
|
293
|
+
### 8.1 已交付能力(当前版本)
|
|
294
|
+
|
|
295
|
+
1. **参数配置**:对样例工程执行 `setup` 后,App `build.gradle` 含正确 `resValue` 且同名键不重复堆积。
|
|
296
|
+
2. **SDK 导入**:根工程含 TopSdk 等仓库;App 模块含 `topsdk_version` 与按开关启用的 `implementation`。
|
|
297
|
+
3. **拉取**:`fetch-config` 成功时 JSON 含 `channel`、`devicePlatform`,且无 `topsdk.channel`。
|
|
298
|
+
4. **流水线**:在 CI 中可无人工步骤完成 `fetch-config` + `integrate`(需目标环境已部署 `downloadSDKConfig`)。
|
|
299
|
+
5. **测试**:`npm test` 通过。
|
|
300
|
+
|
|
301
|
+
### 8.2 后续版本
|
|
302
|
+
|
|
303
|
+
| 能力 | 验收 |
|
|
304
|
+
|------|------|
|
|
305
|
+
| 接口调用诊断 | 对约定 API 列表输出静态检查报告 |
|
|
306
|
+
| Snapchat Manifest placeholders | 与 PRD 示例一致的 `addManifestPlaceholders` |
|
|
307
|
+
| 三方配置文件原文件下载 | OSS 直链写入 JSON(如 `firebase_file_url`) |
|
|
308
|
+
| 接入客服 | 可回答 FAQ 范围内接入问题 |
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 9. 里程碑建议
|
|
313
|
+
|
|
314
|
+
| 阶段 | 内容 |
|
|
315
|
+
|------|------|
|
|
316
|
+
| M1 | Android:fetch-config + integrate + CI 样例 ✅ |
|
|
317
|
+
| M2 | gp-sdk `downloadSDKConfig` 测试/预发/正式部署;MG 后台下载按钮与文件存取 |
|
|
318
|
+
| M3 | iOS integrate 与 Android 同等级流水线支持 |
|
|
319
|
+
| M4 | 游戏源码 AST 接口诊断、Snapchat Manifest placeholders、客服 / FAQ Agent |
|
|
320
|
+
| M5 | **Groovy AST** 替代 Gradle 正则编辑(仍不支持 `.kts`) |
|