diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 79a4da2a4a655..690b9f71d90be 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -481,6 +481,12 @@ public class AppsFilter { mQueriesViaPackage.add(newPkgSetting.appId, existingSetting.appId); } } + // if either package instruments the other, mark both as visible to one another + if (pkgInstruments(newPkgSetting, existingSetting) + || pkgInstruments(existingSetting, newPkgSetting)) { + mQueriesViaPackage.add(newPkgSetting.appId, existingSetting.appId); + mQueriesViaPackage.add(existingSetting.appId, newPkgSetting.appId); + } } int existingSize = existingSettings.size(); @@ -715,19 +721,6 @@ public class AppsFilter { Trace.endSection(); } - if (callingPkgSetting != null) { - if (callingPkgInstruments(callingPkgSetting, targetPkgSetting, targetName)) { - return false; - } - } else { - for (int i = callingSharedPkgSettings.size() - 1; i >= 0; i--) { - if (callingPkgInstruments(callingSharedPkgSettings.valueAt(i), - targetPkgSetting, targetName)) { - return false; - } - } - } - try { Trace.beginSection("mOverlayReferenceMapper"); if (callingSharedPkgSettings != null) { @@ -762,16 +755,16 @@ public class AppsFilter { } } - private static boolean callingPkgInstruments(PackageSetting callingPkgSetting, - PackageSetting targetPkgSetting, - String targetName) { + /** Returns {@code true} if the source package instruments the target package. */ + private static boolean pkgInstruments(PackageSetting source, PackageSetting target) { try { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "callingPkgInstruments"); - final List inst = callingPkgSetting.pkg.getInstrumentations(); + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "pkgInstruments"); + final String packageName = target.pkg.getPackageName(); + final List inst = source.pkg.getInstrumentations(); for (int i = ArrayUtils.size(inst) - 1; i >= 0; i--) { - if (Objects.equals(inst.get(i).getTargetPackage(), targetName)) { + if (Objects.equals(inst.get(i).getTargetPackage(), packageName)) { if (DEBUG_LOGGING) { - log(callingPkgSetting, targetPkgSetting, "instrumentation"); + log(source, target, "instrumentation"); } return true; } diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java index 5d5c71471aec2..22591c6e10a7e 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java @@ -31,6 +31,7 @@ import android.content.pm.PackageParser; import android.content.pm.Signature; import android.content.pm.parsing.ParsingPackage; import android.content.pm.parsing.component.ParsedActivity; +import android.content.pm.parsing.component.ParsedInstrumentation; import android.content.pm.parsing.component.ParsedIntentInfo; import android.content.pm.parsing.component.ParsedProvider; import android.os.Build; @@ -135,6 +136,13 @@ public class AppsFilterTest { .addActivity(activity); } + private static ParsingPackage pkgWithInstrumentation( + String packageName, String instrumentationTargetPackage) { + ParsedInstrumentation instrumentation = new ParsedInstrumentation(); + instrumentation.setTargetPackage(instrumentationTargetPackage); + return pkg(packageName).addInstrumentation(instrumentation); + } + private static ParsingPackage pkgWithProvider(String packageName, String authority) { ParsedProvider provider = new ParsedProvider(); provider.setPackageName(packageName); @@ -608,6 +616,25 @@ public class AppsFilterTest { assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } + @Test + public void testInstrumentation_DoesntFilter() { + final AppsFilter appsFilter = + new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); + appsFilter.onSystemReady(); + + + PackageSetting target = simulateAddPackage(appsFilter, pkg("com.some.package"), + DUMMY_TARGET_UID); + PackageSetting instrumentation = simulateAddPackage(appsFilter, + pkgWithInstrumentation("com.some.other.package", "com.some.package"), + DUMMY_CALLING_UID); + + assertFalse( + appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, instrumentation, target, 0)); + assertFalse( + appsFilter.shouldFilterApplication(DUMMY_TARGET_UID, target, instrumentation, 0)); + } + private interface WithSettingBuilder { PackageSettingBuilder withBuilder(PackageSettingBuilder builder); }