Allow OpenApkAsset() to open resource files as well as assets.
This will be necessary for when language .pak files are moved to
res/raw (for apk splits).
BUG=394502
Review URL: https://codereview.chromium.org/1156573008
Cr-Commit-Position: refs/heads/master@{#332998}
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index 4ea656ce..4e5548e 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -61,7 +61,8 @@
base::android::GetDefaultLocale(),
NULL,
ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
- std::string locale = l10n_util::GetApplicationLocale(std::string()) + ".pak";
+ std::string locale =
+ "assets/" + l10n_util::GetApplicationLocale(std::string()) + ".pak";
int pak_fd = base::android::OpenApkAsset(locale, &pak_region);
if (pak_fd != -1) {
ui::ResourceBundle::CleanupSharedInstance();
@@ -74,7 +75,8 @@
// Try to directly mmap the webviewchromium.pak from the apk. Fall back to
// load from file, using PATH_SERVICE, otherwise.
- pak_fd = base::android::OpenApkAsset("webviewchromium.pak", &pak_region);
+ pak_fd = base::android::OpenApkAsset("assets/webviewchromium.pak",
+ &pak_region);
if (pak_fd != -1) {
ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion(
base::File(pak_fd), pak_region, ui::SCALE_FACTOR_NONE);
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 60ad9f82..fa67e9f 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -106,11 +106,11 @@
// AwContentBrowserClient::GetAdditionalMappedFilesForChildProcess.
#ifdef V8_USE_EXTERNAL_STARTUP_DATA
#ifdef __LP64__
- const char kNativesFileName[] = "natives_blob_64.bin";
- const char kSnapshotFileName[] = "snapshot_blob_64.bin";
+ const char kNativesFileName[] = "assets/natives_blob_64.bin";
+ const char kSnapshotFileName[] = "assets/snapshot_blob_64.bin";
#else
- const char kNativesFileName[] = "natives_blob_32.bin";
- const char kSnapshotFileName[] = "snapshot_blob_32.bin";
+ const char kNativesFileName[] = "assets/natives_blob_32.bin";
+ const char kSnapshotFileName[] = "assets/snapshot_blob_32.bin";
#endif // __LP64__
// TODO(gsennton) we should use
// gin::IsolateHolder::kNativesFileName/kSnapshotFileName
@@ -121,7 +121,7 @@
kV8SnapshotDataDescriptor, kSnapshotFileName));
#endif
CHECK(base::android::RegisterApkAssetWithGlobalDescriptors(
- kAndroidICUDataDescriptor, base::i18n::kIcuDataFileName));
+ kAndroidICUDataDescriptor, "assets/icudtl.dat"));
return false;
}
diff --git a/android_webview/native/aw_media_url_interceptor.cc b/android_webview/native/aw_media_url_interceptor.cc
index 6923d69..a2c1cdd 100644
--- a/android_webview/native/aw_media_url_interceptor.cc
+++ b/android_webview/native/aw_media_url_interceptor.cc
@@ -21,7 +21,8 @@
if (StartsWithASCII(url, asset_file_prefix, true)) {
std::string filename(url);
- ReplaceFirstSubstringAfterOffset(&filename, 0, asset_file_prefix, "");
+ ReplaceFirstSubstringAfterOffset(
+ &filename, 0, asset_file_prefix, "assets/");
base::MemoryMappedFile::Region region =
base::MemoryMappedFile::Region::kWholeFile;
*fd = base::android::OpenApkAsset(filename, ®ion);
diff --git a/base/android/apk_assets.cc b/base/android/apk_assets.cc
index 431c75c..bcdac6d 100644
--- a/base/android/apk_assets.cc
+++ b/base/android/apk_assets.cc
@@ -18,13 +18,15 @@
return RegisterNativesImpl(env);
}
-int OpenApkAsset(const std::string& filename,
+int OpenApkAsset(const std::string& file_path,
base::MemoryMappedFile::Region* region) {
+ // The AAssetManager API of the NDK is does not expose a method for accessing
+ // raw resources :(.
JNIEnv* env = base::android::AttachCurrentThread();
- ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_openAsset(
+ ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_open(
env,
base::android::GetApplicationContext(),
- base::android::ConvertUTF8ToJavaString(env, filename).Release());
+ base::android::ConvertUTF8ToJavaString(env, file_path).Release());
std::vector<jlong> results;
base::android::JavaLongArrayToLongVector(env, jarr.obj(), &results);
CHECK_EQ(3U, results.size());
@@ -35,10 +37,10 @@
}
bool RegisterApkAssetWithGlobalDescriptors(base::GlobalDescriptors::Key key,
- const std::string& asset_filename) {
+ const std::string& file_path) {
base::MemoryMappedFile::Region region =
base::MemoryMappedFile::Region::kWholeFile;
- int asset_fd = OpenApkAsset(asset_filename, ®ion);
+ int asset_fd = OpenApkAsset(file_path, ®ion);
if (asset_fd != -1) {
base::GlobalDescriptors::GetInstance()->Set(key, asset_fd, region);
}
diff --git a/base/android/apk_assets.h b/base/android/apk_assets.h
index f5df35d..6eb5da3 100644
--- a/base/android/apk_assets.h
+++ b/base/android/apk_assets.h
@@ -20,17 +20,19 @@
// Can be used from renderer process.
// Fails if the asset is not stored uncompressed within the .apk.
// Returns: The File Descriptor of the asset, or -1 upon failure.
+// Input arguments:
+// - |file_path|: Path to file within .apk. e.g.: assets/foo.pak
// Output arguments:
// - |region|: size & offset (in bytes) within the .apk of the asset.
BASE_EXPORT int OpenApkAsset(
- const std::string& filename,
+ const std::string& file_path,
base::MemoryMappedFile::Region* region);
// Registers an uncompressed asset from within the apk with GlobalDescriptors.
// Returns: true in case of success, false otherwise.
BASE_EXPORT bool RegisterApkAssetWithGlobalDescriptors(
base::GlobalDescriptors::Key key,
- const std::string& asset_filename);
+ const std::string& file_path);
} // namespace android
} // namespace base
diff --git a/base/android/java/src/org/chromium/base/ApkAssets.java b/base/android/java/src/org/chromium/base/ApkAssets.java
index 0b7bc32..329660f 100644
--- a/base/android/java/src/org/chromium/base/ApkAssets.java
+++ b/base/android/java/src/org/chromium/base/ApkAssets.java
@@ -21,11 +21,11 @@
private static final String LOGTAG = "ApkAssets";
@CalledByNative
- public static long[] openAsset(Context context, String fileName) {
+ public static long[] open(Context context, String fileName) {
AssetFileDescriptor afd = null;
try {
AssetManager manager = context.getAssets();
- afd = manager.openFd(fileName);
+ afd = manager.openNonAssetFd(fileName);
return new long[] { afd.getParcelFileDescriptor().detachFd(),
afd.getStartOffset(),
afd.getLength() };