TangIKUN 2026-03-16 16:45 采纳率: 0%
浏览 8

关于#android#的问题:请问flutter如何实现国内安卓App的热更新呀

请问flutter如何实现国内安卓App的热更新呀?flutter+安卓原生+iOS原生混合开发的App上架在国内应用市场(例如应用宝,华为应用市场,小米手机的应用市场等)的App可以通过shorebird进行热更新(主要是改一些Dart代码修复bug,不改原生层)吗?

  • 写回答

2条回答 默认 最新

  • 极客车云 2026-03-17 00:42
    关注

    在国内安卓市场实现Flutter热更新,需要兼顾合规性技术实现,因为国内应用商店(如应用宝、华为、小米等)对热更新的审核要求严格,核心是不能绕过应用商店的审核流程修改核心功能。以下是完整的解决方案,包含技术选型、实现步骤和合规注意事项:


    一、合规前提(必须遵守)

    国内应用商店对热更新的核心要求:

    1. 热更新的内容不能是核心功能,只能是UI样式、文案、非核心业务逻辑的小调整
    2. 必须提供热更新内容的审核入口给应用商店
    3. 不能在启动时强制更新,必须让用户可选择
    4. 热更新包必须经过应用商店的备案或审核(部分商店要求)

    二、技术选型推荐

    针对Flutter混合开发项目,推荐以下两种成熟方案:

    方案1:腾讯Tinker + Flutter Boost(适合复杂混合项目)

    Tinker是腾讯官方的热更新框架,支持Android原生和Flutter的热更新,兼容性好,国内使用广泛。

    方案2:Flutter官方flutter_app_bundle + 动态模块(适合纯Flutter为主的项目)

    利用Android App Bundle的动态交付能力,结合Flutter的dynamic_feature实现合规热更新。

    方案3:字节跳动Dokit + 自定义热更新(轻量需求)

    适合小团队,利用Dokit的热更新调试能力改造生产环境热更新。


    三、具体实现步骤(以Tinker为例)

    1. 集成Tinker到Android原生项目

    android/build.gradle中添加依赖:

    buildscript {
        dependencies {
            // Tinker插件
            classpath "com.tencent.tinker:tinker-patch-gradle-plugin:1.9.14.3"
        }
    }
    

    android/app/build.gradle中应用插件并配置:

    apply plugin: 'com.tencent.tinker.patch'
    
    tinkerPatch {
        oldApk = "${bakPath}/app-release.apk"
        ignoreWarning = false
        useSign = true
        dex {
            dexMode = "jar"
            pattern = ["classes*.dex"]
            loader = []
        }
        lib {
            pattern = ["lib/*/*.so"]
        }
        res {
            pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
            ignoreChange = []
            largeModSize = 100
        }
        packageConfig {
        }
        sevenZip {
            zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
        }
        buildConfig {
            keepDexApply = false
        }
    }
    

    2. 集成Flutter热更新能力

    Tinker默认支持Flutter的Dart代码热更新,只需要将Flutter的产物打包到Tinker补丁中:

    # 生成Flutter的release产物
    flutter build apk --release
    
    # 用Tinker补丁工具对比新旧APK生成补丁包
    python tinker-patch-old-new.py --old=old.apk --new=new.apk --output=patch_signed_7zip.apk
    

    3. 实现热更新下载和加载逻辑

    在Android原生中添加热更新管理类:

    public class TinkerManager {
        private static ApplicationLike tinkerApplicationLike;
    
        public static void initTinker(ApplicationLike appLike) {
            tinkerApplicationLike = appLike;
            TinkerInstaller.install(appLike);
        }
    
        public static void loadPatch(String patchPath) {
            TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);
        }
    }
    

    在Flutter中通过MethodChannel调用原生热更新:

    class HotUpdateManager {
      static const MethodChannel _channel = MethodChannel('hot_update');
    
      static Future<void> downloadAndInstallPatch(String patchUrl) async {
        try {
          await _channel.invokeMethod('downloadPatch', {'url': patchUrl});
        } on PlatformException catch (e) {
          print("热更新失败: ${e.message}");
        }
      }
    }
    

    4. 服务端部署补丁包

    将生成的补丁包上传到自己的服务器,提供版本校验接口:

    // 版本校验接口返回示例
    {
      "version": "1.0.1",
      "patchUrl": "https://your-server.com/patch_signed_7zip.apk",
      "desc": "修复了部分UI显示问题",
      "isForce": false
    }
    

    四、合规优化方案

    1. 添加热更新内容审核页面:在App内设置"版本更新"页面,展示所有热更新的内容日志,方便应用商店审核
    2. 用户确认机制:热更新前必须弹出对话框让用户确认,不能静默更新
    3. 回滚机制:如果热更新失败,自动回滚到上一个版本
    4. 上报机制:将热更新的使用情况上报到服务器,方便排查问题

    五、各应用商店热更新审核注意事项

    应用商店审核要求
    应用宝需要在开发者后台提交热更新备案,提供补丁包内容说明
    华为应用市场热更新内容不能涉及核心功能,必须提供更新开关
    小米应用市场禁止热更新修改支付、登录等核心模块,需要提交热更新协议
    OPPO应用商店热更新包大小不能超过10MB,必须提供更新日志
    VIVO应用商店禁止热更新绕过审核,需要在应用内展示更新内容

    六、替代方案:使用应用商店官方动态能力

    部分应用商店提供了官方的动态更新能力,比如:

    • 华为的动态能力平台
    • 小米的动态资源更新
    • 应用宝的微下载

    这些方案完全合规,但只能在对应品牌的手机上生效,适合单一品牌渠道的应用。


    七、总结

    1. 优先选择成熟的第三方框架(如Tinker),减少自研成本
    2. 严格遵守国内应用商店的合规要求,避免被下架
    3. 必须实现回滚机制,防止热更新导致应用崩溃
    4. 热更新内容尽量限制在非核心功能,避免审核风险

    如果你的项目是纯Flutter项目,也可以考虑使用flutter_hotreload的生产环境改造版本,但同样需要注意合规性。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月16日