summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/LoadedApk.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/LoadedApk.java')
-rw-r--r--core/java/android/app/LoadedApk.java68
1 files changed, 32 insertions, 36 deletions
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 05d3a47..4239a5d 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -16,6 +16,7 @@
package android.app;
+import android.util.ArrayMap;
import com.android.internal.util.ArrayUtils;
import android.content.BroadcastReceiver;
@@ -49,8 +50,6 @@ import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
final class IntentReceiverLeaked extends AndroidRuntimeException {
public IntentReceiverLeaked(String msg) {
@@ -89,14 +88,14 @@ public final class LoadedApk {
private ClassLoader mClassLoader;
private Application mApplication;
- private final HashMap<Context, HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>> mReceivers
- = new HashMap<Context, HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
- private final HashMap<Context, HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>> mUnregisteredReceivers
- = new HashMap<Context, HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
- private final HashMap<Context, HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mServices
- = new HashMap<Context, HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
- private final HashMap<Context, HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
- = new HashMap<Context, HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
+ private final ArrayMap<Context, ArrayMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers
+ = new ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
+ private final ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>> mUnregisteredReceivers
+ = new ArrayMap<Context, ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>>();
+ private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mServices
+ = new ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
+ private final ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>> mUnboundServices
+ = new ArrayMap<Context, ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>>();
int mClientCount = 0;
@@ -540,12 +539,11 @@ public final class LoadedApk {
public void removeContextRegistrations(Context context,
String who, String what) {
final boolean reportRegistrationLeaks = StrictMode.vmRegistrationLeaksEnabled();
- HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> rmap =
- mReceivers.remove(context);
+ ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> rmap =
+ mReceivers.remove(context);
if (rmap != null) {
- Iterator<LoadedApk.ReceiverDispatcher> it = rmap.values().iterator();
- while (it.hasNext()) {
- LoadedApk.ReceiverDispatcher rd = it.next();
+ for (int i=0; i<rmap.size(); i++) {
+ LoadedApk.ReceiverDispatcher rd = rmap.valueAt(i);
IntentReceiverLeaked leak = new IntentReceiverLeaked(
what + " " + who + " has leaked IntentReceiver "
+ rd.getIntentReceiver() + " that was " +
@@ -566,12 +564,11 @@ public final class LoadedApk {
}
mUnregisteredReceivers.remove(context);
//Slog.i(TAG, "Receiver registrations: " + mReceivers);
- HashMap<ServiceConnection, LoadedApk.ServiceDispatcher> smap =
+ ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> smap =
mServices.remove(context);
if (smap != null) {
- Iterator<LoadedApk.ServiceDispatcher> it = smap.values().iterator();
- while (it.hasNext()) {
- LoadedApk.ServiceDispatcher sd = it.next();
+ for (int i=0; i<smap.size(); i++) {
+ LoadedApk.ServiceDispatcher sd = smap.valueAt(i);
ServiceConnectionLeaked leak = new ServiceConnectionLeaked(
what + " " + who + " has leaked ServiceConnection "
+ sd.getServiceConnection() + " that was originally bound here");
@@ -598,7 +595,7 @@ public final class LoadedApk {
Instrumentation instrumentation, boolean registered) {
synchronized (mReceivers) {
LoadedApk.ReceiverDispatcher rd = null;
- HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null;
+ ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null;
if (registered) {
map = mReceivers.get(context);
if (map != null) {
@@ -610,7 +607,7 @@ public final class LoadedApk {
instrumentation, registered);
if (registered) {
if (map == null) {
- map = new HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>();
+ map = new ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>();
mReceivers.put(context, map);
}
map.put(r, rd);
@@ -626,7 +623,7 @@ public final class LoadedApk {
public IIntentReceiver forgetReceiverDispatcher(Context context,
BroadcastReceiver r) {
synchronized (mReceivers) {
- HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = mReceivers.get(context);
+ ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = mReceivers.get(context);
LoadedApk.ReceiverDispatcher rd = null;
if (map != null) {
rd = map.get(r);
@@ -636,10 +633,10 @@ public final class LoadedApk {
mReceivers.remove(context);
}
if (r.getDebugUnregister()) {
- HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> holder
+ ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> holder
= mUnregisteredReceivers.get(context);
if (holder == null) {
- holder = new HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>();
+ holder = new ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher>();
mUnregisteredReceivers.put(context, holder);
}
RuntimeException ex = new IllegalArgumentException(
@@ -652,7 +649,7 @@ public final class LoadedApk {
return rd.getIIntentReceiver();
}
}
- HashMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> holder
+ ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> holder
= mUnregisteredReceivers.get(context);
if (holder != null) {
rd = holder.get(r);
@@ -868,14 +865,14 @@ public final class LoadedApk {
Context context, Handler handler, int flags) {
synchronized (mServices) {
LoadedApk.ServiceDispatcher sd = null;
- HashMap<ServiceConnection, LoadedApk.ServiceDispatcher> map = mServices.get(context);
+ ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> map = mServices.get(context);
if (map != null) {
sd = map.get(c);
}
if (sd == null) {
sd = new ServiceDispatcher(c, context, handler, flags);
if (map == null) {
- map = new HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>();
+ map = new ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>();
mServices.put(context, map);
}
map.put(c, sd);
@@ -889,7 +886,7 @@ public final class LoadedApk {
public final IServiceConnection forgetServiceDispatcher(Context context,
ServiceConnection c) {
synchronized (mServices) {
- HashMap<ServiceConnection, LoadedApk.ServiceDispatcher> map
+ ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> map
= mServices.get(context);
LoadedApk.ServiceDispatcher sd = null;
if (map != null) {
@@ -901,10 +898,10 @@ public final class LoadedApk {
mServices.remove(context);
}
if ((sd.getFlags()&Context.BIND_DEBUG_UNBIND) != 0) {
- HashMap<ServiceConnection, LoadedApk.ServiceDispatcher> holder
+ ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> holder
= mUnboundServices.get(context);
if (holder == null) {
- holder = new HashMap<ServiceConnection, LoadedApk.ServiceDispatcher>();
+ holder = new ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher>();
mUnboundServices.put(context, holder);
}
RuntimeException ex = new IllegalArgumentException(
@@ -916,7 +913,7 @@ public final class LoadedApk {
return sd.getIServiceConnection();
}
}
- HashMap<ServiceConnection, LoadedApk.ServiceDispatcher> holder
+ ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> holder
= mUnboundServices.get(context);
if (holder != null) {
sd = holder.get(c);
@@ -969,8 +966,8 @@ public final class LoadedApk {
}
}
- private final HashMap<ComponentName, ServiceDispatcher.ConnectionInfo> mActiveConnections
- = new HashMap<ComponentName, ServiceDispatcher.ConnectionInfo>();
+ private final ArrayMap<ComponentName, ServiceDispatcher.ConnectionInfo> mActiveConnections
+ = new ArrayMap<ComponentName, ServiceDispatcher.ConnectionInfo>();
ServiceDispatcher(ServiceConnection conn,
Context context, Handler activityThread, int flags) {
@@ -1000,9 +997,8 @@ public final class LoadedApk {
void doForget() {
synchronized(this) {
- Iterator<ServiceDispatcher.ConnectionInfo> it = mActiveConnections.values().iterator();
- while (it.hasNext()) {
- ServiceDispatcher.ConnectionInfo ci = it.next();
+ for (int i=0; i<mActiveConnections.size(); i++) {
+ ServiceDispatcher.ConnectionInfo ci = mActiveConnections.valueAt(i);
ci.binder.unlinkToDeath(ci.deathMonitor, 0);
}
mActiveConnections.clear();