OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package org.chromium.chrome.browser.init; | |
6 | |
7 import android.content.BroadcastReceiver; | |
8 import android.content.Context; | |
9 import android.content.Intent; | |
10 import android.content.IntentFilter; | |
11 import android.content.SharedPreferences; | |
12 import android.content.SharedPreferences.Editor; | |
13 import android.os.StrictMode; | |
14 import android.support.v4.content.LocalBroadcastManager; | |
15 | |
16 import org.chromium.base.ContextUtils; | |
17 import org.chromium.base.Log; | |
18 import org.chromium.base.ThreadUtils; | |
19 import org.chromium.base.library_loader.LibraryLoader; | |
20 import org.chromium.base.library_loader.LibraryProcessType; | |
21 import org.chromium.base.library_loader.ProcessInitException; | |
22 import org.chromium.chrome.browser.ChromeVersionInfo; | |
23 import org.chromium.components.variations.firstrun.VariationsSeedService; | |
24 import org.chromium.content.browser.ChildProcessLauncher; | |
25 | |
26 /** | |
27 * Class for running the Asynchronous startup tasks that need to be run before t he native side is | |
28 * started. Currently it runs two tasks: | |
29 * - Native library loading | |
30 * - Fetching the variations seed on first run. | |
31 */ | |
32 public abstract class AsyncInitTaskRunner { | |
33 | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
Nit: Remove empty line. You can add it after TAG i
aberent
2017/01/12 17:31:50
Done.
| |
34 private static final String TAG = "AsyncTaskRunner"; | |
35 private static final String VARIATIONS_INITIALIZED = "variations_initialized "; | |
36 private boolean mWaitingForVariationsFetch; | |
37 private boolean mLibraryLoaded; | |
38 | |
39 private static boolean shouldFetchVariationsSeedDuringFirstRun() { | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
This logic changed on TOT in the meantime - this f
aberent
2017/01/12 17:31:50
Done.
| |
40 // For now, only do the fetching on official canary and dev builds, as t here is a concern | |
41 // about the extra latency this adds. | |
42 // TODO(asvitkine): Revise this logic based on histogram data. | |
43 return ChromeVersionInfo.isOfficialBuild() | |
44 && (ChromeVersionInfo.isCanaryBuild() || ChromeVersionInfo.isDev Build()); | |
45 } | |
46 | |
47 /** | |
48 * Start the background tasks. | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
Nit: Javadoc for params.
aberent
2017/01/12 17:31:50
Done.
| |
49 */ | |
50 public void startBackgroundTasks(final boolean allocateChildConnection, | |
51 final boolean initVariationSeed) { | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
Nit: No need for final on the second var.
aberent
2017/01/12 17:31:50
Done.
| |
52 | |
53 if (initVariationSeed && shouldFetchVariationsSeedDuringFirstRun()) { | |
54 StrictMode.ThreadPolicy policy = StrictMode.allowThreadDiskReads(); | |
55 SharedPreferences prefs = ContextUtils.getAppSharedPreferences(); | |
56 boolean variationsInitialized = prefs.getBoolean(VARIATIONS_INITIALI ZED, false); | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
I don't understand how this will work.
If this Ja
aberent
2017/01/12 17:31:50
Backup only saves and restores a very limited subs
Alexei Svitkine (slow)
2017/01/12 18:55:43
Ah, I did not realise this! It means that my fix f
| |
57 // Only attempt to get the initial seed once, even if the attempt fa ils. | |
58 Editor prefsEditor = prefs.edit(); | |
59 prefsEditor.putBoolean(VARIATIONS_INITIALIZED, true); | |
60 prefsEditor.apply(); | |
61 StrictMode.setThreadPolicy(policy); | |
62 | |
63 if (!variationsInitialized) { | |
64 | |
Alexei Svitkine (slow)
2017/01/12 16:06:28
Nit: Remove empty line.
aberent
2017/01/12 17:31:50
Done.
| |
65 Context context = ContextUtils.getApplicationContext(); | |
66 mWaitingForVariationsFetch = true; | |
67 IntentFilter filter = new IntentFilter(VariationsSeedService.COM PLETE_BROADCAST); | |
68 final LocalBroadcastManager manager = LocalBroadcastManager.getI nstance(context); | |
69 manager.registerReceiver( | |
70 new BroadcastReceiver() { | |
71 @Override | |
72 public void onReceive(Context context, Intent intent ) { | |
73 // This check is needed because onReceive() can be called multiple | |
74 // times even after having unregistered below if two broadcasts | |
75 // arrive in rapid succession. | |
76 if (!mWaitingForVariationsFetch) return; | |
77 mWaitingForVariationsFetch = false; | |
78 manager.unregisterReceiver(this); | |
79 Log.i(TAG, "Variations fetched"); | |
80 tasksPossiblyComplete(); | |
81 } | |
82 }, | |
83 filter); | |
84 Log.i(TAG, "Fetching variations"); | |
85 context.startService(new Intent(context, VariationsSeedService.c lass)); | |
86 } | |
87 } | |
88 | |
89 // TODO(yusufo) : Investigate using an AsyncTask for this. | |
90 new Thread() { | |
91 @Override | |
92 public void run() { | |
93 try { | |
94 LibraryLoader libraryLoader = | |
95 LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER ); | |
96 libraryLoader.ensureInitialized(); | |
97 // The prefetch is done after the library load for two reaso ns: | |
98 // - It is easier to know the library location after it has | |
99 // been loaded. | |
100 // - Testing has shown that this gives the best compromise, | |
101 // by avoiding performance regression on any tested | |
102 // device, and providing performance improvement on | |
103 // some. Doing it earlier delays UI inflation and more | |
104 // generally startup on some devices, most likely by | |
105 // competing for IO. | |
106 // For experimental results, see http://crbug.com/460438. | |
107 libraryLoader.asyncPrefetchLibrariesToMemory(); | |
108 } catch (ProcessInitException e) { | |
109 Log.e(TAG, "Unable to load native library.", e); | |
110 onFailure(); | |
111 return; | |
112 } | |
113 if (allocateChildConnection) { | |
114 ChildProcessLauncher.warmUp(ContextUtils.getApplicationConte xt()); | |
115 } | |
116 ThreadUtils.runOnUiThread(new Runnable() { | |
117 @Override | |
118 public void run() { | |
119 mLibraryLoaded = true; | |
120 tasksPossiblyComplete(); | |
121 } | |
122 }); | |
123 } | |
124 }.start(); | |
125 | |
126 } | |
127 | |
128 private void tasksPossiblyComplete() { | |
129 ThreadUtils.assertOnUiThread(); | |
130 | |
131 if (mLibraryLoaded && !mWaitingForVariationsFetch) { | |
132 onSuccess(); | |
133 } | |
134 } | |
135 | |
136 public abstract void onSuccess(); | |
137 public abstract void onFailure(); | |
138 } | |
OLD | NEW |