跳到主要内容

Android 应用程序包

介绍

Flet CLI 提供了flet build apkflet build aab命令,分别允许将 Flet 应用程序打包为 Android APK 和 Android App Bundle(AAB)。

先决条件

Android SDK

Java 开发工具包(JDK)和 Android SDK 将在首次运行flet build命令时自动安装。

JDK 安装在$HOME/java/{版本} 目录中。

如果安装了 Android Studio,Flet CLI 将定位并使用随工作室附带的 Android SDK;否则,Android SDK 将安装到“$HOME/Android/sdk”目录中。

用于二进制 Python 包的 Android 轮子

二进制 Python 包(与仅用 Python 编写的“纯”Python 包相对)是部分用 C、Rust 或其他生成原生代码的语言编写的包。例如“numpy”、“cryptography”或“pydantic-core”等包。

确保在你的 Flet 应用程序中使用的所有非纯(二进制)包都有针对 Android 的预构建轮子

flet build apk

从你的应用程序构建一个 Android APK 文件。这个命令构建发布版本。“发布”构建不支持调试,适合部署到应用商店。如果你要将应用程序部署到 Play Store,建议使用 Android App Bundles(AAB)或分割 APK 以减小 APK 大小。

构建特定于平台的 APK

默认情况下,Flet 构建“胖”APK,其中包括arm64-v8aarmeabi-v7a架构的二进制文件。你可以使用--split-per-abi选项或在pyproject.toml中设置split_per_abi来配置 Flet 将胖 APK 分割为每个平台的较小 APK:

[tool.flet.android]
split_per_abi = true

将 APK 安装到设备上

将 APK 安装到你的设备上的最简单方法是使用adb(Android Debug Bridge)工具。adb是 Android SDK 的一部分。例如,在 macOS 上,如果使用 Android Studio 安装了 Android SDK,adb工具的位置将在~/Library/Android/sdk/platform-tools/adb查看这篇文章以获取关于在各种平台上安装和使用adb工具的更多信息。 要将 APK 安装到设备上,请运行以下命令:

adb install <路径到你的.apk>

如果有多个设备连接到你的计算机(例如,模拟器和物理手机),你可以使用-s选项指定要在哪个设备上安装.apk

adb -s <设备> install <路径到你的.apk>

其中<设备>可以通过adb devices命令找到。

flet build aab

从你的应用程序构建一个 Android App Bundle(AAB)文件。这个命令构建发布版本。“发布”构建不支持调试,适合部署到应用商店。应用程序捆绑包是发布到 Play Store 的推荐方式,因为它可以改善你的应用程序大小。

为 Android 捆绑包签名

待定

[tool.flet.android.signing]
# 存储和密钥密码可以通过`--android-signing-key-store-password`
# 和`--android-signing-key-password`选项或
# FLET_ANDROID_SIGNING_KEY_STORE_PASSWORD
# 和 FLET_ANDROID_SIGNING_KEY_PASSWORD 环境变量传递。
key_store = "路径/到/store.jks" # --android-signing-key-store
key_alias = "upload"

启动画面

默认情况下,生成的 Android 应用程序将显示一个带有来自assets目录的图像(见下文)或 Flet 标志的启动画面。你可以使用--no-android-splash选项禁用 Android 应用程序的启动画面。 在pyproject.toml中配置启动画面:

[tool.flet.splash]
android = false

Android SDK 版本设置

min_sdk_version

  • 定义了你的应用可以运行的最低 Android 版本(API 级别)。
  • 如果设备的版本低于 min_sdk_version,你的应用将无法在该设备上安装或运行。
  • 增加这个值意味着放弃对旧设备的支持。

pyproject.toml 中进行配置:

[tool.flet.android]
min_sdk_version = 21

如果 min_sdk_version = 21,你的应用将无法在 Android 4.4(API 19)或更低版本上安装。

默认值是 21

target_sdk_version

  • 定义了你的应用针对进行优化的 Android 版本。
  • 你的应用可以在更高的 Android 版本上运行,但除非明确适配,否则将表现得如同在 targetSdkVersion 上运行一样。
  • Google Play 要求你定期更新这个值以满足新的 Android 要求。

pyproject.toml 中进行配置:

[tool.flet.android]
target_sdk_version = 34

如果 targetSdkVersion = 34,你的应用将在 Android 14 及以上版本上以最新的系统行为运行。在较新的 Android 版本上,一些严格的安全和 API 更改可能会自动应用。

默认的 target_sdk_version35

主要区别

特性min_sdk_versiontarget_sdk_version
定义...安装和运行应用所需的最低 Android 版本为最佳兼容性进行优化的 Android 版本
影响降低它可以让更多设备安装应用提高它可以访问更新的 Android 特性
如果设置得太低应用可能不支持现代 API 和安全应用可能不遵循最新的 Android 限制
如果设置得太高应用将无法在旧设备上安装没有重大缺点(除了适应新行为)

pyproject.toml 中配置这两个设置:

[tool.flet.android]
min_sdk_version = 21
target_sdk_version = 34

权限

配置要写入AndroidManifest.xml的 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

pyproject.toml中配置权限和功能(注意键名周围的引号"):

[tool.flet.android.permission]
# --android-permissions "android.permission.CAMERA" = true
"android.permission.CAMERA" = true
[tool.flet.android.feature]
# --android-features "android.hardware.camera" = false

元数据

配置要写入AndroidManifest.xml的 Android 应用程序元数据:

flet build --android-meta-data name_1=value_1 name_2=value_2...

默认 Android 元数据:

  • io.flutter.embedding.android.EnableImpeller=false

pyproject.toml中配置元数据(注意键名周围的引号"):

[tool.flet.android.meta_data]
"com.google.android.gms.ads.APPLICATION_ID" = "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"

深度链接

你可以使用以下flet build选项配置 Android 应用程序的深度链接设置:

  • --deep-linking-scheme - 为 Android 构建配置的深度链接 URL 方案,例如“https”或“myapp”。
  • --deep-linking-host - 深度链接 URL 主机。同样可以在pyproject.toml中配置:
[tool.flet.android.deep_linking]
scheme = "https"
host = "mydomain.com"

查看 Flutter 文档中的深度链接部分以获取更多信息和完整的设置指南。

AndroidManifest 中 application 元素的属性

在 AndroidManifest.xml 的application元素中添加自定义属性:

[tool.flet.android.manifest_application]
usesCleartextTraffic = "true"
requestLegacyExternalStorage = "true"

Android 故障排除

要在模拟器或设备中运行交互式命令:

adb shell

要在尝试在交互式 Android 外壳中浏览文件系统时克服“权限被拒绝”错误:

su

要将文件从设备下载到你的本地计算机:

adb pull <设备路径> <本地路径>