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

Commit 8396fa6d authored by JW Wang's avatar JW Wang
Browse files

Include bounded services when calculating package dependency

If Foo is a bounded service used by Bar, we need to evaluate
install constraints on Bar as well.

* Add ActivityManagerInternal#getClientPackages to query
  all client package names of a service.

Bug: 235306967
Test: atest CtsStagedInstallHostTestCases
Change-Id: I398b62c3076a45856b74e80a52660177f834c79d
parent 946f72e4
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -902,4 +902,9 @@ public abstract class ActivityManagerInternal {
     */
    public abstract void registerNetworkPolicyUidObserver(@NonNull IUidObserver observer,
            int which, int cutpoint, @NonNull String callingPackage);

    /**
     * Return all client package names of a service.
     */
    public abstract ArraySet<String> getClientPackages(String servicePackageName);
}
+31 −0
Original line number Diff line number Diff line
@@ -7673,4 +7673,35 @@ public final class ActiveServices {
            Slog.e(TAG, "stopForegroundServiceDelegateLocked delegate does not exist");
        }
    }

    private static void getClientPackages(ServiceRecord sr, ArraySet<String> output) {
        var connections = sr.getConnections();
        for (int conni = connections.size() - 1; conni >= 0; conni--) {
            var connl = connections.valueAt(conni);
            for (int i = 0, size = connl.size(); i < size; i++) {
                var conn = connl.get(i);
                if (conn.binding.client != null) {
                    output.add(conn.binding.client.info.packageName);
                }
            }
        }
    }

    /**
     * Return all client package names of a service.
     */
    ArraySet<String> getClientPackagesLocked(@NonNull String servicePackageName) {
        var results = new ArraySet<String>();
        int[] users = mAm.mUserController.getUsers();
        for (int ui = 0; ui < users.length; ui++) {
            ArrayMap<ComponentName, ServiceRecord> alls = getServicesLocked(users[ui]);
            for (int i = 0, size = alls.size(); i < size; i++) {
                ServiceRecord sr = alls.valueAt(i);
                if (sr.name.getPackageName().equals(servicePackageName)) {
                    getClientPackages(sr, results);
                }
            }
        }
        return results;
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -18158,6 +18158,13 @@ public class ActivityManagerService extends IActivityManager.Stub
                mServices.stopForegroundServiceDelegateLocked(connection);
            }
        }
        @Override
        public ArraySet<String> getClientPackages(String servicePackageName) {
            synchronized (ActivityManagerService.this) {
                return mServices.getClientPackagesLocked(servicePackageName);
            }
        }
    }
    long inputDispatchingTimedOut(int pid, final boolean aboveSystem, TimeoutRecord timeoutRecord) {
+6 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.media.AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.ActivityManagerInternal;
import android.content.Context;
import android.media.AudioManager;
import android.media.IAudioService;
@@ -30,6 +31,7 @@ import android.text.TextUtils;
import android.util.ArraySet;

import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;

import java.util.ArrayList;
import java.util.List;
@@ -194,8 +196,6 @@ public class AppStateHelper {
     * Returns a list of packages which depend on {@code packageNames}. These are the packages
     * that will be affected when updating {@code packageNames} and should participate in
     * the evaluation of install constraints.
     *
     * TODO(b/235306967): Also include bounded services as dependency.
     */
    public List<String> getDependencyPackages(List<String> packageNames) {
        var results = new ArraySet<String>();
@@ -210,6 +210,10 @@ public class AppStateHelper {
                }
            }
        }
        var amInternal = LocalServices.getService(ActivityManagerInternal.class);
        for (var packageName : packageNames) {
            results.addAll(amInternal.getClientPackages(packageName));
        }
        return new ArrayList<>(results);
    }
}