Fix AssetManager2 isUpToDate check
This logic was lost in the AssetManager1 -> 2 migration. The old AM1 checked the last modification time of the file and compared it to a previously stored value. This re-adds the logic to ApkAssets and fixes the checks in the JNI/Java layer. Unfortunately I couldn't find a failing/practical case where this check mattered. It only came up when diagnosing an issue which ended up being unrelated. Test: manually ran with other overlay changes Change-Id: I758e4af1d32a9c03b2204a8a3a26e82b7e83feda
This commit is contained in:
@@ -1263,12 +1263,19 @@ public final class AssetManager implements AutoCloseable {
|
||||
*/
|
||||
@UnsupportedAppUsage
|
||||
public boolean isUpToDate() {
|
||||
for (ApkAssets apkAssets : getApkAssets()) {
|
||||
if (!apkAssets.isUpToDate()) {
|
||||
synchronized (this) {
|
||||
if (!mOpen) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (ApkAssets apkAssets : mApkAssets) {
|
||||
if (!apkAssets.isUpToDate()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -106,8 +106,7 @@ static jlong NativeGetStringBlock(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr)
|
||||
|
||||
static jboolean NativeIsUpToDate(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
|
||||
const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
|
||||
(void)apk_assets;
|
||||
return JNI_TRUE;
|
||||
return apk_assets->IsUpToDate() ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring file_name) {
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "androidfw/Asset.h"
|
||||
#include "androidfw/Idmap.h"
|
||||
#include "androidfw/misc.h"
|
||||
#include "androidfw/ResourceTypes.h"
|
||||
#include "androidfw/Util.h"
|
||||
|
||||
@@ -39,8 +40,10 @@ using base::unique_fd;
|
||||
|
||||
static const std::string kResourcesArsc("resources.arsc");
|
||||
|
||||
ApkAssets::ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path)
|
||||
: zip_handle_(unmanaged_handle, ::CloseArchive), path_(path) {
|
||||
ApkAssets::ApkAssets(ZipArchiveHandle unmanaged_handle,
|
||||
const std::string& path,
|
||||
time_t last_mod_time)
|
||||
: zip_handle_(unmanaged_handle, ::CloseArchive), path_(path), last_mod_time_(last_mod_time) {
|
||||
}
|
||||
|
||||
std::unique_ptr<const ApkAssets> ApkAssets::Load(const std::string& path, bool system) {
|
||||
@@ -116,8 +119,10 @@ std::unique_ptr<const ApkAssets> ApkAssets::LoadImpl(
|
||||
return {};
|
||||
}
|
||||
|
||||
time_t last_mod_time = getFileModDate(path.c_str());
|
||||
|
||||
// Wrap the handle in a unique_ptr so it gets automatically closed.
|
||||
std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(unmanaged_handle, path));
|
||||
std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(unmanaged_handle, path, last_mod_time));
|
||||
|
||||
// Find the resource table.
|
||||
::ZipString entry_name(kResourcesArsc.c_str());
|
||||
@@ -248,4 +253,8 @@ bool ApkAssets::ForEachFile(const std::string& root_path,
|
||||
return result == -1;
|
||||
}
|
||||
|
||||
bool ApkAssets::IsUpToDate() const {
|
||||
return last_mod_time_ == getFileModDate(path_.c_str());
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
@@ -84,6 +84,8 @@ class ApkAssets {
|
||||
return idmap_asset_.get() != nullptr;
|
||||
}
|
||||
|
||||
bool IsUpToDate() const;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ApkAssets);
|
||||
|
||||
@@ -95,12 +97,13 @@ class ApkAssets {
|
||||
// Creates an Asset from any file on the file system.
|
||||
static std::unique_ptr<Asset> CreateAssetFromFile(const std::string& path);
|
||||
|
||||
ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path);
|
||||
ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path, time_t last_mod_time);
|
||||
|
||||
using ZipArchivePtr = std::unique_ptr<ZipArchive, void(*)(ZipArchiveHandle)>;
|
||||
|
||||
ZipArchivePtr zip_handle_;
|
||||
const std::string path_;
|
||||
time_t last_mod_time_;
|
||||
std::unique_ptr<Asset> resources_asset_;
|
||||
std::unique_ptr<Asset> idmap_asset_;
|
||||
std::unique_ptr<const LoadedArsc> loaded_arsc_;
|
||||
|
||||
Reference in New Issue
Block a user