☰
python-for-android 完整指南:将 Python 应用打包为 Android APK / AAB / AAR
2026/9/25 5:53:47 网站建设 项目流程
  • 开发工具
  • 构建工具
  • 移动开发

【免费下载链接】python-for-android

Turn your Python application into an Android APK

项目地址:https://gitcode.com/gh_mirrors/py/python-for-android
点击查看免费下载

python-for-android(简称 p4a)是 Kivy 团队维护的一款开发工具,核心职责是把 Python 应用及其依赖交叉编译并打包成可在 Android 设备上运行的原生二进制产物。本文以仓库根目录的 README.md 为骨架,结合 toolchain.py 与 recipe.py 等源码,系统讲解 p4a 的产物格式、架构支持、Bootstrap 与 Recipe 机制、推荐使用方式(Buildozer)以及 CLI 命令体系。读完本文,你将理解 p4a 的打包原理,并能按需选择 APK / AAB / AAR 产物、判断依赖是否需要编写 Recipe,以及独立使用 p4a 命令行完成一次构建。

python-for-android 是什么:一个 Python 到 Android 的打包工具

按 README 的定义,python-for-android 是一个开发工具,它将 Python 应用打包成可以在 Android 设备上运行的二进制产物。它解决了"Python 解释器无法原生运行在 Android 上"这一根本问题:

  • p4a 通过交叉编译把 Python 解释器及其依赖编译为面向 Android 的版本;
  • 再将解释器、应用的 Python 代码以及所有依赖捆绑进同一个产物;
  • 应用在 Android 设备上运行时,由捆绑进去的解释器逐行解释执行Python 代码。

从源码结构看,这套流程由多个模块分工完成:pythonforandroid/目录下,toolchain.py 负责命令行入口与整个构建流程的调度,recipe.py 定义 Recipe 基类以描述第三方库的交叉编译方式,distribution.py 管理编译好的发行包(dist),bootstrap.py 与pythonforandroid/bootstraps/目录负责生成 Android 工程骨架。

三种输出产物:APK、AAB、AAR

README 明确指出 p4a 可以生成三种格式的产物,它们用途各异:

产物格式全称适用场景
APKAndroid Package可直接安装到本地设备,尤其适合开发测试;被大多数应用商店接受,但Google Play Store 不接受 APK 上传
AABAndroid App Bundle面向 Google Play Store 发布的格式,由商店按设备生成优化的 APK
AARAndroid Archive可复用的 Android 资源库,供其他 Android 项目作为依赖引入

在命令行层面,toolchain.py 为这三种产物分别注册了apk、aab、aar三个子命令,并共享同一组打包参数(parser_packaging),例如--private指定包含main.py入口的应用源码目录、--release切换为发布构建、--keystore/--signkey等签名参数。也就是说,同一份应用代码,只需切换命令关键字即可产出不同分发形态。

多 CPU 架构支持

p4a 支持多种 Android CPU 架构。通过--arch参数(可在 toolchain.py 中看到其定义为可重复追加的参数)可指定构建目标架构,常见的包括arm64-v8a、armeabi-v7a、x86、x86_64等。具体支持的架构清单由 archs.py 定义,可用archs子命令列出。仓库中pythonforandroid/includes/arm64-v8a/目录的存在,也印证了 p4a 针对不同 ABI 提供差异化头文件支持的事实。

应用后端:Bootstrap 机制与内置后端

Python 应用要在 Android 上展示 UI 或提供服务,必须借助某种"引导层"(bootstrap)把 Python 运行时挂接到 Android 原生组件上。README 强调,p4a 优先支持 Kivy 框架开发的应用,但"built to be flexible about the backend libraries",即对后端库保持高度灵活,官方文档确认支持的后端包括:

  • Kivy:p4a 最主要、最成熟的应用框架后端;
  • PySDL2/PySDL3:基于 SDL2 / SDL3 的 Python 绑定;
  • WebView:使用 Android WebView 加载由 Python Web 服务器提供内容的方案。

从 bootstraps 目录 可以看到当前仓库内置的后端集合:sdl2/、sdl3/、qt/、webview/、empty/、service_only/、service_library/等,其中common/与_sdl_common/存放各后端共享的公共构建逻辑。在 CLI 中,可用bootstraps子命令列出全部可用后端;构建时通过--bootstrap参数显式指定,不指定时 p4a 会根据应用依赖自动选择(见 toolchain.py 的参数说明)。

此外,service_only与service_library类后端用于构建不带 UI 的后台服务型应用,testapps/on_device_unit_tests/test_app/中的app_service.py即为服务型应用的示例。

依赖处理:Recipe 机制与内置 Recipe 库

Python 应用的依赖分两类,p4a 对它们的处理方式截然不同(README 明确指出):

纯 Python 包:自动支持

大多数纯 Python 依赖无需额外配置,p4a 会自动解析并打包进应用。例如feedparser、flask、sqlalchemy等。

含 C 代码的包:需要 Recipe

对于包含 C 扩展或其他原生代码的包,由于必须针对 Android 目标做交叉编译,必须为其编写一个特殊的 "recipe" 来描述编译方式。Recipe 本质上是一个 Python 模块(通常放在pythonforandroid/recipes/<包名>/__init__.py),继承 recipe.py 中的Recipe基类。

Recipe 基类中最核心的属性包括(见 recipe.py):

  • url:源码下载地址,可用{version}占位符自动替换为版本号;
  • version:该库的版本字符串;
  • md5sum/sha512sum/blake2bsum:源码校验和,用于确认下载完整;
  • depends:构建前必须已就绪的其他 Recipe 列表;
  • conflicts:已知不兼容的 Recipe 列表;
  • opt_depends:可选依赖,若构建则必须在前,但缺失不致命;
  • patches:应用到源码的补丁文件列表;
  • python_depends:构建期不可用、但需在运行期通过 pip 安装的纯 Python 包列表。

p4a 自带大量流行库的内置 Recipe,README 特别举例 numpy 与 sqlalchemy。从仓库的 recipes 目录 可以核实,内置 Recipe 覆盖范围极广,例如:

  • 科学计算:numpy/、scipy/、pandas/、matplotlib/、opencv/
  • 数据库与存储:sqlite3/、psycopg2/、libpq/、leveldb/、pyleveldb/
  • 网络与异步:aiohttp/、grpcio/、gevent/、greenlet/、libcurl/、pyzmq/、zeroconf/
  • 加密与安全:openssl/、cryptography/、pycryptodome/、libsodium/、pynacl/、secp256k1/
  • 多媒体:ffmpeg/、libogg/、libvorbis/、libvpx/、libx264/、av/
  • 图形与字体:freetype/、harfbuzz/、libcairo/、libthorvg/
  • Python 运行环境:hostpython3/、python3/、setuptools/、cython/

多数 Recipe 目录还伴随.patch文件(如 Pillow/setup.py.patch、boost/fix-android-issues.patch),这些正是 Recipe 通过patches属性对第三方源码做 Android 适配的实际证据。

如果你的依赖不在内置列表中,可以编写本地 Recipe:将自定义 Recipe 放入--local-recipes指定的目录(默认./p4a-recipes,见 toolchain.py),p4a 会自动扫描加载。

推荐使用方式:搭配 Buildozer

README 明确建议:优先通过 Buildozer 使用 python-for-android。理由有二:

  1. Buildozer 会预先安装正确的系统依赖(Android SDK/NDK、JDK 等),省去手动配置环境的繁琐;
  2. Buildozer集中管理配置(buildozer.spec 文件),把架构、SDK 路径、应用元信息等统一声明。

同时 README 强调:p4a并不限于与 Buildozer 一起使用,完全可以独立调用其命令行。仓库中的 testapps/buildozer.spec 与 setup.py 即为配套构建配置的示例。

独立使用 p4a 的命令行

p4a 的命令行入口位于 entrypoints.py:它先做 Python 版本兼容性检查,然后实例化 toolchain.py 中的ToolchainCL。ToolchainCL通过 argparse 子命令体系注册了大量命令(见 toolchain.py),按功能可划分为:

构建产物类

  • apk/aab/aar:分别构建三种产物;
  • create:将一组需求(requirements)编译成一个 dist(发行包);
  • sdk_tools:运行 SDK 工具目录中的二进制;adb、logcat:直接调用 SDK 中的 adb 与 logcat 工具。

查询类

  • recipes:列出可用 Recipe(--compact输出紧凑格式便于脚本解析,见 toolchain.py);
  • bootstraps:列出可用后端;
  • archs:列出可用目标架构;
  • distributions(别名dists):列出已编译的 dist。

清理类

  • clean_all(别名clean-all):删除所有构建、dist 与缓存;
  • clean_dists、clean_bootstrap_builds、clean_builds:分别清理对应组件;
  • clean <component>:按名称删除指定组件(all、builds、dists、bootstrap_builds、downloads);
  • clean_recipe_build <recipe>:删除指定 Recipe 的构建产物(--no-clean-dists可保留 dist);
  • clean_download_cache:清理需求下载缓存。

其他

  • export_dist(别名export-dist):将命名 dist 复制(或--symlink软链)到指定路径;
  • build_status(别名build-status):打印当前已构建组件的调试信息;
  • recommendations:列出推荐的 p4a 系统依赖。

通用(generic)参数说明

所有子命令共享一组通用参数(定义于 toolchain.py),关键项如下:

参数说明
--sdk-dir/--ndk-dirAndroid SDK 与 NDK 的安装路径
--android-api构建目标 API 级别,默认取RECOMMENDED_TARGET_API
--ndk-api编译时使用的 API 级别,通常应是"最低支持"API,默认取min(ANDROID_API, RECOMMENDED_NDK_API)
--arch构建架构,可重复追加(如--arch arm64-v8a)
--requirements应用依赖,Recipe 名或 Python 模块名,用逗号分隔;若使用--use-setup-py则非必需
--bootstrap指定后端,缺省自动选择
--storage-dir下载与构建的主存储目录(默认用户数据目录,含空格时回退到~/.python-for-android)
--dist-name要使用或创建的 dist 名称
--local-recipes本地 Recipe 目录(默认./p4a-recipes)
--use-setup-py/--ignore-setup-py是否处理项目的 setup.py(实验性)
--recipe-blacklist/--blacklist-requirements禁用内置 Recipe 或需求,用于裁剪体积
--extra-index-url额外的预编译 Android wheel 索引,可多次指定
--skip-prebuilt强制从源码构建,不使用预编译 wheel
--hook指定包含 p4a 钩子函数的模块文件
--color/--debug控制彩色输出与调试日志

打包类命令(apk/aab/aar)额外支持--private(应用源码目录,须含main.py入口)、--release(发布构建,禁用 gdb 调试等)、--with-debug-symbols(保留.so调试符号)、--keystore/--signkey/--keystorepw/--signkeypw(签名参数,仅发布构建)、--add-asset/--add-resource(向 APK 的 assets/res 目录添加资源)。

此外,p4a 支持通过当前目录下的.p4a配置文件预置参数:_read_configuration()会逐行读取并用shlex解析(#开头的行为注释),把参数追加到命令行(见 toolchain.py)。

依赖解析的一个细节:--requirements与版本固定

在 toolchain.py 中可以看到,当传入--requirements且项目包含 setup.py 时,p4a 会尝试分析项目的包依赖,并只取其中命中 Recipe 的部分合并进需求列表;若需求以name==version形式指定版本,p4a 会将版本写入环境变量VERSION_<name>供 Recipe 读取。这说明 p4a 的需求解析是"Recipe 优先"的:纯 Python 依赖交给 pip,原生依赖交给 Recipe。

仓库结构导览:从源码理解 p4a 的工程组织

为了便于读者在仓库中继续深入,这里给出与本文主题直接相关的关键路径:

  • README.md:项目总览,即本文骨架;
  • pythonforandroid/toolchain.py:CLI 入口与全部子命令、通用参数的定义,以及--requirements解析逻辑(L622-L670);
  • pythonforandroid/recipe.py:Recipe基类,定义url、version、depends、patches等核心属性;
  • pythonforandroid/bootstraps/:内置后端(sdl2、sdl3、qt、webview、empty、service_only 等);
  • pythonforandroid/recipes/:内置 Recipe 集合(numpy、sqlalchemy、openssl、ffmpeg 等);
  • pythonforandroid/archs.py:目标架构定义;
  • pythonforandroid/distribution.py:dist(发行包)的编译与管理;
  • pythonforandroid/entrypoints.py:脚本入口,先做 Python 版本检查再启动ToolchainCL;
  • tests/:针对上述模块的单元测试,例如 tests/test_toolchain.py、tests/test_recipe.py、tests/test_archs.py;
  • testapps/:用于验证构建流程的真实示例应用(含 buildozer.spec 与 setup.py);
  • CONTRIBUTING.md 与 CODE_OF_CONDUCT.md:贡献指南与社区行为准则。

小结

python-for-android 是一个成熟、灵活的 Python-to-Android 打包工具:它通过交叉编译把 Python 解释器与依赖捆绑进 APK / AAB / AAR 三种产物,以 Bootstrap 机制适配 Kivy、PySDL2/PySDL3、WebView 等不同后端,以 Recipe 机制解决含原生代码依赖的交叉编译问题,并为 numpy、sqlalchemy 等大量流行库内置了开箱即用的 Recipe。日常开发中推荐经由 Buildozer 调用 p4a 以获得更完整的依赖管理与集中配置;需要细粒度控制时,也可直接使用 p4a 丰富的 CLI 子命令完成从查询、构建到清理的完整工作流。

  • 开发工具
  • 构建工具
  • 移动开发

【免费下载链接】python-for-android

Turn your Python application into an Android APK

项目地址:https://gitcode.com/gh_mirrors/py/python-for-android
点击查看免费下载
上一篇:探索 `jql`:一款高效轻量的 JSON 查询工具
下一篇:如何使用ffplayout:打造专业24/7广播解决方案的完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询