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