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();