| .. _using-android: | |
| ======================= | |
| Using Python on Android | |
| ======================= | |
| Python on Android is unlike Python on desktop platforms. On a desktop platform, | |
| Python is generally installed as a system resource that can be used by any user | |
| of that computer. Users then interact with Python by running a :program:`python` | |
| executable and entering commands at an interactive prompt, or by running a | |
| Python script. | |
| On Android, there is no concept of installing as a system resource. The only unit | |
| of software distribution is an "app". There is also no console where you could | |
| run a :program:`python` executable, or interact with a Python REPL. | |
| As a result, the only way you can use Python on Android is in embedded mode – that | |
| is, by writing a native Android application, embedding a Python interpreter | |
| using ``libpython``, and invoking Python code using the :ref:`Python embedding | |
| API <embedding>`. The full Python interpreter, the standard library, and all | |
| your Python code is then packaged into your app for its own private use. | |
| The Python standard library has some notable omissions and restrictions on | |
| Android. See the :ref:`API availability guide <mobile-availability>` for | |
| details. | |
| Adding Python to an Android app | |
| ------------------------------- | |
| Most app developers should use one of the following tools, which will provide a | |
| much easier experience: | |
| * `Briefcase <https://briefcase.beeware.org>`__, from the BeeWare project | |
| * `Buildozer <https://buildozer.readthedocs.io>`__, from the Kivy project | |
| * `Chaquopy <https://chaquo.com/chaquopy>`__ | |
| * `Flet <https://flet.dev/>`__ | |
| * `pyqtdeploy <https://www.riverbankcomputing.com/static/Docs/pyqtdeploy/>`__ | |
| * `Termux <https://termux.dev/en/>`__ | |
| If you're sure you want to do all of this manually, read on. You can use the | |
| :source:`testbed app <Platforms/Android/testbed>` as a guide; each step below contains a | |
| link to the relevant file. | |
| * First, acquire a build of Python for Android: | |
| * The easiest way is to download an Android release from `python.org | |
| <https://www.python.org/downloads/android/>`__. The ``prefix`` directory | |
| mentioned below is at the top level of the package. | |
| * Or if you want to build it yourself, follow the instructions in | |
| :source:`Platforms/Android/README.md`. The ``prefix`` directory will be created under | |
| :samp:`cross-build/{HOST}`. | |
| * Add code to your :source:`build.gradle <Platforms/Android/testbed/app/build.gradle.kts>` | |
| file to copy the following items into your project. All except your own Python | |
| code can be copied from ``prefix/lib``: | |
| * In your JNI libraries: | |
| * ``libpython*.*.so`` | |
| * ``lib*_python.so`` (external libraries such as OpenSSL) | |
| * In your assets: | |
| * ``python*.*`` (the Python standard library) | |
| * ``python*.*/site-packages`` (your own Python code) | |
| * Add code to your app to :source:`extract the assets to the filesystem | |
| <Platforms/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt>`. | |
| * Add code to your app to :source:`start Python in embedded mode | |
| <Platforms/Android/testbed/app/src/main/c/main_activity.c>`. This will need to be C code | |
| called via JNI. | |
| Building a Python package for Android | |
| ------------------------------------- | |
| Python packages can be built for Android as wheels and released on PyPI. The | |
| recommended tool for doing this is `cibuildwheel | |
| <https://cibuildwheel.pypa.io/en/stable/platforms/#android>`__, which automates | |
| all the details of setting up a cross-compilation environment, building the | |
| wheel, and testing it on an emulator. |