From 9918123bac48bd77b61aef98e73a8d927dfbe338 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Tue, 28 Jan 2020 10:55:25 -0800 Subject: [PATCH] Adds queries->provider tag This change adds support for the tag inside of the tag to support more succinct declaration that an app would like to see the provider of a given authority. Test: atest AppEnumerationTests AppsFilterTest Bug: 136675067 Change-Id: Ie0f73213fae7a3a0619238e44063d4e5be157201 --- .../content/pm/parsing/AndroidPackage.java | 2 + .../content/pm/parsing/ApkParseUtils.java | 20 ++++++ .../content/pm/parsing/PackageImpl.java | 14 +++++ .../content/pm/parsing/ParsingPackage.java | 2 + core/res/res/values/attrs_manifest.xml | 3 + .../com/android/server/pm/AppsFilter.java | 63 ++++++++++--------- .../com/android/server/pm/AppsFilterTest.java | 23 ++++--- tools/aapt2/link/ManifestFixer.cpp | 1 + 8 files changed, 90 insertions(+), 38 deletions(-) diff --git a/core/java/android/content/pm/parsing/AndroidPackage.java b/core/java/android/content/pm/parsing/AndroidPackage.java index fbe5a48ad61eb..da17ff3cdefc9 100644 --- a/core/java/android/content/pm/parsing/AndroidPackage.java +++ b/core/java/android/content/pm/parsing/AndroidPackage.java @@ -286,6 +286,8 @@ public interface AndroidPackage extends Parcelable { List getQueriesPackages(); + Set getQueriesProviders(); + String getRealPackage(); // TODO(b/135203078): Rename to getRequiredFeatures? Somewhat ambiguous whether "Req" is diff --git a/core/java/android/content/pm/parsing/ApkParseUtils.java b/core/java/android/content/pm/parsing/ApkParseUtils.java index 5c8c9a41a5204..548d82a6ab767 100644 --- a/core/java/android/content/pm/parsing/ApkParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkParseUtils.java @@ -96,6 +96,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; /** @hide */ public class ApkParseUtils { @@ -1817,6 +1818,25 @@ public class ApkParseUtils { ); } parsingPackage.addQueriesPackage(packageName.intern()); + } else if (parser.getName().equals("provider")) { + final TypedArray sa = res.obtainAttributes(parser, + R.styleable.AndroidManifestQueriesProvider); + try { + final String authorities = + sa.getString(R.styleable.AndroidManifestQueriesProvider_authorities); + if (TextUtils.isEmpty(authorities)) { + return parseInput.error( + PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Authority missing from provider tag." + ); + } + StringTokenizer authoritiesTokenizer = new StringTokenizer(authorities, ";"); + while (authoritiesTokenizer.hasMoreElements()) { + parsingPackage.addQueriesProvider(authoritiesTokenizer.nextToken()); + } + } finally { + sa.recycle(); + } } } return parseInput.success(parsingPackage); diff --git a/core/java/android/content/pm/parsing/PackageImpl.java b/core/java/android/content/pm/parsing/PackageImpl.java index fe8307c7c8cde..0df950006f437 100644 --- a/core/java/android/content/pm/parsing/PackageImpl.java +++ b/core/java/android/content/pm/parsing/PackageImpl.java @@ -215,6 +215,9 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android @Nullable private ArrayList queriesPackages; + @Nullable + private ArraySet queriesProviders; + @Nullable private ArrayMap processes; @@ -956,6 +959,12 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return this; } + @Override + public ParsingPackage addQueriesProvider(String authority) { + this.queriesProviders = ArrayUtils.add(this.queriesProviders, authority); + return this; + } + @Override public PackageImpl setProcesses(ArrayMap processes) { this.processes = processes; @@ -2975,6 +2984,11 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android return queriesPackages; } + @Override + public Set getQueriesProviders() { + return queriesProviders; + } + private static void internStringArrayList(List list) { if (list != null) { final int N = list.size(); diff --git a/core/java/android/content/pm/parsing/ParsingPackage.java b/core/java/android/content/pm/parsing/ParsingPackage.java index 9ddcc0995fd49..a2fe064b66c30 100644 --- a/core/java/android/content/pm/parsing/ParsingPackage.java +++ b/core/java/android/content/pm/parsing/ParsingPackage.java @@ -100,6 +100,8 @@ public interface ParsingPackage extends AndroidPackage { ParsingPackage addQueriesPackage(String packageName); + ParsingPackage addQueriesProvider(String authority); + ParsingPackage setProcesses(ArrayMap processes); ParsingPackage asSplit( diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index b22e1867f2571..c66261bb6630c 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -2056,6 +2056,9 @@ + + +