Chromium Code Reviews| Index: build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java |
| diff --git a/build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java b/build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java |
| index 8bf37799a3aeea72d1950c8cd63d1cbfa3bb3753..3adb8cbdf79929219b690abb451f2d8dc405f18b 100644 |
| --- a/build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java |
| +++ b/build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java |
| @@ -93,9 +93,8 @@ final class ClassLoaderPatcher { |
| Object dexPathList = Reflect.getField(mClassLoader, "pathList"); |
| Object[] dexElements = (Object[]) Reflect.getField(dexPathList, "dexElements"); |
| - Object[] additionalElements = makeDexElements(dexFilesArr, optimizedDir); |
| - Reflect.setField(dexPathList, "dexElements", |
| - Reflect.concatArrays(dexElements, dexElements, additionalElements)); |
| + dexElements = addDexElements(dexFilesArr, optimizedDir, dexElements); |
| + Reflect.setField(dexPathList, "dexElements", dexElements); |
| } |
| /** |
| @@ -222,17 +221,25 @@ final class ClassLoaderPatcher { |
| return entries; |
| } |
| - private static Object[] makeDexElements(File[] files, File optimizedDirectory) |
| + private Object[] addDexElements(File[] files, File optimizedDirectory, Object[] curDexElements) |
| throws ReflectiveOperationException { |
| Class<?> entryClazz = Class.forName("dalvik.system.DexPathList$Element"); |
| Class<?> clazz = Class.forName("dalvik.system.DexPathList"); |
| - Object[] entries = new Object[files.length]; |
| + Object[] ret = |
| + Reflect.concatArrays(curDexElements, curDexElements, new Object[files.length]); |
|
Yaron
2016/03/07 19:39:20
still seems cleaner to allocate a new array and th
agrieve
2016/03/07 20:04:43
Added a comment: loadDexFile requires that ret con
|
| File emptyDir = new File(""); |
| for (int i = 0; i < files.length; ++i) { |
| File file = files[i]; |
| - Object dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, optimizedDirectory); |
| - entries[i] = Reflect.newInstance(entryClazz, emptyDir, false, file, dexFile); |
| + Object dexFile; |
| + if ("N".equals(Build.VERSION.CODENAME)) { |
| + dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, optimizedDirectory, |
| + mClassLoader, ret); |
| + } else { |
| + dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, optimizedDirectory); |
| + } |
| + ret[curDexElements.length + i] = |
| + Reflect.newInstance(entryClazz, emptyDir, false, file, dexFile); |
| } |
| - return entries; |
| + return ret; |
| } |
| } |