aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
diff options
context:
space:
mode:
authorGravatar Alex Humesky <ahumesky@google.com>2016-03-30 02:27:45 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-03-30 08:20:22 +0000
commit7cb57ff9852f1099ce9a865929d25e53198b8350 (patch)
tree583779291beab91ccf449ec19c798a2c5f09d983 /src/tools/android/java/com/google/devtools/build/android/incrementaldeployment
parentd391fccb41b3bbb5b370986e6ae8a2695a945689 (diff)
Updates stub application resource handling to work with Android N.
-- MOS_MIGRATED_REVID=118532668
Diffstat (limited to 'src/tools/android/java/com/google/devtools/build/android/incrementaldeployment')
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java42
1 files changed, 33 insertions, 9 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
index a0498c2484..2107c37687 100644
--- a/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
+++ b/src/tools/android/java/com/google/devtools/build/android/incrementaldeployment/StubApplication.java
@@ -38,6 +38,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -246,6 +247,7 @@ public class StubApplication extends Application {
}
}
+ @SuppressWarnings("unchecked")
private void monkeyPatchExistingResources() {
if (externalResourceFile == null) {
return;
@@ -273,19 +275,41 @@ public class StubApplication extends Application {
mGetInstance.setAccessible(true);
Object resourcesManager = mGetInstance.invoke(null);
- Field mAssets = Resources.class.getDeclaredField("mAssets");
- mAssets.setAccessible(true);
+ // Get all known Resources objects
+ Collection<WeakReference<Resources>> references;
+ try {
+ // Pre-N
+ Field fMActiveResources = clazz.getDeclaredField("mActiveResources");
+ fMActiveResources.setAccessible(true);
+ ArrayMap<?, WeakReference<Resources>> arrayMap =
+ (ArrayMap<?, WeakReference<Resources>>) fMActiveResources.get(resourcesManager);
+ references = arrayMap.values();
+ } catch (NoSuchFieldException e) {
+ // N moved the resources to mResourceReferences
+ Field mResourceReferences = clazz.getDeclaredField("mResourceReferences");
+ mResourceReferences.setAccessible(true);
+ references =
+ (Collection<WeakReference<Resources>>) mResourceReferences.get(resourcesManager);
+ }
// Iterate over all known Resources objects
- Field fMActiveResources = clazz.getDeclaredField("mActiveResources");
- fMActiveResources.setAccessible(true);
- @SuppressWarnings("unchecked")
- ArrayMap<?, WeakReference<Resources>> arrayMap =
- (ArrayMap<?, WeakReference<Resources>>) fMActiveResources.get(resourcesManager);
- for (WeakReference<Resources> wr : arrayMap.values()) {
+ for (WeakReference<Resources> wr : references) {
Resources resources = wr.get();
// Set the AssetManager of the Resources instance to our brand new one
- mAssets.set(resources, newAssetManager);
+ try {
+ // Pre-N
+ Field mAssets = Resources.class.getDeclaredField("mAssets");
+ mAssets.setAccessible(true);
+ mAssets.set(resources, newAssetManager);
+ } catch (NoSuchFieldException e) {
+ // N moved the mAssets inside an mResourcesImpl field
+ Field mResourcesImplField = Resources.class.getDeclaredField("mResourcesImpl");
+ mResourcesImplField.setAccessible(true);
+ Object mResourceImpl = mResourcesImplField.get(resources);
+ Field implAssets = mResourceImpl.getClass().getDeclaredField("mAssets");
+ implAssets.setAccessible(true);
+ implAssets.set(mResourceImpl, newAssetManager);
+ }
resources.updateConfiguration(resources.getConfiguration(), resources.getDisplayMetrics());
}
} catch (IllegalAccessException | NoSuchFieldException | NoSuchMethodException |