Loading libs/androidfw/AssetManager.cpp +17 −15 Original line number Diff line number Diff line Loading @@ -1420,10 +1420,12 @@ 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, time_t modWhen) : mPath(path), mZipFile(NULL), mModWhen(modWhen), mResourceTableAsset(NULL), mResourceTable(NULL) { 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()); } Loading Loading @@ -1453,7 +1455,7 @@ sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path, bool createIfNotPresent) { AutoMutex _l(gLock); time_t modWhen = getFileModDate(path.c_str()); auto modWhen = getFileModDate(path.c_str()); sp<SharedZip> zip = gOpen.valueFor(path).promote(); if (zip != NULL && zip->mModWhen == modWhen) { return zip; Loading Loading @@ -1520,7 +1522,7 @@ ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res) bool AssetManager::SharedZip::isUpToDate() { time_t modWhen = getFileModDate(mPath.c_str()); auto modWhen = getFileModDate(mPath.c_str()); return mModWhen == modWhen; } Loading libs/androidfw/include/androidfw/AssetManager.h +11 −11 Original line number Diff line number Diff line Loading @@ -280,13 +280,13 @@ private: ~SharedZip(); private: SharedZip(const String8& path, time_t modWhen); SharedZip(const String8& path, ModDate modWhen); SharedZip(int fd, const String8& path); SharedZip(); // <-- not implemented String8 mPath; ZipFileRO* mZipFile; time_t mModWhen; ModDate mModWhen; Asset* mResourceTableAsset; ResTable* mResourceTable; Loading libs/androidfw/include/androidfw/Idmap.h +3 −2 Original line number Diff line number Diff line Loading @@ -25,8 +25,9 @@ #include "android-base/macros.h" #include "android-base/unique_fd.h" #include "androidfw/ConfigDescription.h" #include "androidfw/StringPiece.h" #include "androidfw/ResourceTypes.h" #include "androidfw/StringPiece.h" #include "androidfw/misc.h" #include "utils/ByteOrder.h" namespace android { Loading Loading @@ -213,7 +214,7 @@ class LoadedIdmap { android::base::unique_fd idmap_fd_; std::string_view overlay_apk_path_; std::string_view target_apk_path_; time_t idmap_last_mod_time_; ModDate idmap_last_mod_time_; private: DISALLOW_COPY_AND_ASSIGN(LoadedIdmap); Loading libs/androidfw/include/androidfw/misc.h +27 −8 Original line number Diff line number Diff line Loading @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <sys/types.h> #include <time.h> // // Handy utility functions and portability code. // #ifndef _LIBS_ANDROID_FW_MISC_H #define _LIBS_ANDROID_FW_MISC_H namespace android { Loading @@ -41,15 +40,35 @@ typedef enum FileType { } FileType; /* get the file's type; follows symlinks */ FileType getFileType(const char* fileName); /* get the file's modification date; returns -1 w/errno set on failure */ time_t getFileModDate(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 a seconds 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); /* same, but also returns -1 if the file has already been deleted */ time_t getFileModDate(int fd); ModDate 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 #endif // _LIBS_ANDROID_FW_MISC_H // Whoever uses getFileModDate() will need this as well bool operator==(const timespec& l, const timespec& r); libs/androidfw/misc.cpp +35 −22 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ #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 { /* Loading Loading @@ -73,27 +75,34 @@ FileType getFileType(const char* fileName) } } /* * Get a file's modification date. */ time_t getFileModDate(const char* fileName) { static ModDate getModDate(const struct stat& st) { #ifdef _WIN32 return st.st_mtime; #elif defined(__APPLE__) return st.st_mtimespec; #else return st.st_mtim; #endif } ModDate getFileModDate(const char* fileName) { struct stat sb; if (stat(fileName, &sb) < 0) { return (time_t)-1; return kInvalidModDate; } return sb.st_mtime; return getModDate(sb); } time_t getFileModDate(int fd) { ModDate getFileModDate(int fd) { struct stat sb; if (fstat(fd, &sb) < 0) { return (time_t)-1; return kInvalidModDate; } if (sb.st_nlink <= 0) { errno = ENOENT; return (time_t)-1; return kInvalidModDate; } return sb.st_mtime; return getModDate(sb); } #ifndef __linux__ Loading Loading @@ -124,4 +133,8 @@ bool isReadonlyFilesystem(int fd) { } #endif // __linux__ }; // namespace android } // 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); } Loading
libs/androidfw/AssetManager.cpp +17 −15 Original line number Diff line number Diff line Loading @@ -1420,10 +1420,12 @@ 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, time_t modWhen) : mPath(path), mZipFile(NULL), mModWhen(modWhen), mResourceTableAsset(NULL), mResourceTable(NULL) { 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()); } Loading Loading @@ -1453,7 +1455,7 @@ sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path, bool createIfNotPresent) { AutoMutex _l(gLock); time_t modWhen = getFileModDate(path.c_str()); auto modWhen = getFileModDate(path.c_str()); sp<SharedZip> zip = gOpen.valueFor(path).promote(); if (zip != NULL && zip->mModWhen == modWhen) { return zip; Loading Loading @@ -1520,7 +1522,7 @@ ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res) bool AssetManager::SharedZip::isUpToDate() { time_t modWhen = getFileModDate(mPath.c_str()); auto modWhen = getFileModDate(mPath.c_str()); return mModWhen == modWhen; } Loading
libs/androidfw/include/androidfw/AssetManager.h +11 −11 Original line number Diff line number Diff line Loading @@ -280,13 +280,13 @@ private: ~SharedZip(); private: SharedZip(const String8& path, time_t modWhen); SharedZip(const String8& path, ModDate modWhen); SharedZip(int fd, const String8& path); SharedZip(); // <-- not implemented String8 mPath; ZipFileRO* mZipFile; time_t mModWhen; ModDate mModWhen; Asset* mResourceTableAsset; ResTable* mResourceTable; Loading
libs/androidfw/include/androidfw/Idmap.h +3 −2 Original line number Diff line number Diff line Loading @@ -25,8 +25,9 @@ #include "android-base/macros.h" #include "android-base/unique_fd.h" #include "androidfw/ConfigDescription.h" #include "androidfw/StringPiece.h" #include "androidfw/ResourceTypes.h" #include "androidfw/StringPiece.h" #include "androidfw/misc.h" #include "utils/ByteOrder.h" namespace android { Loading Loading @@ -213,7 +214,7 @@ class LoadedIdmap { android::base::unique_fd idmap_fd_; std::string_view overlay_apk_path_; std::string_view target_apk_path_; time_t idmap_last_mod_time_; ModDate idmap_last_mod_time_; private: DISALLOW_COPY_AND_ASSIGN(LoadedIdmap); Loading
libs/androidfw/include/androidfw/misc.h +27 −8 Original line number Diff line number Diff line Loading @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <sys/types.h> #include <time.h> // // Handy utility functions and portability code. // #ifndef _LIBS_ANDROID_FW_MISC_H #define _LIBS_ANDROID_FW_MISC_H namespace android { Loading @@ -41,15 +40,35 @@ typedef enum FileType { } FileType; /* get the file's type; follows symlinks */ FileType getFileType(const char* fileName); /* get the file's modification date; returns -1 w/errno set on failure */ time_t getFileModDate(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 a seconds 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); /* same, but also returns -1 if the file has already been deleted */ time_t getFileModDate(int fd); ModDate 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 #endif // _LIBS_ANDROID_FW_MISC_H // Whoever uses getFileModDate() will need this as well bool operator==(const timespec& l, const timespec& r);
libs/androidfw/misc.cpp +35 −22 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ #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 { /* Loading Loading @@ -73,27 +75,34 @@ FileType getFileType(const char* fileName) } } /* * Get a file's modification date. */ time_t getFileModDate(const char* fileName) { static ModDate getModDate(const struct stat& st) { #ifdef _WIN32 return st.st_mtime; #elif defined(__APPLE__) return st.st_mtimespec; #else return st.st_mtim; #endif } ModDate getFileModDate(const char* fileName) { struct stat sb; if (stat(fileName, &sb) < 0) { return (time_t)-1; return kInvalidModDate; } return sb.st_mtime; return getModDate(sb); } time_t getFileModDate(int fd) { ModDate getFileModDate(int fd) { struct stat sb; if (fstat(fd, &sb) < 0) { return (time_t)-1; return kInvalidModDate; } if (sb.st_nlink <= 0) { errno = ENOENT; return (time_t)-1; return kInvalidModDate; } return sb.st_mtime; return getModDate(sb); } #ifndef __linux__ Loading Loading @@ -124,4 +133,8 @@ bool isReadonlyFilesystem(int fd) { } #endif // __linux__ }; // namespace android } // 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); }