Merge "A little more work on issue ##16907799." into lmp-dev

This commit is contained in:
Dianne Hackborn
2014-09-15 00:26:59 +00:00
committed by Android (Google) Code Review
3 changed files with 31 additions and 12 deletions

View File

@@ -2104,7 +2104,26 @@ public final class ActiveServices {
// don't want to be thrashing around restarting processes that are only
// there to be cached.
for (int appi=b.apps.size()-1; appi>=0; appi--) {
ProcessRecord proc = b.apps.keyAt(appi);
final ProcessRecord proc = b.apps.keyAt(appi);
// If the process is already gone, skip it.
if (proc.killedByAm || proc.thread == null) {
continue;
}
// Only do this for processes that have an auto-create binding;
// otherwise the binding can be left, because it won't cause the
// service to restart.
final AppBindRecord abind = b.apps.valueAt(appi);
boolean hasCreate = false;
for (int conni=abind.connections.size()-1; conni>=0; conni--) {
ConnectionRecord conn = abind.connections.valueAt(conni);
if ((conn.flags&Context.BIND_AUTO_CREATE) != 0) {
hasCreate = true;
break;
}
}
if (!hasCreate) {
continue;
}
if (proc != null && !proc.persistent && proc.thread != null
&& proc.pid != 0 && proc.pid != ActivityManagerService.MY_PID
&& proc.setProcState >= ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {

View File

@@ -16,8 +16,9 @@
package com.android.server.am;
import android.util.ArraySet;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Iterator;
/**
@@ -28,7 +29,7 @@ final class AppBindRecord {
final IntentBindRecord intent; // The intent we are bound to.
final ProcessRecord client; // Who has started/bound the service.
final HashSet<ConnectionRecord> connections = new HashSet<ConnectionRecord>();
final ArraySet<ConnectionRecord> connections = new ArraySet<>();
// All ConnectionRecord for this client.
void dump(PrintWriter pw, String prefix) {
@@ -38,11 +39,11 @@ final class AppBindRecord {
}
void dumpInIntentBind(PrintWriter pw, String prefix) {
if (connections.size() > 0) {
final int N = connections.size();
if (N > 0) {
pw.println(prefix + "Per-process Connections:");
Iterator<ConnectionRecord> it = connections.iterator();
while (it.hasNext()) {
ConnectionRecord c = it.next();
for (int i=0; i<N; i++) {
ConnectionRecord c = connections.valueAt(i);
pw.println(prefix + " " + c);
}
}

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.ArrayMap;
import android.util.ArraySet;
import java.io.PrintWriter;
@@ -78,11 +79,9 @@ final class IntentBindRecord {
int collectFlags() {
int flags = 0;
for (int i=apps.size()-1; i>=0; i--) {
AppBindRecord app = apps.valueAt(i);
if (app.connections.size() > 0) {
for (ConnectionRecord conn : app.connections) {
flags |= conn.flags;
}
final ArraySet<ConnectionRecord> connections = apps.valueAt(i).connections;
for (int j=connections.size()-1; j>=0; j--) {
flags |= connections.valueAt(j).flags;
}
}
return flags;