Merge change 4828 into donut

* changes:
  Report densities in badging, debugging for nine patch bug.
This commit is contained in:
Android (Google) Code Review
2009-06-19 15:37:03 -07:00
5 changed files with 117 additions and 9 deletions

View File

@ -1781,7 +1781,7 @@ public:
void getLocales(Vector<String8>* locales) const;
#ifndef HAVE_ANDROID_OS
void print() const;
void print(bool inclValues) const;
#endif
private:

View File

@ -3830,9 +3830,45 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
#define CHAR16_ARRAY_EQ(constant, var, len) \
((len == (sizeof(constant)/sizeof(constant[0]))) && (0 == memcmp((var), (constant), (len))))
void ResTable::print() const
void print_complex(uint32_t complex, bool isFraction)
{
printf("mError=0x%x (%s)\n", mError, strerror(mError));
const float MANTISSA_MULT =
1.0f / (1<<Res_value::COMPLEX_MANTISSA_SHIFT);
const float RADIX_MULTS[] = {
1.0f*MANTISSA_MULT, 1.0f/(1<<7)*MANTISSA_MULT,
1.0f/(1<<15)*MANTISSA_MULT, 1.0f/(1<<23)*MANTISSA_MULT
};
float value = (complex&(Res_value::COMPLEX_MANTISSA_MASK
<<Res_value::COMPLEX_MANTISSA_SHIFT))
* RADIX_MULTS[(complex>>Res_value::COMPLEX_RADIX_SHIFT)
& Res_value::COMPLEX_RADIX_MASK];
printf("%f", value);
if (isFraction) {
switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) {
case Res_value::COMPLEX_UNIT_PX: printf("px"); break;
case Res_value::COMPLEX_UNIT_DIP: printf("dp"); break;
case Res_value::COMPLEX_UNIT_SP: printf("sp"); break;
case Res_value::COMPLEX_UNIT_PT: printf("pt"); break;
case Res_value::COMPLEX_UNIT_IN: printf("in"); break;
case Res_value::COMPLEX_UNIT_MM: printf("mm"); break;
default: printf(" (unknown unit)"); break;
}
} else {
switch ((complex>>Res_value::COMPLEX_UNIT_SHIFT)&Res_value::COMPLEX_UNIT_MASK) {
case Res_value::COMPLEX_UNIT_FRACTION: printf("%%"); break;
case Res_value::COMPLEX_UNIT_FRACTION_PARENT: printf("%%p"); break;
default: printf(" (unknown unit)"); break;
}
}
}
void ResTable::print(bool inclValues) const
{
if (mError != 0) {
printf("mError=0x%x (%s)\n", mError, strerror(mError));
}
#if 0
printf("mParams=%c%c-%c%c,\n",
mParams.language[0], mParams.language[1],
@ -3947,6 +3983,8 @@ void ResTable::print() const
(void*)(entriesStart + thisOffset));
continue;
}
const Res_value* value = NULL;
if ((dtohs(ent->flags)&ResTable_entry::FLAG_COMPLEX) != 0) {
printf("<bag>");
} else {
@ -3962,7 +4000,7 @@ void ResTable::print() const
continue;
}
const Res_value* value = (const Res_value*)
value = (const Res_value*)
(((const uint8_t*)ent) + esize);
printf("t=0x%02x d=0x%08x (s=0x%04x r=0x%02x)",
(int)value->dataType, (int)dtohl(value->data),
@ -3973,6 +4011,49 @@ void ResTable::print() const
printf(" (PUBLIC)");
}
printf("\n");
if (inclValues) {
if (value != NULL) {
printf(" ");
if (value->dataType == Res_value::TYPE_NULL) {
printf("(null)\n");
} else if (value->dataType == Res_value::TYPE_REFERENCE) {
printf("(reference) 0x%08x\n", value->data);
} else if (value->dataType == Res_value::TYPE_ATTRIBUTE) {
printf("(attribute) 0x%08x\n", value->data);
} else if (value->dataType == Res_value::TYPE_STRING) {
size_t len;
const char16_t* str = pkg->header->values.stringAt(
value->data, &len);
if (str == NULL) {
printf("(string) null\n");
} else {
printf("(string) \"%s\"\n",
String8(str, len).string());
}
} else if (value->dataType == Res_value::TYPE_FLOAT) {
printf("(float) %g\n", *(const float*)&value->data);
} else if (value->dataType == Res_value::TYPE_DIMENSION) {
printf("(dimension) ");
print_complex(value->data, false);
printf("\n");
} else if (value->dataType == Res_value::TYPE_FRACTION) {
printf("(fraction) ");
print_complex(value->data, true);
printf("\n");
} else if (value->dataType >= Res_value::TYPE_FIRST_COLOR_INT
|| value->dataType <= Res_value::TYPE_LAST_COLOR_INT) {
printf("(color) #%08x\n", value->data);
} else if (value->dataType == Res_value::TYPE_INT_BOOLEAN) {
printf("(boolean) %s\n", value->data ? "true" : "false");
} else if (value->dataType >= Res_value::TYPE_FIRST_INT
|| value->dataType <= Res_value::TYPE_LAST_INT) {
printf("(int) 0x%08x or %d\n", value->data, value->data);
} else {
printf("(unknown type)\n");
}
}
}
}
}
}

View File

@ -34,6 +34,7 @@ public:
mForce(false), mGrayscaleTolerance(0), mMakePackageDirs(false),
mUpdate(false), mExtending(false),
mRequireLocalization(false), mPseudolocalize(false),
mValues(false),
mCompressionMethod(0), mOutputAPKFile(NULL),
mAssetSourceDir(NULL),
mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
@ -72,6 +73,8 @@ public:
void setRequireLocalization(bool val) { mRequireLocalization = val; }
bool getPseudolocalize(void) const { return mPseudolocalize; }
void setPseudolocalize(bool val) { mPseudolocalize = val; }
bool getValues(void) const { return mValues; }
void setValues(bool val) { mValues = val; }
int getCompressionMethod(void) const { return mCompressionMethod; }
void setCompressionMethod(int val) { mCompressionMethod = val; }
const char* getOutputAPKFile() const { return mOutputAPKFile; }
@ -151,6 +154,7 @@ private:
bool mExtending;
bool mRequireLocalization;
bool mPseudolocalize;
bool mValues;
int mCompressionMethod;
const char* mOutputAPKFile;
const char* mAssetSourceDir;

View File

@ -196,7 +196,7 @@ int doList(Bundle* bundle)
printf("\nNo resource table found.\n");
} else {
printf("\nResource table:\n");
res.print();
res.print(false);
}
Asset* manifestAsset = assets.openNonAsset("AndroidManifest.xml",
@ -380,7 +380,7 @@ int doDump(Bundle* bundle)
}
if (strcmp("resources", option) == 0) {
res.print();
res.print(bundle->getValues());
} else if (strcmp("xmltree", option) == 0) {
if (bundle->getFileSpecCount() < 3) {
@ -732,11 +732,12 @@ int doDump(Bundle* bundle)
activityIcon.string());
}
}
printf("locales:");
Vector<String8> locales;
res.getLocales(&locales);
const size_t N = locales.size();
for (size_t i=0; i<N; i++) {
const size_t NL = locales.size();
for (size_t i=0; i<NL; i++) {
const char* localeStr = locales[i].string();
if (localeStr == NULL || strlen(localeStr) == 0) {
localeStr = "--_--";
@ -744,6 +745,24 @@ int doDump(Bundle* bundle)
printf(" '%s'", localeStr);
}
printf("\n");
Vector<ResTable_config> configs;
res.getConfigurations(&configs);
SortedVector<int> densities;
const size_t NC = configs.size();
for (size_t i=0; i<NC; i++) {
int dens = configs[i].density;
if (dens == 0) dens = 160;
densities.add(dens);
}
printf("densities:");
const size_t ND = densities.size();
for (size_t i=0; i<ND; i++) {
printf(" '%d'", densities[i]);
}
printf("\n");
AssetDir* dir = assets.openNonAssetDir(assetsCookie, "lib");
if (dir != NULL) {
if (dir->getFileCount() > 0) {

View File

@ -45,7 +45,7 @@ void usage(void)
" %s l[ist] [-v] [-a] file.{zip,jar,apk}\n"
" List contents of Zip-compatible archive.\n\n", gProgName);
fprintf(stderr,
" %s d[ump] WHAT file.{apk} [asset [asset ...]]\n"
" %s d[ump] [--values] WHAT file.{apk} [asset [asset ...]]\n"
" badging Print the label and icon for the app declared in APK.\n"
" permissions Print the permissions from the APK.\n"
" resources Print the resource table from the APK.\n"
@ -123,6 +123,8 @@ void usage(void)
" inserts android:targetSdkVersion in to manifest.\n"
" --max-sdk-version\n"
" inserts android:maxSdkVersion in to manifest.\n"
" --values\n"
" when used with \"dump resources\" also includes resource values.\n"
" --version-code\n"
" inserts android:versionCode in to manifest.\n"
" --version-name\n"
@ -396,6 +398,8 @@ int main(int argc, char* const argv[])
goto bail;
}
bundle.setVersionName(argv[0]);
} else if (strcmp(cp, "-values") == 0) {
bundle.setValues(true);
} else {
fprintf(stderr, "ERROR: Unknown option '-%s'\n", cp);
wantUsage = true;