Android 应用程序包
介绍
Flet CLI 提供了flet build apk
和flet 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 大小。
- https://developer.android.com/guide/app-bundle
- https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split
构建特定于平台的 APK
默认情况下,Flet 构建“胖”APK,其中包括arm64-v8a
和armeabi-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_version
是 35
。
主要区别
特性 | min_sdk_version | target_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=False
(False
意味着在清单中写为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 <设备路径> <本地路径>