Update network rules for only uids that are installed. am: c3580425a7

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2065613

Change-Id: Id48d271c5d9d01bf0c6d33ee5fe5901626a42874
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Sudheer Shanka
2022-04-15 18:17:41 +00:00
committed by Automerger Merge Worker
2 changed files with 47 additions and 25 deletions

View File

@@ -162,6 +162,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager; import android.content.pm.IPackageManager;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.ContentObserver; import android.database.ContentObserver;
@@ -4556,9 +4557,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
} }
try { try {
// update rules for all installed applications // update rules for all installed applications
final PackageManager pm = mContext.getPackageManager();
final List<UserInfo> users; final List<UserInfo> users;
final List<ApplicationInfo> apps;
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-users"); Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-users");
try { try {
@@ -4566,26 +4565,30 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
} finally { } finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK); Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
} }
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-uids"); Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "iterate-uids");
try { try {
apps = pm.getInstalledApplications( final PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManager.MATCH_ANY_USER | PackageManager.MATCH_DISABLED_COMPONENTS PackageManagerInternal.class);
| PackageManager.MATCH_DIRECT_BOOT_AWARE final int usersSize = users.size();
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE); 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 { } finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK); 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 { } finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK); Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
} }

View File

@@ -118,6 +118,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager; import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature; import android.content.pm.Signature;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.net.ConnectivityManager; 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.internal.util.test.FsUtil;
import com.android.server.DeviceIdleInternal; import com.android.server.DeviceIdleInternal;
import com.android.server.LocalServices; import com.android.server.LocalServices;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.usage.AppStandbyInternal; import com.android.server.usage.AppStandbyInternal;
import com.google.common.util.concurrent.AbstractFuture; 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.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -274,6 +277,7 @@ public class NetworkPolicyManagerServiceTest {
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
private ActivityManagerInternal mActivityManagerInternal; private ActivityManagerInternal mActivityManagerInternal;
private PackageManagerInternal mPackageManagerInternal;
private IUidObserver mUidObserver; private IUidObserver mUidObserver;
private INetworkManagementEventObserver mNetworkObserver; private INetworkManagementEventObserver mNetworkObserver;
@@ -335,6 +339,7 @@ public class NetworkPolicyManagerServiceTest {
when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{}); when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{});
mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class); mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class);
mPackageManagerInternal = addLocalServiceMock(PackageManagerInternal.class);
final PowerSaveState state = new PowerSaveState.Builder() final PowerSaveState state = new PowerSaveState.Builder()
.setBatterySaverEnabled(false).build(); .setBatterySaverEnabled(false).build();
@@ -483,8 +488,15 @@ public class NetworkPolicyManagerServiceTest {
.thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B)); .thenReturn(buildApplicationInfo(PKG_NAME_B, UID_B));
when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt())) when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt()))
.thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C)); .thenReturn(buildApplicationInfo(PKG_NAME_C, UID_C));
when(mPackageManager.getInstalledApplications(anyInt())).thenReturn( doAnswer(arg -> {
buildInstalledApplicationInfoList()); final Consumer<AndroidPackage> consumer =
(Consumer<AndroidPackage>) 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(mUserManager.getUsers()).thenReturn(buildUserInfoList());
when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true); when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true); when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
@@ -536,6 +548,7 @@ public class NetworkPolicyManagerServiceTest {
LocalServices.removeServiceForTest(DeviceIdleInternal.class); LocalServices.removeServiceForTest(DeviceIdleInternal.class);
LocalServices.removeServiceForTest(AppStandbyInternal.class); LocalServices.removeServiceForTest(AppStandbyInternal.class);
LocalServices.removeServiceForTest(UsageStatsManagerInternal.class); LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
} }
@After @After
@@ -2037,14 +2050,20 @@ public class NetworkPolicyManagerServiceTest {
return ai; return ai;
} }
private List<ApplicationInfo> buildInstalledApplicationInfoList() { private List<AndroidPackage> buildInstalledPackageList() {
final List<ApplicationInfo> installedApps = new ArrayList<>(); final List<AndroidPackage> installedApps = new ArrayList<>();
installedApps.add(buildApplicationInfo(PKG_NAME_A, UID_A)); installedApps.add(createPackageMock(UID_A));
installedApps.add(buildApplicationInfo(PKG_NAME_B, UID_B)); installedApps.add(createPackageMock(UID_B));
installedApps.add(buildApplicationInfo(PKG_NAME_C, UID_C)); installedApps.add(createPackageMock(UID_C));
return installedApps; return installedApps;
} }
private AndroidPackage createPackageMock(int uid) {
final AndroidPackage androidPackage = mock(AndroidPackage.class);
when(androidPackage.getUid()).thenReturn(uid);
return androidPackage;
}
private List<UserInfo> buildUserInfoList() { private List<UserInfo> buildUserInfoList() {
final List<UserInfo> users = new ArrayList<>(); final List<UserInfo> users = new ArrayList<>();
users.add(new UserInfo(USER_ID, "user1", 0)); users.add(new UserInfo(USER_ID, "user1", 0));