Merge "Framework support to improve bg check CTS tests." into oc-dev

am: 78e8ac9c14

Change-Id: Ibc14492d2ce3cf312f7478a6f6edaf383d26f657
This commit is contained in:
Dianne Hackborn
2017-04-03 22:32:11 +00:00
committed by android-build-merger
10 changed files with 65 additions and 40 deletions

View File

@@ -9838,6 +9838,7 @@ package android.content {
}
public abstract interface ServiceConnection {
method public default void onBindingDead(android.content.ComponentName);
method public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
method public abstract void onServiceDisconnected(android.content.ComponentName);
}

View File

@@ -10371,6 +10371,7 @@ package android.content {
}
public abstract interface ServiceConnection {
method public default void onBindingDead(android.content.ComponentName);
method public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
method public abstract void onServiceDisconnected(android.content.ComponentName);
}

View File

@@ -9871,6 +9871,7 @@ package android.content {
}
public abstract interface ServiceConnection {
method public default void onBindingDead(android.content.ComponentName);
method public abstract void onServiceConnected(android.content.ComponentName, android.os.IBinder);
method public abstract void onServiceDisconnected(android.content.ComponentName);
}

View File

@@ -21,6 +21,6 @@ import android.content.ComponentName;
/** @hide */
oneway interface IServiceConnection {
void connected(in ComponentName name, IBinder service);
void connected(in ComponentName name, IBinder service, boolean dead);
}

View File

@@ -88,8 +88,8 @@ final class ServiceConnectionLeaked extends AndroidRuntimeException {
* @hide
*/
public final class LoadedApk {
private static final String TAG = "LoadedApk";
static final String TAG = "LoadedApk";
static final boolean DEBUG = false;
private final ActivityThread mActivityThread;
final String mPackageName;
@@ -641,8 +641,7 @@ public final class LoadedApk {
final String zip = (zipPaths.size() == 1) ? zipPaths.get(0) :
TextUtils.join(File.pathSeparator, zipPaths);
if (ActivityThread.localLOGV)
Slog.v(ActivityThread.TAG, "Class path: " + zip +
if (DEBUG) Slog.v(ActivityThread.TAG, "Class path: " + zip +
", JNI path: " + librarySearchPath);
boolean needToSetupJitProfiles = false;
@@ -1371,12 +1370,14 @@ public final class LoadedApk {
LoadedApk.ServiceDispatcher sd = null;
ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> map = mServices.get(context);
if (map != null) {
if (DEBUG) Slog.d(TAG, "Returning existing dispatcher " + sd + " for conn " + c);
sd = map.get(c);
}
if (sd == null) {
sd = new ServiceDispatcher(c, context, handler, flags);
if (DEBUG) Slog.d(TAG, "Creating new dispatcher " + sd + " for conn " + c);
if (map == null) {
map = new ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>();
map = new ArrayMap<>();
mServices.put(context, map);
}
map.put(c, sd);
@@ -1396,6 +1397,7 @@ public final class LoadedApk {
if (map != null) {
sd = map.get(c);
if (sd != null) {
if (DEBUG) Slog.d(TAG, "Removing dispatcher " + sd + " for conn " + c);
map.remove(c);
sd.doForget();
if (map.size() == 0) {
@@ -1461,10 +1463,11 @@ public final class LoadedApk {
mDispatcher = new WeakReference<LoadedApk.ServiceDispatcher>(sd);
}
public void connected(ComponentName name, IBinder service) throws RemoteException {
public void connected(ComponentName name, IBinder service, boolean dead)
throws RemoteException {
LoadedApk.ServiceDispatcher sd = mDispatcher.get();
if (sd != null) {
sd.connected(name, service);
sd.connected(name, service, dead);
}
}
}
@@ -1533,23 +1536,23 @@ public final class LoadedApk {
return mUnbindLocation;
}
public void connected(ComponentName name, IBinder service) {
public void connected(ComponentName name, IBinder service, boolean dead) {
if (mActivityThread != null) {
mActivityThread.post(new RunConnection(name, service, 0));
mActivityThread.post(new RunConnection(name, service, 0, dead));
} else {
doConnected(name, service);
doConnected(name, service, dead);
}
}
public void death(ComponentName name, IBinder service) {
if (mActivityThread != null) {
mActivityThread.post(new RunConnection(name, service, 1));
mActivityThread.post(new RunConnection(name, service, 1, false));
} else {
doDeath(name, service);
}
}
public void doConnected(ComponentName name, IBinder service) {
public void doConnected(ComponentName name, IBinder service, boolean dead) {
ServiceDispatcher.ConnectionInfo old;
ServiceDispatcher.ConnectionInfo info;
@@ -1594,6 +1597,9 @@ public final class LoadedApk {
if (old != null) {
mConnection.onServiceDisconnected(name);
}
if (dead) {
mConnection.onBindingDead(name);
}
// If there is a new service, it is now connected.
if (service != null) {
mConnection.onServiceConnected(name, service);
@@ -1616,15 +1622,16 @@ public final class LoadedApk {
}
private final class RunConnection implements Runnable {
RunConnection(ComponentName name, IBinder service, int command) {
RunConnection(ComponentName name, IBinder service, int command, boolean dead) {
mName = name;
mService = service;
mCommand = command;
mDead = dead;
}
public void run() {
if (mCommand == 0) {
doConnected(mName, mService);
doConnected(mName, mService, mDead);
} else if (mCommand == 1) {
doDeath(mName, mService);
}
@@ -1633,6 +1640,7 @@ public final class LoadedApk {
final ComponentName mName;
final IBinder mService;
final int mCommand;
final boolean mDead;
}
private final class DeathMonitor implements IBinder.DeathRecipient

View File

@@ -37,7 +37,7 @@ public interface ServiceConnection {
* @param service The IBinder of the Service's communication channel,
* which you can now make calls on.
*/
public void onServiceConnected(ComponentName name, IBinder service);
void onServiceConnected(ComponentName name, IBinder service);
/**
* Called when a connection to the Service has been lost. This typically
@@ -49,5 +49,18 @@ public interface ServiceConnection {
* @param name The concrete component name of the service whose
* connection has been lost.
*/
public void onServiceDisconnected(ComponentName name);
void onServiceDisconnected(ComponentName name);
/**
* Called when the binding to this connection is dead. This means the
* interface will never receive another connection. The application will
* need to unbind and rebind the connection to activate it again. This may
* happen, for example, if the application hosting the service it is bound to
* has been updated.
*
* @param name The concrete component name of the service whose
* connection is dead.
*/
default void onBindingDead(ComponentName name) {
}
}

View File

@@ -1140,7 +1140,7 @@ public final class ActiveServices {
// Service is already running, so we can immediately
// publish the connection.
try {
c.conn.connected(s.name, b.intent.binder);
c.conn.connected(s.name, b.intent.binder, false);
} catch (Exception e) {
Slog.w(TAG, "Failure sending service " + s.shortName
+ " to connection " + c.conn.asBinder()
@@ -1194,7 +1194,7 @@ public final class ActiveServices {
}
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Publishing to: " + c);
try {
c.conn.connected(r.name, service);
c.conn.connected(r.name, service, false);
} catch (Exception e) {
Slog.w(TAG, "Failure sending service " + r.name +
" to connection " + c.conn.asBinder() +
@@ -2081,7 +2081,7 @@ public final class ActiveServices {
// being brought down. Mark it as dead.
cr.serviceDead = true;
try {
cr.conn.connected(r.name, null);
cr.conn.connected(r.name, null, true);
} catch (Exception e) {
Slog.w(TAG, "Failure disconnecting service " + r.name +
" to connection " + c.get(i).conn.asBinder() +

View File

@@ -17643,7 +17643,6 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
private final boolean cleanUpApplicationRecordLocked(ProcessRecord app,
boolean restarting, boolean allowRestart, int index, boolean replacingPid) {
Slog.d(TAG, "cleanUpApplicationRecord -- " + app.pid);
if (index >= 0) {
removeLruProcessLocked(app);
ProcessList.remove(app.pid);

View File

@@ -350,58 +350,58 @@ final class ProcessList {
String procState;
switch (curProcState) {
case ActivityManager.PROCESS_STATE_PERSISTENT:
procState = "P ";
procState = "PER ";
break;
case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
procState = "PU";
procState = "PERU";
break;
case ActivityManager.PROCESS_STATE_TOP:
procState = "T ";
procState = "TOP";
break;
case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
procState = "SB";
procState = "BFGS";
break;
case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
procState = "SF";
procState = "FGS ";
break;
case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
procState = "TS";
procState = "TPSL";
break;
case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
procState = "IF";
procState = "IMPF";
break;
case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
procState = "IB";
procState = "IMPB";
break;
case ActivityManager.PROCESS_STATE_BACKUP:
procState = "BU";
procState = "BKUP";
break;
case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
procState = "HW";
procState = "HVY ";
break;
case ActivityManager.PROCESS_STATE_SERVICE:
procState = "S ";
procState = "SVC ";
break;
case ActivityManager.PROCESS_STATE_RECEIVER:
procState = "R ";
procState = "RCVR";
break;
case ActivityManager.PROCESS_STATE_HOME:
procState = "HO";
procState = "HOME";
break;
case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
procState = "LA";
procState = "LAST";
break;
case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
procState = "CA";
procState = "CAC ";
break;
case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
procState = "Ca";
procState = "CACC";
break;
case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
procState = "CE";
procState = "CEM ";
break;
case ActivityManager.PROCESS_STATE_NONEXISTENT:
procState = "N ";
procState = "NONE";
break;
default:
procState = "??";

View File

@@ -287,7 +287,9 @@ final class ProcessRecord {
pw.print(" setSchedGroup="); pw.print(setSchedGroup);
pw.print(" systemNoUi="); pw.print(systemNoUi);
pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel);
pw.print(prefix); pw.print("vrThreadTid="); pw.print(vrThreadTid);
if (vrThreadTid != 0) {
pw.print(prefix); pw.print("vrThreadTid="); pw.println(vrThreadTid);
}
pw.print(prefix); pw.print("curProcState="); pw.print(curProcState);
pw.print(" repProcState="); pw.print(repProcState);
pw.print(" pssProcState="); pw.print(pssProcState);