tag 标签: Flutter

相关博文
  • 热度 5
    2024-1-19 14:39
    1793 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 在嵌入式Linux设备上常使用Qt作为开发图形界面应用的框架,随着web和移动端图形框架技术快速发展,嵌入式Linux也可以从这些技术中受益。由Google开发的Flutter最初用于Android和iOS应用开发,后期加入web、Windwos桌面和Linux桌面的支持。配合适当的渲染引擎,Flutter也可以运行在嵌入式Linux设备上。文章将介绍如何在使用Linux BSP的Verdin iMX8M Plus上运行Flutter应用。 硬件介绍 本次演示使用基于NXP iMX8M Plus SoC 的计算机模块 Verdin iMX8M Plus 。底板为 Dahlia ,该底板可以直接使用Verdin iMX8M Plus 的 HDMI 显示输出。屏幕则使用支持电容屏的 HDMI 显示器,用于测试 Flutter 应用的交互性。 Flutter介绍 Flutter使用Dart语言开发,可以跨平台运行,支持AOT(Ahead of time)预编译,使应用在设备上更高效地运行。对于Flutter应用,用户通常只需要开发apps代码,Framework、Engine和Embedder都油Flutter SDK提供。使用不同的embedder,Flutter app可以运行在不同的平台上。目前官方支持embedder包括Android,iOS,MacOS、Windwos桌面、Linux桌面、Web浏览器 Linux桌面需要依赖GTK和X11,现在的嵌入式Linux系统已经普遍使用Wayland,例如NXP的iMX处理器在新的BSP已经不再支持X11。对于嵌入式Linux系统,可以使用下面两个非官方的embedder。 Flutter-elinux ,这是由Sony 维护的项目,支持 Arm64 和 X64 处理器。可以使用 Wayland 或者 X11 后台,或者直接基于 DRM。 Flutter-pi 是针对树莓派开发和优化的embbeder,其不依赖于 X11 和 GTK 的任何组件。支持 KMS 和 DRI,3D 硬件加速。可以运行在 ARMv7、ARMv8、x86 处理器上。Flutter-pi 拥有更活跃的社区和开发者。结合 flutterpi_tool 工具可以非常容易地开发flutter 应用。 Verdin iMX8M Plus 的 Linux BSP 支持 KMS,其 CPU 也是 Armv8 架构。因此,我们本次选用 Flutter-pi 作为 embedder。关于 Flutter-elinux 在 Toradex 模块上的应用,可以参考 该文章 。 添加meta-flutter meta-flutter 提供了编译flutter-pi 以及 flutter demo 的文件。meta-flutter 依赖 meta-clang layer。Toradex Linux BSP v6 基于 Yocto Project 的 kirkstone 分支。首先,参考 这里 创建Yocto Project 编译环境。然后进入 layers 文件夹,下载 meta-flutter 和 meta-clang。 $ git clone --branch kirkstone https://github.com/meta-flutter/meta-flutter.git $ git clone --branch kirkstone https://github.com/kraj/meta-clang.git 然后在build/conf/bblayers.conf 文件的 BBLAYERS 中添加 meta-flutter 和 meta-clang 的路径。 BBLAYERS ?= " \ ${BBLAYERS_NXP} \ ... ${TOPDIR}/../layers/meta-clang \ ${TOPDIR}/../layerss/meta-flutter \ " 在build/conf/local.conf 文件的结尾添加以下内容。 DEFAULT_TIMEZONE = "Asia/Shanghai" ENABLE_BINARY_LOCALE_GENERATION = "1" IMAGE_LINGUAS:append = " en-us en-gb es-us zh-cn" GLIBC_GENERATE_LOCALES:append = " en_US.UTF-8 es_US.UTF-8 en_GB.UTF-8 zh_CN.UTF-8" IMAGE_INSTALL:append = " tzdata-core tzdata-asia" DISTRO_FEATURES:append = " opengl wayland pam" PACKAGECONFIG:append:pn-weston = " remoting" PACKAGECONFIG:append:pn-flutter-engine = " profile debug" IMAGE_INSTALL:append = " flutter-auto packagegroup-flutter-test-apps \ flutter-pi flutter-gallery" IMAGE_INSTALL:remove = " packagegroup-tdx-qt5" 删除meta-flutter/recipes-platform/packagegroups/ packagegroup-flutter-test-apps.bb 中的 flutter-test-texture-egl。最后编译 tdx-reference-multimedia-image 镜像文件。 $ bitbake tdx-reference-multimedia-image 测试Flutter 应用 禁用自启动的weston 服务。 root@verdin-imx8mp:~# systemctl stop weston.service root@verdin-imx8mp:~# systemctl disable weston.service 镜像中的/usr/share/flutter/gallery/3.16.5/release 中已经包含一个 flutter gallery 应用,现在可以使用 flutter-pi 直接运行。 root@verdin-imx8mp:# cd /usr/share/flutter/gallery/3.16.5/release root@verdin-imx8mp:# flutter-pi --release ./ 在HDMI 显示器上可以看到 gallery 应用的界面。 安装Flutter SDK 和 flutterpi_tool 在Linux 电脑(例如 Ubuntu 23.04)上,首先安装 Flutter SDK。由于 Flutter 和 flutter-pi 两个项目更新都比较活跃,在安装前需求确认 Flutter 版本。在 这里 查看flutter-pi 目前使用的 Flutter 版本。例如撰写文章时其为 3.16.7。在 Flutter SDK 手动安装页面 选择对应的版本进行安装,如flutter_linux_3.16.7-stable.tar.xz。 $ sudo apt-get install clang cmake git ninja-build \ pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev $ cd FLUTTER_SDK_INSTALL_PATH $ tar vxf flutter_linux_3.16.7-stable.tar.xz $ export PATH="$PATH:`pwd`/flutter/bin" $ flutter doctor -v 上面的flutter 环境诊断工具如果提示缺少 chrome 浏览器,可以安装后再运行。 $ sudo dpkg -i google-chrome-stable_current_amd64.deb $ flutter doctor -v 检查flutter 和 dart 命令是否都来自同一个的 SDK 安装目录。 $ which flutter dart /home/ben/flutter-sdk/flutter/bin/flutter /home/ben/flutter-sdk/flutter/bin/dart 安装完Flutter SDK 后使用下面命令安装 flutterpi_tool $ flutter pub global activate flutterpi_tool $ export PATH="$PATH":"$HOME/.pub-cache/bin" 使用下面命令测试 $ flutterpi_tool --help 如果已经安装好Flutter SDK 和 flutterpi_tool,需要编译其他 flutter 应用时,只需要进入之前 Flutter SDK 的安装目录后执行下面命令,重新配置编译环境即可。 $ cd FLUTTER_SDK_INSTALL_PATH $ export PATH="$PATH:`pwd`/flutter/bin" $ export PATH="$PATH":"$HOME/.pub-cache/bin" 使用flutterpi_tool 编译应用 借助flutterpi_tool 可以非常简单的编译 flutter 应用,例如针对 64 位 Arm CPU 的编译命令 flutterpi_tool build --arch=arm64 --cpu=pi4 --release ,参数说明如下: 参数 说明 Runtime mode --debug Build for debug mode. --profile Build for profile mode. --release Build for release mode. --debug-unoptimized Build for debug mode and use unoptimized engine. (For stepping throughengine code) Target,--arch= arm Build for 32-bit ARM. (armv7-linux-gnueabihf) arm64 Build for 64-bit ARM. (aarch64-linux-gnu) x64 Build for x86-64. (x86_64-linux-gnu) Target,--cpu= generic (default) Don’t use a tuned engine. The generic engine will work on all CPUs of the specified architecture. pi3 Use a Raspberry Pi 3 tuned engine. Compatible with arm and arm64. (-mcpu=cortex-a53+nocrypto -mtune=cortex-a53) pi4 Use a Raspberry Pi 4 tuned engine. Compatible with arm and arm64. (-mcpu=cortex-a72+nocrypto -mtune=cortex-a72) 下面是在Linux电脑上编译flutter gallery应用。由于Verdin iMX8M Plus是基于arm64的Cortex-A53 CPU,因此选择--arch=arm64和--cpu=pi3两个参数。 $ git clone https://github.com/flutter/gallery.git flutter_gallery $ cd flutter_gallery/ $ git checkout 6a8d738c94d0710e229d726729c09fdb5ccaf7ed $ flutter pub get $ flutterpi_tool build --arch=arm64 --cpu=pi3 --release 编译结束后,在build/flutter_assets 目录下可以看到如下文件。 build/flutter_assets/ ├── app.so ├── AssetManifest.bin ├── AssetManifest.json ├── FontManifest.json ├── fonts ├── icudtl.dat ├── libflutter_engine.so ├── NOTICES.Z ├── packages └── shaders flutteri_tool 目前使用新的编译方法生成的文件结构尚不能直接使用 flutter_pi 在设备上直接运行,需要重新调整文件位置,参考 Verdin iMX8M Plus 上的 /usr/share/flutter/gallery/3.16.5/release 的内容。 release/ ├── data │ ├── flutter_assets │ └── icudtl.dat └── lib ├── libapp.so └── libflutter_engine.so 在flutter_gallery/build/flutter_assets/ 目录创建 data 和 lib 两个文件夹,app.so 重命名为 libapp.so 后和 libflutter_engine.so 一起移动到 lib 目录。icudtl.dat 移动到 data 目录下。在 data 目录下创建 flutter_assets 文件夹后,将 build/flutter_assets/ 中剩余的 AssetManifest.bin,AssetManifest.json,FontManifest.json,fonts,NOTICES.Z,packages 和 shaders 均移动到 data/flutter_assets 中。完场后将 data 和 lib 两个目录复制到 Verdin iMX8M Plus 上的 /home/root/flutter_gallery 目录中,例如使用 scp 命令。 $ scp -r build/flutter_assets/ root@imx8mp_ip:/home/root/flutter_gallery 复制好文件后可以在Verdin iMX8M Plus 上的 /home/root/flutter_gallery 看到以下内容。 root@verdin-imx8mp-07320826:~/flutter_gallery# ls * data: flutter_assets icudtl.dat lib: libapp.so libflutter_engine.so 运行下面命令即可启动在电脑上编译的flutter 应用。 root@verdin-imx8mp:~# flutter-pi --release /home/root/flutter_gallery/ 总结 使用Flutter 可以开发跨平台应用,并获得流畅的本地运行体验,在移动端和 Web 端都有广泛的应用。但是针对嵌入式 Linux 的 embedder 目前是第三方维护的,所以在实际应用时需要做详尽的测试。 ​
  • 热度 9
    2022-4-24 11:21
    1462 次阅读|
    0 个评论
    ​ B y Toradex 胡珊逢 在嵌入式设备上开发图形用户界面通常会选择 Qt 。这是一种经验证的方案,我们可以在多个领域看到用 Qt 开发的 UI 。但随着移动端和 web 端界面更为广泛地使用,源自于这两个领域的技术也开始向嵌入式设备渗透。 Flutter 就是一个例子。本文将介绍如何在 Torizon 平台上如何使用 Flutter 来开发用户界面。 Google 面向 Android, iOS 推出的跨平台移动应⽤开发框架 Flutter 可以构建高质量的原⽣⽤户界⾯ , 并可以扩展支持 Web 和桌面应用。 Flutter 尚未官方支持嵌入式系统 , 但目前 Sony 和 Ubuntu 正在致力于该工作。例如来自 Sony 的 elinux 可以在嵌入式平台上使用 Flutter 。我们也将以此为基础 , 在 Verdin iMX8M Plus 的 Torizon 上运行 Flutter 应用。 我们来看看 Flutter 的构架。如下图所示 , 其由三个部分构成 , User app, Framework 和 Engine 。 flutter-elinux-linux 属于为嵌入式提供支持的 embbedder 。它可以运行在 wayland 显示后台 , 这也是 Torizon 提供的显示框架。 flutter-elinux-linux 将提供 flutter-client , libflutter_elinux_wayland.so 和 libflutter_engine.so 。这些软件的功能参考该网页描述。 https://github.com/sony/flutter-embedded-linux/wiki/Features-of-Embedded-Linux-embedding-for-Flutter flutter-elinux 是 Flutter SDK 的一个非官方插件 , 用于为嵌入式设备创建、编译和调试 Flutter 应用 , 并使用 flutter-elinux-linux 在设备上显示。 为了减少对编译电脑的软件环境影响 , 我们将使用 docker 容器进行编译。使用下面命令获取 ubuntu:20.04 容器并进入其中。由于后面需要向容器内提供文件 , 这里将 /home/user/flutter 映射到容器内的 /opt/flutter 。 ----------------------------------------------- ~$ docker pull ubuntu:20.04 ~$ docker run -it -v /home/user/flutter:/opt/flutter --name flutter_build ubuntu:20.04 /bin/bash ----------------------------------------------- 如果后续进入该容器重新编译,可以使用下面命令: ----------------------------------------------- ~$ docker container start flutter_build ~$ docker exec -it flutter_build bash ----------------------------------------------- 在容器中安装所需的软件。 ----------------------------------------------- # apt update # apt upgrade # apt install clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev # apt install libwayland-dev wayland-protocols git curl wget unzip git # apt install python2 # apt install virtualenv ----------------------------------------------- 下载编译工具。 ----------------------------------------------- # mkdir -p /opt/flutter # cd /opt/flutter # git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git # export PATH=$PATH:$(pwd)/depot_tools ----------------------------------------------- 默认的 ubuntu:20.04 使用 Python3 ,在容器里使用 virtualenv 创建 Python2 环境。 ----------------------------------------------- # virtualenv .env -p python2 # source .env/bin/activate ----------------------------------------------- 创建 .gclient 文件并指定版本。 ----------------------------------------------- # cat .gclient solutions = ----------------------------------------------- 上面的 bd539267b42051b0da3d16ffa8f48949dce8aa8f 对应 ${path_to_flutter_sdk_install}/flutter/bin/internal/engine.version ,两者需要一致。如果不指定的话,会下载最新的版本。除非确实需要编译最新版本的 Engine ,否则并不推荐。 获取代码。 ----------------------------------------------- # gclient sync ----------------------------------------------- 编译 embbedder 。这里编译为 arm64 目标 release 模式的 embedder 。 ----------------------------------------------- # cd src # ./flutter/tools/gn --target-os linux --linux-cpu arm64 --runtime-mode release --embedder-for-target --disable-desktop-embeddings --no-build-embedder-examples # ninja -C out/linux_release_arm64 ----------------------------------------------- 编译成功后在 out/linux_release_arm64 目录中可以看到 libflutter_engine.so 文件。 接下来将编译 Embedded Linux embedding for Flutter ,这里会生成 flutter-client 和 libflutter_elinux_wayland.so 。如果在 X86 电脑上交叉编译需要使用 Yocoto Project 生成包含 clang 在内的 SDK , 这会涉及大量的工作内容。在 Torizon 中我们可以直接使用 debian 容器并通过 apt 命令安装相应的软件 , 在 Verdin iMX8M Plus 本地编译。这通常适用于代码量不是很多的项目。在 Verdin iMX8M Plus 上运行下面命令启动 debian 容器。 ----------------------------------------------- ~$ docker run -it -v /home/torizon/workspace:/opt/workspace torizon/debian:$CT_TAG_DEBIAN /bin/bash ----------------------------------------------- 在容器中安装所需的软件。 ----------------------------------------------- # apt update # apt install clang cmake build-essential pkg-config libegl1-mesa-dev libxkbcommon-dev libgles2-mesa-dev # apt install unzip git # apt install curl wget # apt install libwayland-dev wayland-protocols # apt install libdrm-dev libgbm-dev libinput-dev libudev-dev libsystemd-dev # cd /opt/workspace ----------------------------------------------- 下载 flutter-embedded-linux 代码。 ----------------------------------------------- # git clone https://github.com/sony/flutter-embedded-linux.git # cd flutter-embedded-linux/ # mkdir build ----------------------------------------------- 此时将刚才编译的 libflutter_engine.so 复制到 build 目录。然后分别执行下面两个命令。 ----------------------------------------------- # cmake -DUSER_PROJECT_PATH=examples/flutter-wayland-client -DCMAKE_BUILD_TYPE=Release .. # cmake -DUSER_PROJECT_PATH=examples/flutter-wayland-client -DCMAKE_BUILD_TYPE=Release -DBUILD_ELINUX_SO=ON -DBACKEND_TYPE=WAYLAND -DENABLE_ELINUX_EMBEDDER_LOG=OFF -DFLUTTER_RELEASE=ON .. ----------------------------------------------- 编译完成后在 build 目录下可以看到生成的 flutter-client 和 libflutter_elinux_wayland.so 两个文件。上面使用的编译选项含义请参考该 网页 说明。 接下来重新回到 X86 编译电脑开始 Flutter 应用的编译。用下面命令重新进入使之前的 ubuntu:20.04 容器。 ----------------------------------------------- ~$ docker exec -it flutter_build bash ----------------------------------------------- 下载 flutter-elinux 。这个是 Flutter SDK 。 ----------------------------------------------- # cd /opt/flutter/ # git clone https://github.com/sony/flutter-elinux # export PATH=$PATH:/opt/flutter/flutter-elinux/bin ----------------------------------------------- 运行下面命令查看安装情况。 ----------------------------------------------- # flutter-elinux doctor # flutter-elinux devices ----------------------------------------------- 创建一个示例工程。 ----------------------------------------------- # flutter-elinux create demo1 # cd demo1 ----------------------------------------------- 按照这里的说明交叉编译创建的工程。但在这之前需要准备 Verdin iMX8M Plus 的 arm64 格式文件系统。该文件系统可以是来自刚才在 Verdin iMX8M Plus 上编译 Embedded Linux embedding for Flutter 的容器。 在 Verdin iMX8M Plus 运行下面命令 , 查看容器 ID 。 ----------------------------------------------- $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3dea07245b24 torizon/debian:2-bullseye "/bin/bash" 2 days ago Exited (137) 2 hours ago hardcore_nightingale ----------------------------------------------- 将容器的文件系统复制出来并打包。 ----------------------------------------------- $ sudo docker cp 3dea07245b24:/ arm64-sysroot $ sudo tar cvf arm64-sysroot.tar arm64-sysroot ----------------------------------------------- 然后将 arm64-sysroot.tar 复制到 X86 编译电脑的 flutter_build 容器中,位于 /opt/flutter 目录。回到 flutter_build 容器,解压 arm64-sysroot.tar 。 ----------------------------------------------- # cd /opt/flutter/ # tar vxf arm64-sysroot.tar ----------------------------------------------- 进入刚才创建的 demo1 目录,运行下面命令编译。 ----------------------------------------------- # cd demo1 # flutter-elinux build elinux --target-arch=arm64 --target-sysroot=/opt/flutter/arm64-sysroot ----------------------------------------------- 待编译结束后,查看 build/elinux/arm64/release/bundle ,这里是 Flutter app 运行所需的所以文件。 ----------------------------------------------- # tree build/elinux/arm64/release/bundle -L 2 . |-- data | |-- flutter_assets | `-- icudtl.dat |-- demo1 `-- lib |-- libapp.so |-- libflutter_elinux_wayland.so `-- libflutter_engine.so ----------------------------------------------- libflutter_elinux_wayland.so 和 libflutter_engine.so 是 Fltter SDK 预编译的库文件,需要将其替换为之前编译的库文件。 将 flutter-client 和 bundle 文件夹复制到 Verdin iMX8M Plus 的 /home/torizon/flutter_demo 目录。然后先启动 weston 容器。 ----------------------------------------------- $ docker run -e ACCEPT_FSL_EULA=1 -d --rm --name=weston --net=host --cap-add CAP_SYS_TTY_CONFIG \ -v /dev:/dev -v /tmp:/tmp -v /run/udev/:/run/udev/ \ --device-cgroup-rule='c 4:* rmw' --device-cgroup-rule='c 13:* rmw' \ --device-cgroup-rule='c 199:* rmw' --device-cgroup-rule='c 226:* rmw' \ torizon/weston-vivante:$CT_TAG_WESTON_VIVANTE --developer weston-launch \ --tty=/dev/tty7 --user=torizon ----------------------------------------------- 再启动另外一个 torizon/weston-vivante 容器,在里面我们将用命令行的方式启动编译好的 demo1 。 ----------------------------------------------- $ docker run -e ACCEPT_FSL_EULA=1 -it --rm --name=wayland-app --user=torizon \ -v /dev/dri:/dev/dri -v /dev/galcore:/dev/galcore -v /tmp:/tmp -v /home/torizon/flutter_demo:/opt/flutter \ --device-cgroup-rule='c 199:* rmw' --device-cgroup-rule='c 226:* rmw' \ torizon/weston-vivante:$CT_TAG_WESTON_VIVANTE bash ----------------------------------------------- 在启动的容器内运行下面命令。 ----------------------------------------------- # cd /opt/flutter # LD_LIBRARY_PATH=/opt/flutter/bundle/lib/ ./flutter-client -b /opt/flutter/bundle ----------------------------------------------- 最后,我们将介绍如何导入一个现成的 Flutter 项目并打包为一个容器,用 docker-compose 文件启动。这里以 covid19_mobile_app 为例进行说明。 在 flutter_build 容器中,下载 covid19_mobile_app 代码,将之前 demo1 目录中的 elinux 文件夹复制到 covid19_mobile_app 后再编译。同样 , libflutter_elinux_wayland.so 和 libflutter_engine.so 也需要替换为之前编译的库文件。 ----------------------------------------------- # cp -r ../demo1/elinux covid19_mobile_app # flutter-elinux pub get # flutter-elinux build elinux --target-arch=arm64 --target-sysroot=/opt/flutter/arm64-sysroot ----------------------------------------------- 编译结束后,将 covid19_mobile_app 的 bundle 目录连同 flutter-client ,以及下面的 startup.sh , Dockerfile 放到任一目录中。 startup.sh ----------------------------------------------- #!/bin/bash LD_LIBRARY_PATH=/home/torizon/bundle/lib/ /usr/sbin/flutter-client -b /home/torizon/bundle ----------------------------------------------- Dockerfile ----------------------------------------------- FROM --platform=linux/arm64 torizon/weston-vivante:2 ADD bundle /home/torizon/bundle COPY flutter-client /usr/sbin COPY startup.sh /home/torizon CMD ----------------------------------------------- 运行下面命令生成一个 flutter app 容器。 ----------------------------------------------- $ docker build -t flutter_demo:1 . ----------------------------------------------- 将 flutter_demo:1 容器和 docker-compose.yml 文件复制到 Verdin iMX8M Plus 上。 docker-compose.yml ----------------------------------------------- services: flutter_demo_covid19: depends_on: - weston devices: device_cgroup_rules: - c 199:* rmw - c 226:* rmw volumes: - /tmp:/tmp:rw - /dev/dri:/dev/dri:rw - /dev/galcore:/dev/galcore:rw weston: cap_add: - CAP_SYS_TTY_CONFIG device_cgroup_rules: - c 4:0 rmw - c 4:7 rmw - c 13:* rmw - c 199:* rmw - c 226:* rmw environment: - ACCEPT_FSL_EULA=1 image: torizon/weston-vivante:2 network_mode: host volumes: - source: /tmp target: /tmp type: bind - source: /dev target: /dev type: bind - source: /run/udev target: /run/udev type: bind version: '2.4' ----------------------------------------------- 运行 docker-compose up -d 即可启动 weston 和 flutter app 容器。 总结 Flutter 框架为图形界面开发提供一个非常灵活的方案,使得嵌入式开发也可以从中受益。于此同时,嵌入式 Linux 对 Flutter 的支持也处于早期阶段,项目开发需要充分验证。
相关资源
  • 所需E币: 0
    时间: 2024-6-24 15:24
    大小: 3.05KB
    虽然Flutter的成长曲线和未来前景看起来都很好,但不可否认的是,目前Flutter仍处在发展阶段,很多大型互联网企业都无法毫无顾虑地让全线App接入,而其中最主要的顾虑是包大小与动态化。动态化代表着更短的需求上线路径,代表着大大压缩了原始包的大小,从而获得更高的用户下载意向,也代表着更健全的线上质量维护体系。当明白这些意义后,我们也就不难理解,在Flutter的应用与适配趋近完善时,动态化自然就成为了一个无法避开的话题。RN和Weex等成熟技术甚至让大家认为动态化是跨端技术的标配。一、什么是动态化?目前移动端应用的版本更新,最常见的方式是定期发版,无论是安卓还是iOS,都需要提交新的安装包到应用市场进行审核。审核通过后,用户在应用市场进行App的下载更新。而动态化,就是不依赖更新程序安装包,就能动态实时更新页面的技术。二、动态化的必要性为什么需要动态化技术呢?因为上述定期发版更新应用的方式存在一些问题,比如:1、审核周期长,且可能审核不通过。周期长导致发版本不够灵活,紧急的业务需求不能及时上线。2、线上出现急需修复的bug时,需要较长修复周期,影响用户体验。3、安装包过大,动辄几十兆几百兆的应用升级可能会让用户比较抗拒。4、即使上线了,也无法达到全部用户升级,服务端存在兼容多版本App的问题。三、Flutter的动态化可以通过在Flutter应用程序中集成可编程的UI组件来实现,例如将Dart代码作为字符串从服务器端下载并评估,从而生成新的UI元素。下面是一些设计思路和代码实现:1、使用Flutter的自定义渲染器(CustomRenderer):您可以编写一个自定义渲染器,该渲染器将解析从服务器或其他来源下载的UI描述,并使用FlutterFrameworkAPI构建UI元素。这种方法需要更多的开发工作,但它提供了更大的灵活性和控制权。2、使用FlutterWidget树序列化:FlutterWidget树可以序列化为JSON格式,并可以发送到移动设备上的Flutter应用程序。您可以使用此功能,从远程服务器下载UI树并将其反序列化为真实的Flutter组件树。3、使用Flutter插件:在Flutter中,插件是一个独立的、客户端库,在Flutter应用程序中运行。您可以编写一个插件,使其可以从云服务器下载所有UI元素并展示给用户四、实现思路 按道理iOS上也可以采取跟Android同样的思路,但是由于苹果开发者协议的规定,不允许动态更新、运行可执行代码;所以在Flutter资源的处理上,我们可以采用同Android一样的思路,但是对代码的处理,我们需要寻找新的方案。回顾之前的这些跨端方案,我们可以参照RN的实现,只不过N不再是Native了,而是Flutter。RN是通过JS控制Native渲染,我们要实现的是通过JS控制Flutter渲染。五、Flutter发展前景随着移动应用市场的不断扩大,跨平台开发框架的需求也越来越大。Flutter框架可以帮助开发者在不同平台上快速开发高质量的移动应用程序,这种趋势将进一步推动Flutter的发展和普及。作为一名Android开发工程师,学习Flutter框架是非常有必要的。因为现在的前端开发已经不仅仅局限于网页开发,而是需要涉及到多个平台的应用开发。如果掌握了Flutter框架的开发技能,就可以更好地满足前端开发的多样化需求。从19年过去的几年时间,Flutter在Google带领各大厂商的引领下,飞速发展。fluttersdk官方也在快速的迭代升级,从1.0到现在的3.1,从底层引擎到适配层再到框架层都有比较大的更新。六、Flutter动态化解决方案的两种方法:1.热重载(HotReload):热重载是Flutter框架的一项独特功能,它允许开发者在应用运行时快速预览代码更改的效果,而无需重新启动整个应用。热重载使开发人员可以实时查看界面、布局和功能等变化,并立即在应用中看到这些变化的效果。2.插件化(FlutterPlugin):插件化是一种在Flutter应用中集成动态化插件的方法,可以在应用运行时动态加载新的功能模块或代码。开发人员可以编写自定义插件,将其集成到应用中,以实现动态化更新和扩展功能的目的。七、动态化方案调研在Flutter实践层面,简单来说分为三个流派:方案一:JavaScript是最好的语言(碰瓷PHP)主要思路:利用Flutter做渲染,开发使用js,逻辑层通过v8/jscore解释运行。代表框架是腾讯的MXFlutter。这个框架是开源的,大写的。方案二:DSL+JS主要思路:基于模板实现动态化,主要布局层采用Dart转DSL的方式,逻辑层使用JS。代表框架是58同城开源的Fair。方案三:布局,逻辑,一把梭主要思路:与方案一最主要的区别是,逻辑层也是使用dart,增加了一层语法解析和运行时。有一个代表,美团的MTFlutter,然而没有开源动向,无从考察更多。
  • 所需E币: 0
    时间: 2024-3-6 09:36
    大小: 3.06KB
    上传者: 开心就很好了
    跨平台高手必修课--Flutter动态化解决方案实战之手把手带你自研一套Flutter动态热更新框架。Flutter作为跨平台首选框架,未来可期,但动态化问题一直是行业诟病的问题。所以,各大公司都急需一套成熟且高效的动态化解决方案,因此,动态化方面的人才缺口巨大。在本文中,我将带大家从0到1自主研发一套Flutter动态化框架,并深入掌握跨平台动态化解决方案,助力你在跨平台技术上有质的飞跃。一、首先,我们先来认识Flutter:Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。[5]Flutter开源、免费,拥有宽松的开源协议,适合商业项目。Flutter可以方便的加入现有的工程中。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。它也是构建未来的GoogleFuchsia应用的主要方式。Flutter组件采用现代响应式框架构建,这是从React中获得的灵感,中心思想是用组件(widget)构建你的UI。组件描述了在给定其当前配置和状态时他们显示的样子。当组件状态改变,组件会重构它的描述(description),Flutter会对比之前的描述,以确定底层渲染树从当前状态转换到下一个状态所需要的最小更改。二、Flutter的特点和优势Flutter具有以下特点和优势:跨平台开发:Flutter允许开发人员使用单个代码库构建应用程序,可在多个平台上运行,包括iOS、Android、Web和桌面操作系统。这简化了跨平台开发的流程,减少了开发成本和工作量。响应式UI:Flutter采用响应式编程模型,允许开发人员根据数据的变化自动更新UI。这意味着UI可以根据应用程序状态的变化实时更新,提供流畅的用户体验。热重载(HotReload):Flutter的热重载功能允许开发人员在应用程序运行时快速查看和调试代码更改。开发人员可以实时看到UI的变化,加快了开发周期,提高了开发效率。自绘引擎:Flutter使用Skia图形引擎进行渲染,这意味着应用程序的每个像素都可以通过Flutter进行绘制。这样可以实现高度自定义的UI设计和动画效果,并提供卓越的性能。丰富的UI组件:Flutter提供了一套丰富而强大的UI组件,可以用于构建漂亮和现代化的用户界面。这些组件具有高度的可定制性,使开发人员能够创建独特的应用程序界面。开发效率:Flutter的热重载、响应式UI和丰富的UI组件使开发人员能够更快速地开发应用程序。单个代码库的使用也简化了代码维护和版本控制的过程。社区支持和生态系统:Flutter拥有庞大的开发者社区和活跃的生态系统。开发人员可以从社区中获取大量的资源、插件和解决方案,加快开发进程,并且可以与其他开发者进行交流和合作。良好的性能:由于Flutter使用自绘引擎和硬件加速,应用程序可以实现卓越的性能。Flutter应用程序通常具有快速的响应时间、流畅的动画效果和较低的内存占用。三、Flutter可以用来做什么?Flutter是一个开源的移动应用程序开发框架,它主要用于移动平台的应用程序开发。Flutter具有许多优势,可以用于开发各种类型的应用程序,包括游戏、社交、生产力和移动应用等。以下是Flutter可以用于开发的一些应用程序类型:游戏:Flutter可以用于开发各种类型的游戏,包括桌面游戏、移动游戏和嵌入式游戏。Flutter提供了高性能的虚拟现实开发工具,可以帮助开发者创建逼真的3D游戏和交互式应用程序。社交应用:Flutter可以用于开发社交应用程序,包括WhatsApp和Facebook等平台。Flutter提供了跨平台的开发工具,可以让开发者使用同一代码库开发多个平台的应用程序。生产力应用:Flutter可以用于开发生产力应用程序,例如任务管理应用程序、金融应用程序和调查应用程序等。Flutter提供了可扩展的开发环境,可以让开发者在不同设备上使用同一代码库进行开发。移动应用:Flutter可以用于开发跨平台的移动应用程序,包括iOS和Android等平台。Flutter提供了丰富的组件和库,可以帮助开发者快速构建原生移动应用程序。桌面应用:Flutter可以用于开发桌面应用程序,包括桌面工具、应用程序和游戏等。Flutter提供了丰富的组件和库,可以帮助开发者快速构建原生桌面应用程序。总的来说,Flutter是一个非常强大的框架,可以用于开发各种类型的应用程序,包括游戏、社交、生产力和移动应用等。开发者可以使用Flutter的高性能、可扩展性和跨平台特性,快速构建具有吸引力和可用性的应用程序。四、Flutter安装安装Flutter的过程通常涉及以下几个步骤:1、下载FlutterSDK。访问Flutter官网,选择并下载最新版本的FlutterSDK2、解压FlutterSDK。将下载的FlutterSDK解压到指定的文件夹,例如,在Windows系统中,通常建议将解压后的文件夹放在`C:\Users\你的用户名\flutter`路径下。3、配置环境变量。在系统环境变量中添加FlutterSDK的路径到`PATH`变量中,例如,在Windows系统中,可以在`系统属性`的`环境变量`部分添加`ANDROID_HOME`和`FLUTTER_STORAGE_BASE_URL`等变量,并相应地设置值。4、安装AndroidStudio或VisualStudioCode。如果计划开发Android应用,需要安装AndroidStudio,并确保安装了AndroidSDKCommand-lineTools;如果计划开发iOS应用,可以选择安装VisualStudioCode并安装Flutter插件。5、配置Flutter和Dart插件。在AndroidStudio或VisualStudioCode中,通过设置菜单找到并安装Flutter和Dart插件。6、运行flutterdoctor。在命令行中,运行`flutterdoctor`来检查并解决可能遇到的问题,如缺少必要的依赖项或环境变量设置不正确完成这些步骤后,就可以在Flutter中创建和运行你的第一个项目了