一、解读flutter run命令
1.1 初识flutter run
1.1.1 IDE运行
编写完flutter代码后,一定离不开运行flutter应用。比如Android Studio可点击如下按钮来执行
ide_flutter_run
该命令默认是采用debug模式,如果需要运行release模式,可以在IDE选择中的Run->Configurations的Additional arguments里面加上--release参数
ide_run_config
1.1.2 命令行运行
既然运行应用是通过调用flutter run命令该命令对Android或者iOS设备是通用的,那么下面直接用命令方式来运行。
1)flutter run命令用于编译打包生成APP,然后安装到已连接设备上,并启动运行该APP的过程。
flutter_demo_debug
以Android为例,利用gradle来编译打包,最终apk产物位于/build/app/outputs/apk/debug/app-debug.apk。当flutter run命令后面不带任何参数默认采用的是debug模式,从上图可以看到APP右上角会带有DEBUG标识,对于非DEBUG模式则右上角不会有任何标识。当需要运行release模式,可运行命令:flutter run --release。
2)当调试性能(需要用到timeline),且修改本地Flutter引擎代码,则采用profile模式,运行命令:
flutter run --profile --disable-service-auth-codes --local-engine-src-path=/engine/src --local-engine android_profile
flutter_run_profile_log
从上图可以看出这是运行在Android设备上的profile模式,利用Gradle来构建APK,位于工程根目录下/build/app/outputs/apk/profile/app-profile.apk,安装到手机后并通过am start来启动该应用。对于Profile模式,启动Observatory调试器,可通过127.0.0.1:xxx地址,打开网页版性能分析工具Observatory,其中包含有timeline工具,类似于Android的systrace。
1.2 解读flutter run参数
1.2.1 参数表
通过前面会发现,flutter run后面可以跟不同的参数[arguments],具体有哪些参数如下所示:
arguments
说明
--debug
调试版本,这是默认模式
--profile
profile版本
--release
发布版本
--target-platform
指定app运行的目标平台,比如android-arm/android-arm64,iOS平台不可用
--target=
主入口,默认值lib/main.dart
--observatory-port
指定observatory端口,默认为0(随机生成可用端口)
--disable-service-auth-codes
关闭observatory服务鉴权
--trace-startup
跟踪应用启动/退出,并保存trace到文件
--trace-skia
跟踪skia,用于调试GPU线程
--trace-systrace
转为systrace,适用于Android/Fuchsia
--dump-skp-on-shader-compilation
转储触发着色器编译的skp,默认关闭
--verbose-system-logs
包括来自flutter引擎的详细日志记录
--enable-software-rendering
开启软件渲染,默认采用OpenGL或者Vulkan
--skia-deterministic-rendering
确定性采用skia渲染
--no-hot
可关闭热重载,默认是开启
--start-paused
应用启动后暂停
--local-engine-src-path
指定本地引擎源码路径,比如xxx/engine/src
--local-engine
指定本地引擎类型,比如android_profile
对于flutter 1.5及以上的版本,抓取timeline报错的情况下,可采用以下两个方案之一:
//方案1:关闭鉴权
flutter run --disable-service-auth-codes
//方案2:对于已安装应用,直接运行
adb shell am start -a android.intent.action.RUN -f 0x20000000 --ez enable-background-compilation true --ez enable-dart-profiling true --ez disable-service-auth-codes true --ez trace-skia true com.gityuan.flutterdemo/.MainActivity
如果不确定该应用的activity名,可以通过以下命令获取:
adb shell dumpsys SurfaceFlinger --list //方式一
adb shell dumpsys activity a -p io.flutter.demo.gallery //方式二
1.2.2 gradle参数说明
flutter run构建应用的过程,对于Android用到了gradle,下面列举gradle的参数。
参数
说明
PlocalEngineOut
引擎产物
Ptarget
取值lib/main.dart
Ptrack-widget-creation
默认为false
Pcompilation-trace-file
Ppatch
Pextra-front-end-options
Pextra-gen-snapshot-options
Pfilesystem-roots
Pfilesystem-scheme
Pbuild-shared-library
是否采取共享库
Ptarget-platform
目标平台
gradle参数说明会传递到build aot过程,其对应参数说明:
-output-dir:指定aot产物输出路径,缺省默认等于“build/aot”;
-target:指定应用的主函数,缺省默认等于“lib/main.dart”;
-target-platform:指定目标平台,可取值有android-arm,android-arm64,android-x64, android-x86,ios, darwin-linux_x64, linux-x64,web;
-ios-arch:指定ios架构类型,可取值有arm64,armv7,仅用于iOS;
-build-shared-library:指定是否构建共享库,仅用于Android;iOS强制为false;
-release:指定编译模式,可取值有debug, profile, release, dynamicProfile, dynamicRelease;
-extra-front-end-options:指定用于编译kernel的可选参数
–extra-gen-snapshot-options:指定用于构建AOT快照的可选参数
1.3 AOT产物命令
产物生成分为Android和iOS产物
Android AOT产物/build/app/intermediates/flutter/release/目录,最终安装到Android手机的是/build/app/outputs/release/app-release.apk
iOS AOT产物位于build/aot目录,最终安装到iOS手机是build/ios/iphoneos/Runner.app
1.3.1 Android AOT产物生成命令
// build aot命令
flutter build aot
--suppress-analytics
--quiet
--target lib/main.dart
--output-dir /build/app/intermediates/flutter/release/
--target-platform android-arm
--extra-front-end-options
--extra-gen-snapshot-options
--release
1.3.2 iOS AOT产物生成命令
// build aot命令
flutter build aot
--suppress-analytics
--target=lib/main.dart
--output-dir=build/aot
--target-platform=ios
--ios-arch=armv7,arm64
--release
1.4 flutter run原理说明
flutter run过程涉及多个flutter相关命令,其包含关系如下所示:
flutter_run_arch
图解:
flutter命令的整个过程位于目录flutter/packages/flutter_tools/,对于flutter run命令核心功能包括以下几部分:
flutter build apk:通过gradle来构建APK,由以下两部分组成:flutter build aot,分为如下两个核心过程,该过程详情见下一篇文章
frontend_server前端编译器生成kernel文件
gen_snapshot来编译成AOT产物</