summaryrefslogtreecommitdiff
path: root/libs/androidfw/ApkAssets.cpp
diff options
context:
space:
mode:
authorWinson <chiuwinson@google.com>2019-02-19 12:48:22 -0800
committerWinson <chiuwinson@google.com>2019-03-29 12:18:18 -0700
commitb0085ce5b63bc5d2d86eaf84ed20d8a4a7b532a7 (patch)
treef1bbbf4d117e587e821c0ee665b0882ac35fc333 /libs/androidfw/ApkAssets.cpp
parent83708c825868b4c26c6c599b5614205ea5118d3c (diff)
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
Diffstat (limited to 'libs/androidfw/ApkAssets.cpp')
-rw-r--r--libs/androidfw/ApkAssets.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/libs/androidfw/ApkAssets.cpp b/libs/androidfw/ApkAssets.cpp
index 66a547723b2f..7b7599ff74ec 100644
--- a/libs/androidfw/ApkAssets.cpp
+++ b/libs/androidfw/ApkAssets.cpp
@@ -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