
跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载导读本文基于 Flutter Engine 仓库中 shell/platform/android/README.md 的官方说明结合仓库源码展开系统讲解 Android EmbedderAndroid 平台嵌入层的职责划分、代码布局、测试体系与开发环境配置。读完本文你将掌握Android Embedder 如何初始化 Flutter 引擎、如何提供平台渲染视图与分发事件如何通过run_tests.py运行 Java 与 C 单元测试、如何在真机/模拟器上跑集成测试以及如何搭建 Cclangd与 JavaAndroid Studio两套开发环境。一、Android Embedder 是什么Flutter Engine 在 Android 上的落地依赖一个被称为Android Platform Embedder的组件。它位于仓库的 shell/platform/android 目录包含两大部分Javaio.flutter源码位于 shell/platform/android/io/flutter即官方所称的 Flutter Android EmbeddingAndroid 专属的引擎侧 C 代码位于 shell/platform/android 及其子目录。官方文档将其职责归纳为三件事初始化 Flutter 引擎——加载libflutter.so、创建 Shell、启动 Dart VM 与 Dart Isolate为 Flutter 引擎提供可渲染的平台视图——把 Android 的Surface/SurfaceTexture等后端与引擎的光栅化管线对接起来向 Flutter 引擎分发事件——触摸事件、键盘事件、语义accessibility更新、平台消息等。这三件事正好对应三类核心源码初始化逻辑集中在FlutterJNI/FlutterLoader/android_shell_holder.cc视图对接集中在FlutterView/android_surface_*/AndroidContext事件分发则贯穿FlutterView、AndroidTouchProcessor与 JNI 桥接层。[!CAUTION] 原文档特别声明这是对 Android Embedder 的尽力而为的说明不保证始终最新、完整如果发现与代码不一致欢迎提交 Pull Request 修正。二、代码布局Java 侧与 C 侧Android Embedder 的开发需要同时接触 Java 与 C理解二者的边界是第一步。2.1 C 侧关键文件原文档列出了以下重点文件均在 shell/platform/android 下文件作用context/android_context.h持有跨 Android Surface 共享的状态。从源码看AndroidContext管理渲染 API 类型AndroidRenderingAPI、供栅格线程共享的 SkiaGrDirectContextSetMainSkiaContext/GetMainSkiaContext以及 Impeller 的impeller::Context软件渲染路径下 Skia context 为nullptrjni/platform_view_android_jni.h允许从任意线程调用运行在 JVM 中的 Java 代码多数方法只能在平台线程调用。该接口刻意不直接依赖 Android 工具链以便用宿主工具链编译的单元测试也能使用AndroidManifest.xml供 tools/android_lint 使用的清单文件BUILD.gnGN 构建脚本负责构建 C 侧 Embedder 测试以及引擎的flutter.jarndk_helpers.h动态加载并调用 Android NDKC/C函数的辅助工具当前仓库中该职责已由library_loader.cc承担见 BUILD.gn 的flutter_shell_native_src源码列表platform_view_android.hAndroid Embedder 的主入口PlatformViewAndroid继承自引擎公共的PlatformView负责创建/销毁 Surface、分发平台消息与语义动作、注册外部纹理、加载 Dart 延迟库等2.2 Java 侧关键文件Java 代码位于 shell/platform/android/io/flutter测试位于 shell/platform/android/test/io/flutter测试运行器在 shell/platform/android/test_runner。原文档点名了三个文件io/flutter/embedding/android/FlutterActivity.java一个展示全屏 Flutter UI 的Activity。从源码的类注释看它负责启动画面、状态栏外观、Dart 入口函数与入口参数、初始路由、透明渲染、实例状态保存/恢复并支持子类覆写getDartEntrypointFunctionName()、getInitialRoute()等方法来定制行为io/flutter/embedding/engine/FlutterJNI.javaJava 侧与 C 引擎之间的接口。源码注释明确说明Flutter 全部 JNI API 都集中在这一类因为 JNI 调用本质是静态的、需要在 C 侧注册集中管理可以显著降低注册复杂度每个FlutterJNI实例在attachToNative()后持有native platform view ID随后的每个平台视图相关调用都会带上该 IDio/flutter/view/TextureRegistry.java单个FlutterView使用的后端纹理注册表提供createSurfaceTexture()、createSurfaceProducer()、createImageTexture()等入口条目可嵌入 Flutter 的Texturewidget。2.3 构建产物如何组装从 BUILD.gn 可以看到完整的构建链flutter_shell_native是一个shared_library输出名为libflutter.so通过android_exports.lst的 version script 控制导出符号flutter_shell_java用javac.py把android_java_sources约 200 个 Java 文件编译成flutter_embedding_runtime_mode.jar并明确以--java-version1.8保证向后兼容android_jar再通过create_flutter_jar.py把 embedding jar 与libflutter.so打包成最终的flutter.jar依赖方面embedding 需要大量 AndroidX 构件activity、fragment、lifecycle系列、kotlin-stdlib等全部由third_party/android_embedding_dependencies以本地 jar 形式提供渲染后端通过shell_gpu_configuration(android_gpu_configuration)配置Android 同时启用 software、GL 与 Vulkan禁用 Metal。三、测试体系单元测试与集成测试原文档将 Android Embedder 的测试明确分为两类单元测试侧重测试 Embedder 内部的契约contracts集成测试将引擎与 Embedder 放在一起、通常配合一个 Flutter App 测试这也是用户实际使用引擎的方式。3.1 单元测试单元测试分布在两个地方shell/platform/android/testJava 单元测试shell/platform/android 下所有以_unittests.cc结尾的 C 文件。最简单的运行方式是使用引擎根目录的 testing/run_tests.py这是最省事、但不是最快的方式# 假设你位于引擎仓库根目录run_tests.py 所在位置 ./testing/run_tests.py --type java # 容易混淆的是这些是为 Android 编译的 C 测试 ./testing/run_tests.py --type android # 如果你使用的是 android_debug_unopt_arm64 构建 ./testing/run_tests.py --type android --android-variant android_debug_unopt_arm64 ./testing/run_tests.py --type java --android-variant android_debug_unopt_arm64补充说明C 单测的构建目标从 BUILD.gn 看flutter_shell_native_unittests汇集了android_context_gl_unittests.cc、android_shell_holder_unittests.cc、apk_asset_provider_unittests.cc、platform_view_android_unittests.cc等测试源依赖 gtest/gmock 与jni_mock见 shell/platform/android/jni并通过jni_mock让宿主工具链也能编译测试Java 单测的运行方式据 shell/platform/android/test/README.md引擎内全部 Java 代码基于Robolectric 4.12.1 JUnit 4测试且支持--java-filtertest_class_name只跑某个测试类例如testing/run_tests.py --android-variantandroid_debug_unopt_arm64 --typejava --java-filterio.flutter.embedding.android.FlutterViewTest注意run_tests.py本身不会构建引擎二进制构建需要先单独完成如et build -c android_debug_unopt_arm64源码变更后同样需要重新构建新增 Java 测试的规范流程来自 test/README.md在test/下按被测类路径建*Test.java→ 加入BUILD.gn中robolectric_tests的sources→ 在FlutterTestSuite.java的SuiteClasses中注册 → 编写测试 → 用run_tests.py运行。若出现ClassNotFoundException或找不到 import通常与 tools/cipd 中 Android embedding 依赖包的更新有关想在控制台看到 Robolectric 日志可在测试中import org.robolectric.shadows.ShadowLog;并设置ShadowLog.stream System.out;。你也可以尝试直接从 Android Studio 运行这些测试。3.2 集成测试Android Embedder 的集成测试大多存在于引擎仓库之外官方原话出于某些历史原因。运行集成测试需要一份 Flutter 仓库 checkout$FLUTTER一个可用的 Android 模拟器或真机。典型流程如下# 为 Android 构建一份最新的 Flutter 引擎。 cd $ENGINE/src # 也可以使用你喜欢的参数和构建变体。 ninja -j1000 -C ../out/android_debug_unopt_arm64 android_jar # 运行测试。这里给出 *1* 个例子 cd $FLUTTER/dev/integration_tests/external_textures flutter drive \ --local-engine-host$ENGINE/out/host_debug_unopt_arm64 \ --local-engine$ENGINE/out/android_debug_unopt_arm64另一个目前仍需手动操作的测试来源是flutter/packages仓库cd $PACKAGES/packages/video_player/video_player_android/example flutter run \ --local-engine-host$ENGINE/out/host_debug_unopt_arm64 \ --local-engine$ENGINE/out/android_debug_unopt_arm64[!NOTE] Android 上外部纹理的渲染方式取决于设备 API 级别。例如要测试 OpenGLES 分支使用SurfaceTexture通常需要一个 API 29 或更低的老设备/模拟器。你也可以在本地强制引擎改用SurfaceTextures// shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java - VisibleForTesting static boolean debugForceSurfaceProducerGlTextures false; VisibleForTesting static boolean debugForceSurfaceProducerGlTextures true;……然后重新构建引擎。这个调试开关在源码中确实存在FlutterRenderer.java 声明了VisibleForTesting public static boolean debugForceSurfaceProducerGlTextures其选择逻辑位于createSurfaceProducer()当开关为false、SDK 版本不低于 API 29 且flutterJNI.ShouldDisableAHB()为假时走ImageReaderSurfaceProducer对应 Impeller/Vulkan 时代的ImageTexture否则回退到SurfaceTextureSurfaceProducer。注释解释了背景Impeller 引入 Vulkan 后端后OpenGLES 提供的SurfaceTexture无法至少不能简单地在 Vulkan 上下文中渲染因此引擎按运行时能力为插件挑选最佳 Surface让插件只面向Surface编程。该开关同样有配套测试FlutterRendererTest.java 中在测试前后分别置位与复位。四、开发编辑与贡献 Android Embedder取决于你要做的事情你可能需要修改 shell/platform/android/io/flutter 下的 Java 代码或 shell/platform/android 下的 C 代码有时两者都要改。官方建议先熟悉 C 代码因为它与引擎其他平台或平台无关部分的开发方式更相似。4.1 编辑 C 代码clangd 配置C 代码位于shell/platform/android及其子目录。用 VSCode 的clangd扩展可以获得代码补全但**--compile-commands-dir必须指向 Android 构建输出**{ /* ... */ clangd.path: buildtools/mac-arm64/clang/bin/clangd, clangd.arguments: [--compile-commands-dirout/android_debug_unopt_arm64] /* ... */ }注意编辑引擎其他部分时要记得改回原来的配置。4.2 编辑 Java 代码Android Studio 配置要为 Java 代码搭一个可用的 IDE 环境并不容易。部分开发者通过 VSCode 成功配置了 Android Embedding 的 Java 开发环境但如果这种方式行不通或者你想用 Android Studio官方给出了如下步骤在 Android Studio 中打开shell/platform/android目录配置以下两项Build, Execution, Deployment → Gradle-Android Compiler → Command-line Options-Pbuild_dir/tmp/build_dir -Pflutter_jar$ENGINE/src/out/android_debug_unopt_arm64/flutter.jarBuild, Execution, Deployment → Build Tools → GradleDistribution 选择Local Installation路径填$ENGINE/src/third_party/gradleGradle SDK 使用 Android Studio 自带的 JDK路径因机器而异macOS 上通常是/Applications/Android Studio.app/Contents/jbr/Contents/HomeSync Gradle。完成上述配置后你就能在 Android Studio 中打开io/flutter与test/io/flutter目录下的 Java 文件并获得代码补全例如FlutterJNI.java。查看行内代码覆盖率找到想运行的测试类后——右键 → Modify Run Configuration...在弹出的窗口中选择 Modify options → Specify classes and packages位于 code coverage 分组下在窗口底部新出现的输入框中点击 → Add package添加io.flutter.*。五、小结Android Embedder 是 Flutter 引擎在 Android 平台的胶水层Java 侧以FlutterJNI为唯一 JNI 出口、以FlutterActivity/FlutterView承载 UIC 侧以PlatformViewAndroid为入口、以AndroidContext与各android_surface_*实现对接 Skia/Impeller 的多种渲染后端。测试上单元测试覆盖 Embedder 内部契约Robolectric/JUnit 与 gtest 双轨集成测试则借助flutter drive在真机/模拟器上验证引擎与 Embedder 的整体行为。开发者可按先 C、后 Java的顺序配合 clangd 与 Android Studio 的两套配置深入贡献代码。相关构建配置可继续查阅 shell/platform/android/BUILD.gn测试运行入口为 testing/run_tests.py。赞分享跨平台图形学前端【免费下载链接】engineThe Flutter engine项目地址https://gitcode.com/gh_mirrors/eng/engine点击查看免费下载相关推荐Flutter Engine macOS Embedder 深入解析框架架构、源码组织与构建测试实战Flutter Engine macOS Embedder 深入解析框架架构、源码组织与构建测试实战 本文以 Flutter Engine 仓库中 shell跨平台图形学前端Markdown.nvim与Treesitter深度解析语法解析与渲染原理Markdown.nvim与Treesitter深度解析语法解析与渲染原理 Markdown.nvim是一款专为Neovim设计的插件它借助Treesitt开发工具Redot Engine 开发环境搭建指南Redot Engine 开发环境搭建指南 1. 项目目录结构及介绍 Redot Engine 是一个开源的2D和3D游戏引擎其项目目录结构如下 redot游戏开发图形学上一篇vim-lsp-settings 使用教程下一篇GPT-Crawler 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考