跳到主要内容

Flet 新打包预发布

· 阅读需 11 分钟
Feodor Fitsner
Flet 创始人及开发者

Flet 针对 iOS 和 Android 的打包一直依赖于 Kivy,当您的应用依赖于 Python 二进制包(如 Numpy 或 Pillow)时,这会非常烦人。您需要使用 Kivy 命令行工具自己编译这些包。如果 Kivy 对于某些包(如 Pydantic)没有“配方”,那真的会让人感到沮丧甚至绝望。

不再需要 Kivy 了!我们刚刚发布了 Flet 0.25.0.dev3519 预发布版本,其中改进的 flet build 命令不再使用 Kivy!Flet 现在使用其自己的“精心内部制作”的 Python 运行时。

Flet 针对 iOS 和 Android 的打包实现遵循了 PEP 730(iOS)和 PEP 738(Android)中定义的严格规范,这些规范在 Python 3.13 中实现并发布(并回溯到 Python 3.12)。当 pypi.org 支持 iOS 和 Android 的 wheel 标签,并且第三方 Python 包维护者开始上传他们的移动包时,Flet 将与它们兼容,您将能够在您的 Flet 应用中使用它们。

安装预发布版本

pip install flet==0.25.0.dev3519
备注

出于测试目的,我们建议在专用的 Python 虚拟环境中安装 Flet 预发布版本。

使用预发布版本构建应用

要使用 flet build 命令和 Flet 的预发布版本构建您的应用,请确保您的 requirements.txt 要么包含确切的版本说明符:

flet==0.25.0.dev3519

要么在 flet 依赖项之前使用 --pre 标志:

--pre
flet

Python 3.12

打包的 Flet 应用在所有平台上都运行在 Python 3.12.6 运行时上。

预构建二进制包

针对 iOS 和 Android 的 flet build 命令现在从 https://pypi.flet.dev 安装预构建的二进制包。

可以通过在 Mobile Forge 项目中创建配方来构建新包。目前,Flet 团队正在为您编写这些配方,但当该过程得到完善并完全自动化后,您将能够发送 PR 并立即测试编译后的包。

如果您在 https://pypi.flet.dev 上还没有看到某个包,您可以在 Flet 讨论 - 包 中请求。请不要请求纯 Python 包。在 https://pypi.org 上转到包的“下载文件”部分,并确保它包含特定于二进制平台的 wheel。

打包行为也发生了变化:

  • 打包不再尝试将 flet 依赖项替换为 flet-runtimeflet-embedflet-pyodide,而是从 requirements.txtpyproject.toml 中“按原样”安装所有依赖项 - 这要归功于新的 Flet 包结构(链接)。
  • 如果未找到目标平台的二进制包,打包将不会尝试从源分布中编译它,而是会以有意义的错误失败。

新的包结构

该结构避免了在各种平台上安装 flet 包时重写 pip 依赖项。如果 flet 不是用户应用中的直接依赖项,则存在检测要安装的正确 flet 包(flet-runtimeflet-embedflet-pyodide?)的问题。

新的 Flet 包:

  • flet - 进行最小 Flet 设置所需,是各种平台的应用入口点。在所有平台上安装。
  • flet-core - 进行最小 Flet 设置所需,包含核心逻辑和控件。在所有平台上安装。
  • flet-cli - 包含 Flet CLI 命令。仅在桌面上安装。
  • flet-desktop - 包含适用于 macOS、Windows 和 Linux 的预构建 Flet“客户端”应用二进制文件。默认情况下仅在 macOS 和 Windows 桌面上安装。
  • flet-desktop-light - 包含适用于 Linux 的轻量级版本(不含音频和视频控件)的 Flet“客户端”。默认情况下仅在 Linux 桌面上安装。
  • flet-web - 包含 Flet Web“客户端”和 FastAPI 集成。仅在桌面上安装。

换句话说,打包的 Flet 应用仅包含 fletflet-core 包。

Linux 的“轻量级”客户端

默认情况下,不含音频和视频控件的轻量级桌面客户端不会在 Linux 上安装。这改善了初始用户体验,因为用户不需要立即处理 gstreamer(音频)和 mpv(视频)依赖项,Flet“就能正常工作”。

一旦用户获得了一些 Flet 经验并希望在其应用中使用视频和音频控件,他们可以安装 gstreamer 和/或 mpv,并将 Flet 桌面替换为完整版本。

卸载“轻量级”Flet 客户端:

pip uninstall flet-desktop-light --yes

安装完整的 Flet 桌面客户端:

pip install flet-desktop==0.25.0.dev3519

权限

新的 flet build 命令允许对嵌入到 AndroidManifest.xmlInfo.plist.entitlements 文件中的权限、功能和授权进行精细控制。

这些文件中不再有硬编码的权限!

iOS

设置 iOS 权限:

flet build --info-plist permission_1=True|False|description permission_2=True|False|description...

例如:

flet build --info-plist NSLocationWhenInUseUsageDescription=This app uses location service when in use.

macOS

设置 macOS 授权:

flet build --macos-entitlements name_1=True|False name_2=True|False...

默认的 macOS 授权:

  • com.apple.security.app-sandbox = False
  • com.apple.security.cs.allow-jit = True
  • com.apple.security.network.client = True
  • com.apple.security.network.server" = True

Android

设置 Android 权限和功能:

flet build --android-permissions permission=True|False... --android-features feature_name=True|False

例如:

flet build \
--android-permissions android.permission.READ_EXTERNAL_STORAGE=True \
android.permission.WRITE_EXTERNAL_STORAGE=True \
--android-features android.hardware.location.network=False

默认的 Android 权限:

  • android.permission.INTERNET

可以使用 --android-permissions 选项和 False 值禁用默认权限,例如:

flet build --android-permissions android.permission.INTERNET=False

默认的 Android 功能:

  • android.software.leanback=FalseFalse 表示在清单中写为 android:required="false"
  • android.hardware.touchscreen=False

跨平台权限组

有预定义的权限,分别映射到相应平台的 Info.plist*.entitlementsAndroidManifest.xml

设置跨平台权限:

flet build --permissions permission_1 permission_2...

支持的权限:

  • location
  • camera
  • microphone
  • photo_library

iOS 映射到 Info.plist 条目

  • location
    • NSLocationWhenInUseUsageDescription = This app uses location service when in use.
    • NSLocationAlwaysAndWhenInUseUsageDescription = This app uses location service.
  • camera
    • NSCameraUsageDescription = This app uses the camera to capture photos and videos.
  • microphone
    • NSMicrophoneUsageDescription = This app uses microphone to record sounds.
  • photo_library
    • NSPhotoLibraryUsageDescription = This app saves photos and videos to the photo library.

macOS 映射到授权

  • location
    • com.apple.security.personal-information.location = True
  • camera
    • com.apple.security.device.camera = True
  • microphone
    • com.apple.security.device.audio-input = True
  • photo_library
    • com.apple.security.personal-information.photos-library = True

Android 映射

  • location
    • 权限:
      • android.permission.ACCESS_FINE_LOCATION": True
      • android.permission.ACCESS_COARSE_LOCATION": True
      • android.permission.ACCESS_BACKGROUND_LOCATION": True
    • 功能:
      • android.hardware.location.network": False
      • android.hardware.location.gps": False
  • camera
    • 权限:
      • android.permission.CAMERA": True
    • 功能:
      • android.hardware.camera": False
      • android.hardware.camera.any": False
      • android.hardware.camera.front": False
      • android.hardware.camera.external": False
      • android.hardware.camera.autofocus": False
  • microphone
    • 权限:
      • android.permission.RECORD_AUDIO": True
      • android.permission.WRITE_EXTERNAL_STORAGE": True
      • android.permission.READ_EXTERNAL_STORAGE": True
  • photo_library
    • 权限:
      • android.permission.READ_MEDIA_VISUAL_USER_SELECTED": True

对应用编译和清理的控制

默认情况下,flet build 命令不再将应用的 .py 文件编译为 .pyc,这使您可以避免(推迟?)在应用中发现任何语法错误并完成打包。

您可以使用以下新选项控制编译和清理:

  • --compile-app - 编译应用的 .py 文件。
  • --compile-packages - 编译已安装包的 .py 文件。
  • --cleanup-on-compile - 在成功编译后删除不必要的文件。

为 Android 捆绑包签名

为签署 Android 构建添加了新选项:

  • --android-signing-key-store - Android 应用的上传密钥库 .jks 文件的路径。
  • --android-signing-key-store-password - Android 签名存储密码。
  • --android-signing-key-alias - Android 签名密钥别名。默认是 "upload"。
  • --android-signing-key-password - Android 签名密钥密码。

有关如何为 Android 构建配置上传密钥的更多信息,请阅读 构建和发布 Android 应用

应用的“数据”和“临时”目录

Flet 开发人员一直在询问在哪里存储应用数据,例如上传的文件、SQLite 数据库等,这些数据在应用更新期间是持久的。

此版本引入了两个在您的 Flet 应用中可用的环境变量:

  • FLET_APP_STORAGE_DATA - 用于存储在应用更新之间保留的应用数据的目录。该目录已经预先创建。
  • FLET_APP_STORAGE_TEMP - 用于临时应用文件(即缓存)的目录。该目录已经预先创建。

例如,在您的应用中可以这样读取数据文件夹路径:

import os

# 在 Web 模式下运行应用时,它为 `None`
data_dir = os.getenv("FLET_APP_STORAGE_DATA")
备注

flet run 命令会创建数据和临时目录,并将 FLET_APP_STORAGE_DATAFLET_APP_STORAGE_TEMP 设置为它们的路径。

深度链接配置

有一个新的 --deep-linking-url 选项可用于为 iOS 和 Android 构建配置深度链接。该值必须采用 <sheme>://<host> 的格式。

更快的重新构建

flet build 命令创建的临时 Flutter 应用不会一直在临时目录中重新创建,而是缓存在 build/flutter 目录中,这使得重新构建更快,改善了打包故障排除,并且不会污染临时目录。

按 ABI 拆分 APK

flet build 现在提供了内置的 --split-per-abi 选项,以按 ABI 拆分 APK。

已知的预发布问题

  • flet publish 尚未正常工作。

该版本中还会有什么

我们希望在 Flet 0.25.0 版本中包含更多内容。预计在未来几周内会有更多预发布版本。

pyproject.toml 支持

将所有 flet build 设置作为命令行选项携带是不方便且笨重的。

您将能够在 pyproject.toml[tool.flet] 部分中存储项目和构建设置。

在模拟器上运行 Flet 应用

我们将为 flet build 添加一个选项,并在真实设备或模拟器上运行打包的应用。

安装 Flutter

如果您的机器上没有合适的安装,flet build 将为您下载并配置 Flutter。