| 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 476d5505654661159280352f6164d5da0861e3e1..e0a0e17634def110efb25397aa12432d5d276b3d 100644
|
| --- a/base/android/java/src/org/chromium/base/ResourceExtractor.java
|
| +++ b/base/android/java/src/org/chromium/base/ResourceExtractor.java
|
| @@ -8,9 +8,6 @@ import android.annotation.TargetApi;
|
| import android.content.Context;
|
| import android.content.pm.PackageInfo;
|
| import android.content.pm.PackageManager;
|
| -import android.content.res.AssetManager;
|
| -import android.content.res.Resources;
|
| -import android.content.res.TypedArray;
|
| import android.os.AsyncTask;
|
| import android.os.Build;
|
| import android.os.Handler;
|
| @@ -18,6 +15,8 @@ import android.os.Looper;
|
| import android.os.Trace;
|
| import android.util.Log;
|
|
|
| +import org.chromium.base.annotations.SuppressFBWarnings;
|
| +
|
| import java.io.File;
|
| import java.io.FileOutputStream;
|
| import java.io.FilenameFilter;
|
| @@ -26,7 +25,6 @@ import java.io.InputStream;
|
| import java.io.OutputStream;
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| -import java.util.Locale;
|
| import java.util.concurrent.CancellationException;
|
| import java.util.concurrent.ExecutionException;
|
|
|
| @@ -41,21 +39,21 @@ public class ResourceExtractor {
|
| private static final String V8_NATIVES_DATA_FILENAME = "natives_blob.bin";
|
| private static final String V8_SNAPSHOT_DATA_FILENAME = "snapshot_blob.bin";
|
|
|
| - private static String[] sMandatoryPaks = new String[0];
|
| - private static int sLocalePaksResId = 0;
|
| + private static ResourceEntry[] sResourcesToExtract = new ResourceEntry[0];
|
|
|
| /**
|
| - * Applies the reverse mapping done by locale_pak_resources.py.
|
| + * Holds information about a res/raw file (e.g. locale .pak files).
|
| */
|
| - private static String toChromeLocaleName(String srcFileName) {
|
| - srcFileName = srcFileName.replace(".lpak", ".pak");
|
| - String[] parts = srcFileName.split("_");
|
| - if (parts.length > 1) {
|
| - int dotIdx = parts[1].indexOf('.');
|
| - return parts[0] + "-" + parts[1].substring(0, dotIdx).toUpperCase(Locale.ENGLISH)
|
| - + parts[1].substring(dotIdx);
|
| + public static final class ResourceEntry {
|
| + public final int resourceId;
|
| + public final String pathWithinApk;
|
| + public final String extractedFileName;
|
| +
|
| + public ResourceEntry(int resourceId, String pathWithinApk, String extractedFileName) {
|
| + this.resourceId = resourceId;
|
| + this.pathWithinApk = pathWithinApk;
|
| + this.extractedFileName = extractedFileName;
|
| }
|
| - return srcFileName;
|
| }
|
|
|
| private class ExtractTask extends AsyncTask<Void, Void, Void> {
|
| @@ -112,51 +110,23 @@ public class ResourceExtractor {
|
| }
|
|
|
| beginTraceSection("WalkAssets");
|
| - AssetManager assetManager = mContext.getAssets();
|
| byte[] buffer = new byte[BUFFER_SIZE];
|
| try {
|
| // Extract all files that don't already exist.
|
| - for (String fileName : sMandatoryPaks) {
|
| - File output = new File(outputDir, fileName);
|
| + for (ResourceEntry entry : sResourcesToExtract) {
|
| + File output = new File(outputDir, entry.extractedFileName);
|
| if (output.exists()) {
|
| continue;
|
| }
|
| beginTraceSection("ExtractResource");
|
| - InputStream inputStream = assetManager.open(fileName);
|
| + InputStream inputStream = mContext.getResources().openRawResource(
|
| + entry.resourceId);
|
| try {
|
| extractResourceHelper(inputStream, output, buffer);
|
| } finally {
|
| endTraceSection(); // ExtractResource
|
| }
|
| }
|
| -
|
| - if (sLocalePaksResId != 0) {
|
| - // locale_paks yields the current language's pak file paths.
|
| - Resources resources = mContext.getResources();
|
| - TypedArray resIds = resources.obtainTypedArray(sLocalePaksResId);
|
| - try {
|
| - int len = resIds.length();
|
| - for (int i = 0; i < len; ++i) {
|
| - int resId = resIds.getResourceId(i, 0);
|
| - String resPath = resources.getString(resId);
|
| - String srcBaseName = new File(resPath).getName();
|
| - String dstBaseName = toChromeLocaleName(srcBaseName);
|
| - File output = new File(outputDir, dstBaseName);
|
| - if (output.exists()) {
|
| - continue;
|
| - }
|
| - beginTraceSection("ExtractResource");
|
| - InputStream inputStream = resources.openRawResource(resId);
|
| - try {
|
| - extractResourceHelper(inputStream, output, buffer);
|
| - } finally {
|
| - endTraceSection(); // ExtractResource
|
| - }
|
| - }
|
| - } finally {
|
| - resIds.recycle();
|
| - }
|
| - }
|
| } catch (IOException e) {
|
| // TODO(benm): See crbug/152413.
|
| // Try to recover here, can we try again after deleting files instead of
|
| @@ -285,24 +255,18 @@ public class ResourceExtractor {
|
|
|
| /**
|
| * Specifies the files that should be extracted from the APK.
|
| - * and moved to {@link #getOutputDirFromContext(Context)}.
|
| - * @param localePaksResId Resource ID for the locale_paks string array. Pass
|
| - * in 0 to disable locale pak extraction.
|
| - * @param paths The list of paths to be extracted.
|
| + * and moved to {@link #getOutputDir()}.
|
| */
|
| - public static void setMandatoryPaksToExtract(int localePaksResId, String... paths) {
|
| + @SuppressFBWarnings("EI_EXPOSE_STATIC_REP2")
|
| + public static void setResourcesToExtract(ResourceEntry[] entries) {
|
| assert (sInstance == null || sInstance.mExtractTask == null)
|
| : "Must be called before startExtractingResources is called";
|
| - sLocalePaksResId = localePaksResId;
|
| - sMandatoryPaks = paths;
|
| + sResourcesToExtract = entries;
|
| }
|
|
|
| // TODO(agrieve): Delete this method ones all usages of it are updated.
|
| public static void setMandatoryPaksToExtract(String... paths) {
|
| - if (paths.length == 1 && "".equals(paths[0])) {
|
| - paths = new String[0];
|
| - }
|
| - setMandatoryPaksToExtract(0, paths);
|
| + assert paths.length == 1 && "".equals(paths[0]);
|
| }
|
|
|
| private ResourceExtractor(Context context) {
|
| @@ -433,6 +397,6 @@ public class ResourceExtractor {
|
| * Pak extraction not necessarily required by the embedder.
|
| */
|
| private static boolean shouldSkipPakExtraction() {
|
| - return sMandatoryPaks.length == 0 && sLocalePaksResId == 0;
|
| + return sResourcesToExtract.length == 0;
|
| }
|
| }
|
|
|