flutter生成源代码_源码解读Flutter run原理

一、解读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产物</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值