| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.incrementalinstall; | 5 package org.chromium.incrementalinstall; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.Build; | 8 import android.os.Build; |
| 9 import android.util.Log; | 9 import android.util.Log; |
| 10 | 10 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 | 88 |
| 89 Log.i(TAG, "Code cache dir: " + optimizedDir); | 89 Log.i(TAG, "Code cache dir: " + optimizedDir); |
| 90 // TODO(agrieve): Might need to record classpath ordering if we ever hav
e duplicate | 90 // TODO(agrieve): Might need to record classpath ordering if we ever hav
e duplicate |
| 91 // class names (since then order will matter here). | 91 // class names (since then order will matter here). |
| 92 Log.i(TAG, "Loading " + dexFilesArr.length + " dex files"); | 92 Log.i(TAG, "Loading " + dexFilesArr.length + " dex files"); |
| 93 | 93 |
| 94 Object dexPathList = Reflect.getField(mClassLoader, "pathList"); | 94 Object dexPathList = Reflect.getField(mClassLoader, "pathList"); |
| 95 Object[] dexElements = (Object[]) Reflect.getField(dexPathList, "dexElem
ents"); | 95 Object[] dexElements = (Object[]) Reflect.getField(dexPathList, "dexElem
ents"); |
| 96 Object[] additionalElements = makeDexElements(dexFilesArr, optimizedDir)
; | 96 dexElements = addDexElements(dexFilesArr, optimizedDir, dexElements); |
| 97 Reflect.setField(dexPathList, "dexElements", | 97 Reflect.setField(dexPathList, "dexElements", dexElements); |
| 98 Reflect.concatArrays(dexElements, dexElements, additionalElement
s)); | |
| 99 } | 98 } |
| 100 | 99 |
| 101 /** | 100 /** |
| 102 * Sets up all libraries within |libDir| to be loadable by System.loadLibrar
y(). | 101 * Sets up all libraries within |libDir| to be loadable by System.loadLibrar
y(). |
| 103 */ | 102 */ |
| 104 void importNativeLibs(File libDir) throws ReflectiveOperationException, IOEx
ception { | 103 void importNativeLibs(File libDir) throws ReflectiveOperationException, IOEx
ception { |
| 105 Log.i(TAG, "Importing native libraries from: " + libDir); | 104 Log.i(TAG, "Importing native libraries from: " + libDir); |
| 106 if (!libDir.exists()) { | 105 if (!libDir.exists()) { |
| 107 Log.i(TAG, "No native libs exist."); | 106 Log.i(TAG, "No native libs exist."); |
| 108 return; | 107 return; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 private static Object[] makeNativePathElements(File[] paths) | 214 private static Object[] makeNativePathElements(File[] paths) |
| 216 throws ReflectiveOperationException { | 215 throws ReflectiveOperationException { |
| 217 Class<?> entryClazz = Class.forName("dalvik.system.DexPathList$Element")
; | 216 Class<?> entryClazz = Class.forName("dalvik.system.DexPathList$Element")
; |
| 218 Object[] entries = new Object[paths.length]; | 217 Object[] entries = new Object[paths.length]; |
| 219 for (int i = 0; i < paths.length; ++i) { | 218 for (int i = 0; i < paths.length; ++i) { |
| 220 entries[i] = Reflect.newInstance(entryClazz, paths[i], true, null, n
ull); | 219 entries[i] = Reflect.newInstance(entryClazz, paths[i], true, null, n
ull); |
| 221 } | 220 } |
| 222 return entries; | 221 return entries; |
| 223 } | 222 } |
| 224 | 223 |
| 225 private static Object[] makeDexElements(File[] files, File optimizedDirector
y) | 224 private Object[] addDexElements(File[] files, File optimizedDirectory, Objec
t[] curDexElements) |
| 226 throws ReflectiveOperationException { | 225 throws ReflectiveOperationException { |
| 227 Class<?> entryClazz = Class.forName("dalvik.system.DexPathList$Element")
; | 226 Class<?> entryClazz = Class.forName("dalvik.system.DexPathList$Element")
; |
| 228 Class<?> clazz = Class.forName("dalvik.system.DexPathList"); | 227 Class<?> clazz = Class.forName("dalvik.system.DexPathList"); |
| 229 Object[] entries = new Object[files.length]; | 228 Object[] ret = |
| 229 Reflect.concatArrays(curDexElements, curDexElements, new Object[
files.length]); |
| 230 File emptyDir = new File(""); | 230 File emptyDir = new File(""); |
| 231 for (int i = 0; i < files.length; ++i) { | 231 for (int i = 0; i < files.length; ++i) { |
| 232 File file = files[i]; | 232 File file = files[i]; |
| 233 Object dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, op
timizedDirectory); | 233 Object dexFile; |
| 234 entries[i] = Reflect.newInstance(entryClazz, emptyDir, false, file,
dexFile); | 234 if ("N".equals(Build.VERSION.CODENAME)) { |
| 235 // loadDexFile requires that ret contain all previously added el
ements. |
| 236 dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, optim
izedDirectory, |
| 237 mClassLoader, ret); |
| 238 } else { |
| 239 dexFile = Reflect.invokeMethod(clazz, "loadDexFile", file, optim
izedDirectory); |
| 240 } |
| 241 ret[curDexElements.length + i] = |
| 242 Reflect.newInstance(entryClazz, emptyDir, false, file, dexFi
le); |
| 235 } | 243 } |
| 236 return entries; | 244 return ret; |
| 237 } | 245 } |
| 238 } | 246 } |
| OLD | NEW |