热更新是一种需求吧。
自然会想到flutter 是否支持热更新。
然后一些群里问了问普遍反映不可以热更新,还说咸鱼的文章写了不支持热更新。
然后我表示很怀疑。
我的结论可以做到热更新
1.你需要把flutter 编译出来的类容放到sdcard 根目录
2.点击”加载根目录”编译生成产物
3.点击”启动”
你便可以看到效果了 (不骗你的)
其实这个apk 只做了一件事,那就是把 flutter_assets 目录里的所有内容
拷贝到 data/data/包名/app_flutter/flutter_assets目录下
比较暴力,暴力,暴力
copyDir(
Environment.getExternalStorageDirectory().getAbsolutePath()+"/flutter_assets",
FlutterMain.findAppBundlePath(getApplicationContext())
);
我觉得你应该了解以下类容
flutter 命令
cmd 里 执行 flutter -h 如下,这些内容可以百度
Global options:
-h, --help Print this usage information.
-v, --verbose Noisy logging, including all shell commands executed.
-d, --device-id Target device id or name (prefixes allowed).
--version Reports the version of this tool.
--bug-report Captures a bug report file to submit to the Flutter team (contains local paths, device
identifiers, and log snippets).
--flutter-root The root directory of the Flutter repository (uses $FLUTTER_ROOT if set).
Available commands:
analyze Analyze the project's Dart code.//分析项目的Dart代码。
build Flutter build commands.
channel List or switch flutter channels.//列出或切换颤振通道。
clean Delete the build/ directory.
config Configure Flutter settings.
create Create a new Flutter project.
devices List all connected devices.//列出所有连接的设备。
doctor Show information about the installed tooling.//显示有关已安装工具的信息。
drive Runs Flutter Driver tests for the current project.//运行当前项目的Flutter Driver测试。
emulators List and launch available emulators.//列出并启动可用的模拟器。
format Format one or more dart files.//格式化一个或多个dart文件。
fuchsia_reload Hot reload on Fuchsia.//热重装。
help Display help information for flutter.
install Install a Flutter app on an attached device.
logs Show log output for running Flutter apps.
packages Commands for managing Flutter packages.
precache Populates the Flutter tool's cache of binary artifacts.//填充Flutter工具的二进制工件缓存。
run Run your Flutter app on an attached device.
screenshot Take a screenshot from a connected device.//从连接的设备截取屏幕截图。
stop Stop your Flutter app on an attached device.
test Run Flutter unit tests for the current project.
trace Start and stop tracing for a running Flutter app.//启动和停止正在运行的Flutter应用程序的跟踪。
upgrade Upgrade your copy of Flutter.//升级您的Flutter副本。
这些内容可以百度
其中 flutter build
aot Build an ahead-of-time compiled snapshot of your app's Dart code.//为应用的Dart代码构建一个提前编译的快照。
apk Build an Android APK file from your app.
bundle Build the Flutter assets directory from your app.//从您的应用程序构建Flutter资产目录。
flx Deprecated//弃用
ios Build an iOS application bundle (Mac OS X host only).
更多的参数你可以参照 flutter.gradle
这个文件可以在 flutter\packages\flutter_tools\gradle 中找到如:
if (buildMode != "debug") {
project.exec {
executable flutterExecutable.absolutePath
workingDir sourceDir
if (localEngine != null) {
args "--local-engine", localEngine
args "--local-engine-src-path", localEngineSrcPath
}
args "build", "aot"
args "--suppress-analytics"
args "--quiet"
args "--target", targetPath
args "--target-platform", "android-arm"
args "--output-dir", "${intermediateDir}"
if (previewDart2) {
args "--preview-dart-2"
} else {
args "--no-preview-dart-2"
}
if (trackWidgetCreation) {
args "--track-widget-creation"
}
if (extraFrontEndOptions != null) {
args "--extra-front-end-options", "${extraFrontEndOptions}"
}
if (extraGenSnapshotOptions != null) {
args "--extra-gen-snapshot-options", "${extraGenSnapshotOptions}"
}
if (preferSharedLibrary) {
args "--prefer-shared-library"
}
if (targetPlatform != null) {
args "--target-platform", "${targetPlatform}"
}
args "--${buildMode}"
}
}
你在flutter 工程目录下 执行 flutter build bundle 即可生成编译文件 在 build 中
这里提下配置项
看类 FlutterMain.java
private static void initConfig(Context applicationContext) {
try {
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_SNAPSHOT_BLOB_KEY, "snapshot_blob.bin");
sFlutterAssetsDir = metadata.getString(PUBLIC_FLUTTER_ASSETS_DIR_KEY, "flutter_assets");
}
} catch (NameNotFoundException var2) {
throw new RuntimeException(var2);
}
}
也就是说 这些类容在什么位置,你完全可以在 metaData 里配置出来
编译生成产物
懒懒懒懒懒。。。。
这个自己看下就知道有些什么了,不一定非要知道每一个文件什么作用
系统拷贝assets那些内容到app_flutter目录
这个要看代码了,FlutterMain.java
private static void initResources(Context applicationContext) {
(new ResourceCleaner(applicationContext)).start();
sResourceExtractor = (new ResourceExtractor(applicationContext))
.addResources(SKY_RESOURCES)
.addResource(fromFlutterAssets(sFlx))
.addResource(fromFlutterAssets(sSnapshotBlob))
.addResource(fromFlutterAssets(sAotVmSnapshotData))
.addResource(fromFlutterAssets(sAotVmSnapshotInstr))
.addResource(fromFlutterAssets(sAotIsolateSnapshotData))
.addResource(fromFlutterAssets(sAotIsolateSnapshotInstr))
.addResource(fromFlutterAssets("kernel_blob.bin"))
.addResource(fromFlutterAssets("platform.dill"));
if (sIsPrecompiledAsSharedLibrary) {
sResourceExtractor.addResource(sAotSharedLibraryPath);
} else {
sResourceExtractor.addResource(sAotVmSnapshotData).addResource(sAotVmSnapshotInstr).addResource(sAotIsolateSnapshotData).addResource(sAotIsolateSnapshotInstr).addResource(sSnapshotBlob);
}
sResourceExtractor.start();
}
这里的 addResources和addResource 就是拷贝到 app_flutter目录的东西我就不一一列举了
其实这里才是重点,你要高清每一个文件,在更新时那些需要替换,那些是不变的,不然的话你全都替换比较暴力
希望哪位大神把这些文件怎么作用都整理出来,有人已经整理的请帖出地址