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

Commit 424b03f7 authored by Christopher Tate's avatar Christopher Tate
Browse files

Allow background default container service in a less crashy way

Turns out we run this code during early boot, before the device idle
service has even been constructed yet.  Find another way to achieve
the needed service execution.

Bug 36865930
Test: manual

Change-Id: I8e3304f37c3a5ee125b73aef2b7d7c7b387aa200
parent ba2e284a
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -635,6 +635,11 @@ interface IActivityManager {
     */
    int getLastResumedActivityUserId();

    /**
     * Add a bare uid to the background restrictions whitelist.  Only the system uid may call this.
     */
     void backgroundWhitelistUid(int uid);

    // WARNING: when these transactions are updated, check if they are any callers on the native
    // side. If so, make sure they are using the correct transaction ids and arguments.
    // If a transaction which will also be used on the native side is being inserted, add it
+18 −0
Original line number Diff line number Diff line
@@ -12143,6 +12143,24 @@ public class ActivityManagerService extends IActivityManager.Stub
        return false;
    }
    @Override
    public void backgroundWhitelistUid(final int uid) {
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
            throw new SecurityException("Only the OS may call backgroundWhitelistUid()");
        }
        if (DEBUG_BACKGROUND_CHECK) {
            Slog.i(TAG, "Adding uid " + uid + " to bg uid whitelist");
        }
        synchronized (this) {
            final int N = mBackgroundUidWhitelist.length;
            int[] newList = new int[N+1];
            System.arraycopy(mBackgroundUidWhitelist, 0, newList, 0, N);
            newList[N] = uid;
            mBackgroundUidWhitelist = newList;
        }
    }
    final ProcessRecord addAppLocked(ApplicationInfo info, String customProcess, boolean isolated,
            String abiOverride) {
        ProcessRecord app;
+15 −0
Original line number Diff line number Diff line
@@ -608,6 +608,10 @@ public class PackageManagerService extends IPackageManager.Stub {
    final boolean mIsPreNUpgrade;
    final boolean mIsPreNMR1Upgrade;
    // Have we told the Activity Manager to whitelist the default container service by uid yet?
    @GuardedBy("mPackages")
    boolean mDefaultContainerWhitelisted = false;
    @GuardedBy("mPackages")
    private boolean mDexOptDialogShown;
@@ -13024,7 +13028,18 @@ public class PackageManagerService extends IPackageManager.Stub {
        intent.setComponent(DEFAULT_CONTAINER_COMPONENT);
        IActivityManager am = ActivityManager.getService();
        if (am != null) {
            int dcsUid = -1;
            synchronized (mPackages) {
                if (!mDefaultContainerWhitelisted) {
                    mDefaultContainerWhitelisted = true;
                    PackageSetting ps = mSettings.mPackages.get(DEFAULT_CONTAINER_PACKAGE);
                    dcsUid = UserHandle.getUid(UserHandle.USER_SYSTEM, ps.appId);
                }
            }
            try {
                if (dcsUid > 0) {
                    am.backgroundWhitelistUid(dcsUid);
                }
                am.startService(null, intent, null, -1, null, false, mContext.getOpPackageName(),
                        UserHandle.USER_SYSTEM);
            } catch (RemoteException e) {