https://github.com/python/cpython/commit/1702ce58ae93273a1cb495c62da66ed52df9f0a9
commit: 1702ce58ae93273a1cb495c62da66ed52df9f0a9
branch: 3.14
author: Miss Islington (bot) <[email protected]>
committer: freakboy3742 <[email protected]>
date: 2026-07-30T02:41:19Z
summary:

[3.14] Minor fixes for Android (GH-154895) (#154906)

A collection of small cleanups for Android support:

* Clarifies the documentation around version number handling for iOS and
  Android in os.uname and platform.release
* Ensures that automated NDK installs surface messages written to stderr
* Makes the Android NDK check more robust for incomplete downloads
* Corrects some linting errors in Android build scripts
(cherry picked from commit f4b1d3e891d0d2055e53df3ccb84030bcaa148b5)

Co-authored-by: Malcolm Smith <[email protected]>

files:
M Android/android-env.sh
M Android/android.py
M Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt
M Doc/library/os.rst
M Doc/library/platform.rst

diff --git a/Android/android-env.sh b/Android/android-env.sh
index 5859c0eac4a88fb..59ce2eeb7d62244 100644
--- a/Android/android-env.sh
+++ b/Android/android-env.sh
@@ -7,7 +7,7 @@
 : "${PREFIX:-}"  # Path in which to find required libraries
 
 
-# Print all messages on stderr so they're visible when running within 
build-wheel.
+# Print all messages on stderr so they're visible when stdout is captured.
 log() {
     echo "$1" >&2
 }
@@ -27,7 +27,7 @@ fail() {
 ndk_version=27.3.13750724
 
 ndk=$ANDROID_HOME/ndk/$ndk_version
-if ! [ -e "$ndk" ]; then
+if ! [ -e "$ndk/package.xml" ]; then
     log "Installing NDK - this may take several minutes"
     yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" 
"ndk;$ndk_version"
 fi
diff --git a/Android/android.py b/Android/android.py
index 3784886bff4ce79..ed6537f56c80974 100755
--- a/Android/android.py
+++ b/Android/android.py
@@ -155,7 +155,7 @@ def android_env(host):
         f"PREFIX={prefix}; "
         f". {ENV_SCRIPT}; "
         f"export",
-        check=True, shell=True, capture_output=True, encoding='utf-8',
+        check=True, shell=True, stdout=subprocess.PIPE, encoding='utf-8',
     ).stdout
 
     env = {}
@@ -622,7 +622,8 @@ async def read_int(size):
     except ValueError:
         priority = LogPriority.UNKNOWN
 
-    payload_fields = (await read_bytes(payload_len - 1)).split(b"\0")
+    payload = await read_bytes(payload_len - 1)
+    payload_fields = payload.split(b"\0")
     if len(payload_fields) < 2:
         raise ValueError(
             f"payload {payload!r} does not contain at least 2 "
diff --git 
a/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt 
b/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt
index dc49cdb9a9f7395..c8fe3acd849ac7a 100644
--- a/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt
+++ b/Android/testbed/app/src/main/java/org/python/testbed/MainActivity.kt
@@ -28,12 +28,11 @@ class PythonTestRunner(val context: Context) {
      * @param args Python command-line, encoded as JSON.
      * @return The Python exit status: zero on success, nonzero on failure. */
     fun run(args: String) : Int {
-        // We leave argument 0 as an empty string, which is a placeholder for 
the
-        // executable name in embedded mode.
+        // Argument 0 is a placeholder for the executable name in embedded 
mode.
         val argsJsonArray = JSONArray(args)
-        val argsStringArray = Array<String>(argsJsonArray.length() + 1) { it 
-> ""}
-        for (i in 0..<argsJsonArray.length()) {
-            argsStringArray[i + 1] = argsJsonArray.getString(i)
+        val argsStringArray = Array<String>(argsJsonArray.length() + 1) { i ->
+            if (i == 0) ""
+            else argsJsonArray.getString(i - 1)
         }
 
         // Python needs this variable to help it find the temporary directory,
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index fe5cba128576ff0..df7d84a35310936 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -793,9 +793,9 @@ process and user.
    Returns information identifying the current operating system.
    The return value is a :class:`uname_result`.
 
-   On macOS, iOS and Android, this returns the *kernel* name and version (i.e.,
+   On macOS, iOS and Android, this returns the *kernel* name and release (i.e.,
    ``'Darwin'`` on macOS and iOS; ``'Linux'`` on Android). 
:func:`platform.uname`
-   can be used to get the user-facing operating system name and version on iOS 
and
+   can be used to get the user-facing operating system name and release on iOS 
and
    Android.
 
    .. seealso::
diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst
index ff254caa5fb8ba0..37c7cb44664ea8a 100644
--- a/Doc/library/platform.rst
+++ b/Doc/library/platform.rst
@@ -144,6 +144,8 @@ Cross platform
    Returns the system's release, e.g. ``'2.2.0'`` or ``'NT'``. An empty string 
is
    returned if the value cannot be determined.
 
+   On iOS and Android, this is the user-facing OS release. To obtain the
+   Darwin or Linux kernel release, use :func:`os.uname`.
 
 .. function:: system()
 
@@ -166,9 +168,6 @@ Cross platform
    Returns the system's release version, e.g. ``'#3 on degas'``. An empty 
string is
    returned if the value cannot be determined.
 
-   On iOS and Android, this is the user-facing OS version. To obtain the
-   Darwin or Linux kernel version, use :func:`os.uname`.
-
 .. function:: uname()
 
    Fairly portable uname interface. Returns a :func:`~collections.namedtuple`

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to