Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java

Issue 289303004: Allow native command line arguments to be initialized early. (Closed) Base URL: https://chromium.googlesource.com/chromium/src
Patch Set: Add CommandLine to CookieManagerStartUpTest Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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.base.library_loader; 5 package org.chromium.base.library_loader;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.os.SystemClock; 8 import android.os.SystemClock;
9 import android.util.Log; 9 import android.util.Log;
10 10
(...skipping 19 matching lines...) Expand all
30 @JNINamespace("base::android") 30 @JNINamespace("base::android")
31 public class LibraryLoader { 31 public class LibraryLoader {
32 private static final String TAG = "LibraryLoader"; 32 private static final String TAG = "LibraryLoader";
33 33
34 // Guards all access to the libraries 34 // Guards all access to the libraries
35 private static final Object sLock = new Object(); 35 private static final Object sLock = new Object();
36 36
37 // One-way switch becomes true when the libraries are loaded. 37 // One-way switch becomes true when the libraries are loaded.
38 private static boolean sLoaded = false; 38 private static boolean sLoaded = false;
39 39
40 // One-way switch becomes true when the native command line is initialized (
41 // by calling nativeInitCommandLine, which forwards to
42 // InitCommandLine(...) in library_loader_hooks.cc).
43 private static boolean sCommandLineInitialized = false;
44
40 // One-way switch becomes true when the libraries are initialized ( 45 // One-way switch becomes true when the libraries are initialized (
41 // by calling nativeLibraryLoaded, which forwards to LibraryLoaded(...) in 46 // by calling nativeLibraryLoaded, which forwards to LibraryLoaded(...) in
42 // library_loader_hooks.cc). 47 // library_loader_hooks.cc).
43 private static boolean sInitialized = false; 48 private static boolean sInitialized = false;
44 49
45 // One-way switch becomes true if the system library loading failed, 50 // One-way switch becomes true if the system library loading failed,
46 // and the right native library was found and loaded by the hack. 51 // and the right native library was found and loaded by the hack.
47 // The flag is used to report UMA stats later. 52 // The flag is used to report UMA stats later.
48 private static boolean sNativeLibraryHackWasUsed = false; 53 private static boolean sNativeLibraryHackWasUsed = false;
49 54
(...skipping 26 matching lines...) Expand all
76 */ 81 */
77 public static void ensureInitialized( 82 public static void ensureInitialized(
78 Context context, boolean shouldDeleteOldWorkaroundLibraries) 83 Context context, boolean shouldDeleteOldWorkaroundLibraries)
79 throws ProcessInitException { 84 throws ProcessInitException {
80 synchronized (sLock) { 85 synchronized (sLock) {
81 if (sInitialized) { 86 if (sInitialized) {
82 // Already initialized, nothing to do. 87 // Already initialized, nothing to do.
83 return; 88 return;
84 } 89 }
85 loadAlreadyLocked(context, shouldDeleteOldWorkaroundLibraries); 90 loadAlreadyLocked(context, shouldDeleteOldWorkaroundLibraries);
86 initializeAlreadyLocked(CommandLine.getJavaSwitchesOrNull()); 91
92 // We can only call getJavaSwitchesOrNull if we have not yet
93 // switched CommandLine to native.
94 String[] switches = null;
95 if (!sCommandLineInitialized) {
96 switches = CommandLine.getJavaSwitchesOrNull();
97 }
98 initializeAlreadyLocked(switches);
87 } 99 }
88 } 100 }
89 101
90 /** 102 /**
91 * Checks if library is fully loaded and initialized. 103 * Checks if library is fully loaded and initialized.
92 */ 104 */
93 public static boolean isInitialized() { 105 public static boolean isInitialized() {
94 synchronized (sLock) { 106 synchronized (sLock) {
95 return sInitialized; 107 return sInitialized;
96 } 108 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 Log.i(TAG, String.format( 205 Log.i(TAG, String.format(
194 "Expected native library version number \"%s\"," + 206 "Expected native library version number \"%s\"," +
195 "actual native library version number \"%s\"", 207 "actual native library version number \"%s\"",
196 NativeLibraries.VERSION_NUMBER, 208 NativeLibraries.VERSION_NUMBER,
197 nativeGetVersionNumber())); 209 nativeGetVersionNumber()));
198 if (!NativeLibraries.VERSION_NUMBER.equals(nativeGetVersionNumber())) { 210 if (!NativeLibraries.VERSION_NUMBER.equals(nativeGetVersionNumber())) {
199 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_NATIVE_LIBR ARY_WRONG_VERSION); 211 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_NATIVE_LIBR ARY_WRONG_VERSION);
200 } 212 }
201 } 213 }
202 214
215 /**
216 * Set the native command line if it is has not been set yet.
217 * If the command line is set already the arguments are ignored.
218 * The library must have previously been loaded with loadNow.
219 */
220 public static void ensureCommandLineInit(String[] initCommandLine) {
bulach 2014/05/21 11:33:49 hmm... this method seems dangerous, it "ensures" b
hjd 2014/05/22 11:09:10 Yeah I felt bad writing that name... I've changed
221 synchronized (sLock) {
222 ensureCommandLineInitAlreadyLocked(initCommandLine);
223 }
224 }
225
226 private static void ensureCommandLineInitAlreadyLocked(String[] initCommandL ine) {
227 if (sCommandLineInitialized) {
228 return;
229 }
230 nativeInitCommandLine(initCommandLine);
bulach 2014/05/21 11:33:49 calling an unbound method throws some fairly crypt
hjd 2014/05/22 11:09:10 I added a lot of extra LoaderErrors and checked th
231 CommandLine.enableNativeProxy();
232 sCommandLineInitialized = true;
233 }
234
203 // Invoke base::android::LibraryLoaded in library_loader_hooks.cc 235 // Invoke base::android::LibraryLoaded in library_loader_hooks.cc
204 private static void initializeAlreadyLocked(String[] initCommandLine) 236 private static void initializeAlreadyLocked(String[] initCommandLine)
205 throws ProcessInitException { 237 throws ProcessInitException {
206 if (sInitialized) { 238 if (sInitialized) {
207 return; 239 return;
208 } 240 }
209 if (!nativeLibraryLoaded(initCommandLine)) { 241
242 ensureCommandLineInitAlreadyLocked(initCommandLine);
243
244 if (!nativeLibraryLoaded()) {
210 Log.e(TAG, "error calling nativeLibraryLoaded"); 245 Log.e(TAG, "error calling nativeLibraryLoaded");
211 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_R EGISTER_JNI); 246 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_R EGISTER_JNI);
212 } 247 }
213 // From this point on, native code is ready to use and checkIsReady() 248 // From this point on, native code is ready to use and checkIsReady()
214 // shouldn't complain from now on (and in fact, it's used by the 249 // shouldn't complain from now on (and in fact, it's used by the
215 // following calls). 250 // following calls).
216 sInitialized = true; 251 sInitialized = true;
217 CommandLine.enableNativeProxy();
218 252
219 // From now on, keep tracing in sync with native. 253 // From now on, keep tracing in sync with native.
220 TraceEvent.registerNativeEnabledObserver(); 254 TraceEvent.registerNativeEnabledObserver();
221 255
222 // Record histogram for the Chromium linker. 256 // Record histogram for the Chromium linker.
223 if (Linker.isUsed()) { 257 if (Linker.isUsed()) {
224 nativeRecordChromiumAndroidLinkerHistogram(Linker.loadAtFixedAddress Failed(), 258 nativeRecordChromiumAndroidLinkerHistogram(Linker.loadAtFixedAddress Failed(),
225 SysUtils.isLowEndDevice()); 259 SysUtils.isLowEndDevice());
226 } 260 }
227 261
228 nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed); 262 nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed);
229 } 263 }
230 264
265 // Invokes InitCommandLine in library_loader_hooks.cc to set the native comm and line.
266 private static native void nativeInitCommandLine(String[] commandLine);
267
231 // Only methods needed before or during normal JNI registration are during S ystem.OnLoad. 268 // Only methods needed before or during normal JNI registration are during S ystem.OnLoad.
232 // nativeLibraryLoaded is then called to register everything else. This pro cess is called 269 // nativeLibraryLoaded is then called to register everything else. This pro cess is called
233 // "initialization". This method will be mapped (by generated code) to the LibraryLoaded 270 // "initialization". This method will be mapped (by generated code) to the LibraryLoaded
234 // definition in base/android/library_loader/library_loader_hooks.cc. 271 // definition in base/android/library_loader/library_loader_hooks.cc.
235 // 272 //
236 // Return true on success and false on failure. 273 // Return true on success and false on failure.
237 private static native boolean nativeLibraryLoaded(String[] initCommandLine); 274 private static native boolean nativeLibraryLoaded();
238 275
239 // Method called to record statistics about the Chromium linker operation, 276 // Method called to record statistics about the Chromium linker operation,
240 // i.e. whether the library failed to be loaded at a fixed address, and 277 // i.e. whether the library failed to be loaded at a fixed address, and
241 // whether the device is 'low-memory'. 278 // whether the device is 'low-memory'.
242 private static native void nativeRecordChromiumAndroidLinkerHistogram( 279 private static native void nativeRecordChromiumAndroidLinkerHistogram(
243 boolean loadedAtFixedAddressFailed, 280 boolean loadedAtFixedAddressFailed,
244 boolean isLowMemoryDevice); 281 boolean isLowMemoryDevice);
245 282
246 // Get the version of the native library. This is needed so that we can chec k we 283 // Get the version of the native library. This is needed so that we can chec k we
247 // have the right version before initializing the (rest of the) JNI. 284 // have the right version before initializing the (rest of the) JNI.
248 private static native String nativeGetVersionNumber(); 285 private static native String nativeGetVersionNumber();
249 286
250 private static native void nativeRecordNativeLibraryHack(boolean usedHack); 287 private static native void nativeRecordNativeLibraryHack(boolean usedHack);
251 } 288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698