OLD | NEW |
(Empty) | |
| 1 package org.chromium.deconstructed; |
| 2 |
| 3 import android.app.Application; |
| 4 |
| 5 import java.lang.ref.WeakReference; |
| 6 import java.lang.reflect.InvocationTargetException; |
| 7 import java.util.List; |
| 8 import java.util.Map; |
| 9 |
| 10 public class ApplicationInstaller { |
| 11 public static void install(Application currentApplication, Application realA
pplication) |
| 12 throws ClassNotFoundException, InvocationTargetException, NoSuchFiel
dException, |
| 13 NoSuchMethodException { |
| 14 Object currentActivityThread = |
| 15 Reflect.invokeStaticMethod("android.app.ActivityThread", "curren
tActivityThread"); |
| 16 if (Reflect.getField(currentActivityThread, "mInitialApplication") == cu
rrentApplication) { |
| 17 Reflect.setField(currentActivityThread, "mInitialApplication", realA
pplication); |
| 18 } |
| 19 |
| 20 List<Application> allApplications = |
| 21 (List<Application>) Reflect.getField(currentActivityThread, "mAl
lApplications"); |
| 22 for (int i = 0; i < allApplications.size(); i++) { |
| 23 if (allApplications.get(i) == currentApplication) { |
| 24 allApplications.set(i, realApplication); |
| 25 } |
| 26 } |
| 27 |
| 28 for (String fieldName : new String[] {"mPackages", "mResourcePackages"})
{ |
| 29 Map<String, WeakReference<?>> packageMap = |
| 30 (Map<String, WeakReference<?>>) Reflect.getField( |
| 31 currentActivityThread, fieldName); |
| 32 for (Map.Entry<String, WeakReference<?>> entry : packageMap.entrySet
()) { |
| 33 Object loadedApk = entry.getValue().get(); |
| 34 if (loadedApk == null) continue; |
| 35 if (Reflect.getField(loadedApk, "mApplication") == currentApplic
ation) { |
| 36 Reflect.setField(loadedApk, "mApplication", realApplication)
; |
| 37 Reflect.setField(realApplication, "mLoadedApk", loadedApk); |
| 38 } |
| 39 } |
| 40 } |
| 41 } |
| 42 } |
OLD | NEW |