flutter已经支持安卓热更新_flutter 在 android 上的热更新

热更新是一种需求吧。

自然会想到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目录的东西我就不一一列举了

其实这里才是重点,你要高清每一个文件,在更新时那些需要替换,那些是不变的,不然的话你全都替换比较暴力

希望哪位大神把这些文件怎么作用都整理出来,有人已经整理的请帖出地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值