Merge "Allow background default container service in a less crashy way" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-05 20:43:38 +00:00
committed by Android (Google) Code Review
3 changed files with 38 additions and 0 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
@@ -13050,7 +13054,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) {