diff options
author | 2024-09-10 10:30:57 +0000 | |
---|---|---|
committer | 2024-09-10 10:30:57 +0000 | |
commit | e2cc267a14a4eccd54b9fe1f7d3c8d860ac80a4f (patch) | |
tree | a26b94ce72f56f9050921e2b30f958e3b76aa2fd | |
parent | fff1d48f432741160019a9266728097f10bd2189 (diff) |
Revert "[res] Better modification time resolution in Idmap"
This reverts commit fff1d48f432741160019a9266728097f10bd2189.
Reason for revert: <Potential culprit for b/365676142 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted.>
Change-Id: I6b0a0bd67a14e4738a8cd64be2214840d02eee3f
-rw-r--r-- | libs/androidfw/AssetManager.cpp | 32 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/AssetManager.h | 22 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/Idmap.h | 5 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/misc.h | 35 | ||||
-rw-r--r-- | libs/androidfw/misc.cpp | 55 | ||||
-rw-r--r-- | libs/androidfw/tests/Idmap_test.cpp | 11 | ||||
-rw-r--r-- | tools/aapt/Package.cpp | 11 |
7 files changed, 66 insertions, 105 deletions
diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 5955915c9fcd..e6182454ad8a 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -1420,20 +1420,18 @@ void AssetManager::mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo Mutex AssetManager::SharedZip::gLock; DefaultKeyedVector<String8, wp<AssetManager::SharedZip> > AssetManager::SharedZip::gOpen; -AssetManager::SharedZip::SharedZip(const String8& path, ModDate modWhen) - : mPath(path), - mZipFile(NULL), - mModWhen(modWhen), - mResourceTableAsset(NULL), - mResourceTable(NULL) { - if (kIsDebug) { - ALOGI("Creating SharedZip %p %s\n", this, mPath.c_str()); - } - ALOGV("+++ opening zip '%s'\n", mPath.c_str()); - mZipFile = ZipFileRO::open(mPath.c_str()); - if (mZipFile == NULL) { - ALOGD("failed to open Zip archive '%s'\n", mPath.c_str()); - } +AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen) + : mPath(path), mZipFile(NULL), mModWhen(modWhen), + mResourceTableAsset(NULL), mResourceTable(NULL) +{ + if (kIsDebug) { + ALOGI("Creating SharedZip %p %s\n", this, mPath.c_str()); + } + ALOGV("+++ opening zip '%s'\n", mPath.c_str()); + mZipFile = ZipFileRO::open(mPath.c_str()); + if (mZipFile == NULL) { + ALOGD("failed to open Zip archive '%s'\n", mPath.c_str()); + } } AssetManager::SharedZip::SharedZip(int fd, const String8& path) @@ -1455,7 +1453,7 @@ sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path, bool createIfNotPresent) { AutoMutex _l(gLock); - auto modWhen = getFileModDate(path.c_str()); + time_t modWhen = getFileModDate(path.c_str()); sp<SharedZip> zip = gOpen.valueFor(path).promote(); if (zip != NULL && zip->mModWhen == modWhen) { return zip; @@ -1522,8 +1520,8 @@ ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res) bool AssetManager::SharedZip::isUpToDate() { - auto modWhen = getFileModDate(mPath.c_str()); - return mModWhen == modWhen; + time_t modWhen = getFileModDate(mPath.c_str()); + return mModWhen == modWhen; } void AssetManager::SharedZip::addOverlay(const asset_path& ap) diff --git a/libs/androidfw/include/androidfw/AssetManager.h b/libs/androidfw/include/androidfw/AssetManager.h index 376c881ea376..ce0985b38986 100644 --- a/libs/androidfw/include/androidfw/AssetManager.h +++ b/libs/androidfw/include/androidfw/AssetManager.h @@ -280,21 +280,21 @@ private: ~SharedZip(); private: - SharedZip(const String8& path, ModDate modWhen); - SharedZip(int fd, const String8& path); - SharedZip(); // <-- not implemented + SharedZip(const String8& path, time_t modWhen); + SharedZip(int fd, const String8& path); + SharedZip(); // <-- not implemented - String8 mPath; - ZipFileRO* mZipFile; - ModDate mModWhen; + String8 mPath; + ZipFileRO* mZipFile; + time_t mModWhen; - Asset* mResourceTableAsset; - ResTable* mResourceTable; + Asset* mResourceTableAsset; + ResTable* mResourceTable; - Vector<asset_path> mOverlays; + Vector<asset_path> mOverlays; - static Mutex gLock; - static DefaultKeyedVector<String8, wp<SharedZip> > gOpen; + static Mutex gLock; + static DefaultKeyedVector<String8, wp<SharedZip> > gOpen; }; /* diff --git a/libs/androidfw/include/androidfw/Idmap.h b/libs/androidfw/include/androidfw/Idmap.h index 98f1aa86f2db..64b1f0c6ed03 100644 --- a/libs/androidfw/include/androidfw/Idmap.h +++ b/libs/androidfw/include/androidfw/Idmap.h @@ -25,9 +25,8 @@ #include "android-base/macros.h" #include "android-base/unique_fd.h" #include "androidfw/ConfigDescription.h" -#include "androidfw/ResourceTypes.h" #include "androidfw/StringPiece.h" -#include "androidfw/misc.h" +#include "androidfw/ResourceTypes.h" #include "utils/ByteOrder.h" namespace android { @@ -203,7 +202,7 @@ class LoadedIdmap { android::base::unique_fd idmap_fd_; std::string_view overlay_apk_path_; std::string_view target_apk_path_; - ModDate idmap_last_mod_time_; + time_t idmap_last_mod_time_; private: DISALLOW_COPY_AND_ASSIGN(LoadedIdmap); diff --git a/libs/androidfw/include/androidfw/misc.h b/libs/androidfw/include/androidfw/misc.h index 09ae40c35369..077609d20d55 100644 --- a/libs/androidfw/include/androidfw/misc.h +++ b/libs/androidfw/include/androidfw/misc.h @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#pragma once -#include <time.h> +#include <sys/types.h> // // Handy utility functions and portability code. // +#ifndef _LIBS_ANDROID_FW_MISC_H +#define _LIBS_ANDROID_FW_MISC_H namespace android { @@ -40,35 +41,15 @@ typedef enum FileType { } FileType; /* get the file's type; follows symlinks */ FileType getFileType(const char* fileName); - -// MinGW doesn't support nanosecond resolution in stat() modification time, and given -// that it only matters on the device it's ok to keep it at the second level there. -#ifdef _WIN32 -using ModDate = time_t; -inline constexpr ModDate kInvalidModDate = ModDate(-1); -inline constexpr unsigned long long kModDateResolutionNs = 1ull * 1000 * 1000 * 1000; -inline time_t toTimeT(ModDate m) { - return m; -} -#else -using ModDate = timespec; -inline constexpr ModDate kInvalidModDate = {-1, -1}; -inline constexpr unsigned long long kModDateResolutionNs = 1; -inline time_t toTimeT(ModDate m) { - return m.tv_sec; -} -#endif - -/* get the file's modification date; returns kInvalidModDate w/errno set on failure */ -ModDate getFileModDate(const char* fileName); +/* get the file's modification date; returns -1 w/errno set on failure */ +time_t getFileModDate(const char* fileName); /* same, but also returns -1 if the file has already been deleted */ -ModDate getFileModDate(int fd); +time_t getFileModDate(int fd); // Check if |path| or |fd| resides on a readonly filesystem. bool isReadonlyFilesystem(const char* path); bool isReadonlyFilesystem(int fd); -} // namespace android +}; // namespace android -// Whoever uses getFileModDate() will need this as well -bool operator==(const timespec& l, const timespec& r); +#endif // _LIBS_ANDROID_FW_MISC_H diff --git a/libs/androidfw/misc.cpp b/libs/androidfw/misc.cpp index 9bdaf18a116a..93dcaf549a90 100644 --- a/libs/androidfw/misc.cpp +++ b/libs/androidfw/misc.cpp @@ -28,13 +28,11 @@ #include <sys/vfs.h> #endif // __linux__ +#include <cstring> +#include <cstdio> #include <errno.h> #include <sys/stat.h> -#include <cstdio> -#include <cstring> -#include <tuple> - namespace android { /* @@ -75,32 +73,27 @@ FileType getFileType(const char* fileName) } } -static ModDate getModDate(const struct stat& st) { -#ifdef _WIN32 - return st.st_mtime; -#else - return st.st_mtim; -#endif -} - -ModDate getFileModDate(const char* fileName) { - struct stat sb; - if (stat(fileName, &sb) < 0) { - return kInvalidModDate; - } - return getModDate(sb); +/* + * Get a file's modification date. + */ +time_t getFileModDate(const char* fileName) { + struct stat sb; + if (stat(fileName, &sb) < 0) { + return (time_t)-1; + } + return sb.st_mtime; } -ModDate getFileModDate(int fd) { - struct stat sb; - if (fstat(fd, &sb) < 0) { - return kInvalidModDate; - } - if (sb.st_nlink <= 0) { - errno = ENOENT; - return kInvalidModDate; - } - return getModDate(sb); +time_t getFileModDate(int fd) { + struct stat sb; + if (fstat(fd, &sb) < 0) { + return (time_t)-1; + } + if (sb.st_nlink <= 0) { + errno = ENOENT; + return (time_t)-1; + } + return sb.st_mtime; } #ifndef __linux__ @@ -131,8 +124,4 @@ bool isReadonlyFilesystem(int fd) { } #endif // __linux__ -} // namespace android - -bool operator==(const timespec& l, const timespec& r) { - return std::tie(l.tv_sec, l.tv_nsec) == std::tie(r.tv_sec, l.tv_nsec); -} +}; // namespace android diff --git a/libs/androidfw/tests/Idmap_test.cpp b/libs/androidfw/tests/Idmap_test.cpp index cb2e56f5f5e4..60aa7d88925d 100644 --- a/libs/androidfw/tests/Idmap_test.cpp +++ b/libs/androidfw/tests/Idmap_test.cpp @@ -14,9 +14,6 @@ * limitations under the License. */ -#include <chrono> -#include <thread> - #include "android-base/file.h" #include "androidfw/ApkAssets.h" #include "androidfw/AssetManager2.h" @@ -30,7 +27,6 @@ #include "data/overlayable/R.h" #include "data/system/R.h" -using namespace std::chrono_literals; using ::testing::NotNull; namespace overlay = com::android::overlay; @@ -222,13 +218,10 @@ TEST_F(IdmapTest, OverlayAssetsIsUpToDate) { unlink(temp_file.path); ASSERT_FALSE(apk_assets->IsUpToDate()); - - const auto sleep_duration = - std::chrono::nanoseconds(std::max(kModDateResolutionNs, 1'000'000ull)); - std::this_thread::sleep_for(sleep_duration); + sleep(2); base::WriteStringToFile("hello", temp_file.path); - std::this_thread::sleep_for(sleep_duration); + sleep(2); ASSERT_FALSE(apk_assets->IsUpToDate()); } diff --git a/tools/aapt/Package.cpp b/tools/aapt/Package.cpp index 60c4bf5c4131..5e0f87f0dcaf 100644 --- a/tools/aapt/Package.cpp +++ b/tools/aapt/Package.cpp @@ -292,12 +292,13 @@ bool processFile(Bundle* bundle, ZipFile* zip, } if (!hasData) { const String8& srcName = file->getSourceFile(); - auto fileModWhen = getFileModDate(srcName.c_str()); - if (fileModWhen == kInvalidModDate) { // file existence tested earlier, - return false; // not expecting an error here + time_t fileModWhen; + fileModWhen = getFileModDate(srcName.c_str()); + if (fileModWhen == (time_t) -1) { // file existence tested earlier, + return false; // not expecting an error here } - - if (toTimeT(fileModWhen) > entry->getModWhen()) { + + if (fileModWhen > entry->getModWhen()) { // mark as deleted so add() will succeed if (bundle->getVerbose()) { printf(" (removing old '%s')\n", storageName.c_str()); |