Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3580425 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

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
parent fa63f444
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -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;
@@ -4556,9 +4557,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        }
        try {
            // update rules for all installed applications
            final PackageManager pm = mContext.getPackageManager();
            final List<UserInfo> users;
            final List<ApplicationInfo> apps;

            Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "list-users");
            try {
@@ -4566,25 +4565,29 @@ 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);
            } finally {
                Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
            }

                final PackageManagerInternal packageManagerInternal = LocalServices.getService(
                        PackageManagerInternal.class);
                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);
                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);
            }
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
+26 −7
Original line number Diff line number Diff line
@@ -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<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(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<ApplicationInfo> buildInstalledApplicationInfoList() {
        final List<ApplicationInfo> 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<AndroidPackage> buildInstalledPackageList() {
        final List<AndroidPackage> 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<UserInfo> buildUserInfoList() {
        final List<UserInfo> users = new ArrayList<>();
        users.add(new UserInfo(USER_ID, "user1", 0));