serious_python_android
Android implementation of the serious_python plugin
4.5.1
23K downloads/mo
#2072 most downloaded on pub.dev
flet-dev/serious-python
What this package is like to depend on
Last release 24 days ago
31 Jul 2026
Release timing varies
gaps range from 9 days to 2 months
Nearly every release is documented
notes for 50 of 51 stable releases
1 version withdrawn
withdrawn after publishing
3 years old
52 releases · first in 2023
31 releases in the last 12 months
see the full history below
Release timeline
52 releases · Sep 2023 to Jul 2026Releases
latest 52-
4.5.131 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.5.1: sign and verify both XCFramework layers by @FeodorFitsner in #245
Full Changelog: v4.5.0...v4.5.1
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260730 and
dart_bridgeto 1.7.1. Both exist to sign the Apple XCFrameworks on both layers (seeserious_python_darwin4.5.1); no Python version moved from 20260729 (3.12.13 / 3.13.14 / 3.14.6), and nothing about Android changed.
-
4.5.029 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.5.0: preserve provider XCFramework signatures through staging by @FeodorFitsner in #244
Full Changelog: v4.4.2...v4.5.0
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260729 and
dart_bridgeto 1.7.0. Both exist to provider-sign the Apple XCFrameworks (seeserious_python_darwin4.5.0). Nothing about Android changed: no Python version moved from 20260727 (3.12.13 / 3.13.14 / 3.14.6), anddart_bridge's Android.sos are byte-identical to 1.6.1 — verified, not assumed.
-
4.4.227 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.4.2: Xcode build-provenance keys in iOS framework Info.plists by @FeodorFitsner in #242
Full Changelog: v4.4.1...v4.4.2
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260727. Its only functional change is to the iOS frameworks'
Info.plist(seeserious_python_darwin4.4.2); no versions moved and the Android runtime is unchanged from 20260726.
-
4.4.126 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.4.1: OpenSSL privacy manifest for iOS _ssl/_hashlib by @FeodorFitsner in #241
Full Changelog: v4.4.0...v4.4.1
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260726. Its only functional change is an iOS privacy-manifest fix (see
serious_python_darwin4.4.1); no versions moved and the Android runtime is unchanged from 20260725.
-
4.4.025 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.4.0: dart_bridge as a dynamic framework on Apple platforms by @FeodorFitsner in #240
Full Changelog: v4.3.6...v4.4.0
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260725 (
dart_bridge1.5.1 → 1.6.1). 1.6.1 changes only howdart_bridgeis packaged for Apple platforms (static library → dynamic framework, seeserious_python_darwin4.4.0); the Android runtime is byte-identical to 20260720.
-
4.3.620 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.3.6: Windows UTF-8 startup fix (dart_bridge 1.5.1, python-build 20260720) by @FeodorFitsner in #238
- fix(android): make PEP 734 subinterpreters work (
concurrent.interpreters/InterpreterPoolExecutor) by @ndonkoHenri in #239
Full Changelog: v4.3.4...v4.3.6
Release notes
Open source →- PEP 734 subinterpreters now work (Python 3.14
concurrent.interpreters/InterpreterPoolExecutor) — enabling true multi-core CPU parallelism inside a single process, whichmultiprocessingcannot provide on Android. Previously the main interpreter imported the machinery fine, but every subinterpreter raisedModuleNotFoundErrorfor_struct/_interpqueues/ any other C extension, soInterpreterPoolExecutorand the low-level API were unusable. Cause: Android relocates C extensions (native-mmap packaging) and resolves them through_SorefFinderonsys.meta_path;sys.meta_pathis per-interpreter, andinstall()only ran in the main interpreter, so a freshly created subinterpreter had ameta_pathwithout the finder. Fix:_sp_bootstrap.install()now also wrapsconcurrent.interpreters.create()so every new interpreter installs the finder before use. The install runs viaInterpreter.exec()— a source string, which is pickle-free (unlikeInterpreter.call()), so it works before_structis importable in the child. BecauseInterpreterPoolExecutorbuilds its workers viaconcurrent.interpreters.create(), the pool is fixed transparently with no user-code change. A no-op before 3.14; iOS/desktop were unaffected. - Re-pins the bundled python-build snapshot to 20260720 (
dart_bridge1.5.0 → 1.5.1). 1.5.1 is a Windows-only UTF-8 startup fix (seeserious_python_windows4.3.6); the Android runtime is functionally unchanged from 20260719.
-
4.3.520 Jul 2026 withdrawnNothing published for this version
-
4.3.419 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.3.4: Android
flet debugstale-code fix (flet #6682) by @FeodorFitsner in #235 - Re-pin python-build to 20260719: desktop _pyrepl restored (pydoc/pdb, #236) by @FeodorFitsner in #237
Full Changelog: v4.3.3...v4.3.4
Release notes
Open source →- Re-pins the bundled python-build snapshot to 20260719 (previously 20260714). The snapshot un-prunes
_pyreplon Windows/Linux desktop only; Android already shipped_pyrepl(un-pruned in 4.3.2), so these runtimes are byte-identical to 20260714. - Android: fix code edits not taking effect under
flet debug android— the app kept running the previously-unpacked, stale code after a re-run (flet-dev/flet#6682).prepareAppcopies the app payload out of the APK only when its cache key changes, and the key wasversionName+versionCode. Sinceflet debugreinstalls the same-version APK on each iteration (flutter rundoes an update install that preserves app data, including the cache marker), the key never changed and re-extraction was skipped. The key now also includesPackageManager.lastUpdateTime, which is bumped on every (re)install but stays stable across plain relaunches — so a debug reinstall re-extracts the new code while ordinary relaunches still hit the cache.flet build apkwas unaffected (fresh/version-bumped install).
- Bump to 4.3.4: Android
-
4.3.316 Jul 2026Release notes
Open source →What's Changed
- Fix Windows build failure on non-UTF-8 locales (C4819/C2220) by @FeodorFitsner in #234
Full Changelog: v4.3.2...v4.3.3
Release notes
Open source →- Version bump aligning with the
serious_python_*4.3.3 release (a Windows build fix). No Android-affecting changes.
-
4.3.214 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.3.2: python-build 20260712 (Android mimalloc seccomp crash, mobile _pyrepl restored) by @FeodorFitsner in #230
- Mobile packaging fixes: iOS interdependent-dylib frameworks + Android native-init packages by @ndonkoHenri in #232
- Re-pin python-build to 20260714: iOS _posixshmem restored (multiprocessing imports) by @FeodorFitsner in #233
Full Changelog: v4.3.1...v4.3.2
Release notes
Open source →- Resolve a package whose
__init__is itself the native extension._SorefFinderonly probed<dotted>.soref, so a package that ships its extension as<pkg>/__init__.<abi>.so— e.g. apsw (import nameapsw), whose relocation marker lands atapsw/__init__.soref— was never resolved:find_specreturnedNone, the synthesized emptyapsw/__init__.pywon, andimport apswyielded an empty module (AttributeError: module 'apsw' has no attribute 'Connection').find_specnow falls back to<dotted>/__init__.soref, loads the extension under the correct top-level name viaExtensionFileLoader, and marks the result a package (withsubmodule_search_locations) so pure-Python submodules (apsw.ext, …) still resolve. - Bump the bundled python-build snapshot to
20260714, fixing two on-device crashes on Python 3.13/3.14 (3.12 is unaffected; Python/dart_bridgeversions are unchanged):- Apps died with
SIGSYSatdlopen()oflibpython— before the interpreter even started — on x86_64/x86/armeabi-v7a: mimalloc (bundled with CPython since 3.13) reads/proc/sys/vm/overcommit_memoryduring allocator init via a bareopen(2)syscall, which Android's bionic seccomp policy forbids (onlyopenat(2)is allowed). python-build now patches the call toSYS_openat(AT_FDCWD, …).arm64-v8awas latently unaffected (noSYS_openthere, so mimalloc already went through libcopen()→openat), but emulators are typically x86_64. _pyreplis no longer pruned from the bundled stdlib: Python 3.14'spdbimports it at module load, so anything importingpdb(e.g. pytest's debugging plugin) died withModuleNotFoundError: No module named '_pyrepl'.
- Apps died with
-
4.3.110 Jul 2026Release notes
Open source →- Fix
flet build apk --arch <abi>shipping an emptysitepackages.zipwhenever the selected ABI subset didn't includearm64-v8a(e.g.--arch x86_64) — the app bundled no Python site-packages at all and the very first dependency import failed at startup. The ABI-common pure-code zips (sitepackages.zip/extract.zip) were built from a hardcoded primary ABI (abis.first(), i.e.arm64-v8a); when only other ABIs were staged underSERIOUS_PYTHON_SITE_PACKAGES, the primary split task walked a nonexistent directory and silently produced a valid-but-empty zip. The primary ABI is now the first manifest ABI whose site-packages tree was actually staged. If none is staged at all (legitimate when packaging with no requirements), the build falls back toabis.first()and logssitepackages.zip will be emptyinstead of staying silent.
- Fix
-
4.3.009 Jul 2026Release notes
Open source →PYTHONINSPECT=1is no longer set by any platform implementation. It had no effect on the embedded interpreter, but it leaked into the process environment where any real interpreter child (e.g. a serviced multiprocessing worker) would inherit it and hang in interactive mode after its command completed. No functional change on Android, which doesn't support process spawning.- Bump the bundled python-build snapshot to
20260708(dart_bridge1.5.0). The new multiprocessing child-interception exports are present in the runtime but not wired up on Android, which doesn't support process spawning.
-
4.2.102 Jul 2026Release notes
Open source →- Bump the bundled python-build snapshot to
20260701; aligns with theserious_python_*4.2.1 release. The Android runtimes are byte-identical to20260630(the release only rebuilds the iOS runtime).
- Bump the bundled python-build snapshot to
-
4.2.001 Jul 2026Release notes
Open source →armeabi-v7a(32-bit ARM) is now bundled for Python 3.13 and 3.14, not just 3.12.flet-dev/python-build20260630publishes 32-bit ARM runtimes for those minors (built withdart_bridge1.4.1), so the per-minorandroid_abisinpython_versions.propertiesnow includearmeabi-v7aacross the board anddefaultConfig.ndk.abiFilters+ the per-ABI download/copy fan-out pick it up automatically — no Gradle change needed.
-
4.1.129 Jun 2026Release notes
Open source →- Fix app crashing on launch on Android 8.1 and below (API < 28). The
getAppVersionmethod-channel handler, called on every startup, usedPackageInfo.getLongVersionCode()(API 28+) unconditionally. R8 outlines this call into a synthetic class that it can merge with other API 28+ outlines — notably Flutter 3.41'sImageDecoder-based image decoder — and invoking that merged class on API < 28 fails verification withNoClassDefFoundError: android.graphics.ImageDecoder$OnHeaderDecodedListener. The call is now guarded with aBuild.VERSION.SDK_INTcheck, falling back to the deprecatedversionCodeint field on older devices. - Fix the embedded interpreter crashing on startup on a non-primary ABI (e.g. an x86_64 emulator when
arm64-v8ais the primary ABI) withModuleNotFoundError: No module named '_sysconfigdata__android_<arch>-linux-android'. The ABI-commonstdlib.zipwas built from the primary ABI only, dropping every other ABI's arch-specific_sysconfigdata__android_<arch>module — which CPython imports at startup viasysconfig(pulled in byctypes). The primarysplitStdlibtask now also harvests each other ABI's_sysconfigdata__android_<arch>intostdlib.zip(only that arch-specific module, so the generic ABI-identical_sysconfigdata__linux_shipped by some versions like 3.12 isn't duplicated).
- Fix app crashing on launch on Android 8.1 and below (API < 28). The
-
4.1.025 Jun 2026Release notes
Open source →- Run the
extractAsset/unzipAsset/loadLibrarymethod-channel handlers on a backgroundExecutor(posting theResultback on the main looper) instead of inline on the platform main thread. The first-launch asset unpack and the pyjnius native-library load no longer block Android'sChoreographer, so Flutter's vsync isn't starved and on-screen animations (e.g. a boot/splash spinner) stay smooth while the app starts. - Ship consumer ProGuard/R8 keep rules (
-keep class com.flet.serious_python_android.** { *; }) so release (minified) builds don't obfuscate or strip the classes pyjnius resolves by name at runtime. Without them R8 renamedPythonActivityand dropped its staticmActivityfield, breaking pyjnius in release builds withtype object 'C.f' has no attribute 'mActivity'(debug builds were unaffected). - Version bump aligning with the
serious_python_*4.1.0 release.
- Run the
-
4.0.022 Jun 2026Release notes
Open source →- Ship the app as a stored
app.zipasset in the APK and unpack it once (version-keyed) to<application-support>/flet/appon the first launch after install/update, via the newprepareApp(). The version-keyed unpack moved out ofrun(); user data in the sibling<application-support>/datais preserved across updates. - Resolve the support dir via
path_providergetApplicationSupportDirectory()(==context.getFilesDir()) and drop the customgetFilesDirmethod channel; the payload base moves fromflet/pytoflet/. - Synthesize an empty
__init__.pyfor__init__-less package directories when buildingstdlib.zip/sitepackages.zip, sozipimportcan import PEP 420 namespace packages (e.g.flask.sansio). SERIOUS_PYTHON_ANDROID_EXTRACT_PACKAGESentries now support*/?wildcards matched against the top-level name (e.g.flask*also extractsflask-<version>.dist-info/).- Restore
pyjniussupport under the FFI model: re-add theloadLibrarymethod channel and load its JNI helper (libpyjni.so) via JavaSystem.loadLibrarybefore the interpreter starts, so the helper'sJNI_OnLoadcaptures theJavaVM+ app ClassLoader (dart:ffi'sdlopenforlibdart_bridgenever triggersJNI_OnLoad). Best-effort — a no-op for apps that don't depend on pyjnius. - Version bump aligning with the
serious_python_*4.0.0 release.
- Ship the app as a stored
-
3.0.018 Jun 2026Release notes
Open source →- In-process Python (dart_bridge FFI). The Python lifecycle now runs through
libdart_bridge.so(fromflet-dev/dart-bridge1.4.0) instead of a socket transport. - Native modules are memory-mapped from the APK — no more
useLegacyPackaging. Python extension modules (stdliblib-dynloadand site-packages) are relocated intojniLibs/<abi>/lib<mangled>.soand loaded directly from the APK by a customsys.meta_pathfinder that resolves them from.sorefmarkers — no extraction to disk, still ABI-split by the Play Store. Pure Python ships in stored, ABI-common asset zips read viazipimport, so the stdlib is no longer duplicated per ABI. This replaces the previous scheme of zipping stdlib/site-packages into fakelib*.sofiles (which requireduseLegacyPackaging). The dart-bridge Android binary now uses the full CPython API (PyConfig) to install the finder beforesiteruns. SetSERIOUS_PYTHON_ANDROID_EXTRACT_PACKAGES(comma-separated relative paths) to ship path-hungry packages extracted to disk instead. - Breaking change: requires Flutter 3.44.2. Moves to AGP 8.11.1, Gradle 8.11.1,
compileSdk36, Java 17, and the Kotlin-DSL Gradle build (build.gradle.kts). build.gradleresolves the Python version from the generatedpython_versions.properties(a snapshot of python-build'smanifest.json):SERIOUS_PYTHON_VERSIONselects the version; the full version, build date anddart_bridgeversion derive from the table, withSERIOUS_PYTHON_FULL_VERSION/SERIOUS_PYTHON_BUILD_DATE/DART_BRIDGE_VERSIONleft as escape hatches. Downloads continue to use python-build's date-keyed release scheme.- Drop the
x86(32-bit Intel) ABI — Flutter no longer produces it. ABIs arearm64-v8a+x86_64(plusarmeabi-v7aon Python 3.12). - Remove the scaffold
getPlatformVersionmethod.
- In-process Python (dart_bridge FFI). The Python lifecycle now runs through
-
2.0.007 Jun 2026Release notes
Open source →- Breaking change: default bundled Python version is now 3.14 (was 3.12). Apps built without an explicit
SERIOUS_PYTHON_VERSIONenv var pull the 3.14 python-build distribution and shiplibpython3.14.so. SetSERIOUS_PYTHON_VERSION=3.12(typically threaded throughflet build) to preserve the previous default. - Multi-version Python support.
python_versioninandroid/build.gradlereads fromSERIOUS_PYTHON_VERSIONand drives theflet-dev/python-builddownload URL. - The Dart runtime no longer hardcodes
libpython3.12.so— it scansnativeLibraryDirforlibpython3.*.soso whichever libpython the plugin bundled is loaded automatically. abiFiltersnow branches onpython_version: keeparmeabi-v7afor 3.12, restrict toarm64-v8a+x86_64for 3.13+ (python-build dropped 32-bit Android per PEP 738).
- Breaking change: default bundled Python version is now 3.14 (was 3.12). Apps built without an explicit
-
1.0.106 Jun 2026Release notes
Open source →Improvements
- Cache downloaded Python distribution tarballs (
python-android-dart-<py>-<abi>.tar.gz) across builds. ThedownloadDistArchive_*Gradle tasks now write to a persistent cache directory —$FLET_CACHE_DIR/python-build/v<python_version>/if the env var is set, otherwise~/.flet/cache/python-build/v<python_version>/— and useonlyIfModified true+useETag "all"so subsequent builds issue a conditional GET (If-None-Match/If-Modified-Since) againstobjects.githubusercontent.cominstead of re-downloading 30–100 MB per ABI per build. When the upstream release republishes a tarball at the same URL (e.g. a Python patch update under the existingv<py>release), the validators flip and the cache refreshes automatically; otherwise the build skips the download entirely.tempAndMove trueguards against partial downloads being kept in the cache (flet-dev/flet#6555, #208) by @FeodorFitsner.
Bug fixes
- Cache downloaded Python distribution tarballs (
-
1.0.012 May 2026Release notes
Open source →- Breaking change:
--platformargument valuePyodidehas been renamed toEmscriptento match whatplatform.system()returns in the Pyodide runtime, so PEP 508 markers likeplatform_system != 'Emscripten'work consistently.
- Breaking change:
-
0.9.1203 May 2026 -
0.9.1101 Mar 2026 -
0.9.1021 Feb 2026Release notes
Open source →- Android: Add debug logs and deduplicate FFI imports.
- Android: Invalidate extracted assets when version keys change.
-
0.9.931 Jan 2026Release notes
Open source →- Add zipDirectoryPosix to create POSIX-compliant app archives on Windows.
- Enforce C++20 standard for
serious_pythonplugin build. - Fix: Normalize
WINDIRpath for bundled DLLs in CMake. - Fix Logcat logging crash on some Android devices.
-
0.9.822 Dec 2025 -
0.9.718 Dec 2025 -
0.9.602 Dec 2025 -
0.9.501 Dec 2025 -
0.9.421 Oct 2025 -
0.9.319 Oct 2025Release notes
Open source →- Fix: Hidden files in site-packages are skipped when building macOS app.
- Fix: Do not delete package metadata in
.dist-infodirectories (#164).
-
0.9.211 Mar 2025Release notes
Open source →- Breaking change: multiple
--requirementsoptions ofpackagecommand must be passed as--requirements DEP_1 --requirements DEP_2 ...(or-r DEP_1 -r DEP_2 ...) instead of-r DEP_1,DEP_2,...to support dependency specifications with commas, e.g.pandas>=2.2,<3. - Fix site-packages packaging for Pyodide platform.
- Breaking change: multiple
-
0.9.105 Mar 2025Release notes
Open source →- Fix
serious_pythonto work on macOS 12 Monterey and built with Xcode 14.
- Fix
-
0.9.020 Feb 2025Release notes
Open source →- Set
MinimumOSVersionto13.0for generated Python frameworks. - iOS and macOS packaging: Python system libraries are put into
python.bundleto pass App Store verification. - On macOS, Windows, and Linux, application site packages are copied in an unpacked state to the application bundle to speed up the first launch.
- Pyodide 0.27.2
- Python 3.12.9
- Packaging
--cleanupoption replaced with two separate--cleanup-appand--cleanup-packagesoptions. - New packaging options
--cleanup-app-filesand--cleanup-package-filesto specify a list of globs to exclude files and directories from app and site packages. - New packaging
--skip-site-packagesoption to skip site packages installation for faster re-builds. - Packaging
--archoption accepts a list now.
- Set
-
0.8.707 Jan 2025 -
0.8.606 Jan 2025Release notes
Open source →- Added
com.flet.serious_python_android.PythonActivityholder class withmActivityholding a reference to an app MainActivity. Needed forplyer. - Android plugin sets
MAIN_ACTIVITY_HOST_CLASS_NAMEenvironment variable with the name of activity holder class name (com.flet.serious_python_android.PythonActivity). - Android plugin sets
MAIN_ACTIVITY_CLASS_NAMEenvironment variable with a class name of an app MainActivity. - Android plugin sets
ANDROID_NATIVE_LIBRARY_DIRenvironment variable with the path to a directory containing app .so libraries. Needed for patchingctypes.find_library. - Changed behavior of
SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONSenvironment variable that should contain a comma-separated list of packages to allow installation from source distribution. - Fixed: iOS
site-packagestoxcframeworksmigration script supports bothlibrary.soandlibrary.{something}.so.
- Added
-
0.8.501 Jan 2025 -
0.8.405 Dec 2024Release notes
Open source →- Copy
site-packages/fluttercontents toSERIOUS_PYTHON_FLUTTER_PACKAGES. - Added
SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONSvariable to allow pip installing from source distributions.
- Copy
-
0.8.303 Dec 2024 -
0.8.228 Oct 2024 -
0.8.115 Oct 2024 -
0.8.008 Oct 2024 -
0.7.121 Jun 2024 -
0.7.015 Jan 2024Release notes
Open source →runPython()method to support running Python script.- Updated
flet_exampleto catch program output and errors,sys.exit()support. packagecommand to read dependencies frompyproject.toml.
-
0.6.121 Dec 2023Release notes
Open source →--excludeoption forpackagecommand - to exclude directories and files from Python app package.- Re-create temp Python distributive directory on every run of
packagecommand.
-
0.6.013 Dec 2023Release notes
Open source →--verboseflag - verbose output.--mobileflag - (removes.so) from app dest archive.--webflag for packaging for pyodide.--find-linksoption for installing pip dependencies from alternative sources (indexes).--dep-mappingsfor rewritingfletdependency to eitherflet-embedorflet-pyodide.--req-depsfor adding required dependencies likeflet-embedorflet-pyodide.--platformoption for use withsitecustomize.pyto tweak pip to pull platform-specific packages.- More structured regular output.
- Bump deps versions.
-
0.5.125 Nov 2023 -
0.5.024 Nov 2023 -
0.4.102 Nov 2023 -
0.4.002 Nov 2023 -
0.3.125 Sep 2023Nothing published for this version
-
0.3.025 Sep 2023