This document describes the release process for python-for-android. It is intended for core developers who cut new releases. Casual contributors do not need to read it.
python-for-android uses calendar versioning of the
form YYYY.MM.DD (e.g. 2026.05.09). Calendar versioning is used because
changes are often driven by Android build-tool updates, so users generally
want the latest release. Backward compatibility is preserved across
releases where possible.
The single source of truth for the version is
pythonforandroid/__init__.py. setup.py
parses __version__ from that file and exposes it as the package version.
masteralways represents the latest stable release.developis the active development branch and the target for all PRs.- Release branches
release-YYYY.MM.DDare cut fromdevelopfor each release, then merged into bothmasterand back intodevelop.
-
Cut a release branch from an up-to-date
develop:git checkout develop && git pull git checkout -b release-YYYY.MM.DD -
Bump the version in
pythonforandroid/__init__.py. -
Regenerate
CHANGELOG.mdusinggithub-changelog-generator. -
Open a pull request from
release-YYYY.MM.DDtargetingmaster. Copy the release checklist into the PR description and tick items off as they are validated. -
Wait for review and complete the checklist before merging.
-
Merge the release branch into
master, then merge it back intodevelopso the version bump and changelog land on both branches. -
Tag the release commit on
masterwith an annotated tag:git checkout master && git pull git tag -a vYYYY.MM.DD -m "Release YYYY.MM.DD" git push origin vYYYY.MM.DD
Tags follow the format
vYYYY.MM.DD. -
PyPI upload happens automatically when the tag is pushed. The
pypi-release.ymlworkflow buildssdistandbdist_wheel, runstwine check, and uploads via thepypi_passwordtoken. Non-tag pushes still build and check the artifacts but do not publish. -
Create the GitHub Release at https://github.com/kivy/python-for-android/releases from the new tag. Use GitHub's "Generate release notes" feature to auto-fill the title and description from merged PRs since the previous tag, then tweak as needed.
-
Announce the release on Discord in the #announcements channel. Include the version number and a link to the GitHub release page.
Use this as the PR description for the release branch.
- Check that the builds are passing
- Run the tests locally via
tox: this performs some long-running tests that are skipped on github-actions. - Build and run the on_device_unit_tests app using buildozer. Check that they all pass.
- Build (or download from github actions) and run the following testapps for arch
armeabi-v7aandarm64-v8a:- on_device_unit_tests
-
armeabi-v7a(cd testapps/on_device_unit_tests && PYTHONPATH=.:../../ python3 setup.py apk --ndk-dir=<your-ndk-dir> --sdk-dir=<your-sdk-dir> --arch=armeabi-v7a --debug) -
arm64-v8a(cd testapps/on_device_unit_tests && PYTHONPATH=.:../../ python3 setup.py apk --ndk-dir=<your-ndk-dir> --sdk-dir=<your-sdk-dir> --arch=arm64-v8a --debug)
-
- on_device_unit_tests
- Check that the version number is correct