diff options
author | agrieve <agrieve@chromium.org> | 2016-03-07 14:10:47 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-07 22:12:37 +0000 |
commit | 38ac32e6609e58bb1530dc53b70118532d4a57a3 (patch) | |
tree | 8e21be77b9d06a1be1131be6a100e53803369211 /build/android | |
parent | d5b7278d64bae3f91fcd48c88ff65a244048a304 (diff) | |
download | chromium_src-38ac32e6609e58bb1530dc53b70118532d4a57a3.zip chromium_src-38ac32e6609e58bb1530dc53b70118532d4a57a3.tar.gz chromium_src-38ac32e6609e58bb1530dc53b70118532d4a57a3.tar.bz2 |
Fix incremental install for Android N
BUG=590394
Review URL: https://codereview.chromium.org/1772843002
Cr-Commit-Position: refs/heads/master@{#379664}
Diffstat (limited to 'build/android')
-rw-r--r-- | build/android/incremental_install/java/org/chromium/incrementalinstall/ClassLoaderPatcher.java | 24 |
1 files changed, 16 insertions, 8 deletions
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 8bf3779..ac51be9 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,26 @@ 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]); 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)) { + // loadDexFile requires that ret contain all previously added elements. + 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; } } |