Flutter混合开发和动态更新的探索历程 Android版

本文探讨了Flutter框架在国内中大型应用如闲鱼中的实践,详细解析了Flutter与原生应用混合开发的方法,包括理解Flutter核心产物、初始化流程及解决SO兼容性问题。同时,提出并实现了基于替换核心产物的Flutter界面动态更新方案。

Flutter是Google推出的可以高效构建Android、iOS界面的移动UI框架,在国内中大公司像闲鱼/Now直播等app陆续出现它的影子,当然闲鱼的最为成熟,闲鱼也非常的高效产出了很多优秀的文章。

本文是基于Flutter SDK : 0.7.3
在最新的SDK v0.11.13中或者说运行后发现没有PathProviderPlugin / SharedPreferencesPlugin 对应的目录以及jar包,那是因为新版本中已经不需要了 自然就可以删除。

可是

可是,网上能找到的混合开发方案或者动态更新flutter的相关文章都没法符合我自己理想的效果。所以自己摸索了一套混合开发和动态更新的方案,这里记录一下摸索过程。

Flutter源码分析

如果说把自家的app改造成纯Flutter方案那是不可能的,顶多是某个模块或者某些模块改成Flutter,所以自然想到Flutter如何跟原生混合开发,混合开发不是说java去调用dart中的方法更多的是指如何从当前Activity跳转到Flutter实现的界面,要像知道这些东西那么必须得弄懂Flutter源码,不求深入但求知之一二三四。
Android的应用那么自然先找Application,所以很快找到了FlutterApplication:

public class FlutterApplication extends Application {
    private Activity mCurrentActivity = null;

    public FlutterApplication() {
    }

    @CallSuper
    public void onCreate() {
        super.onCreate();
        FlutterMain.startInitialization(this);
    }

    public Activity getCurrentActivity() {
        return this.mCurrentActivity;
    }

    public void setCurrentActivity(Activity mCurrentActivity) {
        this.mCurrentActivity = mCurrentActivity;
    }
}

还行初始化的东西不多,直接进入onCreate对应的FlutterMain.startInitialization中去看看:

public static void startInitialization(Context applicationContext, FlutterMain.Settings settings) {
      long initStartTimestampMillis = SystemClock.uptimeMillis();
      initConfig(applicationContext);
      initAot(applicationContext);
      initResources(applicationContext);
      System.loadLibrary("flutter");
      long initTimeMillis = SystemClock.uptimeMillis() - initStartTimestampMillis;
      nativeRecordStartTimestamp(initTimeMillis);
 }

不具体一行一行的看代码,但是看到了几个很关键的词在initConfig方法中:

private static void initConfig(Context applicationContext) {
	  Bundle metadata = applicationContext.getPackageManager().getApplicationInfo(applicationContext.getPackageName(), 128).metaData;
	  if (metadata != null) {
	      sAotSharedLibraryPath = metadata.getString(PUBLIC_AOT_AOT_SHARED_LIBRARY_PATH, "app.so");
	      sAotVmSnapshotData = metadata.getString(PUBLIC_AOT_VM_SNAPSHOT_DATA_KEY, "vm_snapshot_data");
	      sAotVmSnapshotInstr = metadata.getString(PUBLIC_AOT_VM_SNAPSHOT_INSTR_KEY, "vm_snapshot_instr");
	      sAotIsolateSnapshotData = metadata.getString(PUBLIC_AOT_ISOLATE_SNAPSHOT_DATA_KEY, "isolate_snapshot_data");
	      sAotIsolateSnapshotInstr = metadata.getString(PUBLIC_AOT_ISOLATE_SNAPSHOT_INSTR_KEY, "isolate_snapshot_instr");
	      sFlx = metadata.getString(PUBLIC_FLX_KEY, "app.flx");
	      sSnapshotBlob = metadata.getString(PUBLIC
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值