Kuikly 多端工程从零搭建避坑指南:官方模板开箱就崩?一条命令补齐六端配置层

发布时间:2026/10/11 9:54:13
Kuikly 多端工程从零搭建避坑指南:官方模板开箱就崩?一条命令补齐六端配置层
Kuikly 多端工程从零搭建避坑指南官方模板开箱就崩一条命令补齐六端配置层摘要本文记录我用 Kuikly腾讯 KMP 多端框架从官方模板新建工程时踩的全部坑。最要命的一条是——官方插件生成的模板AGP 7.4.2 Kotlin 2.1.21组合在 Android 侧打 dex 必崩报com.android.tools.r8.kotlin.H。此外六端配置散落各处、网上大量 Kuikly 教程命令是 AI 编的。文末给出一个自包含的 Node 工具一条命令补齐配置层 自动修版本矩阵 注入 Gradle 片段实测BUILD SUCCESSFUL。一、先说结论TL;DR如果你也在用 Kuikly只想快速跑起来官方模板别直接编——AGP 7.4.2内置的 R8 读不懂 Kotlin 2.x 的 metadatamergeExtDexDebug必 FAILED。升 AGP 必须连 Gradle 一起升—— 推荐AGP 8.5.0 Gradle 8.7-all腾讯镜像JDK 用17。配置别散着放—— 六端Android / shared / H5 / 小程序 / 鸿蒙 / iOS应当共用一份config.properties改一处全端生效。网上搜到的kuikly serve/kuikly/cli之类命令大概率是假的—— 那些包 npm 上根本不存在只信官方docs/目录。下面把每个坑讲清楚。二、坑 1官方模板开箱必崩AGP 7.4.2 Kotlin 2.x现象用 Android Studio 官方 Kuikly 插件新建工程什么都不改直接命令行编译./gradlew :androidApp:assembleDebug结果ERROR:D8: com.android.tools.r8.kotlin.H Task :androidApp:mergeExtDexDebug FAILED或者换个任务名 Task :androidApp:mergeLibDexDebug FAILED搜这个报错网上答案五花八门但基本没人说清根因。根因官方模板给的是AGP 7.4.2 Kotlin 2.1.21。AGP 7.4.2 内部捆绑的是R8 4.0.52而 R8 能正确解析 Kotlin 2.x metadata 需要R8 ≥ 8.6.17。R8 是 AGP 自带的、不可单独升级所以只能升 AGP。而 AGP 8.x 又硬性要求JDK 17和Gradle ≥ 8.7环环相扣。修复组件从到改在哪JDK任意17本机 AS 的 Gradle JDKAGP7.4.28.5.0根build.gradle.kts、build.ohos.gradle.kts、gradle/libs.versions.tomlGradle8.5-bin8.7-all腾讯镜像gradle/wrapper/gradle-wrapper.propertiesgradle-wrapper.propertiesdistributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-8.7-all.zip为什么一定要-all而不是-bin-bin不含src/Android Studio 解析 Kotlin DSL 时会去 GitHub 拉gradle-8.7-src.zip国内基本超时。-all自带源码不再外网拉取。再把 Android Studio 的 Gradle JDK 切成 17Settings → Build, Execution, Deployment → Build Tools → Gradle → Gradle JDK → 17新版 AS 默认给的是 JDK 21和这套配置不兼容必须手动切。这一套改完实测BUILD SUCCESSFUL in 58sD8 错误归零。三、坑 2六端配置散落各处改一处要改六处Kuikly 一个工程有六个端shared/ 跨平台业务逻辑KMP androidApp/ Android 宿主 h5App/ H5 宿主 miniApp/ 微信小程序宿主 iosApp/ iOS 宿主 ohosApp/ 鸿蒙宿主应用名、版本号、环境、API 地址这些配置默认散落在androidApp/build.gradle.ktsversionName / versionCodeshared里的业务常量API 地址H5 的index.html与 dev server 端口.whistle.jsdebug 包 bundle 转发端口static_server/serve/config/serve.conf.js静态服务端口鸿蒙AppScope/app.json5resources/base/element/string.jsoniOSInfo.plist改一个版本号要开五六个文件漏一个就出线上事故。解法三层消费、一处配置我把它统一成一份config.properties然后分成三层消费层谁读怎么读Gradle 端构建时androidApp/shared/h5AppbuildSrc/AppConfig.kt读生成BuildConfig、resValue、APK 文件名Node 端运行时.whistle.js/static_server/scriptsscripts/read-config.js读独立构建系统鸿蒙 / iOSscripts/sync-config.js把版本号写进app.json5/Info.plistconfig.properties长这样envdev app.name我的商城 app.versionName1.0.0 app.versionCode1 dev.api.urlhttp://192.168.0.11:8006/ prod.api.urlhttps://api.example.com/ port.static8017 port.whistle8899改完app.versionName2.5.0重编出的 APK 文件名直接从我的商城(dev)_测试环境_v1.0.0_1.apk变成我的商城(dev)_测试环境_v2.5.0_77.apk鸿蒙 / iOS 的版本号也由一条同步命令带过去。⚠️ 一个隐蔽的编码坑config.properties用 JavaProperties读时默认按 ISO-8859-1 解码中文会显示成·、å¤ç«¯这种乱码。两个办法建议都做Android StudioSettings → Editor → File Encodings里把 properties 文件编码设成 UTF-8代码里显式指定 UTF-8// buildSrc/src/main/java/AppConfig.ktvalpropsProperties()File(path).reader(Charsets.UTF_8).use{props.load(it)}// 关键reader(Charsets.UTF_8)四、坑 3网上大量 Kuikly 命令是 AI 编的搜 Kuikly 教程时你会发现 CSDN / 掘金上一堆文章教你kuikly serve--port8080kuikly debug --hot-reloadnpmi kuikly/cli这些包在 npm 上根本不存在。相当一部分是 AI 生成的看起来对的内容互相抄越传越真。判断方法很简单npmview kuikly/cli# → 404npmview kuikly-devtools# 存在但月下载量极小只信两个来源官方仓库里的docs/QuickStart/*.md、docs/DevGuide/*.md以及 npm registry 实查。五、解决方案一个自包含的一条命令工具上面这些坑我把处理逻辑固化成了一个纯 Node 工具不依赖 Git Bash——因为有人 PowerShell 里根本没有bash。用法# 1) 先用官方插件建工程这步脚本替不了# Android Studio → File → New → New Project → Kuikly Project Template# 2) 一条命令nodetools/init-new-project.js D:\Android\Project\myShop com.yourco.myshop 我的商城包名可省略自动从androidApp的namespace嗅探应用名可省略取目录名加--dry-run可先预览。它自动做三件事① 复制配置层文件——config.properties、.whistle.js、scripts/、static_server/、run.sh/run.bat、AppConfig.kt。注意官方模板自带一批**「未接入」版本的基础设施文件.whistle.js端口写死 8017 等。如果按只加不覆盖处理装完就是半残状态**——改了config.properties的端口没人读。工具会辨认文件来历备份后升级备份名*.config-layer.bak。② 检查 / 修复版本矩阵—— 就是本文第二节那套条件触发、健康工程零副作用AGP 主版本 8 且 Kotlin 主版本 ≥ 2 → 升 AGP GradleAGP ≥ 8 但 Gradle 8.7 → 只升 Gradle其余 → 打印「版本组合健康无需修改」直接退出③ 注入 Gradle 片段—— 往 4 个文件里写入配置层代码文件注入内容androidApp/build.gradle.ktsversionName/versionCode、buildConfigField(APP_ENV/API_URL)、resValue(app_name)、buildFeatures { buildConfig true }、APK 输出命名shared/build.gradle.ktsgenerateAppConfig任务 → 生成全端可读的AppConfig.kth5App/build.gradle.ktsbundle 端口 dev server 端口 patchIndexHtmlPort端口对齐androidApp/src/main/AndroidManifest.xml补android:labelstring/app_name注入器做了几件让人安心的事锚点定位 真正的括号匹配找到defaultConfig {这类已知块配对找闭合}把片段追加到块尾保证赋值最后生效模板结构略有差异也能工作幂等注入内容用// kuikly-config-layer 包裹重跑先剥旧块再注入二次保护检测到已手工接入过存在AppConfig.load(就跳过可回滚改动前自动备份*.config-layer.bak。⚠️ AGP 8 起BuildConfig默认不生成所以buildFeatures { buildConfig true }这一句不能漏已自动注入。六、完整操作清单照着做一次性环境准备Android Studio ≥ 2024.2.1Gradle JDK 切17Plugins 装Kotlin、Kotlin MultiPlatform、Kuikly插件要鸿蒙则插件≥ 1.1.0本机装JDK 17Node.js LTS新建工程 5 步① File → New → New Project → Kuikly Project Template ② node tools/init-new-project.js 目录 [包名] [应用名] ③ 改 config.properties应用名 / 版本 / 环境 / API / 端口 ④ cd 工程 npm install node scripts/sync-config.js ⑤ ./gradlew :androidApp:assembleDebug第 ⑤ 步成功标志androidApp/build/outputs/apk/debug/应用名(dev)_环境_v版本_code.apk端到端验证证明配置真生效把app.versionName / versionCode临时改成9.9.9 / 42重编APK 名应跟着变然后改回去。七、踩坑速查表都是真实踩过的#现象原因处理1com.android.tools.r8.kotlin.H/mergeExtDexDebug FAILEDAGP 7.4.2 内置 R8 4.0.52 读不懂 Kotlin 2.1 metadataAGP →8.5.0、Gradle →8.7-all2BuildConfig找不到AGP 8 起默认不生成buildFeatures { buildConfig true }3AS Sync 拉gradle-8.7-src.zip超时-bin不含 srcAS 去 GitHub 要换-all腾讯镜像4journal-1.lock拒绝访问AS 的 Gradle daemon 占着GRADLE_USER_HOME先./gradlew --stop5config.properties中文乱码·JDK Properties 默认 ISO-8859-1AS 编码设 UTF-8 代码reader(Charsets.UTF_8)6Cannot expand ZIP .../nativevue2.zip as it does not existH5 的publishLocalJSBundle在配置阶段就解压打 H5 前先跑:shared:packLocalJSBundleRelease7run.bat在 cmd 下解析错乱bat 里写了中文bat 保持纯 ASCII中文注释放别处8重编很慢ksp.incrementalfalse关了增量Kuikly ≥ 2.11 后可尝试打开9小程序versionCode改了没反应小程序版本号在微信后台配去微信后台改10改端口后 H5 加载不到 bundleserve.conf.js/.whistle.js是常驻进程读的改完重启npm run serve11网上搜到的kuikly serve/kuikly/cli用不了那些包 npm 上不存在AI 编的只信官方docs/与 npm registry12鸿蒙 / iOS 构建报错两个独立构建系统Windows 跑不了鸿蒙要 DevEco、iOS 要 macOS Xcode13bash not found. Git Bash is required脚本依赖 Git Bash而它未必在 PATH改用纯 Node实现14改了config.properties端口没人读模板自带端口写死的「未接入」版基建备份后升级基建文件八、关于官方插件建出来到底有哪几端网上说法是「只给sharedandroidAppiosApph5App/miniApp要手工建」。但我 2026-10 实测本机这版插件实际生成六端全齐androidApp / shared / h5App / miniApp / iosApp / ohosApp并且settings.gradle.kts里已经include(:h5App)/include(:miniApp)。结论以你实际生成的目录为准建完ls一眼确认。万一真缺h5App/miniApp按官方docs/QuickStart/h5.md、docs/QuickStart/Miniapp.md补建再重新跑一次安装命令片段会自动补进去。补建时注意h5App/miniApp里的val businessPathName shared要和实际业务模块名一致漏改这里 H5 打包会找不到nativevue2.zip。九、另一个高频误区Windows 上要不要注释 iOS 配置早期文档说要手工注释掉shared/build.gradle.kts里的cocoapods { }和三个 ios target。实测不需要。Windows 上这些会被 Kotlin自动禁用只打一条kotlin.native.ignoreDisabledTargets的提示不影响构建。另有一条The Default Kotlin Hierarchy Template was not applied警告同样无害。这两条都不用处理。十、建成后的日常开发循环建成后日常只碰两个东西配置改config.properties业务改shared/。场景命令H5 改 UI秒级反馈终端Anpm run serve终端B./gradlew :h5App:jsBrowserDevelopmentRun -t出 JS bundle 给 App 热看./gradlew :shared:packLocalJSBundleDebug把nativevue2.js放进 static 目录App 内刷新Android 出包./gradlew :androidApp:assembleDebug热更新原理debug 包的.whistle.js把/.*/debug/nv_js/(.*)/转发到127.0.0.1:8017所以改 JS 不用重装 APK只需重出 bundle。注意shared是业务代码改它必须重新编译成 JS——Kuikly 目前没有零编译预览官方 H5 dev server 已经是反馈最快的方式了。十一、实测数据步骤结果安装器新增 6 项 / 升级 3 项 / 保留 2 项版本矩阵 4 处修复:shared:generateAppConfigBUILD SUCCESSFUL in 1m 1s:androidApp:assembleDebugBUILD SUCCESSFUL in 58sD8 错误 0产物…(dev)_测试环境_v1.0.0_1.apk8,189,677 字节端到端改versionName/versionCode→ 重编 → APK 名跟着变 ✅十二、小结Kuikly 本身没问题坑主要在**“官方模板的版本组合和多端配置分散”**这两件事上。把这两件事用工程化的方式固化下来多端开发其实是顺的。我在文末附的工具做的不多就三件事补配置层、修版本矩阵、注入 Gradle 片段。工具是自包含的纯 Node货源都在自己目录里整个tools/目录拷到任何机器都能跑不依赖具体工程。一句话记忆官方插件建壳 → 一条命令补配置层 → 改config.properties→ 编一次。如果这篇帮你少踩一个坑点个赞就行 有问题评论区见。免费下载https://download.csdn.net/download/m0_65816600/93676724本文基于 2026-10 实际环境实测整理命令行输出均为真实复现。