# Python for Android

If you obtained this README as part of a release package, then the only
applicable sections are "Prerequisites", "Testing", and "Using in your own app".

If you obtained this README as part of the CPython source tree, then you can
also follow the other sections to compile Python for Android yourself.

However, most app developers should not need to do any of these things manually.
Instead, use one of the tools listed
[here](https://docs.python.org/3/using/android.html), which will provide a much
easier experience.

## Prerequisites

If you already have an Android SDK installed, export the `ANDROID_HOME`
environment variable to point at its location. Otherwise, here's how to install
it:

* Download the "Command line tools" from <https://developer.android.com/studio>.
* Create a directory `android-sdk/cmdline-tools`, and unzip the command line
  tools package into it.
* Rename `android-sdk/cmdline-tools/cmdline-tools` to
  `android-sdk/cmdline-tools/latest`.
* `export ANDROID_HOME=/path/to/android-sdk`

The `Platforms/Android` script will automatically use the SDK's `sdkmanager` to install
any packages it needs.

The script also requires the following commands to be on the `PATH`:

* `curl`
* `java` (or set the `JAVA_HOME` environment variable).
  Java versions 17, 21 and 25 are supported.

## Building

Python can be built for Android on any POSIX platform supported by the Android
development tools, which currently means Linux or macOS.

First we'll make a "build" Python (for your development machine), then use it to
help produce a "host" Python for Android. So make sure you have all the usual
tools and libraries needed to build Python for your development machine.

The easiest way to do a build is to use the `Platforms/Android` script. You can either
have it perform the entire build process from start to finish in one step, or
you can do it in discrete steps that mirror running `configure` and `make` for
each of the two builds of Python you end up producing.

The discrete steps for building via `Platforms/Android` are:

```sh
python3 Platforms/Android configure-build
python3 Platforms/Android make-build
python3 Platforms/Android configure-host HOST
python3 Platforms/Android make-host HOST
```

`HOST` identifies which architecture to build. To see the possible values, run
`python3 Platforms/Android configure-host --help`.

To do all steps in a single command, run:

```sh
python3 Platforms/Android build HOST
```
In the end you should have a build Python in `cross-build/build`, and a host
Python in `cross-build/HOST`.

You can use `--` as a separator for any of the `configure`-related commands –
including `build` itself – to pass arguments to the underlying `configure`
call. For example, if you want a pydebug build that also caches the results from
`configure`, you can do:

```sh
python3 Platforms/Android build HOST -- -C --with-pydebug
```

## Packaging

After building an architecture as described in the section above, you can
package it for release with this command:

```sh
python3 Platforms/Android package HOST
```

`HOST` is defined in the section above.

This will generate a tarball in `cross-build/HOST/dist`, whose structure is
similar to the `Android` directory of the CPython source tree.

## Testing

Tests can be run  on Linux, macOS, or Windows, using either an Android emulator
or a physical device.

On Linux, the emulator needs access to the KVM virtualization interface. This may
require adding your user to a group, or changing your udev rules. On GitHub
Actions, the test script will do this automatically using the commands shown
[here](https://github.blog/changelog/2024-04-02-github-actions-hardware-accelerated-android-virtualization-now-available/).

The test script supports the following modes:

* In `--connected` mode, it runs on a device or emulator you have already
  connected to the build machine. List the available devices with
  `$ANDROID_HOME/platform-tools/adb devices -l`, then pass a device ID to the
  script like this:

  ```sh
  python3 Platforms/Android test --connected emulator-5554
  ```

* In `--managed` mode, it uses a temporary headless emulator defined in the
  `managedDevices` section of testbed/app/build.gradle.kts. This mode is slower,
  but more reproducible.

  We currently define two devices: `minVersion` and `maxVersion`, corresponding
  to our minimum and maximum supported Android versions. For example:

  ```sh
  python3 Platforms/Android test --managed maxVersion
  ```

By default, the only messages the script will show are Python's own stdout and
stderr. Add the `-v` option to also show Gradle output, and non-Python logcat
messages.

### Testing Python

You can run the test suite by doing a build as described above, and then running
`python3 Platforms/Android test`. On Windows, you won't be able to do the build
on the same machine, so you'll have to copy the `cross-build/HOST/prefix` directory
from somewhere else.

Extra arguments on the `Platforms/Android test` command line will be passed through
to `python -m test` – use `--` to separate them from `Platforms/Android`'s own options.
See the [Python Developer's
Guide](https://devguide.python.org/testing/run-write-tests/) for common options
– most of them will work on Android, except for those that involve subprocesses,
such as `-j`.

Every time you run `python3 Platforms/Android test`, changes in pure-Python files in the
repository's `Lib` directory will be picked up immediately. Changes in C files,
and architecture-specific files such as sysconfigdata, will not take effect
until you re-run `python3 Platforms/Android make-host` or `build`.

### Testing a third-party package

The `Platforms/Android` script is also included as `android.py` in the root of a
release package (i.e., the one built using `Platforms/Android package`).

You can use this script to test third-party packages by taking a release
package, extracting it wherever you want, and using the `android.py` script to
run the test suite for your third-party package.

Any argument that can be passed to `python3 Platforms/Android test` can also be
passed to `android.py`. The following options will be of particular use when
configuring the execution of a third-party test suite:

* `--cwd`: the directory of content to copy into the testbed app as the working
  directory.
* `--site-packages`: the directory to copy into the testbed app to use as site
  packages.

Extra arguments on the `android.py test` command line will be passed through to
Python – use `--` to separate them from `android.py`'s own options. You must include
either a `-c` or `-m` argument to specify how the test suite should be started.

For more details, run `android.py test --help`.

## Using in your own app

See https://docs.python.org/3/using/android.html.
