Flutter Android 端热修复(热更新)实践

在本次 文章中,简单分析了一下 Flutter 在 Android 端的启动流程,虽然没有更深入的分析,但是我们可以了解到,对于 Flutter 端的 Dart VM 的启动等,是通过 Android 传递的资源(或者说路径)过去,Dart VM 加载这些资源完成初始化的,那么我们可以通过动态替换资源就可以达到热更新的目的。

注意:

  • 不同版本的 Flutter 代码与逻辑可能有所不同,但整体流程大同小异。
  • 同样的,不同版本 Flutter 编译之后的产物不同,
  • Release 模式 和 Debug 模式下的编译产物不同,这里以 Release 为例,代码也是 Release 版本的代码。

本次测试的开发环境:

  • Android Studio 3.5
  • Flutter 1.10.3-pre.39 chanel master
  • Dart 2.6.0

一、资源复制

通过之前文章的分析,可以知道,FlutterMain 这个类中,会传递指定资源路径,提供给 Dart VM 进行初始化。

这里面有两个重要的资源,一个是 libflutter.so ,一个是 libapp.so。 通过名字就可以看出来,libflutter.so 是框架相关的库,而 libapp.so 就是我们写的代码编译成的 so 库,我们就是要通过动态替换这个文件,达到热更新的目的。

为了能够让 Dart VM 加载我们修改之后的 so 库,我们肯定需要将修改后的 so 库放到 app 的私有目录下。这里直接从手机根目录下获取,当然从网络下载等都是同样的道理。 先定义一个辅助类,将文件复制到手机私有目录下。

public class FlutterFileUtils {
    ///将文件拷贝到私有目录
    public static String copyLibAndWrite(Context context, String fileName){
        try {
            File dir = context.getDir("libs", Activity.MODE_PRIVATE);
            File destFile = new File(dir.getAbsolutePath() + File.separator + fileName);
            if (destFile.exists() ) {
                destFile.delete();
            }

            if (!destFile.exists()){
                boolean res = destFile.createNewFile();
                if (res){

                    String path = Environment.getExternalStorageDirectory().toString();
                    FileInputStream is = new FileInputStream(new File(path + "/" + fileName));

                    FileOutputStream fos = new FileOutputStream(destFile);
                    byte[] buffer = new byte[is.available()];
                    int byteCount;
                    while ((byteCount = is.read(buffer)) != -1){
                        fos.write(buffer,0,byteCount);
                    }
                    fos.flush();
                    is.close();
                    fos.close();
                    return destFile.getAbsolutePath();
                }
            }
        }catch (IOEx
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值