Merge "Prevent activity config override for system processes." into rvc-dev am: c47c4c0e13

Change-Id: I31cd40ec31485fcada2e133e5fdd05db75f67b1b
This commit is contained in:
Automerger Merge Worker
2020-03-11 20:20:19 +00:00
8 changed files with 72 additions and 3 deletions

View File

@@ -356,6 +356,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
ActivityManagerInternal mAmInternal; ActivityManagerInternal mAmInternal;
UriGrantsManagerInternal mUgmInternal; UriGrantsManagerInternal mUgmInternal;
private PackageManagerInternal mPmInternal; private PackageManagerInternal mPmInternal;
/** The cached sys ui service component name from package manager. */
private ComponentName mSysUiServiceComponent;
private PermissionPolicyInternal mPermissionPolicyInternal; private PermissionPolicyInternal mPermissionPolicyInternal;
@VisibleForTesting @VisibleForTesting
final ActivityTaskManagerInternal mInternal; final ActivityTaskManagerInternal mInternal;
@@ -5869,6 +5871,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
return mPmInternal; return mPmInternal;
} }
ComponentName getSysUiServiceComponentLocked() {
if (mSysUiServiceComponent == null) {
final PackageManagerInternal pm = getPackageManagerInternalLocked();
mSysUiServiceComponent = pm.getSystemUiServiceComponent();
}
return mSysUiServiceComponent;
}
PermissionPolicyInternal getPermissionPolicyInternal() { PermissionPolicyInternal getPermissionPolicyInternal() {
if (mPermissionPolicyInternal == null) { if (mPermissionPolicyInternal == null) {
mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class); mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);

View File

@@ -53,6 +53,7 @@ import android.content.pm.ApplicationInfo;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.os.Message; import android.os.Message;
import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.ArraySet; import android.util.ArraySet;
@@ -200,6 +201,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
/** Whether our process is currently running a {@link IRemoteAnimationRunner} */ /** Whether our process is currently running a {@link IRemoteAnimationRunner} */
private boolean mRunningRemoteAnimation; private boolean mRunningRemoteAnimation;
/** Whether this process is owned by the System UI package. */
final boolean mIsSysUiPackage;
public WindowProcessController(@NonNull ActivityTaskManagerService atm, ApplicationInfo info, public WindowProcessController(@NonNull ActivityTaskManagerService atm, ApplicationInfo info,
String name, int uid, int userId, Object owner, WindowProcessListener listener) { String name, int uid, int userId, Object owner, WindowProcessListener listener) {
mInfo = info; mInfo = info;
@@ -210,6 +214,10 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
mListener = listener; mListener = listener;
mAtm = atm; mAtm = atm;
mDisplayId = INVALID_DISPLAY; mDisplayId = INVALID_DISPLAY;
mIsSysUiPackage = info.packageName.equals(
mAtm.getSysUiServiceComponentLocked().getPackageName());
onConfigurationChanged(atm.getGlobalConfiguration()); onConfigurationChanged(atm.getGlobalConfiguration());
} }
@@ -1077,6 +1085,12 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
* always track the configuration of the non-finishing activity last added to the process. * always track the configuration of the non-finishing activity last added to the process.
*/ */
private void updateActivityConfigurationListener() { private void updateActivityConfigurationListener() {
if (mIsSysUiPackage || mUid == Process.SYSTEM_UID) {
// This is a system owned process and should not use an activity config.
// TODO(b/151161907): Remove after support for display-independent (raw) SysUi configs.
return;
}
for (int i = mActivities.size() - 1; i >= 0; i--) { for (int i = mActivities.size() - 1; i >= 0; i--) {
final ActivityRecord activityRecord = mActivities.get(i); final ActivityRecord activityRecord = mActivities.get(i);
if (!activityRecord.finishing && !activityRecord.containsListener(this)) { if (!activityRecord.finishing && !activityRecord.containsListener(this)) {

View File

@@ -55,6 +55,7 @@ import android.system.OsConstants;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair; import android.util.Pair;
import com.android.server.LocalServices;
import com.android.server.ServiceThread; import com.android.server.ServiceThread;
import com.android.server.appop.AppOpsService; import com.android.server.appop.AppOpsService;
import com.android.server.wm.ActivityTaskManagerService; import com.android.server.wm.ActivityTaskManagerService;
@@ -125,6 +126,8 @@ public class ApplicationExitInfoTest {
mAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper()); mAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
mAms.mAtmInternal = spy(mAms.mActivityTaskManager.getAtmInternal()); mAms.mAtmInternal = spy(mAms.mActivityTaskManager.getAtmInternal());
mAms.mPackageManagerInt = mPackageManagerInt; mAms.mPackageManagerInt = mPackageManagerInt;
doReturn(new ComponentName("", "")).when(mPackageManagerInt).getSystemUiServiceComponent();
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInt);
} }
@After @After

View File

@@ -75,8 +75,10 @@ import static org.mockito.Mockito.spy;
import android.app.IApplicationThread; import android.app.IApplicationThread;
import android.app.IServiceConnection; import android.app.IServiceConnection;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.os.Build; import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
@@ -87,6 +89,7 @@ import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.SparseArray; import android.util.SparseArray;
import com.android.server.LocalServices;
import com.android.server.wm.ActivityServiceConnectionsHolder; import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.ActivityTaskManagerService; import com.android.server.wm.ActivityTaskManagerService;
import com.android.server.wm.WindowProcessController; import com.android.server.wm.WindowProcessController;
@@ -127,6 +130,7 @@ public class MockingOomAdjusterTests {
private static final String MOCKAPP5_PROCESSNAME = "test #5"; private static final String MOCKAPP5_PROCESSNAME = "test #5";
private static final String MOCKAPP5_PACKAGENAME = "com.android.test.test5"; private static final String MOCKAPP5_PACKAGENAME = "com.android.test.test5";
private static Context sContext; private static Context sContext;
private static PackageManagerInternal sPackageManagerInternal;
private static ActivityManagerService sService; private static ActivityManagerService sService;
@BeforeClass @BeforeClass
@@ -134,9 +138,15 @@ public class MockingOomAdjusterTests {
sContext = getInstrumentation().getTargetContext(); sContext = getInstrumentation().getTargetContext();
System.setProperty("dexmaker.share_classloader", "true"); System.setProperty("dexmaker.share_classloader", "true");
sPackageManagerInternal = mock(PackageManagerInternal.class);
doReturn(new ComponentName("", "")).when(sPackageManagerInternal)
.getSystemUiServiceComponent();
LocalServices.addService(PackageManagerInternal.class, sPackageManagerInternal);
sService = mock(ActivityManagerService.class); sService = mock(ActivityManagerService.class);
sService.mActivityTaskManager = new ActivityTaskManagerService(sContext); sService.mActivityTaskManager = new ActivityTaskManagerService(sContext);
sService.mActivityTaskManager.initialize(null, null, sContext.getMainLooper()); sService.mActivityTaskManager.initialize(null, null, sContext.getMainLooper());
sService.mPackageManagerInt = sPackageManagerInternal;
sService.mAtmInternal = spy(sService.mActivityTaskManager.getAtmInternal()); sService.mAtmInternal = spy(sService.mActivityTaskManager.getAtmInternal());
sService.mConstants = new ActivityManagerConstants(sContext, sService, sService.mConstants = new ActivityManagerConstants(sContext, sService,

View File

@@ -203,10 +203,11 @@ public class ActivityStarterTests extends ActivityTestsBase {
final IApplicationThread caller = mock(IApplicationThread.class); final IApplicationThread caller = mock(IApplicationThread.class);
final WindowProcessListener listener = mock(WindowProcessListener.class); final WindowProcessListener listener = mock(WindowProcessListener.class);
final ApplicationInfo ai = new ApplicationInfo();
ai.packageName = "com.android.test.package";
final WindowProcessController wpc = final WindowProcessController wpc =
containsConditions(preconditions, PRECONDITION_NO_CALLER_APP) containsConditions(preconditions, PRECONDITION_NO_CALLER_APP)
? null : new WindowProcessController( ? null : new WindowProcessController(service, ai, null, 0, -1, null, listener);
service, mock(ApplicationInfo.class), null, 0, -1, null, listener);
doReturn(wpc).when(service).getProcessController(anyObject()); doReturn(wpc).when(service).getProcessController(anyObject());
final Intent intent = new Intent(); final Intent intent = new Intent();
@@ -345,6 +346,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
doReturn(false).when(mMockPackageManager).isInstantAppInstallerComponent(any()); doReturn(false).when(mMockPackageManager).isInstantAppInstallerComponent(any());
doReturn(null).when(mMockPackageManager).resolveIntent(any(), any(), anyInt(), anyInt(), doReturn(null).when(mMockPackageManager).resolveIntent(any(), any(), anyInt(), anyInt(),
anyInt(), anyBoolean(), anyInt()); anyInt(), anyBoolean(), anyInt());
doReturn(new ComponentName("", "")).when(mMockPackageManager).getSystemUiServiceComponent();
// Never review permissions // Never review permissions
doReturn(false).when(mMockPackageManager).isPermissionsReviewRequired(any(), anyInt()); doReturn(false).when(mMockPackageManager).isPermissionsReviewRequired(any(), anyInt());
@@ -656,6 +658,7 @@ public class ActivityStarterTests extends ActivityTestsBase {
final WindowProcessListener listener = mock(WindowProcessListener.class); final WindowProcessListener listener = mock(WindowProcessListener.class);
final ApplicationInfo ai = new ApplicationInfo(); final ApplicationInfo ai = new ApplicationInfo();
ai.uid = callingUid; ai.uid = callingUid;
ai.packageName = "com.android.test.package";
final WindowProcessController callerApp = final WindowProcessController callerApp =
new WindowProcessController(mService, ai, null, callingUid, -1, null, listener); new WindowProcessController(mService, ai, null, callingUid, -1, null, listener);
callerApp.setHasForegroundActivities(hasForegroundActivities); callerApp.setHasForegroundActivities(hasForegroundActivities);

View File

@@ -131,6 +131,7 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase {
LocalServices.addService(PackageManagerInternal.class, mMockPmi); LocalServices.addService(PackageManagerInternal.class, mMockPmi);
when(mMockPmi.getPackageList(any())).thenReturn(new PackageList( when(mMockPmi.getPackageList(any())).thenReturn(new PackageList(
Collections.singletonList(TEST_COMPONENT.getPackageName()), /* observer */ null)); Collections.singletonList(TEST_COMPONENT.getPackageName()), /* observer */ null));
when(mMockPmi.getSystemUiServiceComponent()).thenReturn(new ComponentName("", ""));
mTarget.onSystemReady(); mTarget.onSystemReady();
final ArgumentCaptor<PackageManagerInternal.PackageListObserver> observerCaptor = final ArgumentCaptor<PackageManagerInternal.PackageListObserver> observerCaptor =

View File

@@ -40,6 +40,7 @@ import android.app.ActivityManagerInternal;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.usage.UsageStatsManagerInternal; import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
@@ -213,6 +214,9 @@ public class SystemServicesTestRule implements TestRule {
anyString(), anyInt()); anyString(), anyInt());
doReturn(null).when(packageManagerInternal).getDefaultHomeActivity(anyInt()); doReturn(null).when(packageManagerInternal).getDefaultHomeActivity(anyInt());
ComponentName systemServiceComponent = new ComponentName("android.test.system.service", "");
doReturn(systemServiceComponent).when(packageManagerInternal).getSystemUiServiceComponent();
// PowerManagerInternal // PowerManagerInternal
final PowerManagerInternal pmi = mock(PowerManagerInternal.class); final PowerManagerInternal pmi = mock(PowerManagerInternal.class);
final PowerSaveState state = new PowerSaveState.Builder().build(); final PowerSaveState state = new PowerSaveState.Builder().build();

View File

@@ -29,6 +29,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.IApplicationThread; import android.app.IApplicationThread;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
@@ -55,8 +56,11 @@ public class WindowProcessControllerTests extends ActivityTestsBase {
@Before @Before
public void setUp() { public void setUp() {
mMockListener = mock(WindowProcessListener.class); mMockListener = mock(WindowProcessListener.class);
ApplicationInfo info = mock(ApplicationInfo.class);
info.packageName = "test.package.name";
mWpc = new WindowProcessController( mWpc = new WindowProcessController(
mService, mock(ApplicationInfo.class), null, 0, -1, null, mMockListener); mService, info, null, 0, -1, null, mMockListener);
mWpc.setThread(mock(IApplicationThread.class)); mWpc.setThread(mock(IApplicationThread.class));
} }
@@ -176,6 +180,26 @@ public class WindowProcessControllerTests extends ActivityTestsBase {
assertEquals(mWpc.getLastReportedConfiguration(), newConfig); assertEquals(mWpc.getLastReportedConfiguration(), newConfig);
} }
@Test
public void testActivityNotOverridingSystemUiProcessConfig() {
final ComponentName systemUiServiceComponent = mService.getSysUiServiceComponentLocked();
ApplicationInfo applicationInfo = mock(ApplicationInfo.class);
applicationInfo.packageName = systemUiServiceComponent.getPackageName();
WindowProcessController wpc = new WindowProcessController(
mService, applicationInfo, null, 0, -1, null, mMockListener);
wpc.setThread(mock(IApplicationThread.class));
final ActivityRecord activity = new ActivityBuilder(mService)
.setCreateTask(true)
.setUseProcess(wpc)
.build();
wpc.addActivityIfNeeded(activity);
// System UI owned processes should not be registered for activity config changes.
assertFalse(wpc.registeredForActivityConfigChanges());
}
private TestDisplayContent createTestDisplayContentInContainer() { private TestDisplayContent createTestDisplayContentInContainer() {
return new TestDisplayContent.Builder(mService, 1000, 1500).build(); return new TestDisplayContent.Builder(mService, 1000, 1500).build();
} }