Merge "Prevent activity config override for system processes." into rvc-dev am: c47c4c0e13
Change-Id: I31cd40ec31485fcada2e133e5fdd05db75f67b1b
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user