Index: base/android/java/src/org/chromium/base/ResourceExtractor.java |
diff --git a/base/android/java/src/org/chromium/base/ResourceExtractor.java b/base/android/java/src/org/chromium/base/ResourceExtractor.java |
index 37fea6c863de3eb1d4941be7afb6adcf8f6b3463..5beb07dcb8975cc6743c2a18894a7d3d6b41ba5c 100644 |
--- a/base/android/java/src/org/chromium/base/ResourceExtractor.java |
+++ b/base/android/java/src/org/chromium/base/ResourceExtractor.java |
@@ -4,12 +4,15 @@ |
package org.chromium.base; |
+import android.annotation.TargetApi; |
import android.content.Context; |
import android.content.SharedPreferences; |
import android.content.pm.PackageInfo; |
import android.content.pm.PackageManager; |
import android.content.res.AssetManager; |
import android.os.AsyncTask; |
+import android.os.Build; |
+import android.os.Trace; |
import android.preference.PreferenceManager; |
import android.util.Log; |
@@ -52,15 +55,20 @@ public class ResourceExtractor { |
public ExtractTask() { |
} |
- @Override |
- protected Void doInBackground(Void... unused) { |
+ private void doInBackgroundImpl() { |
final File outputDir = getOutputDir(); |
if (!outputDir.exists() && !outputDir.mkdirs()) { |
Log.e(LOGTAG, "Unable to create pak resources directory!"); |
- return null; |
+ return; |
} |
- String timestampFile = checkPakTimestamp(outputDir); |
+ String timestampFile = null; |
+ beginTraceSection("checkPakTimeStamp"); |
+ try { |
+ timestampFile = checkPakTimestamp(outputDir); |
+ } finally { |
+ endTraceSection(); |
+ } |
if (timestampFile != null) { |
deleteFiles(); |
} |
@@ -72,7 +80,7 @@ public class ResourceExtractor { |
String currentLanguage = currentLocale.split("-", 2)[0]; |
if (prefs.getString(LAST_LANGUAGE, "").equals(currentLanguage) |
- && filenames.size() >= sMandatoryPaks.length) { |
+ && filenames.size() >= sMandatoryPaks.length) { |
boolean filesPresent = true; |
for (String file : filenames) { |
if (!new File(outputDir, file).exists()) { |
@@ -80,7 +88,7 @@ public class ResourceExtractor { |
break; |
} |
} |
- if (filesPresent) return null; |
+ if (filesPresent) return; |
} else { |
prefs.edit().putString(LAST_LANGUAGE, currentLanguage).apply(); |
} |
@@ -93,9 +101,9 @@ public class ResourceExtractor { |
if (sExtractImplicitLocalePak) { |
if (p.length() > 0) p.append('|'); |
- // As well as the minimum required set of .paks above, we'll also add all .paks that |
- // we have for the user's currently selected language. |
- |
+ // As well as the minimum required set of .paks above, we'll |
+ // also add all .paks that we have for the user's currently |
+ // selected language. |
p.append(currentLanguage); |
p.append("(-\\w+)?\\.pak"); |
} |
@@ -103,6 +111,7 @@ public class ResourceExtractor { |
Pattern paksToInstall = Pattern.compile(p.toString()); |
AssetManager manager = mContext.getResources().getAssets(); |
+ beginTraceSection("WalkAssets"); |
try { |
// Loop through every asset file that we have in the APK, and look for the |
// ones that we need to extract by trying to match the Patterns that we |
@@ -114,16 +123,16 @@ public class ResourceExtractor { |
continue; |
} |
boolean isAppDataFile = file.equals(ICU_DATA_FILENAME) |
- || file.equals(V8_NATIVES_DATA_FILENAME) |
- || file.equals(V8_SNAPSHOT_DATA_FILENAME); |
- File output = new File(isAppDataFile |
- ? getAppDataDir() : outputDir, file); |
+ || file.equals(V8_NATIVES_DATA_FILENAME) |
+ || file.equals(V8_SNAPSHOT_DATA_FILENAME); |
+ File output = new File(isAppDataFile ? getAppDataDir() : outputDir, file); |
if (output.exists()) { |
continue; |
} |
InputStream is = null; |
OutputStream os = null; |
+ beginTraceSection("ExtractResource"); |
try { |
is = manager.open(file); |
os = new FileOutputStream(output); |
@@ -159,6 +168,7 @@ public class ResourceExtractor { |
if (os != null) { |
os.close(); |
} |
+ endTraceSection(); // ExtractResource |
} |
} |
} |
@@ -169,11 +179,12 @@ public class ResourceExtractor { |
// this happens with regularity. |
Log.w(LOGTAG, "Exception unpacking required pak resources: " + e.getMessage()); |
deleteFiles(); |
- return null; |
+ return; |
+ } finally { |
+ endTraceSection(); // WalkAssets |
} |
// Finished, write out a timestamp file if we need to. |
- |
if (timestampFile != null) { |
try { |
new File(outputDir, timestampFile).createNewFile(); |
@@ -186,6 +197,20 @@ public class ResourceExtractor { |
// TODO(yusufo): Figure out why remove is required here. |
prefs.edit().remove(PAK_FILENAMES).apply(); |
prefs.edit().putStringSet(PAK_FILENAMES, filenames).apply(); |
+ } |
+ |
+ @Override |
+ protected Void doInBackground(Void... unused) { |
+ // TODO(lizeb): Use chrome tracing here (and above in |
+ // doInBackgroundImpl) when it will be possible. This is currently |
+ // not doable since the native library is not loaded yet, and the |
+ // TraceEvent calls are dropped before this point. |
+ beginTraceSection("ResourceExtractor.ExtractTask.doInBackground"); |
+ try { |
+ doInBackgroundImpl(); |
+ } finally { |
+ endTraceSection(); |
+ } |
return null; |
} |
@@ -233,6 +258,18 @@ public class ResourceExtractor { |
// timestamp file is already up-to date. |
return null; |
} |
+ |
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) |
+ private void beginTraceSection(String section) { |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) return; |
+ Trace.beginSection(section); |
+ } |
+ |
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) |
+ private void endTraceSection() { |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) return; |
+ Trace.endSection(); |
+ } |
} |
private final Context mContext; |