拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Flutter add-to-app 实战指南:宿主自定义构建变体导致 :flutter 匹配失败的排查

Flutter add-to-app 实战指南宿主自定义构建变体导致 :flutter 匹配失败的排查【免费下载链接】QuickRecorderA lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具项目地址: https://gitcode.com/GitHub_Trending/qu/QuickRecorder如果你的宿主 App 定义了 staging、prod 这类自定义 buildType或按渠道分了 flavor接上flutter create -t module生成的 Flutter Module 后gradlew assembleDemoStaging就会抛出Unable to find a matching variant of project :flutter。Flutter 仓库的集成测试项目module_host_with_custom_build_v2_embedding位于dev/integration_tests/下就是为这个场景造的验证「宿主带着自定义 build type 和 flavor 时含 Flutter 模块的 App 能否正常出包」。从报错说起Unable to find a matching variant 是怎么发生的变体匹配为什么会在 :flutter 这里断裂app/build.gradle里一行implementation project(:flutter)之后Gradle 要做变体匹配——你可以理解成按名字找工位:app要构建demoStaging就拿staging这个名字去:flutter里找同名变体。可:flutter由 Flutter 工具链生成永远只有debug和release找不到构建就中止并报上面那个错。matchingFallbacks 回退机制给变体指定替补⚠️ 这里有个坑光写initWith debug是不够的。它只继承配置不混淆、不签名变体名字还是staging匹配照样失败。解法是给工位指定一个替补buildTypes { staging { initWith debug // :flutter 没有 staging 变体找不到时回退到 debug matchingFallbacks debug } prod { initWith release matchingFallbacks release } }matchingFallbacks就是告诉 Gradle找不到同名变体时用这个替补。加上它staging在:flutter侧解析到debug构建继续。这段连同源码注释在app/build.gradle里写得很清楚值得对着读一遍。你还会问demoflavor 在:flutter里同样找不到为什么不用配 fallback因为 flavor 按存在性匹配——:flutter一个 flavor 都没有时Gradle 让宿主的 flavor 自己兜底模块产物各 flavor 共用而 build type 必须显式声明回退没有默认值。换句话说buildType 自定义必须写matchingFallbacksflavor 自定义不用。这套测试把两者同时自定义就是要覆盖这个最别扭的组合。最小宿主长什么样接住模块、声明身份、跑起来这个宿主工程不用按文件捋记住三个角色就够了。角色一接住模块。干这件事的是settings.gradle里最不起眼的一行include :app setBinding(new Binding([gradle: this])) evaluate(new File(settingsDir.parentFile, hello/.android/include_flutter.groovy))evaluate指向的include_flutter.groovy由 Flutter 工具链生成、flutter pub get时刷新负责把:flutter子工程及依赖注册进宿主——模块就是这样挂进来的。注意路径约定模块目录必须与宿主工程同级、且目录名恰好是hello改名这里就断。角色二声明身份。namespace和applicationId决定 APK 的归属namespace io.flutter.addtoapp defaultConfig { applicationId io.flutter.addtoapp }角色三跑起来。入口是一个空壳 Activitypublic class MainActivity extends FlutterActivity { }继承 v2 嵌入的io.flutter.embedding.android.FlutterActivity一行代码不写——空壳能拉起模块里的 Dart 入口就说明引擎、Dart 产物、宿主集成这条链路是通的。至于gradle-wrapper.properties锁定的 Gradle 版本和gradle.properties里的 AndroidX 声明前者保证 CI 构建可复现后者是 v2 嵌入的硬性前提。四轮构建在验证什么四变体产物校验矩阵devicelab 任务dev/devicelab/bin/tasks/module_host_with_custom_build_test.dart在临时目录摆好工程后会做四轮构建轮与轮之间先gradlew clean构建命令变体验证目标产物校验标准app:assembleDemoDebugdemoDebug标准 debug 基线APK 内 Flutter 资产快照完整app:assembleDemoStagingdemoStagingbuildType 回退 debug同上APK 为app-demo-staging.apkapp:assembleDemoReleasedemoReleaserelease AOT 编译各 ABI 下libflutter.so、libapp.so齐全app:assembleDemoProddemoProdbuildType 回退 release逐 ABI 校验 AOT 产物你会发现校验标准是升级的debug 系走解释执行查flutter_assets资产在不在release 系走 AOT粒度细到各 ABI 下的libapp.soDart 编译产物和libflutter.so引擎是否都在包里。任务顺序扰动测试在防什么回归四轮之外还藏着一个动作。Gradle 默认先跑processDemoDebugManifest再跑mergeDemoDebugAssets测试故意在同一命令行里把这两步反序执行再 assemble、重新解包校验资产。这是回归保护历史上出过任务【免费下载链接】QuickRecorderA lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具项目地址: https://gitcode.com/GitHub_Trending/qu/QuickRecorder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门