Skip to content

Commit

Permalink
New command line tool 'idmap'
Browse files Browse the repository at this point in the history
Introduce a new tool 'idmap' to handle generation and verification of
idmap files. The tool is modelled on 'dexopt', and is intended to be
used similarly, notably by 'installd'.
See cmds/idmap/idmap.cpp for further documentation on 'idmap'.

Note: this commit is interdependent on a commit in project build/ to add
'idmap' to PRODUCT_PACKAGES.

Note: the changes to androidfw are only stubs. The actual implementation
will be provided in Runtime resource overlay, iteration 2.

Change-Id: I7131b74ece1e46c8a9c0a31d103e686aa07da2bb
  • Loading branch information
amhk authored and yghazikantelinen committed May 10, 2014
1 parent f7d605d commit e38348c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 3 deletions.
8 changes: 8 additions & 0 deletions include/androidfw/AssetManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -218,6 +219,13 @@ class AssetManager : public AAssetManager {
*/
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
{
Expand Down
25 changes: 23 additions & 2 deletions include/androidfw/ResourceTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1546,9 +1546,19 @@ class ResTable
// 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),
};
Expand All @@ -1557,7 +1567,18 @@ class ResTable
// 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);
Expand Down
25 changes: 25 additions & 0 deletions libs/androidfw/AssetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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@[email protected]@idmap
String8 idmapPathForPackagePath(const String8& pkgPath)
Expand Down Expand Up @@ -239,6 +241,29 @@ bool AssetManager::addAssetPath(const String8& path, void** 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)
{
Expand Down
2 changes: 1 addition & 1 deletion libs/androidfw/ResourceTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit e38348c

Please sign in to comment.