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 Merged-In: I3d5327bf4acd9c043483ace7b89576801b9e4ef1
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user