OLD | NEW |
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.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.content.pm.ApplicationInfo; | 9 import android.content.pm.ApplicationInfo; |
10 import android.content.pm.PackageInfo; | 10 import android.content.pm.PackageInfo; |
11 import android.os.AsyncTask; | 11 import android.os.AsyncTask; |
12 import android.os.Build; | 12 import android.os.Build; |
13 import android.os.SystemClock; | 13 import android.os.SystemClock; |
14 | 14 |
15 import org.chromium.base.CommandLine; | 15 import org.chromium.base.CommandLine; |
| 16 import org.chromium.base.ContextUtils; |
16 import org.chromium.base.Log; | 17 import org.chromium.base.Log; |
17 import org.chromium.base.PackageUtils; | 18 import org.chromium.base.PackageUtils; |
18 import org.chromium.base.TraceEvent; | 19 import org.chromium.base.TraceEvent; |
19 import org.chromium.base.annotations.CalledByNative; | 20 import org.chromium.base.annotations.CalledByNative; |
20 import org.chromium.base.annotations.JNINamespace; | 21 import org.chromium.base.annotations.JNINamespace; |
21 import org.chromium.base.metrics.RecordHistogram; | 22 import org.chromium.base.metrics.RecordHistogram; |
22 | 23 |
23 import java.util.concurrent.atomic.AtomicBoolean; | 24 import java.util.concurrent.atomic.AtomicBoolean; |
24 | 25 |
25 import javax.annotation.Nullable; | 26 import javax.annotation.Nullable; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 mLibraryProcessType = libraryProcessType; | 126 mLibraryProcessType = libraryProcessType; |
126 mPrefetchLibraryHasBeenCalled = new AtomicBoolean(); | 127 mPrefetchLibraryHasBeenCalled = new AtomicBoolean(); |
127 } | 128 } |
128 | 129 |
129 /** | 130 /** |
130 * This method blocks until the library is fully loaded and initialized. | 131 * This method blocks until the library is fully loaded and initialized. |
131 * | 132 * |
132 * @param context The context in which the method is called. | 133 * @param context The context in which the method is called. |
133 */ | 134 */ |
134 public void ensureInitialized(Context context) throws ProcessInitException { | 135 public void ensureInitialized(Context context) throws ProcessInitException { |
| 136 // TODO(wnwen): Move this call appropriately down to the tests that need
it. |
| 137 ContextUtils.initApplicationContext(context.getApplicationContext()); |
135 synchronized (sLock) { | 138 synchronized (sLock) { |
136 if (mInitialized) { | 139 if (mInitialized) { |
137 // Already initialized, nothing to do. | 140 // Already initialized, nothing to do. |
138 return; | 141 return; |
139 } | 142 } |
140 loadAlreadyLocked(context); | 143 loadAlreadyLocked(context); |
141 initializeAlreadyLocked(); | 144 initializeAlreadyLocked(); |
142 } | 145 } |
143 } | 146 } |
144 | 147 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 // This must happen after the code is loaded and after JNI is ready (since a
fter the | 356 // This must happen after the code is loaded and after JNI is ready (since a
fter the |
354 // switch the Java CommandLine will delegate all calls the native CommandLin
e). | 357 // switch the Java CommandLine will delegate all calls the native CommandLin
e). |
355 private void ensureCommandLineSwitchedAlreadyLocked() { | 358 private void ensureCommandLineSwitchedAlreadyLocked() { |
356 assert mLoaded; | 359 assert mLoaded; |
357 if (mCommandLineSwitched) { | 360 if (mCommandLineSwitched) { |
358 return; | 361 return; |
359 } | 362 } |
360 nativeInitCommandLine(CommandLine.getJavaSwitchesOrNull()); | 363 nativeInitCommandLine(CommandLine.getJavaSwitchesOrNull()); |
361 CommandLine.enableNativeProxy(); | 364 CommandLine.enableNativeProxy(); |
362 mCommandLineSwitched = true; | 365 mCommandLineSwitched = true; |
| 366 |
| 367 // Ensure that native side application context is loaded and in sync wit
h java side. Must do |
| 368 // this here so webview also gets its application context set before ful
ly initializing. |
| 369 ContextUtils.initApplicationContextForNative(); |
363 } | 370 } |
364 | 371 |
365 // Invoke base::android::LibraryLoaded in library_loader_hooks.cc | 372 // Invoke base::android::LibraryLoaded in library_loader_hooks.cc |
366 private void initializeAlreadyLocked() throws ProcessInitException { | 373 private void initializeAlreadyLocked() throws ProcessInitException { |
367 if (mInitialized) { | 374 if (mInitialized) { |
368 return; | 375 return; |
369 } | 376 } |
370 | 377 |
371 // Setup the native command line if necessary. | 378 ensureCommandLineSwitchedAlreadyLocked(); |
372 if (!mCommandLineSwitched) { | |
373 nativeInitCommandLine(CommandLine.getJavaSwitchesOrNull()); | |
374 } | |
375 | 379 |
376 if (!nativeLibraryLoaded()) { | 380 if (!nativeLibraryLoaded()) { |
377 Log.e(TAG, "error calling nativeLibraryLoaded"); | 381 Log.e(TAG, "error calling nativeLibraryLoaded"); |
378 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_R
EGISTER_JNI); | 382 throw new ProcessInitException(LoaderErrors.LOADER_ERROR_FAILED_TO_R
EGISTER_JNI); |
379 } | 383 } |
380 | 384 |
381 // The Chrome JNI is registered by now so we can switch the Java | |
382 // command line over to delegating to native if it's necessary. | |
383 if (!mCommandLineSwitched) { | |
384 CommandLine.enableNativeProxy(); | |
385 mCommandLineSwitched = true; | |
386 } | |
387 | |
388 // From now on, keep tracing in sync with native. | 385 // From now on, keep tracing in sync with native. |
389 TraceEvent.registerNativeEnabledObserver(); | 386 TraceEvent.registerNativeEnabledObserver(); |
390 | 387 |
391 // From this point on, native code is ready to use and checkIsReady() | 388 // From this point on, native code is ready to use and checkIsReady() |
392 // shouldn't complain from now on (and in fact, it's used by the | 389 // shouldn't complain from now on (and in fact, it's used by the |
393 // following calls). | 390 // following calls). |
394 // Note that this flag can be accessed asynchronously, so any initializa
tion | 391 // Note that this flag can be accessed asynchronously, so any initializa
tion |
395 // must be performed before. | 392 // must be performed before. |
396 mInitialized = true; | 393 mInitialized = true; |
397 } | 394 } |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 | 481 |
485 // Finds the ranges corresponding to the native library pages, forks a new | 482 // Finds the ranges corresponding to the native library pages, forks a new |
486 // process to prefetch these pages and waits for it. The new process then | 483 // process to prefetch these pages and waits for it. The new process then |
487 // terminates. This is blocking. | 484 // terminates. This is blocking. |
488 private static native boolean nativeForkAndPrefetchNativeLibrary(); | 485 private static native boolean nativeForkAndPrefetchNativeLibrary(); |
489 | 486 |
490 // Returns the percentage of the native library code page that are currently
reseident in | 487 // Returns the percentage of the native library code page that are currently
reseident in |
491 // memory. | 488 // memory. |
492 private static native int nativePercentageOfResidentNativeLibraryCode(); | 489 private static native int nativePercentageOfResidentNativeLibraryCode(); |
493 } | 490 } |
OLD | NEW |