# 6. 在Android上使用 Python

Python 在 Android 上与桌面平台上不同。 在桌面平台上，Python 通常是作为系统资源安装的，该计算机的任何用户都可以使用。 然后，用户通过运行 python 可执行文件并在交互提示符中输入命令，或运行脚本。

在安卓系统中，没有将安装作为系统资源的概念。 软件分发的唯一单位是"应用程序"。 也没有可以运行 python 可执行文件或与 Python REPL 交互的控制台。

因此，在 Android 上使用 Python 的唯一方式是嵌入模式，即编写本地 Android 应用，使用 `libpython` 嵌入 Python 解释器，并使用 Python 嵌入 API 调用 Python 代码。然后，完整的 Python 解释器、标准库和所有 Python 代码都会打包到您的应用程序中，供其单独使用。

Python 标准库在 Android 上有一些明显的遗漏和限制。 详情参见 API 可用性指南。

## 6.1. 将 Python 添加到 Android 应用

大多数开发者应当使用下列工具之一，它们将提供更便捷的体验：

- 来自 BeeWare 项目的 Briefcase

- 来自 Kivy 项目的 Buildozer

- Chaquopy

- pyqtdeploy

- Termux

如果您确定要手动完成所有这些操作，请继续阅读。您可以使用 testbed app 作为指南；下面的每个步骤都包含相关文件的链接。

- 首先，获取针对 Android 的 Python 构建版：

  - 最简单的方式是从 python.org 下载 Android 发布版。 下面提及的 `prefix` 目录将位于软件包的最高层级。

  - 或者如果你想要自行构建，请遵照 Android/README.md 中的指导。 `prefix` 目录将在 `cross-build/HOST` 之下创建。

- 向你的 build.gradle 文件添加代码来将以下条目拷贝到你的项目中。 除了你自己的 Python 代码以外所有内容均可从 `prefix/lib` 拷贝：

  - 在 JNI 库中:

    - `libpython*.*.so`

    - `lib*_python.so` （外部库，如 OpenSSL）

  - 在您的资源文件中：

    - `python*.*` (Python 标准库)

    - `python*.*/site-packages` （您自己的 Python 代码）

- 在应用程序中添加代码以 提取资源文件到文件系统。

- 在应用程序中添加代码 以嵌入模式启动 Python。 这需要通过 JNI 调用 C 代码。

## 6.2. 为 Android 构建 Python 软件包

Python 软件包可以作为针对 Android 构建的 wheel 文件并在 PyPI 上发布。 完成此任务的推荐工具是 cibuildwheel，它将自动化设置交叉编译环境、构建 wheel 以及在模拟器上进行测试等所有细节。