跳到主要内容

Android 应用程序包

简介

Flet CLI 提供了 flet build apkflet build aab 命令,允许将 Flet 应用程序打包成 Android APK 和 Android 应用程序包(AAB)文件。

前提条件

本机 Python 包

本机 Python 包(与“纯”Python 包不同,后者仅用 Python 编写)是部分用 C、Rust 或其他语言编写的包,生成本机代码。示例包包括 numpycryptographylxmlpydantic

当使用 flet build 命令将 Flet 应用程序打包到 Android 时,这些包无法从 PyPI 安装,因为没有 Android 平台的轮子(.whl)。

因此,在运行 flet build 命令之前,您需要在计算机上编译 Android的本机包。

工作正在进行中

我们正在积极地自动化下面描述的过程 - 这是我们的待办事项清单中的第 1 项。

Flet 使用 Kivy for Android 将 Python 和本机 Python 包构建到 Android。

要使用 flet build 命令构建自定义 Python 发行版,您需要使用 Kivy for Android 提供的 p4a 工具。

p4a 命令行工具可以在 macOS 和 Linux(Windows 的 WSL)上运行。

要获取 Android SDK,请安装 Android Studio。

在 macOS 上,Android SDK 将位于 $HOME/Library/Android/sdk

安装 Temurin8,以获取 JRE 1.8,required by sdkmanager 工具:

brew install --cask temurin8
export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home

设置以下环境变量:

export ANDROID_SDK_ROOT="$HOME/Library/Android/sdk"
export NDK_VERSION=25.2.9519653
export SDK_VERSION=android-33

sdkmanager 的路径添加到 PATH

export PATH=$ANDROID_SDK_ROOT/tools/bin:$PATH

https://developer.android.com/ndk/downloads/ 或使用 Android SDK Manager 安装 Android SDK 和 NDK:

echo "y" | sdkmanager --install "ndk;$NDK_VERSION" --channel=3
echo "y" | sdkmanager --install "platforms;$SDK_VERSION"

创建新的 Python 虚拟环境:

python3 -m venv.venv
source.venv/bin/activate

从 Flet 的 fork 安装 p4a - 它固定了 Python 3.11.6,兼容 flet build 生成的其他代码:

pip3 install git+https://github.com/flet-dev/python-for-android.git@3.11.6

安装 cython

pip install --upgrade cython

使用 --requirements 选项,包括您的自定义 Python 库,分隔以逗号,例如 numpy,在以下示例中:

p4a create --requirements numpy --arch arm64-v8a --arch armeabi-v7a --arch x86_64 --sdk-dir $ANDROID_SDK_ROOT --ndk-dir $ANDROID_SDK_ROOT/ndk/$NDK_VERSION --dist-name mydist

选择“No”以回答“Do you want automatically install prerequisite JDK? [y/N]”。

注意: 您想要使用 p4a 命令构建的库应该在 这个文件夹 中有一个 recipe。如果您需要的库没有 recipe,可以 提交请求 或创建自己的 recipe 并提交 PR。

p4a 命令完成时,Python 发行版将位于:

$HOME/.python-for-android/dists/mydist

在运行 flet build apk 命令以构建 Flet Android 应用程序的终端中,运行以下命令以将发行版的完整路径存储在 SERIOUS_PYTHON_P4A_DIST 环境变量中:

export SERIOUS_PYTHON_P4A_DIST=$HOME/.python-for-android/dists/mydist

构建应用程序通过运行 flet build apk 命令以生成 .apk 文件。

现在,您的应用程序包包括自定义 Python 库。

flet build apk

从您的应用程序生成 Android APK 文件。

此命令构建 release 版本。'release' 版本不支持调试,适合部署到应用程序商店。如果您将应用程序部署到 Play Store,建议使用 Android 应用程序包(AAB)或将 APK 分割以减少 APK 大小。

启动屏幕

默认情况下,生成的 Android 应用程序将显示启动屏幕,使用来自 assets 目录(见下)的图像或 Flet 标志。您可以使用 --no-android-splash 选项禁用 Android 应用程序的启动屏幕。

安装 APK 到设备

将 APK 安装到设备的最简单方法是使用 adb(Android 调试桥)工具。

adb 是 Android SDK 的一部分。例如,在 macOS 上,如果使用 Android Studio 安装了 Android SDK,那么 adb 工具的位置将在 ~/Library/Android/sdk/platform-tools/adb

查看这篇文章,以获取更多关于安装和使用 adb 工具的信息。

要安装 APK 到设备,请运行以下命令:

adb install <path-to-your.apk>

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

adb -s <device> install <path-to-your.apk>

其中 <device> 可以使用 adb devices 命令找到。

构建特定平台的 APK

默认情况下,Flet 构建“胖”APK,其中包括 arm64-v8aarmeabi-v7a 架构的二进制文件。

如果您了解/控制您的应用将分发到的 Android 设备,则可以为特定架构构建较小的 APK。

要为 arm64-v8a 构建 APK:

flet build apk --flutter-build-args=--target-platform --flutter-build-args=android-arm64

要为 armeabi-v7a 构建 APK:

flet build apk --flutter-build-args=--target-platform --flutter-build-args=android-arm

Android 故障排除

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

adb shell

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

su

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

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

flet build aab

从您的应用程序生成 Android 应用程序包(AAB)文件。

此命令构建 release 版本。'release' 版本不支持调试,适合部署到应用程序商店。应用程序包是发布到 Play Store 的推荐方式,因为它可以改善应用程序的大小。

启动屏幕

默认情况下,生成的 Android 应用程序将显示启动屏幕,使用来自 assets 目录(见下)的图像或 Flet 标志。您可以使用 --no-android-splash 选项禁用 Android 应用程序的启动屏幕。