From a6e49349d81d58ab4125bdfbea44b4949e9d4e0d Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Mon, 21 Mar 2022 23:31:27 +0000 Subject: [PATCH] Update network rules for only uids that are installed. Not all apps are installed on all users, so only look at apps which are installed on each user when updating the rules. Bug: 209338078 Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java Change-Id: I3d5327bf4acd9c043483ace7b89576801b9e4ef1 --- .../net/NetworkPolicyManagerService.java | 39 ++++++++++--------- .../net/NetworkPolicyManagerServiceTest.java | 33 ++++++++++++---- 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index c25e60864a688..589b8f18b1a56 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -162,6 +162,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageManagerInternal; import android.content.pm.UserInfo; import android.content.res.Resources; import android.database.ContentObserver; @@ -4539,9 +4540,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } try { // update rules for all installed applications - final PackageManager pm = mContext.getPackageManager(); final List users; - final List apps; Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-users"); try { @@ -4549,26 +4548,30 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } - Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-uids"); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "iterate-uids"); try { - apps = pm.getInstalledApplications( - PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DISABLED_COMPONENTS - | PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); + final PackageManagerInternal packageManagerInternal = LocalServices.getService( + PackageManagerInternal.class); + final int usersSize = users.size(); + for (int i = 0; i < usersSize; ++i) { + final int userId = users.get(i).id; + final SparseBooleanArray sharedAppIdsHandled = new SparseBooleanArray(); + packageManagerInternal.forEachInstalledPackage(androidPackage -> { + final int appId = androidPackage.getUid(); + if (androidPackage.getSharedUserId() != null) { + if (sharedAppIdsHandled.indexOfKey(appId) < 0) { + sharedAppIdsHandled.put(appId, true); + } else { + return; + } + } + final int uid = UserHandle.getUid(userId, appId); + consumer.accept(uid); + }, userId); + } } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } - - final int usersSize = users.size(); - final int appsSize = apps.size(); - for (int i = 0; i < usersSize; i++) { - final UserInfo user = users.get(i); - for (int j = 0; j < appsSize; j++) { - final ApplicationInfo app = apps.get(j); - final int uid = UserHandle.getUid(user.id, app.uid); - consumer.accept(uid); - } - } } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index af8ac6f412f54..7634b09b4dc6c 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -118,6 +118,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.content.pm.UserInfo; import android.net.ConnectivityManager; @@ -166,6 +167,7 @@ import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent; import com.android.internal.util.test.FsUtil; import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; +import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.usage.AppStandbyInternal; import com.google.common.util.concurrent.AbstractFuture; @@ -216,6 +218,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; import java.util.stream.Collectors; /** @@ -274,6 +277,7 @@ public class NetworkPolicyManagerServiceTest { ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); private ActivityManagerInternal mActivityManagerInternal; + private PackageManagerInternal mPackageManagerInternal; private IUidObserver mUidObserver; private INetworkManagementEventObserver mNetworkObserver; @@ -335,6 +339,7 @@ public class NetworkPolicyManagerServiceTest { when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{}); mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class); + mPackageManagerInternal = addLocalServiceMock(PackageManagerInternal.class); final PowerSaveState state = new PowerSaveState.Builder() .setBatterySaverEnabled(false).build(); @@ -483,8 +488,15 @@ public class NetworkPolicyManagerServiceTest { .thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B)); when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt())) .thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C)); - when(mPackageManager.getInstalledApplications(anyInt())).thenReturn( - buildInstalledApplicationInfoList()); + doAnswer(arg -> { + final Consumer consumer = + (Consumer) arg.getArguments()[0]; + for (AndroidPackage androidPackage : buildInstalledPackageList()) { + consumer.accept(androidPackage); + } + return null; + }).when(mPackageManagerInternal).forEachInstalledPackage( + any(Consumer.class), anyInt()); when(mUserManager.getUsers()).thenReturn(buildUserInfoList()); when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true); when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true); @@ -536,6 +548,7 @@ public class NetworkPolicyManagerServiceTest { LocalServices.removeServiceForTest(DeviceIdleInternal.class); LocalServices.removeServiceForTest(AppStandbyInternal.class); LocalServices.removeServiceForTest(UsageStatsManagerInternal.class); + LocalServices.removeServiceForTest(PackageManagerInternal.class); } @After @@ -2037,14 +2050,20 @@ public class NetworkPolicyManagerServiceTest { return ai; } - private List buildInstalledApplicationInfoList() { - final List installedApps = new ArrayList<>(); - installedApps.add(buildApplicationInfo(PKG_NAME_A, UID_A)); - installedApps.add(buildApplicationInfo(PKG_NAME_B, UID_B)); - installedApps.add(buildApplicationInfo(PKG_NAME_C, UID_C)); + private List buildInstalledPackageList() { + final List installedApps = new ArrayList<>(); + installedApps.add(createPackageMock(UID_A)); + installedApps.add(createPackageMock(UID_B)); + installedApps.add(createPackageMock(UID_C)); return installedApps; } + private AndroidPackage createPackageMock(int uid) { + final AndroidPackage androidPackage = mock(AndroidPackage.class); + when(androidPackage.getUid()).thenReturn(uid); + return androidPackage; + } + private List buildUserInfoList() { final List users = new ArrayList<>(); users.add(new UserInfo(USER_ID, "user1", 0));