6. 在 Android 上使用 Python
***************************

Android 上的 Python 與桌面版的 Python 不同。在桌面版上，Python 通常作
為系統資源安裝，供該台電腦上的任何使用者使用。使用者通常透過執行
**python** 可執行檔並在互動式提示字元中輸入指令，或是直接執行 Python
腳本與 Python 互動。

在 Android 上，沒有將其安裝為系統資源的概念。唯一的軟體單位是 "app"。
也沒有可以執行 **python** 可執行檔的控制台，或與 Python REPL 互動。

因此，在 Android 上使用 Python 的唯一方式就是以嵌入模式運作 - 也就是撰
寫一個原生的 Android 應用程式，使用 "libpython" 嵌入 Python 直譯器，並
透過 Python 嵌入式 API 呼叫 Python 程式碼。完整的 Python 直譯器、標準
函式庫，以及你所有的 Python 程式碼，都會被打包進你的應用程式，供該應用
程式使用。

Python 的標準函式庫在 Android 上有一些明顯的缺漏與限制。詳情請參考 API
可用性指南。


6.1. 將 Python 加入 Android 應用程式
====================================

大多數的應用程式開發者應該使用下面其中一種工具，這些工具能提供更輕鬆的
使用體驗：

* Briefcase, from the BeeWare project

* Buildozer，由 Kivy 專案提供

* 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 建置成 wheels 並發布到 PyPI。建議使用的工具
是 cibuildwheel，它會自動設定交叉編譯環境、建置 wheel，以及在模擬器上
測試等所有細節。
