Merge "Ensure to update top process state when launching activity" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b066ba1699
@@ -876,13 +876,6 @@ class ProcessRecord implements WindowProcessListener {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPackage(String pkg, long versionCode) {
|
||||
synchronized (mService) {
|
||||
addPackage(pkg, versionCode, mService.mProcessStats);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return true if package has been added false if not
|
||||
*/
|
||||
@@ -1300,15 +1293,13 @@ class ProcessRecord implements WindowProcessListener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
|
||||
boolean activityChange, boolean updateOomAdj) {
|
||||
public void updateProcessInfo(boolean updateServiceConnectionActivities, boolean activityChange,
|
||||
boolean updateOomAdj) {
|
||||
synchronized (mService) {
|
||||
if (updateServiceConnectionActivities) {
|
||||
mService.mServices.updateServiceConnectionActivitiesLocked(this);
|
||||
}
|
||||
if (updateLru) {
|
||||
mService.mProcessList.updateLruProcessLocked(this, activityChange, null);
|
||||
}
|
||||
mService.mProcessList.updateLruProcessLocked(this, activityChange, null /* client */);
|
||||
if (updateOomAdj) {
|
||||
mService.updateOomAdjLocked();
|
||||
}
|
||||
@@ -1330,19 +1321,20 @@ class ProcessRecord implements WindowProcessListener {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearWaitingToKill() {
|
||||
public void onStartActivity(int topProcessState, boolean setProfileProc, String packageName,
|
||||
long versionCode) {
|
||||
synchronized (mService) {
|
||||
waitingToKill = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartActivity(int topProcessState, boolean setProfileProc) {
|
||||
synchronized (mService) {
|
||||
if (setProfileProc) {
|
||||
mService.mProfileData.setProfileProc(this);
|
||||
}
|
||||
if (packageName != null) {
|
||||
addPackage(packageName, versionCode, mService.mProcessStats);
|
||||
}
|
||||
|
||||
// Update oom adj first, we don't want the additional states are involved in this round.
|
||||
updateProcessInfo(false /* updateServiceConnectionActivities */,
|
||||
true /* activityChange */, true /* updateOomAdj */);
|
||||
hasShownUi = true;
|
||||
setPendingUiClean(true);
|
||||
forceProcessStateUpTo(topProcessState);
|
||||
|
||||
@@ -2753,7 +2753,7 @@ class ActivityStack extends ConfigurationContainer {
|
||||
// happens to be sitting towards the end.
|
||||
if (next.attachedToProcess()) {
|
||||
next.app.updateProcessInfo(false /* updateServiceConnectionActivities */,
|
||||
true /* updateLru */, true /* activityChange */, false /* updateOomAdj */);
|
||||
true /* activityChange */, false /* updateOomAdj */);
|
||||
}
|
||||
if (lastResumed != null) {
|
||||
lastResumed.setWillCloseOrEnterPip(true);
|
||||
@@ -2903,7 +2903,7 @@ class ActivityStack extends ConfigurationContainer {
|
||||
next.setState(RESUMED, "resumeTopActivityInnerLocked");
|
||||
|
||||
next.app.updateProcessInfo(false /* updateServiceConnectionActivities */,
|
||||
true /* updateLru */, true /* activityChange */, true /* updateOomAdj */);
|
||||
true /* activityChange */, true /* updateOomAdj */);
|
||||
updateLRUListLocked(next);
|
||||
|
||||
// Have the window manager re-evaluate the orientation of
|
||||
@@ -4600,7 +4600,8 @@ class ActivityStack extends ConfigurationContainer {
|
||||
// Update any services we are bound to that might care about whether
|
||||
// their client may have activities.
|
||||
// No longer have activities, so update LRU list and oom adj.
|
||||
r.app.updateProcessInfo(true, true, false, true);
|
||||
r.app.updateProcessInfo(true /* updateServiceConnectionActivities */,
|
||||
false /* activityChange */, true /* updateOomAdj */);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -769,14 +769,12 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
|
||||
+ " old=" + r.app + " new=" + proc);
|
||||
}
|
||||
|
||||
proc.clearWaitingToKill();
|
||||
r.launchCount++;
|
||||
r.lastLaunchTime = SystemClock.uptimeMillis();
|
||||
|
||||
if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
|
||||
|
||||
proc.addActivityIfNeeded(r);
|
||||
proc.updateProcessInfo(false, true, true, true);
|
||||
|
||||
final LockTaskController lockTaskController = mService.getLockTaskController();
|
||||
if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE
|
||||
@@ -814,7 +812,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
|
||||
r.forceNewConfig = false;
|
||||
mService.getAppWarningsLocked().onStartActivity(r);
|
||||
r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
|
||||
ProfilerInfo profilerInfo = proc.onStartActivity(mService.mTopProcessState);
|
||||
|
||||
// Because we could be starting an Activity in the system process this may not go
|
||||
// across a Binder interface which would create a new Configuration. Consequently
|
||||
@@ -840,7 +837,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
|
||||
mergedConfiguration.getOverrideConfiguration(), r.compat,
|
||||
r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
|
||||
r.icicle, r.persistentState, results, newIntents,
|
||||
dc.isNextTransitionForward(), profilerInfo));
|
||||
dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded()));
|
||||
|
||||
// Set desired final state.
|
||||
final ActivityLifecycleItem lifecycleItem;
|
||||
@@ -910,6 +907,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
|
||||
"Moving to PAUSED: " + r + " (starting in paused state)");
|
||||
r.setState(PAUSED, "realStartActivityLocked");
|
||||
}
|
||||
// Perform OOM scoring after the activity state is set, so the process can be updated with
|
||||
// the latest state.
|
||||
proc.onStartActivity(mService.mTopProcessState, r.info);
|
||||
|
||||
// Launch the new version setup screen if needed. We do this -after-
|
||||
// launching the initial activity (that is, home), so that it can have
|
||||
@@ -960,13 +960,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
|
||||
boolean knownToBeDead = false;
|
||||
if (wpc != null && wpc.hasThread()) {
|
||||
try {
|
||||
if ((r.info.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0
|
||||
|| !"android".equals(r.info.packageName)) {
|
||||
// Don't add this if it is a platform component that is marked to run in
|
||||
// multiple processes, because this is actually part of the framework so doesn't
|
||||
// make sense to track as a separate apk in the process.
|
||||
wpc.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode);
|
||||
}
|
||||
realStartActivityLocked(r, wpc, andResume, checkConfig);
|
||||
return;
|
||||
} catch (RemoteException e) {
|
||||
|
||||
@@ -44,6 +44,7 @@ import android.app.IApplicationThread;
|
||||
import android.app.ProfilerInfo;
|
||||
import android.app.servertransaction.ConfigurationChangeItem;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Message;
|
||||
@@ -771,13 +772,12 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
WindowProcessListener::clearProfilerIfNeeded, mListener));
|
||||
}
|
||||
|
||||
void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
|
||||
boolean activityChange, boolean updateOomAdj) {
|
||||
void updateProcessInfo(boolean updateServiceConnectionActivities, boolean activityChange,
|
||||
boolean updateOomAdj) {
|
||||
if (mListener == null) return;
|
||||
// Posting on handler so WM lock isn't held when we call into AM.
|
||||
final Message m = PooledLambda.obtainMessage(WindowProcessListener::updateProcessInfo,
|
||||
mListener, updateServiceConnectionActivities, updateLru, activityChange,
|
||||
updateOomAdj);
|
||||
mListener, updateServiceConnectionActivities, activityChange, updateOomAdj);
|
||||
mAtm.mH.sendMessage(m);
|
||||
}
|
||||
|
||||
@@ -801,53 +801,44 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
|
||||
return mListener == null ? false : mListener.isRemoved();
|
||||
}
|
||||
|
||||
void clearWaitingToKill() {
|
||||
if (mListener == null) return;
|
||||
// Posting on handler so WM lock isn't held when we call into AM.
|
||||
final Message m = PooledLambda.obtainMessage(
|
||||
WindowProcessListener::clearWaitingToKill, mListener);
|
||||
mAtm.mH.sendMessage(m);
|
||||
private boolean shouldSetProfileProc() {
|
||||
return mAtm.mProfileApp != null && mAtm.mProfileApp.equals(mName)
|
||||
&& (mAtm.mProfileProc == null || mAtm.mProfileProc == this);
|
||||
}
|
||||
|
||||
void addPackage(String pkg, long versionCode) {
|
||||
if (mListener == null) return;
|
||||
// Posting on handler so WM lock isn't held when we call into AM.
|
||||
final Message m = PooledLambda.obtainMessage(
|
||||
WindowProcessListener::addPackage, mListener, pkg, versionCode);
|
||||
mAtm.mH.sendMessage(m);
|
||||
}
|
||||
|
||||
ProfilerInfo onStartActivity(int topProcessState) {
|
||||
ProfilerInfo profilerInfo = null;
|
||||
boolean setProfileProc = false;
|
||||
if (mAtm.mProfileApp != null
|
||||
&& mAtm.mProfileApp.equals(mName)) {
|
||||
if (mAtm.mProfileProc == null || mAtm.mProfileProc == this) {
|
||||
setProfileProc = true;
|
||||
final ProfilerInfo profilerInfoSvc = mAtm.mProfilerInfo;
|
||||
if (profilerInfoSvc != null && profilerInfoSvc.profileFile != null) {
|
||||
if (profilerInfoSvc.profileFd != null) {
|
||||
try {
|
||||
profilerInfoSvc.profileFd = profilerInfoSvc.profileFd.dup();
|
||||
} catch (IOException e) {
|
||||
profilerInfoSvc.closeFd();
|
||||
}
|
||||
}
|
||||
|
||||
profilerInfo = new ProfilerInfo(profilerInfoSvc);
|
||||
}
|
||||
ProfilerInfo createProfilerInfoIfNeeded() {
|
||||
final ProfilerInfo currentProfilerInfo = mAtm.mProfilerInfo;
|
||||
if (currentProfilerInfo == null || currentProfilerInfo.profileFile == null
|
||||
|| !shouldSetProfileProc()) {
|
||||
return null;
|
||||
}
|
||||
if (currentProfilerInfo.profileFd != null) {
|
||||
try {
|
||||
currentProfilerInfo.profileFd = currentProfilerInfo.profileFd.dup();
|
||||
} catch (IOException e) {
|
||||
currentProfilerInfo.closeFd();
|
||||
}
|
||||
}
|
||||
return new ProfilerInfo(currentProfilerInfo);
|
||||
}
|
||||
|
||||
|
||||
if (mListener != null) {
|
||||
// Posting on handler so WM lock isn't held when we call into AM.
|
||||
final Message m = PooledLambda.obtainMessage(WindowProcessListener::onStartActivity,
|
||||
mListener, topProcessState, setProfileProc);
|
||||
mAtm.mH.sendMessage(m);
|
||||
void onStartActivity(int topProcessState, ActivityInfo info) {
|
||||
if (mListener == null) return;
|
||||
String packageName = null;
|
||||
if ((info.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0
|
||||
|| !"android".equals(info.packageName)) {
|
||||
// Don't add this if it is a platform component that is marked to run in multiple
|
||||
// processes, because this is actually part of the framework so doesn't make sense
|
||||
// to track as a separate apk in the process.
|
||||
packageName = info.packageName;
|
||||
}
|
||||
|
||||
return profilerInfo;
|
||||
// Posting the message at the front of queue so WM lock isn't held when we call into AM,
|
||||
// and the process state of starting activity can be updated quicker which will give it a
|
||||
// higher scheduling group.
|
||||
final Message m = PooledLambda.obtainMessage(WindowProcessListener::onStartActivity,
|
||||
mListener, topProcessState, shouldSetProfileProc(), packageName,
|
||||
info.applicationInfo.longVersionCode);
|
||||
mAtm.mH.sendMessageAtFrontOfQueue(m);
|
||||
}
|
||||
|
||||
public void appDied() {
|
||||
|
||||
@@ -41,8 +41,8 @@ public interface WindowProcessListener {
|
||||
void setPendingUiCleanAndForceProcessStateUpTo(int newState);
|
||||
|
||||
/** Update the process information. */
|
||||
void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru,
|
||||
boolean activityChange, boolean updateOomAdj);
|
||||
void updateProcessInfo(boolean updateServiceConnectionActivities, boolean activityChange,
|
||||
boolean updateOomAdj);
|
||||
|
||||
/**
|
||||
* Returns true if the process is removed and we should completely clean up the related records
|
||||
@@ -53,14 +53,9 @@ public interface WindowProcessListener {
|
||||
/** Returns the total time (in milliseconds) spent executing in both user and system code. */
|
||||
long getCpuTime();
|
||||
|
||||
/** Clears the waiting to kill reason for this process. */
|
||||
void clearWaitingToKill();
|
||||
|
||||
/** Adds the package to the process. */
|
||||
void addPackage(String pkg, long versionCode);
|
||||
|
||||
/** Called when we are in the process on starting an activity. */
|
||||
void onStartActivity(int topProcessState, boolean setProfileProc);
|
||||
void onStartActivity(int topProcessState, boolean setProfileProc, String packageName,
|
||||
long versionCode);
|
||||
|
||||
/** App died :(...oh well */
|
||||
void appDied();
|
||||
|
||||
Reference in New Issue
Block a user