From 4d15b7f50957e0870ddd05fbdf794b3bb1e45cfa Mon Sep 17 00:00:00 2001 From: Kaoru0822 Date: Thu, 12 Nov 2026 16:29:40 -0800 Subject: [PATCH] fix(android): preserve SDK-gated manifest permissions (#10236) --- bridge/android/ReaJadxBridge.java | 4 +++- .../android/ReaJadxMetadataRegression.java | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/bridge/android/ReaJadxBridge.java b/bridge/android/ReaJadxBridge.java index 4c42e1e7d5..0678d111c1 100644 --- a/bridge/android/ReaJadxBridge.java +++ b/bridge/android/ReaJadxBridge.java @@ -464,7 +464,9 @@ class ReaJadxBridge { if (element.getTagName().equals("uses-sdk")) { minSdk = element.getAttributeNS(android, "minSdkVersion"); targetSdk = element.getAttributeNS(android, "targetSdkVersion"); - } else if (element.getTagName().equals("uses-permission")) { + } else if (element.getTagName().equals("uses-permission") + || element.getTagName().equals("uses-permission-sdk-23") + || element.getTagName().equals("uses-permission-sdk-m")) { String permission = element.getAttributeNS(android, "name"); if (!permission.isEmpty()) permissions.add(permission); } diff --git a/tests/conformance/android/ReaJadxMetadataRegression.java b/tests/conformance/android/ReaJadxMetadataRegression.java index 678ee24825..042b3924d0 100644 --- a/tests/conformance/android/ReaJadxMetadataRegression.java +++ b/tests/conformance/android/ReaJadxMetadataRegression.java @@ -51,8 +51,14 @@ public class ReaJadxMetadataRegression { + prefix + ":versionName=\"" + encoded + "\" " + prefix + ":versionCode=\"7\"" + " other:versionName=\"decoy\">"; + + ":name=\"org.example.MARKER\"/>" + + "" + + "" + + "" + + ""; Map summary = ReaJadxBridge.manifestSummary(xml); require(summary.get("package").equals("org.example.root"), "Wrong manifest package"); require(summary.get("version_name").equals( @@ -60,8 +66,9 @@ public class ReaJadxMetadataRegression { "Version name lost XML entity identity: " + summary); require(summary.get("version_code").equals("7") && summary.get("min_sdk").equals("23") && summary.get("target_sdk").equals("35"), "Namespace prefix changed summary values"); - require(summary.get("permissions").equals(List.of("org.example.MARKER")), - "Permission summary included a nested or unrelated declaration"); + require(summary.get("permissions").equals( + List.of("org.example.MARKER", "org.example.SDK23", "org.example.SDKM")), + "Permission summary lost SDK-gated declarations or included unrelated declarations"); } } for (String xml : List.of("", "", @@ -80,7 +87,9 @@ public class ReaJadxMetadataRegression { for (boolean assetFirst : List.of(true, false)) { String pkg = assetFirst ? "org.example.first" : "org.example.second"; String root = ""; + + pkg + "\" a:versionName=\"one & beta\" a:versionCode=\"7\">" + + "" + + ""; String asset = ""; Path apk = output.resolve(assetFirst ? "manifest-asset-first.apk" : "manifest-root-first.apk"); try (ZipOutputStream zip = new ZipOutputStream(Files.newOutputStream(apk))) { @@ -99,6 +108,9 @@ public class ReaJadxMetadataRegression { JsonObject summary = call(handle, bridge, "get_app_info", new JsonObject()); require(summary.get("package").getAsString().equals(pkg), "Asset or previous session supplied package facts"); require(summary.get("version_name").getAsString().equals("one & beta"), "Wrong root version value"); + require(summary.getAsJsonArray("permissions").equals(JsonParser.parseString( + "[\"org.example.SDK23\",\"org.example.SDKM\"]")), + "Root manifest SDK-gated permissions were omitted"); String raw = holder.current().getResources().stream() .filter(resource -> resource.getOriginalName().equals("AndroidManifest.xml")) .findFirst().orElseThrow().loadContent().getText().getCodeStr();