diff options
Diffstat (limited to 'core/java/android/app/LoadedApk.java')
-rw-r--r-- | core/java/android/app/LoadedApk.java | 68 |
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(); |