Loading include/androidfw/AssetManager.h +8 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ struct ResTable_config; */ class AssetManager : public AAssetManager { public: static const char* RESOURCES_FILENAME; typedef enum CacheMode { CACHE_UNKNOWN = 0, CACHE_OFF, // don't try to cache file locations Loading Loading @@ -218,6 +219,13 @@ public: */ void getLocales(Vector<String8>* locales) const; /** * Generate idmap data to translate resources IDs between a package and a * corresponding overlay package. */ bool createIdmap(const char* targetApkPath, const char* overlayApkPath, uint32_t targetCrc, uint32_t overlayCrc, uint32_t** outData, uint32_t* outSize); private: struct asset_path { Loading include/androidfw/ResourceTypes.h +23 −2 Original line number Diff line number Diff line Loading @@ -1545,9 +1545,19 @@ public: // Return value: on success: NO_ERROR; caller is responsible for free-ing // outData (using free(3)). On failure, any status_t value other than // NO_ERROR; the caller should not free outData. status_t createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc, status_t createIdmap(const ResTable& overlay, uint32_t targetCrc, uint32_t overlayCrc, void** outData, size_t* outSize) const; status_t createIdmap(const ResTable& overlay, uint32_t targetCrc, uint32_t overlayCrc, const char* targetPath, const char* overlayPath, void** outData, uint32_t* outSize) const { (void)targetPath; (void)overlayPath; return createIdmap(overlay, targetCrc, overlayCrc, outData, outSize); } enum { IDMAP_HEADER_SIZE_BYTES = 3 * sizeof(uint32_t), }; Loading @@ -1556,7 +1566,18 @@ public: // This function only requires the idmap header (the first // IDMAP_HEADER_SIZE_BYTES) bytes of an idmap file. static bool getIdmapInfo(const void* idmap, size_t size, uint32_t* pOriginalCrc, uint32_t* pOverlayCrc); uint32_t* pTargetCrc, uint32_t* pOverlayCrc); static bool getIdmapInfo(const void* idmap, size_t size, uint32_t* pTargetCrc, uint32_t* pOverlayCrc, String8* pTargetPath, String8* pOverlayPath) { if (*pTargetPath) *pTargetPath = String8(); if (*pOverlayPath) *pOverlayPath = String8(); return getIdmapInfo(idmap, size, pTargetCrc, pOverlayCrc); } void print(bool inclValues) const; static String8 normalizeForOutput(const char* input); Loading libs/androidfw/AssetManager.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ static Asset* const kExcludedAsset = (Asset*) 0xd000000d; static volatile int32_t gCount = 0; const char* AssetManager::RESOURCES_FILENAME = "resources.arsc"; namespace { // Transform string /a/b/c.apk to /data/resource-cache/a@b@c.apk@idmap String8 idmapPathForPackagePath(const String8& pkgPath) Loading Loading @@ -239,6 +241,29 @@ bool AssetManager::addAssetPath(const String8& path, int32_t* cookie) return true; } bool AssetManager::createIdmap(const char* targetApkPath, const char* overlayApkPath, uint32_t targetCrc, uint32_t overlayCrc, uint32_t** outData, uint32_t* outSize) { AutoMutex _l(mLock); const String8 paths[2] = { String8(targetApkPath), String8(overlayApkPath) }; ResTable tables[2]; for (int i = 0; i < 2; ++i) { asset_path ap; ap.type = kFileTypeRegular; ap.path = paths[i]; Asset* ass = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap); if (ass == NULL) { ALOGW("failed to find resources.arsc in %s\n", ap.path.string()); return false; } tables[i].add(ass, (void*)1, false); } return tables[0].createIdmap(tables[1], targetCrc, overlayCrc, targetApkPath, overlayApkPath, (void**)outData, outSize) == NO_ERROR; } bool AssetManager::isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath, const String8& idmapPath) { Loading libs/androidfw/ResourceTypes.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -5368,7 +5368,7 @@ status_t ResTable::createIdmap(const ResTable& overlay, uint32_t originalCrc, ui | (0x00ff0000 & ((typeIndex+1)<<16)) | (0x0000ffff & (entryIndex)); resource_name resName; if (!this->getResourceName(resID, true, &resName)) { if (!this->getResourceName(resID, false, &resName)) { ALOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID); // add dummy value, or trimming leading/trailing zeroes later will fail vector.push(0); Loading Loading
include/androidfw/AssetManager.h +8 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ struct ResTable_config; */ class AssetManager : public AAssetManager { public: static const char* RESOURCES_FILENAME; typedef enum CacheMode { CACHE_UNKNOWN = 0, CACHE_OFF, // don't try to cache file locations Loading Loading @@ -218,6 +219,13 @@ public: */ void getLocales(Vector<String8>* locales) const; /** * Generate idmap data to translate resources IDs between a package and a * corresponding overlay package. */ bool createIdmap(const char* targetApkPath, const char* overlayApkPath, uint32_t targetCrc, uint32_t overlayCrc, uint32_t** outData, uint32_t* outSize); private: struct asset_path { Loading
include/androidfw/ResourceTypes.h +23 −2 Original line number Diff line number Diff line Loading @@ -1545,9 +1545,19 @@ public: // Return value: on success: NO_ERROR; caller is responsible for free-ing // outData (using free(3)). On failure, any status_t value other than // NO_ERROR; the caller should not free outData. status_t createIdmap(const ResTable& overlay, uint32_t originalCrc, uint32_t overlayCrc, status_t createIdmap(const ResTable& overlay, uint32_t targetCrc, uint32_t overlayCrc, void** outData, size_t* outSize) const; status_t createIdmap(const ResTable& overlay, uint32_t targetCrc, uint32_t overlayCrc, const char* targetPath, const char* overlayPath, void** outData, uint32_t* outSize) const { (void)targetPath; (void)overlayPath; return createIdmap(overlay, targetCrc, overlayCrc, outData, outSize); } enum { IDMAP_HEADER_SIZE_BYTES = 3 * sizeof(uint32_t), }; Loading @@ -1556,7 +1566,18 @@ public: // This function only requires the idmap header (the first // IDMAP_HEADER_SIZE_BYTES) bytes of an idmap file. static bool getIdmapInfo(const void* idmap, size_t size, uint32_t* pOriginalCrc, uint32_t* pOverlayCrc); uint32_t* pTargetCrc, uint32_t* pOverlayCrc); static bool getIdmapInfo(const void* idmap, size_t size, uint32_t* pTargetCrc, uint32_t* pOverlayCrc, String8* pTargetPath, String8* pOverlayPath) { if (*pTargetPath) *pTargetPath = String8(); if (*pOverlayPath) *pOverlayPath = String8(); return getIdmapInfo(idmap, size, pTargetCrc, pOverlayCrc); } void print(bool inclValues) const; static String8 normalizeForOutput(const char* input); Loading
libs/androidfw/AssetManager.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,8 @@ static Asset* const kExcludedAsset = (Asset*) 0xd000000d; static volatile int32_t gCount = 0; const char* AssetManager::RESOURCES_FILENAME = "resources.arsc"; namespace { // Transform string /a/b/c.apk to /data/resource-cache/a@b@c.apk@idmap String8 idmapPathForPackagePath(const String8& pkgPath) Loading Loading @@ -239,6 +241,29 @@ bool AssetManager::addAssetPath(const String8& path, int32_t* cookie) return true; } bool AssetManager::createIdmap(const char* targetApkPath, const char* overlayApkPath, uint32_t targetCrc, uint32_t overlayCrc, uint32_t** outData, uint32_t* outSize) { AutoMutex _l(mLock); const String8 paths[2] = { String8(targetApkPath), String8(overlayApkPath) }; ResTable tables[2]; for (int i = 0; i < 2; ++i) { asset_path ap; ap.type = kFileTypeRegular; ap.path = paths[i]; Asset* ass = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap); if (ass == NULL) { ALOGW("failed to find resources.arsc in %s\n", ap.path.string()); return false; } tables[i].add(ass, (void*)1, false); } return tables[0].createIdmap(tables[1], targetCrc, overlayCrc, targetApkPath, overlayApkPath, (void**)outData, outSize) == NO_ERROR; } bool AssetManager::isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath, const String8& idmapPath) { Loading
libs/androidfw/ResourceTypes.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -5368,7 +5368,7 @@ status_t ResTable::createIdmap(const ResTable& overlay, uint32_t originalCrc, ui | (0x00ff0000 & ((typeIndex+1)<<16)) | (0x0000ffff & (entryIndex)); resource_name resName; if (!this->getResourceName(resID, true, &resName)) { if (!this->getResourceName(resID, false, &resName)) { ALOGW("idmap: resource 0x%08x has spec but lacks values, skipping\n", resID); // add dummy value, or trimming leading/trailing zeroes later will fail vector.push(0); Loading