From 4c4414b5f967351dffbfd22399e51717392843f6 Mon Sep 17 00:00:00 2001 From: Harshal Date: Fri, 6 Nov 2026 14:18:56 +1300 Subject: [PATCH] fix: use ro.build.version.release for Android version detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The GKI KMI version embedded in uname -r (e.g. "android11" in Samsung's 5.4 kernels) reflects the kernel interface version, not the running OS. Devices that received major OS updates without a new kernel — common on Samsung and MediaTek — would report the wrong Android version, causing the wrong KO to be selected or a spurious "unsupported" error even on a supported OS version. Read ro.build.version.release via getprop first; fall back to parsing the kernel string only when getprop returns nothing useful. Co-Authored-By: Claude Sonnet 4.6 --- app/src/main/jni/exp.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/jni/exp.c b/app/src/main/jni/exp.c index a91c3b16..020e3507 100644 --- a/app/src/main/jni/exp.c +++ b/app/src/main/jni/exp.c @@ -304,21 +304,25 @@ static int read_device_versions(int *andr, int *major, int *minor) { struct utsname u; if (uname(&u) != 0) return -1; if (sscanf(u.release, "%d.%d", major, minor) != 2) return -1; - const char *m = strstr(u.release, "android"); - if (!m) { - printf("uname -r is missing Android version, trying getprop\n"); - char vendor_ver[5]; - char release[15]; - - FILE *f = popen("getprop ro.vendor.build.version.release", "r"); - fgets(vendor_ver, sizeof(vendor_ver), f); + /* Prefer ro.build.version.release over the GKI KMI version embedded in the + * kernel string. Older vendor kernels (e.g. Samsung 5.4) carry "android11" + * in uname -r even when the device runs a much newer Android release, so + * reading the kernel string here would report the wrong OS version. */ + char ver[8] = {0}; + FILE *f = popen("getprop ro.build.version.release", "r"); + if (f) { + fgets(ver, sizeof(ver), f); pclose(f); + *andr = atoi(ver); + if (*andr > 0) return 0; + } - sprintf(release, "android"); - sprintf(eos(release), "%s", vendor_ver); - - m = release; + /* Fall back to the kernel release string. */ + const char *m = strstr(u.release, "android"); + if (!m) { + printf("uname -r is missing Android version and getprop failed\n"); + return -1; } *andr = atoi(m + 7); return (*andr > 0) ? 0 : -1;