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

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

被折叠的 条评论
为什么被折叠?



