| .. _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 | |
| ------------------------------- | |
| These instructions are only needed if you're planning to compile Python for | |
| Android yourself. Most users should *not* need to do this. Instead, use one of | |
| the following tools, which will provide a much easier experience: | |
| * `Briefcase <https://briefcase.readthedocs.io>`__, from the BeeWare project | |
| * `Buildozer <https://buildozer.readthedocs.io>`__, from the Kivy project | |
| * `Chaquopy <https://chaquo.com/chaquopy>`__ | |
| * `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 <Android/testbed>` as a guide; each step below contains a | |
| link to the relevant file. | |
| * Build Python by following the instructions in :source:`Android/README.md`. | |
| * Add code to your :source:`build.gradle <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 ``cross-build/HOST/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 | |
| <Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt>`. | |
| * Add code to your app to :source:`start Python in embedded mode | |
| <Android/testbed/app/src/main/c/main_activity.c>`. This will need to be C code | |
| called via JNI. |