Flutter for Apple TV
Flutter 引擎的修改+测试应用程序,用于演示 Flutter 应用程序可以在 Apple TV 上运行
此项目(以及Liberty Global 仓库)仅用于测试目的!
Flutter 及相关标志是 Google LLC 的商标。我们未获得 Google LLC 的认可或关联。
方法
- 引擎
- 使用
ios目标来编译tvos目标- 可以创建一个新的
tvos目标,但这会产生影响,需要更改更多文件,因此需要更多工作来维护引擎中的 Apple TV 支持。- 可以通过修改不同项目中的 Makefiles 来完成此操作。
- 查看 'real_tvos_target' 分支(未完成!)。
- 而是使用
tvosSDK,而不是iosSDK。
- 可以创建一个新的
- 禁用/替换
tvosSDK 不支持的代码。 - 增加了对 Apple TV 遥控器的支持。
- 滑动
- 基于手势识别器和游戏控制器。
- 创建了一个新通道将移动通知到应用程序。
- 应用程序将移动转换为左、右、上和下。
- 在应用程序中处理此问题,可以允许应用程序为每个屏幕/用例优化速度等。
- 遥控器按键
- 菜单、播放/暂停等被映射到按键代码。
- 菜单按键被映射到“popRoute”函数,但也可以映射到“back”按键。
- 键盘输入
- 1.26:支持 ios 键盘,无需修改。
- 在 flutter 1.15/1.19/1.22 中,一部分按键被映射到“macos”和“Android”按键代码。
- 滑动
- 启用了 bitcode(Apple TV 的强制要求)。
- 已修改的仓库
- https://github.com/flutter/buildroot --> https://github.com/LibertyGlobal/flutter-tvos-buildroot
- https://github.com/flutter/engine --> https://github.com/LibertyGlobal/flutter-tvos-engine
- https://dart.googlesource.com/sdk --> https://github.com/LibertyGlobal/flutter-tvos-dart
- https://skia.googlesource.com/skia --> https://github.com/LibertyGlobal/flutter-tvos-skia
- 测试过的 flutter 引擎
- 1.15, 1.19-candidate-4, 1.22-candidate.13, 1.26.0-17.6-pre, 2.0.4
- 使用
- 框架
- “flutter”工具(/framework)未修改。
- 不支持
tvos平台,无法使用ios目标,因为在没有修改的情况下,它将使用错误的 SDK(ios)来编译应用程序。
- 应用程序
- 与
ios应用程序设置相比的更改- 修改了主故事板。
- tvos 的图标集。
- 用于编译应用程序的自定义脚本,该脚本替换了“构建阶段”中的
code_backend.sh。此脚本基于引擎测试应用程序中的脚本,该应用程序仅使用引擎中的工具。无法使用普通脚本,因为它使用了不支持tvos的标准“flutter”工具。
- 从真实的
ios应用目标复制生成的资源。测试应用目标实际上会覆盖ios构建以使用这些资源。 - 将应用程序和 pod 的目标更改为 'tvos',并将最低操作系统版本设置为 12.0。
- 与
已知限制
- 并非所有 pod 都能编译。使用
ios目标,并且某些 API 不被tvos支持。例如 WebView。 - 没有调试功能。
- 没有 Apple TV 外观小部件、没有虚拟键盘集成等。
- tvos 不支持资源监控(使用 flutter 工具)。
已知问题
- 当调试版本安装在模拟器或 Apple TV 设备上时,应用程序在屏幕上选择时将不会加载。它只能从 xcode 调试器加载。这对于发布版本没有问题。这很可能与应用程序尝试连接到未启动的 127.0.0.1 有关,因为没有使用 flutter 工具。
支持的设备
- Apple tvOS 12.0 或更高版本。
解决方法
- 在
process_macos.cc中禁用 fork 命令等。- 这不应该是必需的,只应该为宿主编译。
- https://github.com/dart-lang/sdk/issues/39918#issuecomment-569806159
- 在
kernel_translation_helper.cc中禁用了致命错误,仍需调查根本原因。
设置引擎/开发环境
- 宿主编译(macos)在内存为 16Gb 的系统上失败,在 32Gb 的 mac 上没有问题。
- 添加了
--no-lto标志,请参见 https://github.com/flutter/flutter/issues/57207。
- 添加了
- 基于此处的说明:https://github.com/flutter/flutter/wiki/Setting-up-the-Engine-development-environment)
- 在本地仓库副本中创建一个名为
engine的空目录,然后cd进入其中。(某些工具假定此文件夹名称!) - 在 engine 目录中创建一个
.gclient文件,内容如下:{ "managed": False, "name": "src/flutter", "url": "https://github.com/LibertyGlobal/[email protected]", "custom_deps": {}, "deps_file": "DEPS", "safesync_url": "", } - 在
engine目录中运行gclient sync。 - 请参阅 flutter wiki 获取 Java SKD 和 'ant' 依赖项。
- 安装“flutter”版本
2.0.4(https://flutterdart.cn/docs/get-started/install/macos)。
编译引擎
- 脚本将在 src/out 文件夹中为 TVOS 构建 5 个目标。
- ios_debug_unopt, ios_debug_sim_unopt, ios_release, host_debug_unopt 和 host_release release。
- 注意:获取所有仓库并为 Apple TV(所有目标)编译引擎至少需要
29Gb的可用磁盘空间! - 在
/engine/src/脚本中运行sh ninja_build.sh(位于脚本文件夹中,参见)。
- 添加参数
clean以进行完全重建。 - 注意:在 32Gb 宿主系统上可以删除
--no-lto标志。
- 添加参数
- 基于:https://github.com/flutter/flutter/wiki/Compiling-the-engine。此 wiki 中描述的顺序问题在于,为主机生成的文件的指向是 ios/tvos SDK 而不是 macos。
编译应用程序
- 第一次构建真实的 ios 目标,以确保资源(图像、字体等)由 flutter 工具生成并可用于 tvos。
flutter build ios
- 注意:无论目标如何,应用程序始终会编译到
/build/ios/Release-iphoneos。主要原因是普通 ios 构建生成的资源位于此处并被重新使用。- 这意味着,如果任何资源发生更改、添加或删除,则必须先完成普通的 ios 构建。为此,必须先撤销以下步骤!
- 将 tvos 文件夹重命名为 ios。
- Flutter 工具假定文件夹名称为
ios。如果文件夹名称不同,Flutter pub get 将失败! - 运行命令:
sh scripts/switch_target.sh tvos。 - (切换回 ios:
sh scripts/switch_target.sh ios)。
- Flutter 工具假定文件夹名称为
- 运行命令:
flutter pub get。 - 转到
ios文件夹。 - 安装/获取 cocoa pods。
- 运行命令:
pod install。 - Pod 目标在
podfile的 post_install 步骤中自动从 ios 更正为 tvos。
- 运行命令:
- 将 flutter 框架复制到 pods。
- 运行命令:
sh ../scripts/copy_framework.sh debug_sim <path to local flutter engine>/engine/src。 - 复制调试模拟器版本。正确的版本(debug、sim、release/archive)将在应用程序编译期间复制。
- 不幸的是,这是一个手动步骤,因为 pod 首先由 xcode 作为依赖项进行编译,而 xcode 构建过程中没有在此之前的钩子来根据所选目标自动复制要使用的正确框架。
- 运行命令:
- 在 ios 文件夹中打开
Runner.xcworkspace。- 在
FLUTTER_LOCAL_ENGINE中设置指向本地编译的 flutter 引擎的路径(src 文件夹)。 - 例如:
FLUTTER_LOCAL_ENGINE = <your local path to flutter engine>/engine/src。 - 或者运行:
sed -i '' "s#FLUTTER_LOCAL_ENGINE[[:space:]]=[[:space:]].*;#FLUTTER_LOCAL_ENGINE = \"${FLUTTER_LOCAL_ENGINE}\";#g" Runner.xcodeproj/project.pbxproj。
- 在
- 为设备调试、模拟器或存档构建应用程序(请参阅下面的切换目标)。