Implemented annotations display in dexdump.
Rationale:
Showing this in true dexdump style as a separate construct
under switch -a (rather than interpreting the data and showing
each annotation where it is used). Also added new test to
cover many more value encodings in static fields.
BUG=28981655
Change-Id: I6d7d44cbd358d9880aab78812471bdb0dc6b6ad8
diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc
index 1a2f2c2..9e06a7c 100644
--- a/dexdump/dexdump.cc
+++ b/dexdump/dexdump.cc
@@ -17,8 +17,8 @@
*
* This is a re-implementation of the original dexdump utility that was
* based on Dalvik functions in libdex into a new dexdump that is now
- * based on Art functions in libart instead. The output is identical to
- * the original for correct DEX files. Error messages may differ, however.
+ * based on Art functions in libart instead. The output is very similar to
+ * to the original for correct DEX files. Error messages may differ, however.
* Also, ODEX files are no longer supported.
*
* The dexdump tool is intended to mimic objdump. When possible, use
@@ -65,6 +65,8 @@
typedef uint16_t u2;
typedef uint32_t u4;
typedef uint64_t u8;
+typedef int8_t s1;
+typedef int16_t s2;
typedef int32_t s4;
typedef int64_t s8;
@@ -187,6 +189,13 @@
}
/*
+ * Returns string representing the boolean value.
+ */
+static const char* strBool(bool val) {
+ return val ? "true" : "false";
+}
+
+/*
* Returns a quoted string representing the boolean value.
*/
static const char* quotedBool(bool val) {
@@ -346,10 +355,197 @@
}
/*
+ * Dumps a string value with some escape characters.
+ */
+static void dumpEscapedString(const char* p) {
+ fputs("\"", gOutFile);
+ for (; *p; p++) {
+ switch (*p) {
+ case '\\':
+ fputs("\\\\", gOutFile);
+ break;
+ case '\"':
+ fputs("\\\"", gOutFile);
+ break;
+ case '\t':
+ fputs("\\t", gOutFile);
+ break;
+ case '\n':
+ fputs("\\n", gOutFile);
+ break;
+ case '\r':
+ fputs("\\r", gOutFile);
+ break;
+ default:
+ putc(*p, gOutFile);
+ } // switch
+ } // for
+ fputs("\"", gOutFile);
+}
+
+/*
+ * Dumps a string as an XML attribute value.
+ */
+static void dumpXmlAttribute(const char* p) {
+ for (; *p; p++) {
+ switch (*p) {
+ case '&':
+ fputs("&", gOutFile);
+ break;
+ case '<':
+ fputs("<", gOutFile);
+ break;
+ case '>':
+ fputs(">", gOutFile);
+ break;
+ case '"':
+ fputs(""", gOutFile);
+ break;
+ case '\t':
+ fputs("	", gOutFile);
+ break;
+ case '\n':
+ fputs("
", gOutFile);
+ break;
+ case '\r':
+ fputs("
", gOutFile);
+ break;
+ default:
+ putc(*p, gOutFile);
+ } // switch
+ } // for
+}
+
+/*
+ * Reads variable width value, possibly sign extended at the last defined byte.
+ */
+static u8 readVarWidth(const u1** data, u1 arg, bool sign_extend) {
+ u8 value = 0;
+ for (u4 i = 0; i <= arg; i++) {
+ value |= static_cast<u8>(*(*data)++) << (i * 8);
+ }
+ if (sign_extend) {
+ int shift = (7 - arg) * 8;
+ return (static_cast<s8>(value) << shift) >> shift;
+ }
+ return value;
+}
+
+/*
+ * Dumps encoded value.
+ */
+static void dumpEncodedValue(const DexFile* pDexFile, const u1** data); // forward
+static void dumpEncodedValue(const DexFile* pDexFile, const u1** data, u1 type, u1 arg) {
+ switch (type) {
+ case DexFile::kDexAnnotationByte:
+ fprintf(gOutFile, "%" PRId8, static_cast<s1>(readVarWidth(data, arg, false)));
+ break;
+ case DexFile::kDexAnnotationShort:
+ fprintf(gOutFile, "%" PRId16, static_cast<s2>(readVarWidth(data, arg, true)));
+ break;
+ case DexFile::kDexAnnotationChar:
+ fprintf(gOutFile, "%" PRIu16, static_cast<u2>(readVarWidth(data, arg, false)));
+ break;
+ case DexFile::kDexAnnotationInt:
+ fprintf(gOutFile, "%" PRId32, static_cast<s4>(readVarWidth(data, arg, true)));
+ break;
+ case DexFile::kDexAnnotationLong:
+ fprintf(gOutFile, "%" PRId64, static_cast<s8>(readVarWidth(data, arg, true)));
+ break;
+ case DexFile::kDexAnnotationFloat: {
+ // Fill on right.
+ union {
+ float f;
+ u4 data;
+ } conv;
+ conv.data = static_cast<u4>(readVarWidth(data, arg, false)) << (3 - arg) * 8;
+ fprintf(gOutFile, "%g", conv.f);
+ break;
+ }
+ case DexFile::kDexAnnotationDouble: {
+ // Fill on right.
+ union {
+ double d;
+ u8 data;
+ } conv;
+ conv.data = readVarWidth(data, arg, false) << (7 - arg) * 8;
+ fprintf(gOutFile, "%g", conv.d);
+ break;
+ }
+ case DexFile::kDexAnnotationString: {
+ const u4 idx = static_cast<u4>(readVarWidth(data, arg, false));
+ if (gOptions.outputFormat == OUTPUT_PLAIN) {
+ dumpEscapedString(pDexFile->StringDataByIdx(idx));
+ } else {
+ dumpXmlAttribute(pDexFile->StringDataByIdx(idx));
+ }
+ break;
+ }
+ case DexFile::kDexAnnotationType: {
+ const u4 str_idx = static_cast<u4>(readVarWidth(data, arg, false));
+ fputs(pDexFile->StringByTypeIdx(str_idx), gOutFile);
+ break;
+ }
+ case DexFile::kDexAnnotationField:
+ case DexFile::kDexAnnotationEnum: {
+ const u4 field_idx = static_cast<u4>(readVarWidth(data, arg, false));
+ const DexFile::FieldId& pFieldId = pDexFile->GetFieldId(field_idx);
+ fputs(pDexFile->StringDataByIdx(pFieldId.name_idx_), gOutFile);
+ break;
+ }
+ case DexFile::kDexAnnotationMethod: {
+ const u4 method_idx = static_cast<u4>(readVarWidth(data, arg, false));
+ const DexFile::MethodId& pMethodId = pDexFile->GetMethodId(method_idx);
+ fputs(pDexFile->StringDataByIdx(pMethodId.name_idx_), gOutFile);
+ break;
+ }
+ case DexFile::kDexAnnotationArray: {
+ fputc('{', gOutFile);
+ // Decode and display all elements.
+ const u4 size = DecodeUnsignedLeb128(data);
+ for (u4 i = 0; i < size; i++) {
+ fputc(' ', gOutFile);
+ dumpEncodedValue(pDexFile, data);
+ }
+ fputs(" }", gOutFile);
+ break;
+ }
+ case DexFile::kDexAnnotationAnnotation: {
+ const u4 type_idx = DecodeUnsignedLeb128(data);
+ fputs(pDexFile->StringByTypeIdx(type_idx), gOutFile);
+ // Decode and display all name=value pairs.
+ const u4 size = DecodeUnsignedLeb128(data);
+ for (u4 i = 0; i < size; i++) {
+ const u4 name_idx = DecodeUnsignedLeb128(data);
+ fputc(' ', gOutFile);
+ fputs(pDexFile->StringDataByIdx(name_idx), gOutFile);
+ fputc('=', gOutFile);
+ dumpEncodedValue(pDexFile, data);
+ }
+ break;
+ }
+ case DexFile::kDexAnnotationNull:
+ fputs("null", gOutFile);
+ break;
+ case DexFile::kDexAnnotationBoolean:
+ fputs(strBool(arg), gOutFile);
+ break;
+ default:
+ fputs("????", gOutFile);
+ break;
+ } // switch
+}
+
+/*
+ * Dumps encoded value with prefix.
+ */
+static void dumpEncodedValue(const DexFile* pDexFile, const u1** data) {
+ const u1 enc = *(*data)++;
+ dumpEncodedValue(pDexFile, data, enc & 0x1f, enc >> 5);
+}
+
+/*
* Dumps the file header.
- *
- * Note that some of the : are misaligned on purpose to preserve
- * the exact output of the original Dalvik dexdump.
*/
static void dumpFileHeader(const DexFile* pDexFile) {
const DexFile::Header& pHeader = pDexFile->GetHeader();
@@ -373,8 +569,8 @@
fprintf(gOutFile, "type_ids_size : %d\n", pHeader.type_ids_size_);
fprintf(gOutFile, "type_ids_off : %d (0x%06x)\n",
pHeader.type_ids_off_, pHeader.type_ids_off_);
- fprintf(gOutFile, "proto_ids_size : %d\n", pHeader.proto_ids_size_);
- fprintf(gOutFile, "proto_ids_off : %d (0x%06x)\n",
+ fprintf(gOutFile, "proto_ids_size : %d\n", pHeader.proto_ids_size_);
+ fprintf(gOutFile, "proto_ids_off : %d (0x%06x)\n",
pHeader.proto_ids_off_, pHeader.proto_ids_off_);
fprintf(gOutFile, "field_ids_size : %d\n", pHeader.field_ids_size_);
fprintf(gOutFile, "field_ids_off : %d (0x%06x)\n",
@@ -426,6 +622,99 @@
fprintf(gOutFile, "\n");
}
+/**
+ * Dumps an annotation set item.
+ */
+static void dumpAnnotationSetItem(const DexFile* pDexFile, const DexFile::AnnotationSetItem* set_item) {
+ if (set_item == nullptr || set_item->size_ == 0) {
+ fputs(" empty-annotation-set\n", gOutFile);
+ return;
+ }
+ for (u4 i = 0; i < set_item->size_; i++) {
+ const DexFile::AnnotationItem* annotation = pDexFile->GetAnnotationItem(set_item, i);
+ if (annotation == nullptr) {
+ continue;
+ }
+ fputs(" ", gOutFile);
+ switch (annotation->visibility_) {
+ case DexFile::kDexVisibilityBuild: fputs("VISIBILITY_BUILD ", gOutFile); break;
+ case DexFile::kDexVisibilityRuntime: fputs("VISIBILITY_RUNTIME ", gOutFile); break;
+ case DexFile::kDexVisibilitySystem: fputs("VISIBILITY_SYSTEM ", gOutFile); break;
+ default: fputs("VISIBILITY_UNKNOWN ", gOutFile); break;
+ } // switch
+ // Decode raw bytes in annotation.
+ const u1* rData = annotation->annotation_;
+ dumpEncodedValue(pDexFile, &rData, DexFile::kDexAnnotationAnnotation, 0);
+ fputc('\n', gOutFile);
+ }
+}
+
+/*
+ * Dumps class annotations.
+ */
+static void dumpClassAnnotations(const DexFile* pDexFile, int idx) {
+ const DexFile::ClassDef& pClassDef = pDexFile->GetClassDef(idx);
+ const DexFile::AnnotationsDirectoryItem* dir = pDexFile->GetAnnotationsDirectory(pClassDef);
+ if (dir == nullptr) {
+ return; // none
+ }
+
+ fprintf(gOutFile, "Class #%d annotations:\n", idx);
+
+ const DexFile::AnnotationSetItem* class_set_item = pDexFile->GetClassAnnotationSet(dir);
+ const DexFile::FieldAnnotationsItem* fields = pDexFile->GetFieldAnnotations(dir);
+ const DexFile::MethodAnnotationsItem* methods = pDexFile->GetMethodAnnotations(dir);
+ const DexFile::ParameterAnnotationsItem* pars = pDexFile->GetParameterAnnotations(dir);
+
+ // Annotations on the class itself.
+ if (class_set_item != nullptr) {
+ fprintf(gOutFile, "Annotations on class\n");
+ dumpAnnotationSetItem(pDexFile, class_set_item);
+ }
+
+ // Annotations on fields.
+ if (fields != nullptr) {
+ for (u4 i = 0; i < dir->fields_size_; i++) {
+ const u4 field_idx = fields[i].field_idx_;
+ const DexFile::FieldId& pFieldId = pDexFile->GetFieldId(field_idx);
+ const char* field_name = pDexFile->StringDataByIdx(pFieldId.name_idx_);
+ fprintf(gOutFile, "Annotations on field #%u '%s'\n", field_idx, field_name);
+ dumpAnnotationSetItem(pDexFile, pDexFile->GetFieldAnnotationSetItem(fields[i]));
+ }
+ }
+
+ // Annotations on methods.
+ if (methods != nullptr) {
+ for (u4 i = 0; i < dir->methods_size_; i++) {
+ const u4 method_idx = methods[i].method_idx_;
+ const DexFile::MethodId& pMethodId = pDexFile->GetMethodId(method_idx);
+ const char* method_name = pDexFile->StringDataByIdx(pMethodId.name_idx_);
+ fprintf(gOutFile, "Annotations on method #%u '%s'\n", method_idx, method_name);
+ dumpAnnotationSetItem(pDexFile, pDexFile->GetMethodAnnotationSetItem(methods[i]));
+ }
+ }
+
+ // Annotations on method parameters.
+ if (pars != nullptr) {
+ for (u4 i = 0; i < dir->parameters_size_; i++) {
+ const u4 method_idx = pars[i].method_idx_;
+ const DexFile::MethodId& pMethodId = pDexFile->GetMethodId(method_idx);
+ const char* method_name = pDexFile->StringDataByIdx(pMethodId.name_idx_);
+ fprintf(gOutFile, "Annotations on method #%u '%s' parameters\n", method_idx, method_name);
+ const DexFile::AnnotationSetRefList*
+ list = pDexFile->GetParameterAnnotationSetRefList(&pars[i]);
+ if (list != nullptr) {
+ for (u4 j = 0; j < list->size_; j++) {
+ fprintf(gOutFile, "#%u\n", j);
+ dumpAnnotationSetItem(pDexFile, pDexFile->GetSetRefItemItem(&list->list_[j]));
+ }
+ }
+ }
+ }
+
+ fputc('\n', gOutFile);
+}
+
/*
* Dumps an interface that a class declares to implement.
*/
@@ -677,27 +966,25 @@
fprintf(gOutFile, " v%d", pDecInsn->VRegA());
break;
case Instruction::k10t: // op +AA
- case Instruction::k20t: // op +AAAA
- {
- const s4 targ = (s4) pDecInsn->VRegA();
- fprintf(gOutFile, " %04x // %c%04x",
- insnIdx + targ,
- (targ < 0) ? '-' : '+',
- (targ < 0) ? -targ : targ);
- }
+ case Instruction::k20t: { // op +AAAA
+ const s4 targ = (s4) pDecInsn->VRegA();
+ fprintf(gOutFile, " %04x // %c%04x",
+ insnIdx + targ,
+ (targ < 0) ? '-' : '+',
+ (targ < 0) ? -targ : targ);
break;
+ }
case Instruction::k22x: // op vAA, vBBBB
fprintf(gOutFile, " v%d, v%d", pDecInsn->VRegA(), pDecInsn->VRegB());
break;
- case Instruction::k21t: // op vAA, +BBBB
- {
- const s4 targ = (s4) pDecInsn->VRegB();
- fprintf(gOutFile, " v%d, %04x // %c%04x", pDecInsn->VRegA(),
- insnIdx + targ,
- (targ < 0) ? '-' : '+',
- (targ < 0) ? -targ : targ);
- }
+ case Instruction::k21t: { // op vAA, +BBBB
+ const s4 targ = (s4) pDecInsn->VRegB();
+ fprintf(gOutFile, " v%d, %04x // %c%04x", pDecInsn->VRegA(),
+ insnIdx + targ,
+ (targ < 0) ? '-' : '+',
+ (targ < 0) ? -targ : targ);
break;
+ }
case Instruction::k21s: // op vAA, #+BBBB
fprintf(gOutFile, " v%d, #int %d // #%x",
pDecInsn->VRegA(), (s4) pDecInsn->VRegB(), (u2)pDecInsn->VRegB());
@@ -727,16 +1014,15 @@
pDecInsn->VRegA(), pDecInsn->VRegB(),
(s4) pDecInsn->VRegC(), (u1) pDecInsn->VRegC());
break;
- case Instruction::k22t: // op vA, vB, +CCCC
- {
- const s4 targ = (s4) pDecInsn->VRegC();
- fprintf(gOutFile, " v%d, v%d, %04x // %c%04x",
- pDecInsn->VRegA(), pDecInsn->VRegB(),
- insnIdx + targ,
- (targ < 0) ? '-' : '+',
- (targ < 0) ? -targ : targ);
- }
+ case Instruction::k22t: { // op vA, vB, +CCCC
+ const s4 targ = (s4) pDecInsn->VRegC();
+ fprintf(gOutFile, " v%d, v%d, %04x // %c%04x",
+ pDecInsn->VRegA(), pDecInsn->VRegB(),
+ insnIdx + targ,
+ (targ < 0) ? '-' : '+',
+ (targ < 0) ? -targ : targ);
break;
+ }
case Instruction::k22s: // op vA, vB, #+CCCC
fprintf(gOutFile, " v%d, v%d, #int %d // #%04x",
pDecInsn->VRegA(), pDecInsn->VRegB(),
@@ -751,18 +1037,17 @@
case Instruction::k30t:
fprintf(gOutFile, " #%08x", pDecInsn->VRegA());
break;
- case Instruction::k31i: // op vAA, #+BBBBBBBB
- {
- // This is often, but not always, a float.
- union {
- float f;
- u4 i;
- } conv;
- conv.i = pDecInsn->VRegB();
- fprintf(gOutFile, " v%d, #float %f // #%08x",
- pDecInsn->VRegA(), conv.f, pDecInsn->VRegB());
- }
+ case Instruction::k31i: { // op vAA, #+BBBBBBBB
+ // This is often, but not always, a float.
+ union {
+ float f;
+ u4 i;
+ } conv;
+ conv.i = pDecInsn->VRegB();
+ fprintf(gOutFile, " v%d, #float %g // #%08x",
+ pDecInsn->VRegA(), conv.f, pDecInsn->VRegB());
break;
+ }
case Instruction::k31t: // op vAA, offset +BBBBBBBB
fprintf(gOutFile, " v%d, %08x // +%08x",
pDecInsn->VRegA(), insnIdx + pDecInsn->VRegB(), pDecInsn->VRegB());
@@ -770,39 +1055,37 @@
case Instruction::k32x: // op vAAAA, vBBBB
fprintf(gOutFile, " v%d, v%d", pDecInsn->VRegA(), pDecInsn->VRegB());
break;
- case Instruction::k35c: // op {vC, vD, vE, vF, vG}, thing@BBBB
+ case Instruction::k35c: { // op {vC, vD, vE, vF, vG}, thing@BBBB
// NOT SUPPORTED:
// case Instruction::k35ms: // [opt] invoke-virtual+super
// case Instruction::k35mi: // [opt] inline invoke
- {
- u4 arg[Instruction::kMaxVarArgRegs];
- pDecInsn->GetVarArgs(arg);
- fputs(" {", gOutFile);
- for (int i = 0, n = pDecInsn->VRegA(); i < n; i++) {
- if (i == 0) {
- fprintf(gOutFile, "v%d", arg[i]);
- } else {
- fprintf(gOutFile, ", v%d", arg[i]);
- }
- } // for
- fprintf(gOutFile, "}, %s", indexBuf);
- }
+ u4 arg[Instruction::kMaxVarArgRegs];
+ pDecInsn->GetVarArgs(arg);
+ fputs(" {", gOutFile);
+ for (int i = 0, n = pDecInsn->VRegA(); i < n; i++) {
+ if (i == 0) {
+ fprintf(gOutFile, "v%d", arg[i]);
+ } else {
+ fprintf(gOutFile, ", v%d", arg[i]);
+ }
+ } // for
+ fprintf(gOutFile, "}, %s", indexBuf);
break;
- case Instruction::k25x: // op vC, {vD, vE, vF, vG} (B: count)
- {
- u4 arg[Instruction::kMaxVarArgRegs25x];
- pDecInsn->GetAllArgs25x(arg);
- fprintf(gOutFile, " v%d, {", arg[0]);
- for (int i = 0, n = pDecInsn->VRegB(); i < n; i++) {
- if (i == 0) {
- fprintf(gOutFile, "v%d", arg[Instruction::kLambdaVirtualRegisterWidth + i]);
- } else {
- fprintf(gOutFile, ", v%d", arg[Instruction::kLambdaVirtualRegisterWidth + i]);
- }
- } // for
- fputc('}', gOutFile);
- }
+ }
+ case Instruction::k25x: { // op vC, {vD, vE, vF, vG} (B: count)
+ u4 arg[Instruction::kMaxVarArgRegs25x];
+ pDecInsn->GetAllArgs25x(arg);
+ fprintf(gOutFile, " v%d, {", arg[0]);
+ for (int i = 0, n = pDecInsn->VRegB(); i < n; i++) {
+ if (i == 0) {
+ fprintf(gOutFile, "v%d", arg[Instruction::kLambdaVirtualRegisterWidth + i]);
+ } else {
+ fprintf(gOutFile, ", v%d", arg[Instruction::kLambdaVirtualRegisterWidth + i]);
+ }
+ } // for
+ fputc('}', gOutFile);
break;
+ }
case Instruction::k3rc: // op {vCCCC .. v(CCCC+AA-1)}, thing@BBBB
// NOT SUPPORTED:
// case Instruction::k3rms: // [opt] invoke-virtual+super/range
@@ -821,18 +1104,17 @@
fprintf(gOutFile, "}, %s", indexBuf);
}
break;
- case Instruction::k51l: // op vAA, #+BBBBBBBBBBBBBBBB
- {
- // This is often, but not always, a double.
- union {
- double d;
- u8 j;
- } conv;
- conv.j = pDecInsn->WideVRegB();
- fprintf(gOutFile, " v%d, #double %f // #%016" PRIx64,
- pDecInsn->VRegA(), conv.d, pDecInsn->WideVRegB());
- }
+ case Instruction::k51l: { // op vAA, #+BBBBBBBBBBBBBBBB
+ // This is often, but not always, a double.
+ union {
+ double d;
+ u8 j;
+ } conv;
+ conv.j = pDecInsn->WideVRegB();
+ fprintf(gOutFile, " v%d, #double %g // #%016" PRIx64,
+ pDecInsn->VRegA(), conv.d, pDecInsn->WideVRegB());
break;
+ }
// NOT SUPPORTED:
// case Instruction::k00x: // unknown op or breakpoint
// break;
@@ -1017,126 +1299,9 @@
}
/*
- * Dumps a string value with some escape characters.
- */
-static void dumpEscapedString(const char* p) {
- for (; *p; p++) {
- switch (*p) {
- case '\\':
- fputs("\\\\", gOutFile);
- break;
- case '\"':
- fputs("\\\"", gOutFile);
- break;
- case '\t':
- fputs("\\t", gOutFile);
- break;
- case '\n':
- fputs("\\n", gOutFile);
- break;
- case '\r':
- fputs("\\r", gOutFile);
- break;
- default:
- putc(*p, gOutFile);
- }
- }
-}
-
-/*
- * Dumps an XML attribute value between double-quotes.
- */
-static void dumpXmlAttribute(const char* p) {
- for (; *p; p++) {
- switch (*p) {
- case '&':
- fputs("&", gOutFile);
- break;
- case '<':
- fputs("<", gOutFile);
- break;
- case '"':
- fputs(""", gOutFile);
- break;
- case '\t':
- fputs("	", gOutFile);
- break;
- case '\n':
- fputs("
", gOutFile);
- break;
- case '\r':
- fputs("
", gOutFile);
- break;
- default:
- putc(*p, gOutFile);
- }
- }
-}
-
-/*
- * Dumps a value of static (class) field.
- */
-static void dumpSFieldValue(const DexFile* pDexFile,
- EncodedStaticFieldValueIterator::ValueType valueType,
- const jvalue* pValue) {
- switch (valueType) {
- case EncodedStaticFieldValueIterator::kByte:
- fprintf(gOutFile, "%" PRIu8, pValue->b);
- break;
- case EncodedStaticFieldValueIterator::kShort:
- fprintf(gOutFile, "%" PRId16, pValue->s);
- break;
- case EncodedStaticFieldValueIterator::kChar:
- fprintf(gOutFile, "%" PRIu16, pValue->c);
- break;
- case EncodedStaticFieldValueIterator::kInt:
- fprintf(gOutFile, "%" PRId32, pValue->i);
- break;
- case EncodedStaticFieldValueIterator::kLong:
- fprintf(gOutFile, "%" PRId64, pValue->j);
- break;
- case EncodedStaticFieldValueIterator::kFloat:
- fprintf(gOutFile, "%f", pValue->f);
- break;
- case EncodedStaticFieldValueIterator::kDouble:
- fprintf(gOutFile, "%f", pValue->d);
- break;
- case EncodedStaticFieldValueIterator::kString: {
- const char* str =
- pDexFile->GetStringData(pDexFile->GetStringId(pValue->i));
- if (gOptions.outputFormat == OUTPUT_PLAIN) {
- fputs("\"", gOutFile);
- dumpEscapedString(str);
- fputs("\"", gOutFile);
- } else {
- dumpXmlAttribute(str);
- }
- break;
- }
- case EncodedStaticFieldValueIterator::kNull:
- fputs("null", gOutFile);
- break;
- case EncodedStaticFieldValueIterator::kBoolean:
- fputs(pValue->z ? "true" : "false", gOutFile);
- break;
-
- case EncodedStaticFieldValueIterator::kAnnotation:
- case EncodedStaticFieldValueIterator::kArray:
- case EncodedStaticFieldValueIterator::kEnum:
- case EncodedStaticFieldValueIterator::kField:
- case EncodedStaticFieldValueIterator::kMethod:
- case EncodedStaticFieldValueIterator::kType:
- default:
- fprintf(gOutFile, "Unexpected static field type: %d", valueType);
- }
-}
-
-/*
* Dumps a static (class) field.
*/
-static void dumpSField(const DexFile* pDexFile, u4 idx, u4 flags, int i,
- EncodedStaticFieldValueIterator::ValueType valueType,
- const jvalue* pValue) {
+static void dumpSField(const DexFile* pDexFile, u4 idx, u4 flags, int i, const u1** data) {
// Bail for anything private if export only requested.
if (gOptions.exportsOnly && (flags & (kAccPublic | kAccProtected)) == 0) {
return;
@@ -1153,9 +1318,9 @@
fprintf(gOutFile, " name : '%s'\n", name);
fprintf(gOutFile, " type : '%s'\n", typeDescriptor);
fprintf(gOutFile, " access : 0x%04x (%s)\n", flags, accessStr);
- if (pValue != nullptr) {
+ if (data != nullptr) {
fputs(" value : ", gOutFile);
- dumpSFieldValue(pDexFile, valueType, pValue);
+ dumpEncodedValue(pDexFile, data);
fputs("\n", gOutFile);
}
} else if (gOptions.outputFormat == OUTPUT_XML) {
@@ -1170,9 +1335,9 @@
fprintf(gOutFile, " final=%s\n", quotedBool((flags & kAccFinal) != 0));
// The "deprecated=" is not knowable w/o parsing annotations.
fprintf(gOutFile, " visibility=%s\n", quotedVisibility(flags));
- if (pValue != nullptr) {
+ if (data != nullptr) {
fputs(" value=\"", gOutFile);
- dumpSFieldValue(pDexFile, valueType, pValue);
+ dumpEncodedValue(pDexFile, data);
fputs("\"\n", gOutFile);
}
fputs(">\n</field>\n", gOutFile);
@@ -1185,8 +1350,7 @@
* Dumps an instance field.
*/
static void dumpIField(const DexFile* pDexFile, u4 idx, u4 flags, int i) {
- dumpSField(pDexFile, idx, flags, i,
- EncodedStaticFieldValueIterator::kByte, nullptr);
+ dumpSField(pDexFile, idx, flags, i, nullptr);
}
/*
@@ -1196,7 +1360,7 @@
*/
static void dumpCfg(const DexFile* dex_file,
- uint32_t dex_method_idx,
+ u4 dex_method_idx,
const DexFile::CodeItem* code_item) {
if (code_item != nullptr) {
std::ostringstream oss;
@@ -1207,7 +1371,7 @@
static void dumpCfg(const DexFile* dex_file, int idx) {
const DexFile::ClassDef& class_def = dex_file->GetClassDef(idx);
- const uint8_t* class_data = dex_file->GetClassData(class_def);
+ const u1* class_data = dex_file->GetClassData(class_def);
if (class_data == nullptr) { // empty class such as a marker interface?
return;
}
@@ -1248,7 +1412,15 @@
return;
}
- if (gOptions.cfg) {
+ if (gOptions.showSectionHeaders) {
+ dumpClassDef(pDexFile, idx);
+ }
+
+ if (gOptions.showAnnotations) {
+ dumpClassAnnotations(pDexFile, idx);
+ }
+
+ if (gOptions.showCfg) {
dumpCfg(pDexFile, idx);
return;
}
@@ -1347,33 +1519,35 @@
}
} else {
ClassDataItemIterator pClassData(*pDexFile, pEncodedData);
+
+ // Prepare data for static fields.
+ const u1* sData = pDexFile->GetEncodedStaticFieldValuesArray(pClassDef);
+ const u4 sSize = sData != nullptr ? DecodeUnsignedLeb128(&sData) : 0;
+
+ // Static fields.
if (gOptions.outputFormat == OUTPUT_PLAIN) {
fprintf(gOutFile, " Static fields -\n");
}
- EncodedStaticFieldValueIterator staticFieldValues(*pDexFile, pClassDef);
- for (int i = 0; pClassData.HasNextStaticField(); i++, pClassData.Next()) {
- EncodedStaticFieldValueIterator::ValueType valueType =
- EncodedStaticFieldValueIterator::kByte;
- const jvalue* pValue = nullptr;
- if (staticFieldValues.HasNext()) {
- valueType = staticFieldValues.GetValueType();
- pValue = &staticFieldValues.GetJavaValue();
- }
- dumpSField(pDexFile, pClassData.GetMemberIndex(),
- pClassData.GetRawMemberAccessFlags(), i,
- valueType, pValue);
- if (staticFieldValues.HasNext()) {
- staticFieldValues.Next();
- }
+ for (u4 i = 0; pClassData.HasNextStaticField(); i++, pClassData.Next()) {
+ dumpSField(pDexFile,
+ pClassData.GetMemberIndex(),
+ pClassData.GetRawMemberAccessFlags(),
+ i,
+ i < sSize ? &sData : nullptr);
} // for
- DCHECK(!staticFieldValues.HasNext());
+
+ // Instance fields.
if (gOptions.outputFormat == OUTPUT_PLAIN) {
fprintf(gOutFile, " Instance fields -\n");
}
- for (int i = 0; pClassData.HasNextInstanceField(); i++, pClassData.Next()) {
- dumpIField(pDexFile, pClassData.GetMemberIndex(),
- pClassData.GetRawMemberAccessFlags(), i);
+ for (u4 i = 0; pClassData.HasNextInstanceField(); i++, pClassData.Next()) {
+ dumpIField(pDexFile,
+ pClassData.GetMemberIndex(),
+ pClassData.GetRawMemberAccessFlags(),
+ i);
} // for
+
+ // Direct methods.
if (gOptions.outputFormat == OUTPUT_PLAIN) {
fprintf(gOutFile, " Direct methods -\n");
}
@@ -1383,6 +1557,8 @@
pClassData.GetMethodCodeItem(),
pClassData.GetMethodCodeItemOffset(), i);
} // for
+
+ // Virtual methods.
if (gOptions.outputFormat == OUTPUT_PLAIN) {
fprintf(gOutFile, " Virtual methods -\n");
}
@@ -1434,9 +1610,6 @@
char* package = nullptr;
const u4 classDefsSize = pDexFile->GetHeader().class_defs_size_;
for (u4 i = 0; i < classDefsSize; i++) {
- if (gOptions.showSectionHeaders) {
- dumpClassDef(pDexFile, i);
- }
dumpClass(pDexFile, i, &package);
} // for
@@ -1461,14 +1634,9 @@
}
// If the file is not a .dex file, the function tries .zip/.jar/.apk files,
- // all of which are Zip archives with "classes.dex" inside. The compressed
- // data needs to be extracted to a temp file, the location of which varies.
+ // all of which are Zip archives with "classes.dex" inside.
//
- // TODO(ajcbik): fix following issues
- //
- // (1) gOptions.tempFileName is not accounted for
- // (2) gOptions.ignoreBadChecksum is not accounted for
- //
+ // TODO(ajcbik): implement gOptions.ignoreBadChecksum
std::string error_msg;
std::vector<std::unique_ptr<const DexFile>> dex_files;
if (!DexFile::Open(fileName, fileName, &error_msg, &dex_files)) {
diff --git a/dexdump/dexdump.h b/dexdump/dexdump.h
index 50280a9..6939f90 100644
--- a/dexdump/dexdump.h
+++ b/dexdump/dexdump.h
@@ -42,13 +42,13 @@
bool disassemble;
bool exportsOnly;
bool ignoreBadChecksum;
+ bool showAnnotations;
+ bool showCfg;
bool showFileHeaders;
bool showSectionHeaders;
bool verbose;
- bool cfg;
OutputFormat outputFormat;
const char* outputFileName;
- const char* tempFileName;
};
/* Prototypes. */
diff --git a/dexdump/dexdump_main.cc b/dexdump/dexdump_main.cc
index dd1002c..32e9d52 100644
--- a/dexdump/dexdump_main.cc
+++ b/dexdump/dexdump_main.cc
@@ -40,19 +40,18 @@
*/
static void usage(void) {
fprintf(stderr, "Copyright (C) 2007 The Android Open Source Project\n\n");
- fprintf(stderr, "%s: [-c] [-d] [-e] [-f] [-h] [-i] [-l layout] [-o outfile]"
- " [-t tempfile] dexfile...\n", gProgName);
- fprintf(stderr, "\n");
+ fprintf(stderr, "%s: [-a] [-c] [-d] [-e] [-f] [-h] [-i] [-l layout] [-o outfile]"
+ " dexfile...\n\n", gProgName);
+ fprintf(stderr, " -a : display annotations\n");
fprintf(stderr, " -c : verify checksum and exit\n");
fprintf(stderr, " -d : disassemble code sections\n");
fprintf(stderr, " -e : display exported items only\n");
fprintf(stderr, " -f : display summary information from file header\n");
- fprintf(stderr, " -g : dump CFG for dex\n");
+ fprintf(stderr, " -g : display CFG for dex\n");
fprintf(stderr, " -h : display file header details\n");
fprintf(stderr, " -i : ignore checksum failures\n");
fprintf(stderr, " -l : output layout, either 'plain' or 'xml'\n");
fprintf(stderr, " -o : output file name (defaults to stdout)\n");
- fprintf(stderr, " -t : temp file name (defaults to /sdcard/dex-temp-*)\n");
}
/*
@@ -70,11 +69,14 @@
// Parse all arguments.
while (1) {
- const int ic = getopt(argc, argv, "cdefghil:t:o:");
+ const int ic = getopt(argc, argv, "acdefghil:o:");
if (ic < 0) {
break; // done
}
switch (ic) {
+ case 'a': // display annotations
+ gOptions.showAnnotations = true;
+ break;
case 'c': // verify the checksum then exit
gOptions.checksumOnly = true;
break;
@@ -84,13 +86,13 @@
case 'e': // exported items only
gOptions.exportsOnly = true;
break;
- case 'f': // dump outer file header
+ case 'f': // display outer file header
gOptions.showFileHeaders = true;
break;
- case 'g': // dump cfg
- gOptions.cfg = true;
+ case 'g': // display cfg
+ gOptions.showCfg = true;
break;
- case 'h': // dump section headers, i.e. all meta-data
+ case 'h': // display section headers, i.e. all meta-data
gOptions.showSectionHeaders = true;
break;
case 'i': // continue even if checksum is bad
@@ -106,9 +108,6 @@
wantUsage = true;
}
break;
- case 't': // temp file, used when opening compressed Jar
- gOptions.tempFileName = optarg;
- break;
case 'o': // output file
gOptions.outputFileName = optarg;
break;
diff --git a/test/dexdump/bytecodes.txt b/test/dexdump/bytecodes.txt
old mode 100755
new mode 100644
index 4c8b79b..e1a381e
--- a/test/dexdump/bytecodes.txt
+++ b/test/dexdump/bytecodes.txt
@@ -12,8 +12,8 @@
string_ids_off : 112 (0x000070)
type_ids_size : 42
type_ids_off : 724 (0x0002d4)
-proto_ids_size : 12
-proto_ids_off : 892 (0x00037c)
+proto_ids_size : 12
+proto_ids_off : 892 (0x00037c)
field_ids_size : 40
field_ids_off : 1036 (0x00040c)
method_ids_size : 28
@@ -36,6 +36,11 @@
direct_methods_size : 0
virtual_methods_size: 1
+Class #0 annotations:
+Annotations on class
+ VISIBILITY_RUNTIME Ljava/lang/annotation/Retention; value=CLASS
+ VISIBILITY_RUNTIME Ljava/lang/annotation/Target; value={ TYPE FIELD METHOD PARAMETER CONSTRUCTOR LOCAL_VARIABLE }
+
Class #0 -
Class descriptor : 'Landroid/annotation/SuppressLint;'
Access flags : 0x2601 (PUBLIC INTERFACE ABSTRACT ANNOTATION)
@@ -67,6 +72,11 @@
direct_methods_size : 0
virtual_methods_size: 1
+Class #1 annotations:
+Annotations on class
+ VISIBILITY_RUNTIME Ljava/lang/annotation/Retention; value=CLASS
+ VISIBILITY_RUNTIME Ljava/lang/annotation/Target; value={ TYPE METHOD CONSTRUCTOR }
+
Class #1 -
Class descriptor : 'Landroid/annotation/TargetApi;'
Access flags : 0x2601 (PUBLIC INTERFACE ABSTRACT ANNOTATION)
@@ -144,6 +154,11 @@
direct_methods_size : 1
virtual_methods_size: 0
+Class #3 annotations:
+Annotations on class
+ VISIBILITY_SYSTEM Ldalvik/annotation/EnclosingClass; value=Lcom/google/android/test/R;
+ VISIBILITY_SYSTEM Ldalvik/annotation/InnerClass; accessFlags=25 name="attr"
+
Class #3 -
Class descriptor : 'Lcom/google/android/test/R$attr;'
Access flags : 0x0011 (PUBLIC FINAL)
@@ -186,6 +201,11 @@
direct_methods_size : 1
virtual_methods_size: 0
+Class #4 annotations:
+Annotations on class
+ VISIBILITY_SYSTEM Ldalvik/annotation/EnclosingClass; value=Lcom/google/android/test/R;
+ VISIBILITY_SYSTEM Ldalvik/annotation/InnerClass; accessFlags=25 name="drawable"
+
Class #4 -
Class descriptor : 'Lcom/google/android/test/R$drawable;'
Access flags : 0x0011 (PUBLIC FINAL)
@@ -233,6 +253,10 @@
direct_methods_size : 1
virtual_methods_size: 0
+Class #5 annotations:
+Annotations on class
+ VISIBILITY_SYSTEM Ldalvik/annotation/MemberClasses; value={ Lcom/google/android/test/R$attr; Lcom/google/android/test/R$drawable; }
+
Class #5 -
Class descriptor : 'Lcom/google/android/test/R;'
Access flags : 0x0011 (PUBLIC FINAL)
@@ -275,6 +299,10 @@
direct_methods_size : 13
virtual_methods_size: 2
+Class #6 annotations:
+Annotations on method #13 'doit'
+ VISIBILITY_SYSTEM Ldalvik/annotation/Throws; value={ Ljava/lang/Exception; }
+
Class #6 -
Class descriptor : 'Lcom/google/android/test/Test;'
Access flags : 0x0001 (PUBLIC)
@@ -418,17 +446,17 @@
000a02: 6a00 1800 |0001: sput-boolean v0, Lcom/google/android/test/Test;.sBool:Z // field@0018
000a06: 1300 1f00 |0003: const/16 v0, #int 31 // #1f
000a0a: 6b00 1700 |0005: sput-byte v0, Lcom/google/android/test/Test;.sB:B // field@0017
-000a0e: 1400 ffff 0000 |0007: const v0, #float 0.000000 // #0000ffff
+000a0e: 1400 ffff 0000 |0007: const v0, #float 9.18341e-41 // #0000ffff
000a14: 6c00 1900 |000a: sput-char v0, Lcom/google/android/test/Test;.sC:C // field@0019
000a18: 1300 3412 |000c: const/16 v0, #int 4660 // #1234
000a1c: 6d00 1f00 |000e: sput-short v0, Lcom/google/android/test/Test;.sS:S // field@001f
-000a20: 1400 7856 3412 |0010: const v0, #float 0.000000 // #12345678
+000a20: 1400 7856 3412 |0010: const v0, #float 5.69046e-28 // #12345678
000a26: 6700 1c00 |0013: sput v0, Lcom/google/android/test/Test;.sI:I // field@001c
-000a2a: 1800 ffff cdab 7956 3412 |0015: const-wide v0, #double 0.000000 // #12345679abcdffff
+000a2a: 1800 ffff cdab 7956 3412 |0015: const-wide v0, #double 5.62635e-221 // #12345679abcdffff
000a34: 6800 1d00 |001a: sput-wide v0, Lcom/google/android/test/Test;.sL:J // field@001d
-000a38: 1400 00e4 4046 |001c: const v0, #float 12345.000000 // #4640e400
+000a38: 1400 00e4 4046 |001c: const v0, #float 12345 // #4640e400
000a3e: 6700 1b00 |001f: sput v0, Lcom/google/android/test/Test;.sF:F // field@001b
-000a42: 1800 0000 0000 801c c840 |0021: const-wide v0, #double 12345.000000 // #40c81c8000000000
+000a42: 1800 0000 0000 801c c840 |0021: const-wide v0, #double 12345 // #40c81c8000000000
000a4c: 6800 1a00 |0026: sput-wide v0, Lcom/google/android/test/Test;.sD:D // field@001a
000a50: 1200 |0028: const/4 v0, #int 0 // #0
000a52: 6900 1e00 |0029: sput-object v0, Lcom/google/android/test/Test;.sO:Ljava/lang/Object; // field@001e
@@ -471,17 +499,17 @@
000ab4: 5c81 0d00 |0008: iput-boolean v1, v8, Lcom/google/android/test/Test;.mBool:Z // field@000d
000ab8: 1301 1f00 |000a: const/16 v1, #int 31 // #1f
000abc: 5d81 0c00 |000c: iput-byte v1, v8, Lcom/google/android/test/Test;.mB:B // field@000c
-000ac0: 1401 ffff 0000 |000e: const v1, #float 0.000000 // #0000ffff
+000ac0: 1401 ffff 0000 |000e: const v1, #float 9.18341e-41 // #0000ffff
000ac6: 5e81 0e00 |0011: iput-char v1, v8, Lcom/google/android/test/Test;.mC:C // field@000e
000aca: 1301 3412 |0013: const/16 v1, #int 4660 // #1234
000ace: 5f81 1500 |0015: iput-short v1, v8, Lcom/google/android/test/Test;.mS:S // field@0015
-000ad2: 1401 7856 3412 |0017: const v1, #float 0.000000 // #12345678
+000ad2: 1401 7856 3412 |0017: const v1, #float 5.69046e-28 // #12345678
000ad8: 5981 1100 |001a: iput v1, v8, Lcom/google/android/test/Test;.mI:I // field@0011
-000adc: 1802 ffff cdab 7956 3412 |001c: const-wide v2, #double 0.000000 // #12345679abcdffff
+000adc: 1802 ffff cdab 7956 3412 |001c: const-wide v2, #double 5.62635e-221 // #12345679abcdffff
000ae6: 5a82 1200 |0021: iput-wide v2, v8, Lcom/google/android/test/Test;.mL:J // field@0012
-000aea: 1401 00e4 4046 |0023: const v1, #float 12345.000000 // #4640e400
+000aea: 1401 00e4 4046 |0023: const v1, #float 12345 // #4640e400
000af0: 5981 1000 |0026: iput v1, v8, Lcom/google/android/test/Test;.mF:F // field@0010
-000af4: 1802 0000 0000 801c c840 |0028: const-wide v2, #double 12345.000000 // #40c81c8000000000
+000af4: 1802 0000 0000 801c c840 |0028: const-wide v2, #double 12345 // #40c81c8000000000
000afe: 5a82 0f00 |002d: iput-wide v2, v8, Lcom/google/android/test/Test;.mD:D // field@000f
000b02: 1201 |002f: const/4 v1, #int 0 // #0
000b04: 5b81 1300 |0030: iput-object v1, v8, Lcom/google/android/test/Test;.mO:Ljava/lang/Object; // field@0013
@@ -626,7 +654,7 @@
000cc6: 8d00 |0011: int-to-byte v0, v0
000cc8: 5db0 0c00 |0012: iput-byte v0, v11, Lcom/google/android/test/Test;.mB:B // field@000c
000ccc: 57b0 0e00 |0014: iget-char v0, v11, Lcom/google/android/test/Test;.mC:C // field@000e
-000cd0: 1401 ffff 0000 |0016: const v1, #float 0.000000 // #0000ffff
+000cd0: 1401 ffff 0000 |0016: const v1, #float 9.18341e-41 // #0000ffff
000cd6: b010 |0019: add-int/2addr v0, v1
000cd8: 8e00 |001a: int-to-char v0, v0
000cda: 5eb0 0e00 |001b: iput-char v0, v11, Lcom/google/android/test/Test;.mC:C // field@000e
@@ -635,7 +663,7 @@
000ce6: 8f00 |0021: int-to-short v0, v0
000ce8: 5fb0 1500 |0022: iput-short v0, v11, Lcom/google/android/test/Test;.mS:S // field@0015
000cec: 52b0 1100 |0024: iget v0, v11, Lcom/google/android/test/Test;.mI:I // field@0011
-000cf0: 1401 7856 3412 |0026: const v1, #float 0.000000 // #12345678
+000cf0: 1401 7856 3412 |0026: const v1, #float 5.69046e-28 // #12345678
000cf6: b010 |0029: add-int/2addr v0, v1
000cf8: 59b0 1100 |002a: iput v0, v11, Lcom/google/android/test/Test;.mI:I // field@0011
000cfc: 52b0 1100 |002c: iget v0, v11, Lcom/google/android/test/Test;.mI:I // field@0011
@@ -643,7 +671,7 @@
000d04: b010 |0030: add-int/2addr v0, v1
000d06: 59b0 1100 |0031: iput v0, v11, Lcom/google/android/test/Test;.mI:I // field@0011
000d0a: 53b0 1200 |0033: iget-wide v0, v11, Lcom/google/android/test/Test;.mL:J // field@0012
-000d0e: 1802 ffff cdab 7956 3412 |0035: const-wide v2, #double 0.000000 // #12345679abcdffff
+000d0e: 1802 ffff cdab 7956 3412 |0035: const-wide v2, #double 5.62635e-221 // #12345679abcdffff
000d18: bb20 |003a: add-long/2addr v0, v2
000d1a: 5ab0 1200 |003b: iput-wide v0, v11, Lcom/google/android/test/Test;.mL:J // field@0012
000d1e: 53b0 1200 |003d: iget-wide v0, v11, Lcom/google/android/test/Test;.mL:J // field@0012
@@ -651,7 +679,7 @@
000d26: bb20 |0041: add-long/2addr v0, v2
000d28: 5ab0 1200 |0042: iput-wide v0, v11, Lcom/google/android/test/Test;.mL:J // field@0012
000d2c: 52b0 1000 |0044: iget v0, v11, Lcom/google/android/test/Test;.mF:F // field@0010
-000d30: 1401 00e4 4046 |0046: const v1, #float 12345.000000 // #4640e400
+000d30: 1401 00e4 4046 |0046: const v1, #float 12345 // #4640e400
000d36: 52b2 1000 |0049: iget v2, v11, Lcom/google/android/test/Test;.mF:F // field@0010
000d3a: 1503 803f |004b: const/high16 v3, #int 1065353216 // #3f80
000d3e: c732 |004d: sub-float/2addr v2, v3
@@ -664,7 +692,7 @@
000d50: c610 |0056: add-float/2addr v0, v1
000d52: 59b0 1000 |0057: iput v0, v11, Lcom/google/android/test/Test;.mF:F // field@0010
000d56: 53b0 0f00 |0059: iget-wide v0, v11, Lcom/google/android/test/Test;.mD:D // field@000f
-000d5a: 1802 0000 0000 801c c840 |005b: const-wide v2, #double 12345.000000 // #40c81c8000000000
+000d5a: 1802 0000 0000 801c c840 |005b: const-wide v2, #double 12345 // #40c81c8000000000
000d64: 53b4 0f00 |0060: iget-wide v4, v11, Lcom/google/android/test/Test;.mD:D // field@000f
000d68: 1906 f03f |0062: const-wide/high16 v6, #long 4607182418800017408 // #3ff0
000d6c: cc64 |0064: sub-double/2addr v4, v6
@@ -681,7 +709,7 @@
000d8a: 2d00 0001 |0073: cmpl-float v0, v0, v1
000d8e: 3800 2900 |0075: if-eqz v0, 009e // +0029
000d92: 52b0 1000 |0077: iget v0, v11, Lcom/google/android/test/Test;.mF:F // field@0010
-000d96: 1401 9a99 993e |0079: const v1, #float 0.300000 // #3e99999a
+000d96: 1401 9a99 993e |0079: const v1, #float 0.3 // #3e99999a
000d9c: 2d00 0001 |007c: cmpl-float v0, v0, v1
000da0: 3900 2000 |007e: if-nez v0, 009e // +0020
000da4: 52b0 1000 |0080: iget v0, v11, Lcom/google/android/test/Test;.mF:F // field@0010
@@ -707,7 +735,7 @@
000df2: 2f00 0002 |00a7: cmpl-double v0, v0, v2
000df6: 3800 2b00 |00a9: if-eqz v0, 00d4 // +002b
000dfa: 53b0 0f00 |00ab: iget-wide v0, v11, Lcom/google/android/test/Test;.mD:D // field@000f
-000dfe: 1802 3333 3333 3333 d33f |00ad: const-wide v2, #double 0.300000 // #3fd3333333333333
+000dfe: 1802 3333 3333 3333 d33f |00ad: const-wide v2, #double 0.3 // #3fd3333333333333
000e08: 2f00 0002 |00b2: cmpl-double v0, v0, v2
000e0c: 3900 2000 |00b4: if-nez v0, 00d4 // +0020
000e10: 53b0 0f00 |00b6: iget-wide v0, v11, Lcom/google/android/test/Test;.mD:D // field@000f
@@ -790,7 +818,7 @@
000eb8: 8d00 |000c: int-to-byte v0, v0
000eba: 6b00 1700 |000d: sput-byte v0, Lcom/google/android/test/Test;.sB:B // field@0017
000ebe: 6500 1900 |000f: sget-char v0, Lcom/google/android/test/Test;.sC:C // field@0019
-000ec2: 1401 ffff 0000 |0011: const v1, #float 0.000000 // #0000ffff
+000ec2: 1401 ffff 0000 |0011: const v1, #float 9.18341e-41 // #0000ffff
000ec8: b010 |0014: add-int/2addr v0, v1
000eca: 8e00 |0015: int-to-char v0, v0
000ecc: 6c00 1900 |0016: sput-char v0, Lcom/google/android/test/Test;.sC:C // field@0019
@@ -799,7 +827,7 @@
000ed8: 8f00 |001c: int-to-short v0, v0
000eda: 6d00 1f00 |001d: sput-short v0, Lcom/google/android/test/Test;.sS:S // field@001f
000ede: 6000 1c00 |001f: sget v0, Lcom/google/android/test/Test;.sI:I // field@001c
-000ee2: 1401 7856 3412 |0021: const v1, #float 0.000000 // #12345678
+000ee2: 1401 7856 3412 |0021: const v1, #float 5.69046e-28 // #12345678
000ee8: b010 |0024: add-int/2addr v0, v1
000eea: 6700 1c00 |0025: sput v0, Lcom/google/android/test/Test;.sI:I // field@001c
000eee: 6000 1c00 |0027: sget v0, Lcom/google/android/test/Test;.sI:I // field@001c
@@ -807,7 +835,7 @@
000ef6: b010 |002b: add-int/2addr v0, v1
000ef8: 6700 1c00 |002c: sput v0, Lcom/google/android/test/Test;.sI:I // field@001c
000efc: 6100 1d00 |002e: sget-wide v0, Lcom/google/android/test/Test;.sL:J // field@001d
-000f00: 1802 ffff cdab 7956 3412 |0030: const-wide v2, #double 0.000000 // #12345679abcdffff
+000f00: 1802 ffff cdab 7956 3412 |0030: const-wide v2, #double 5.62635e-221 // #12345679abcdffff
000f0a: bb20 |0035: add-long/2addr v0, v2
000f0c: 6800 1d00 |0036: sput-wide v0, Lcom/google/android/test/Test;.sL:J // field@001d
000f10: 6100 1d00 |0038: sget-wide v0, Lcom/google/android/test/Test;.sL:J // field@001d
@@ -815,7 +843,7 @@
000f18: bb20 |003c: add-long/2addr v0, v2
000f1a: 6800 1d00 |003d: sput-wide v0, Lcom/google/android/test/Test;.sL:J // field@001d
000f1e: 6000 1b00 |003f: sget v0, Lcom/google/android/test/Test;.sF:F // field@001b
-000f22: 1401 00e4 4046 |0041: const v1, #float 12345.000000 // #4640e400
+000f22: 1401 00e4 4046 |0041: const v1, #float 12345 // #4640e400
000f28: 6002 1b00 |0044: sget v2, Lcom/google/android/test/Test;.sF:F // field@001b
000f2c: 7f22 |0046: neg-float v2, v2
000f2e: 1503 803f |0047: const/high16 v3, #int 1065353216 // #3f80
@@ -830,7 +858,7 @@
000f48: c610 |0054: add-float/2addr v0, v1
000f4a: 6700 1b00 |0055: sput v0, Lcom/google/android/test/Test;.sF:F // field@001b
000f4e: 6100 1a00 |0057: sget-wide v0, Lcom/google/android/test/Test;.sD:D // field@001a
-000f52: 1802 0000 0000 801c c840 |0059: const-wide v2, #double 12345.000000 // #40c81c8000000000
+000f52: 1802 0000 0000 801c c840 |0059: const-wide v2, #double 12345 // #40c81c8000000000
000f5c: 6104 1a00 |005e: sget-wide v4, Lcom/google/android/test/Test;.sD:D // field@001a
000f60: 8044 |0060: neg-double v4, v4
000f62: 1906 f03f |0061: const-wide/high16 v6, #long 4607182418800017408 // #3ff0
diff --git a/test/dexdump/checkers.txt b/test/dexdump/checkers.txt
old mode 100755
new mode 100644
index 5c8336f..aee6e64
--- a/test/dexdump/checkers.txt
+++ b/test/dexdump/checkers.txt
@@ -12,8 +12,8 @@
string_ids_off : 112 (0x000070)
type_ids_size : 58
type_ids_off : 1404 (0x00057c)
-proto_ids_size : 88
-proto_ids_off : 1636 (0x000664)
+proto_ids_size : 88
+proto_ids_off : 1636 (0x000664)
field_ids_size : 108
field_ids_off : 2692 (0x000a84)
method_ids_size : 177
@@ -836,7 +836,7 @@
001c8a: 1300 5829 |0147: const/16 v0, #int 10584 // #2958
001c8e: 2300 3600 |0149: new-array v0, v0, [B // type@0036
001c92: 6900 6800 |014b: sput-object v0, Lcom/google/android/checkers/g;.p:[B // field@0068
-001c96: 1400 00c1 0300 |014d: const v0, #float 0.000000 // #0003c100
+001c96: 1400 00c1 0300 |014d: const v0, #float 3.44742e-40 // #0003c100
001c9c: 2300 3600 |0150: new-array v0, v0, [B // type@0036
001ca0: 6900 6900 |0152: sput-object v0, Lcom/google/android/checkers/g;.q:[B // field@0069
001ca4: 6e10 1100 0a00 |0154: invoke-virtual {v10}, Landroid/content/Context;.getResources:()Landroid/content/res/Resources; // method@0011
@@ -2044,7 +2044,7 @@
002bd0: 5433 3b00 |004c: iget-object v3, v3, Lcom/google/android/checkers/a;.b:[I // field@003b
002bd4: 4403 0309 |004e: aget v3, v3, v9
002bd8: 5983 2a00 |0050: iput v3, v8, Lcom/google/android/checkers/CheckersView;.x:I // field@002a
-002bdc: 1403 6666 663f |0052: const v3, #float 0.900000 // #3f666666
+002bdc: 1403 6666 663f |0052: const v3, #float 0.9 // #3f666666
002be2: 5983 1e00 |0055: iput v3, v8, Lcom/google/android/checkers/CheckersView;.l:F // field@001e
002be6: 3800 4500 |0057: if-eqz v0, 009c // +0045
002bea: 5483 2200 |0059: iget-object v3, v8, Lcom/google/android/checkers/CheckersView;.p:Lcom/google/android/checkers/a; // field@0022
@@ -2943,7 +2943,7 @@
0036f2: 0800 1c00 |0197: move-object/from16 v0, v28
0036f6: 5202 1e00 |0199: iget v2, v0, Lcom/google/android/checkers/CheckersView;.l:F // field@001e
0036fa: 8922 |019b: float-to-double v2, v2
-0036fc: 1804 9a99 9999 9999 a93f |019c: const-wide v4, #double 0.050000 // #3fa999999999999a
+0036fc: 1804 9a99 9999 9999 a93f |019c: const-wide v4, #double 0.05 // #3fa999999999999a
003706: cc42 |01a1: sub-double/2addr v2, v4
003708: 8c22 |01a2: double-to-float v2, v2
00370a: 0800 1c00 |01a3: move-object/from16 v0, v28
@@ -3568,7 +3568,7 @@
003f38: 28e9 |001e: goto 0007 // -0017
003f3a: 1300 3075 |001f: const/16 v0, #int 30000 // #7530
003f3e: 28e6 |0021: goto 0007 // -001a
-003f40: 1400 60ea 0000 |0022: const v0, #float 0.000000 // #0000ea60
+003f40: 1400 60ea 0000 |0022: const v0, #float 8.40779e-41 // #0000ea60
003f46: 28e2 |0025: goto 0007 // -001e
003f48: 0d00 |0026: move-exception v0
003f4a: 1e02 |0027: monitor-exit v2
@@ -3811,7 +3811,7 @@
004024: 1302 0040 |0046: const/16 v2, #int 16384 // #4000
004028: 4b02 0001 |0048: aput v2, v0, v1
00402c: 1301 1300 |004a: const/16 v1, #int 19 // #13
-004030: 1402 0080 0000 |004c: const v2, #float 0.000000 // #00008000
+004030: 1402 0080 0000 |004c: const v2, #float 4.59177e-41 // #00008000
004036: 4b02 0001 |004f: aput v2, v0, v1
00403a: 1501 0100 |0051: const/high16 v1, #int 65536 // #1
00403e: 4b01 0006 |0053: aput v1, v0, v6
@@ -3931,7 +3931,7 @@
0041f6: 1302 0040 |012f: const/16 v2, #int 16384 // #4000
0041fa: 4b02 0001 |0131: aput v2, v0, v1
0041fe: 1301 1200 |0133: const/16 v1, #int 18 // #12
-004202: 1402 0080 0000 |0135: const v2, #float 0.000000 // #00008000
+004202: 1402 0080 0000 |0135: const v2, #float 4.59177e-41 // #00008000
004208: 4b02 0001 |0138: aput v2, v0, v1
00420c: 1301 1400 |013a: const/16 v1, #int 20 // #14
004210: 1502 0100 |013c: const/high16 v2, #int 65536 // #1
@@ -3996,7 +3996,7 @@
0042fa: 1301 0040 |01b1: const/16 v1, #int 16384 // #4000
0042fe: 4b01 0006 |01b3: aput v1, v0, v6
004302: 1301 1600 |01b5: const/16 v1, #int 22 // #16
-004306: 1402 0080 0000 |01b7: const v2, #float 0.000000 // #00008000
+004306: 1402 0080 0000 |01b7: const v2, #float 4.59177e-41 // #00008000
00430c: 4b02 0001 |01ba: aput v2, v0, v1
004310: 1301 1800 |01bc: const/16 v1, #int 24 // #18
004314: 1502 0200 |01be: const/high16 v2, #int 131072 // #2
@@ -4045,7 +4045,7 @@
0043b4: 1301 0040 |020e: const/16 v1, #int 16384 // #4000
0043b8: 4b01 0004 |0210: aput v1, v0, v4
0043bc: 1301 0b00 |0212: const/16 v1, #int 11 // #b
-0043c0: 1402 0080 0000 |0214: const v2, #float 0.000000 // #00008000
+0043c0: 1402 0080 0000 |0214: const v2, #float 4.59177e-41 // #00008000
0043c6: 4b02 0001 |0217: aput v2, v0, v1
0043ca: 1301 0d00 |0219: const/16 v1, #int 13 // #d
0043ce: 1502 0100 |021b: const/high16 v2, #int 65536 // #1
@@ -4167,7 +4167,7 @@
004588: 1301 0900 |02f8: const/16 v1, #int 9 // #9
00458c: 1302 0040 |02fa: const/16 v2, #int 16384 // #4000
004590: 4b02 0001 |02fc: aput v2, v0, v1
-004594: 1401 0080 0000 |02fe: const v1, #float 0.000000 // #00008000
+004594: 1401 0080 0000 |02fe: const v1, #float 4.59177e-41 // #00008000
00459a: 4b01 0004 |0301: aput v1, v0, v4
00459e: 1301 0c00 |0303: const/16 v1, #int 12 // #c
0045a2: 1502 0100 |0305: const/high16 v2, #int 65536 // #1
@@ -4226,7 +4226,7 @@
00466e: 1302 0040 |036b: const/16 v2, #int 16384 // #4000
004672: 4b02 0001 |036d: aput v2, v0, v1
004676: 1261 |036f: const/4 v1, #int 6 // #6
-004678: 1402 0080 0000 |0370: const v2, #float 0.000000 // #00008000
+004678: 1402 0080 0000 |0370: const v2, #float 4.59177e-41 // #00008000
00467e: 4b02 0001 |0373: aput v2, v0, v1
004682: 1301 0800 |0375: const/16 v1, #int 8 // #8
004686: 1502 0200 |0377: const/high16 v2, #int 131072 // #2
@@ -4496,7 +4496,7 @@
004c16: 3803 3400 |0047: if-eqz v3, 007b // +0034
004c1a: 0800 1800 |0049: move-object/from16 v0, v24
004c1e: 5203 5100 |004b: iget v3, v0, Lcom/google/android/checkers/a;.x:I // field@0051
-004c22: 1404 ffff 0f00 |004d: const v4, #float 0.000000 // #000fffff
+004c22: 1404 ffff 0f00 |004d: const v4, #float 1.46937e-39 // #000fffff
004c28: b534 |0050: and-int/2addr v4, v3
004c2a: 0800 1800 |0051: move-object/from16 v0, v24
004c2e: 5405 5200 |0053: iget-object v5, v0, Lcom/google/android/checkers/a;.y:[I // field@0052
@@ -4516,7 +4516,7 @@
004c66: 5405 5300 |006f: iget-object v5, v0, Lcom/google/android/checkers/a;.z:[S // field@0053
004c6a: 4a04 0504 |0071: aget-short v4, v5, v4
004c6e: 2c03 8104 0000 |0073: sparse-switch v3, 000004f4 // +00000481
-004c74: 1403 3f42 0f00 |0076: const v3, #float 0.000000 // #000f423f
+004c74: 1403 3f42 0f00 |0076: const v3, #float 1.4013e-39 // #000f423f
004c7a: 3334 a1ff |0079: if-ne v4, v3, 001a // -005f
004c7e: 0800 1800 |007b: move-object/from16 v0, v24
004c82: 0201 1b00 |007d: move/from16 v1, v27
@@ -4897,7 +4897,7 @@
0051da: 28c4 |0329: goto 02ed // -003c
0051dc: 0200 1900 |032a: move/from16 v0, v25
0051e0: 3704 4afd |032c: if-le v4, v0, 0076 // -02b6
-0051e4: 1404 3f42 0f00 |032e: const v4, #float 0.000000 // #000f423f
+0051e4: 1404 3f42 0f00 |032e: const v4, #float 1.4013e-39 // #000f423f
0051ea: 2900 45fd |0331: goto/16 0076 // -02bb
0051ee: 0200 1a00 |0333: move/from16 v0, v26
0051f2: 3404 f9ff |0335: if-lt v4, v0, 032e // -0007
@@ -5020,7 +5020,7 @@
0053a2: 3545 bd00 |040d: if-ge v5, v4, 04ca // +00bd
0053a6: 0800 1800 |040f: move-object/from16 v0, v24
0053aa: 5204 3e00 |0411: iget v4, v0, Lcom/google/android/checkers/a;.e:I // field@003e
-0053ae: 1405 1100 0088 |0413: const v5, #float -0.000000 // #88000011
+0053ae: 1405 1100 0088 |0413: const v5, #float -3.85187e-34 // #88000011
0053b4: b554 |0416: and-int/2addr v4, v5
0053b6: 3804 0900 |0417: if-eqz v4, 0420 // +0009
0053ba: 7110 9e00 0400 |0419: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
@@ -5052,11 +5052,11 @@
005418: 1507 00a0 |0448: const/high16 v7, #int -1610612736 // #a000
00541c: 3376 0400 |044a: if-ne v6, v7, 044e // +0004
005420: d803 03f4 |044c: add-int/lit8 v3, v3, #int -12 // #f4
-005424: 1406 0066 6600 |044e: const v6, #float 0.000000 // #00666600
+005424: 1406 0066 6600 |044e: const v6, #float 9.40381e-39 // #00666600
00542a: b564 |0451: and-int/2addr v4, v6
00542c: 7110 9e00 0400 |0452: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
005432: 0a04 |0455: move-result v4
-005434: 1406 0066 6600 |0456: const v6, #float 0.000000 // #00666600
+005434: 1406 0066 6600 |0456: const v6, #float 9.40381e-39 // #00666600
00543a: b565 |0459: and-int/2addr v5, v6
00543c: 7110 9e00 0500 |045a: invoke-static {v5}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
005442: 0a05 |045d: move-result v5
@@ -5064,13 +5064,13 @@
005446: b043 |045f: add-int/2addr v3, v4
005448: 0800 1800 |0460: move-object/from16 v0, v24
00544c: 5204 3d00 |0462: iget v4, v0, Lcom/google/android/checkers/a;.d:I // field@003d
-005450: 1405 1818 1818 |0464: const v5, #float 0.000000 // #18181818
+005450: 1405 1818 1818 |0464: const v5, #float 1.96577e-24 // #18181818
005456: b554 |0467: and-int/2addr v4, v5
005458: 7110 9e00 0400 |0468: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
00545e: 0a04 |046b: move-result v4
005460: 0800 1800 |046c: move-object/from16 v0, v24
005464: 5205 3f00 |046e: iget v5, v0, Lcom/google/android/checkers/a;.f:I // field@003f
-005468: 1406 1818 1818 |0470: const v6, #float 0.000000 // #18181818
+005468: 1406 1818 1818 |0470: const v6, #float 1.96577e-24 // #18181818
00546e: b565 |0473: and-int/2addr v5, v6
005470: 7110 9e00 0500 |0474: invoke-static {v5}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
005476: 0a05 |0477: move-result v5
@@ -5078,7 +5078,7 @@
00547a: b143 |0479: sub-int/2addr v3, v4
00547c: 0800 1800 |047a: move-object/from16 v0, v24
005480: 5204 3e00 |047c: iget v4, v0, Lcom/google/android/checkers/a;.e:I // field@003e
-005484: 1405 0800 0010 |047e: const v5, #float 0.000000 // #10000008
+005484: 1405 0800 0010 |047e: const v5, #float 2.52436e-29 // #10000008
00548a: b554 |0481: and-int/2addr v4, v5
00548c: 3804 0900 |0482: if-eqz v4, 048b // +0009
005490: 7110 9e00 0400 |0484: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
@@ -5087,7 +5087,7 @@
00549c: b143 |048a: sub-int/2addr v3, v4
00549e: 0800 1800 |048b: move-object/from16 v0, v24
0054a2: 5204 4000 |048d: iget v4, v0, Lcom/google/android/checkers/a;.g:I // field@0040
-0054a6: 1405 0800 0010 |048f: const v5, #float 0.000000 // #10000008
+0054a6: 1405 0800 0010 |048f: const v5, #float 2.52436e-29 // #10000008
0054ac: b554 |0492: and-int/2addr v4, v5
0054ae: 3804 4c00 |0493: if-eqz v4, 04df // +004c
0054b2: 7110 9e00 0400 |0495: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
@@ -5124,7 +5124,7 @@
00551c: 3745 56ff |04ca: if-le v5, v4, 0420 // -00aa
005520: 0800 1800 |04cc: move-object/from16 v0, v24
005524: 5204 4000 |04ce: iget v4, v0, Lcom/google/android/checkers/a;.g:I // field@0040
-005528: 1405 1100 0088 |04d0: const v5, #float -0.000000 // #88000011
+005528: 1405 1100 0088 |04d0: const v5, #float -3.85187e-34 // #88000011
00552e: b554 |04d3: and-int/2addr v4, v5
005530: 3804 4cff |04d4: if-eqz v4, 0420 // -00b4
005534: 7110 9e00 0400 |04d6: invoke-static {v4}, Ljava/lang/Integer;.bitCount:(I)I // method@009e
@@ -5407,7 +5407,7 @@
005868: 0126 |0010: move v6, v2
00586a: 0135 |0011: move v5, v3
00586c: 5240 5100 |0012: iget v0, v4, Lcom/google/android/checkers/a;.x:I // field@0051
-005870: 1401 ffff 0f00 |0014: const v1, #float 0.000000 // #000fffff
+005870: 1401 ffff 0f00 |0014: const v1, #float 1.46937e-39 // #000fffff
005876: b501 |0017: and-int/2addr v1, v0
005878: 5442 5200 |0018: iget-object v2, v4, Lcom/google/android/checkers/a;.y:[I // field@0052
00587c: 4b00 0201 |001a: aput v0, v2, v1
@@ -5568,19 +5568,19 @@
005a54: e203 1404 |0016: ushr-int/lit8 v3, v20, #int 4 // #04
005a58: b543 |0018: and-int/2addr v3, v4
005a5a: 3803 1200 |0019: if-eqz v3, 002b // +0012
-005a5e: 1401 e0e0 e0e0 |001b: const v1, #float -129633581999069331456.000000 // #e0e0e0e0
+005a5e: 1401 e0e0 e0e0 |001b: const v1, #float -1.29634e+20 // #e0e0e0e0
005a64: b531 |001e: and-int/2addr v1, v3
005a66: e201 0105 |001f: ushr-int/lit8 v1, v1, #int 5 // #05
-005a6a: 1405 0007 0707 |0021: const v5, #float 0.000000 // #07070700
+005a6a: 1405 0007 0707 |0021: const v5, #float 1.01583e-34 // #07070700
005a70: b553 |0024: and-int/2addr v3, v5
005a72: e203 0303 |0025: ushr-int/lit8 v3, v3, #int 3 // #03
005a76: b631 |0027: or-int/2addr v1, v3
005a78: b521 |0028: and-int/2addr v1, v2
005a7a: de01 0100 |0029: or-int/lit8 v1, v1, #int 0 // #00
-005a7e: 1403 e0e0 e0e0 |002b: const v3, #float -129633581999069331456.000000 // #e0e0e0e0
+005a7e: 1403 e0e0 e0e0 |002b: const v3, #float -1.29634e+20 // #e0e0e0e0
005a84: 9503 0314 |002e: and-int v3, v3, v20
005a88: e203 0305 |0030: ushr-int/lit8 v3, v3, #int 5 // #05
-005a8c: 1405 0007 0707 |0032: const v5, #float 0.000000 // #07070700
+005a8c: 1405 0007 0707 |0032: const v5, #float 1.01583e-34 // #07070700
005a92: 9505 0514 |0035: and-int v5, v5, v20
005a96: e205 0503 |0037: ushr-int/lit8 v5, v5, #int 3 // #03
005a9a: b653 |0039: or-int/2addr v3, v5
@@ -5597,19 +5597,19 @@
005abc: 3802 1500 |004a: if-eqz v2, 005f // +0015
005ac0: 0800 1100 |004c: move-object/from16 v0, v17
005ac4: 5203 3e00 |004e: iget v3, v0, Lcom/google/android/checkers/a;.e:I // field@003e
-005ac8: 1405 0707 0707 |0050: const v5, #float 0.000000 // #07070707
+005ac8: 1405 0707 0707 |0050: const v5, #float 1.01583e-34 // #07070707
005ace: b525 |0053: and-int/2addr v5, v2
005ad0: e005 0505 |0054: shl-int/lit8 v5, v5, #int 5 // #05
-005ad4: 1406 e0e0 e000 |0056: const v6, #float 0.000000 // #00e0e0e0
+005ad4: 1406 e0e0 e000 |0056: const v6, #float 2.06518e-38 // #00e0e0e0
005ada: b562 |0059: and-int/2addr v2, v6
005adc: e002 0203 |005a: shl-int/lit8 v2, v2, #int 3 // #03
005ae0: b652 |005c: or-int/2addr v2, v5
005ae2: b532 |005d: and-int/2addr v2, v3
005ae4: b621 |005e: or-int/2addr v1, v2
-005ae6: 1402 0707 0707 |005f: const v2, #float 0.000000 // #07070707
+005ae6: 1402 0707 0707 |005f: const v2, #float 1.01583e-34 // #07070707
005aec: 9502 0214 |0062: and-int v2, v2, v20
005af0: e002 0205 |0064: shl-int/lit8 v2, v2, #int 5 // #05
-005af4: 1403 e0e0 e000 |0066: const v3, #float 0.000000 // #00e0e0e0
+005af4: 1403 e0e0 e000 |0066: const v3, #float 2.06518e-38 // #00e0e0e0
005afa: 9503 0314 |0069: and-int v3, v3, v20
005afe: e003 0303 |006b: shl-int/lit8 v3, v3, #int 3 // #03
005b02: b632 |006d: or-int/2addr v2, v3
@@ -5802,19 +5802,19 @@
005dd4: 3803 1600 |01d6: if-eqz v3, 01ec // +0016
005dd8: 0800 1100 |01d8: move-object/from16 v0, v17
005ddc: 5201 4000 |01da: iget v1, v0, Lcom/google/android/checkers/a;.g:I // field@0040
-005de0: 1405 e0e0 e0e0 |01dc: const v5, #float -129633581999069331456.000000 // #e0e0e0e0
+005de0: 1405 e0e0 e0e0 |01dc: const v5, #float -1.29634e+20 // #e0e0e0e0
005de6: b535 |01df: and-int/2addr v5, v3
005de8: e205 0505 |01e0: ushr-int/lit8 v5, v5, #int 5 // #05
-005dec: 1406 0007 0707 |01e2: const v6, #float 0.000000 // #07070700
+005dec: 1406 0007 0707 |01e2: const v6, #float 1.01583e-34 // #07070700
005df2: b563 |01e5: and-int/2addr v3, v6
005df4: e203 0303 |01e6: ushr-int/lit8 v3, v3, #int 3 // #03
005df8: b653 |01e8: or-int/2addr v3, v5
005dfa: b531 |01e9: and-int/2addr v1, v3
005dfc: de01 0100 |01ea: or-int/lit8 v1, v1, #int 0 // #00
-005e00: 1403 e0e0 e0e0 |01ec: const v3, #float -129633581999069331456.000000 // #e0e0e0e0
+005e00: 1403 e0e0 e0e0 |01ec: const v3, #float -1.29634e+20 // #e0e0e0e0
005e06: 9503 0314 |01ef: and-int v3, v3, v20
005e0a: e203 0305 |01f1: ushr-int/lit8 v3, v3, #int 5 // #05
-005e0e: 1405 0007 0707 |01f3: const v5, #float 0.000000 // #07070700
+005e0e: 1405 0007 0707 |01f3: const v5, #float 1.01583e-34 // #07070700
005e14: 9505 0514 |01f6: and-int v5, v5, v20
005e18: e205 0503 |01f8: ushr-int/lit8 v5, v5, #int 3 // #03
005e1c: b653 |01fa: or-int/2addr v3, v5
@@ -5828,19 +5828,19 @@
005e34: e003 1404 |0206: shl-int/lit8 v3, v20, #int 4 // #04
005e38: b543 |0208: and-int/2addr v3, v4
005e3a: 3803 1100 |0209: if-eqz v3, 021a // +0011
-005e3e: 1405 0707 0707 |020b: const v5, #float 0.000000 // #07070707
+005e3e: 1405 0707 0707 |020b: const v5, #float 1.01583e-34 // #07070707
005e44: b535 |020e: and-int/2addr v5, v3
005e46: e005 0505 |020f: shl-int/lit8 v5, v5, #int 5 // #05
-005e4a: 1406 e0e0 e000 |0211: const v6, #float 0.000000 // #00e0e0e0
+005e4a: 1406 e0e0 e000 |0211: const v6, #float 2.06518e-38 // #00e0e0e0
005e50: b563 |0214: and-int/2addr v3, v6
005e52: e003 0303 |0215: shl-int/lit8 v3, v3, #int 3 // #03
005e56: b653 |0217: or-int/2addr v3, v5
005e58: b523 |0218: and-int/2addr v3, v2
005e5a: b631 |0219: or-int/2addr v1, v3
-005e5c: 1403 0707 0707 |021a: const v3, #float 0.000000 // #07070707
+005e5c: 1403 0707 0707 |021a: const v3, #float 1.01583e-34 // #07070707
005e62: 9503 0314 |021d: and-int v3, v3, v20
005e66: e003 0305 |021f: shl-int/lit8 v3, v3, #int 5 // #05
-005e6a: 1405 e0e0 e000 |0221: const v5, #float 0.000000 // #00e0e0e0
+005e6a: 1405 e0e0 e000 |0221: const v5, #float 2.06518e-38 // #00e0e0e0
005e70: 9505 0514 |0224: and-int v5, v5, v20
005e74: e005 0503 |0226: shl-int/lit8 v5, v5, #int 3 // #03
005e78: b653 |0228: or-int/2addr v3, v5
@@ -6423,9 +6423,9 @@
outs : 6
insns size : 461 16-bit code units
006604: |[006604] com.google.android.checkers.a.b:(IZI)Z
-006614: 1404 e0e0 e000 |0000: const v4, #float 0.000000 // #00e0e0e0
+006614: 1404 e0e0 e000 |0000: const v4, #float 2.06518e-38 // #00e0e0e0
00661a: 1216 |0003: const/4 v6, #int 1 // #1
-00661c: 1403 e0e0 e0e0 |0004: const v3, #float -129633581999069331456.000000 // #e0e0e0e0
+00661c: 1403 e0e0 e0e0 |0004: const v3, #float -1.29634e+20 // #e0e0e0e0
006622: 130a 0008 |0007: const/16 v10, #int 2048 // #800
006626: 1309 0002 |0009: const/16 v9, #int 512 // #200
00662a: 380d e400 |000b: if-eqz v13, 00ef // +00e4
@@ -6436,7 +6436,7 @@
00663e: 9502 0e03 |0015: and-int v2, v14, v3
006642: e202 0205 |0017: ushr-int/lit8 v2, v2, #int 5 // #05
006646: b621 |0019: or-int/2addr v1, v2
-006648: 1402 0007 0707 |001a: const v2, #float 0.000000 // #07070700
+006648: 1402 0007 0707 |001a: const v2, #float 1.01583e-34 // #07070700
00664e: b5e2 |001d: and-int/2addr v2, v14
006650: e202 0203 |001e: ushr-int/lit8 v2, v2, #int 3 // #03
006654: b621 |0020: or-int/2addr v1, v2
@@ -6453,14 +6453,14 @@
006676: 9502 0e03 |0031: and-int v2, v14, v3
00667a: e202 0205 |0033: ushr-int/lit8 v2, v2, #int 5 // #05
00667e: b621 |0035: or-int/2addr v1, v2
-006680: 1402 0007 0707 |0036: const v2, #float 0.000000 // #07070700
+006680: 1402 0007 0707 |0036: const v2, #float 1.01583e-34 // #07070700
006686: b5e2 |0039: and-int/2addr v2, v14
006688: e202 0203 |003a: ushr-int/lit8 v2, v2, #int 3 // #03
00668c: b621 |003c: or-int/2addr v1, v2
00668e: b510 |003d: and-int/2addr v0, v1
006690: 52b1 3e00 |003e: iget v1, v11, Lcom/google/android/checkers/a;.e:I // field@003e
006694: e002 0e04 |0040: shl-int/lit8 v2, v14, #int 4 // #04
-006698: 1403 0707 0707 |0042: const v3, #float 0.000000 // #07070707
+006698: 1403 0707 0707 |0042: const v3, #float 1.01583e-34 // #07070707
00669e: b5e3 |0045: and-int/2addr v3, v14
0066a0: e003 0305 |0046: shl-int/lit8 v3, v3, #int 5 // #05
0066a4: b632 |0048: or-int/2addr v2, v3
@@ -6563,7 +6563,7 @@
0067f6: 3900 5400 |00f1: if-nez v0, 0145 // +0054
0067fa: 52b0 3f00 |00f3: iget v0, v11, Lcom/google/android/checkers/a;.f:I // field@003f
0067fe: e001 0e04 |00f5: shl-int/lit8 v1, v14, #int 4 // #04
-006802: 1402 0707 0707 |00f7: const v2, #float 0.000000 // #07070707
+006802: 1402 0707 0707 |00f7: const v2, #float 1.01583e-34 // #07070707
006808: b5e2 |00fa: and-int/2addr v2, v14
00680a: e002 0205 |00fb: shl-int/lit8 v2, v2, #int 5 // #05
00680e: b621 |00fd: or-int/2addr v1, v2
@@ -6611,7 +6611,7 @@
0068a2: 52b1 3f00 |0147: iget v1, v11, Lcom/google/android/checkers/a;.f:I // field@003f
0068a6: b610 |0149: or-int/2addr v0, v1
0068a8: e001 0e04 |014a: shl-int/lit8 v1, v14, #int 4 // #04
-0068ac: 1402 0707 0707 |014c: const v2, #float 0.000000 // #07070707
+0068ac: 1402 0707 0707 |014c: const v2, #float 1.01583e-34 // #07070707
0068b2: b5e2 |014f: and-int/2addr v2, v14
0068b4: e002 0205 |0150: shl-int/lit8 v2, v2, #int 5 // #05
0068b8: b621 |0152: or-int/2addr v1, v2
@@ -6624,7 +6624,7 @@
0068ce: b5e3 |015d: and-int/2addr v3, v14
0068d0: e203 0305 |015e: ushr-int/lit8 v3, v3, #int 5 // #05
0068d4: b632 |0160: or-int/2addr v2, v3
-0068d6: 1403 0007 0707 |0161: const v3, #float 0.000000 // #07070700
+0068d6: 1403 0007 0707 |0161: const v3, #float 1.01583e-34 // #07070700
0068dc: b5e3 |0164: and-int/2addr v3, v14
0068de: e203 0303 |0165: ushr-int/lit8 v3, v3, #int 3 // #03
0068e2: b632 |0167: or-int/2addr v2, v3
diff --git a/test/dexdump/run-all-tests b/test/dexdump/run-all-tests
index 11ab55a..c9976cd 100755
--- a/test/dexdump/run-all-tests
+++ b/test/dexdump/run-all-tests
@@ -39,7 +39,7 @@
# Set up dexdump binary and flags to test.
DEXD="${ANDROID_HOST_OUT}/bin/dexdump2"
-DEXDFLAGS1="-dfh"
+DEXDFLAGS1="-adfh"
DEXDFLAGS2="-e -l xml"
# Set up dexlist binary and flags to test.
diff --git a/test/dexdump/staticfields.txt b/test/dexdump/staticfields.txt
index 022605f..f6d8f19 100644
--- a/test/dexdump/staticfields.txt
+++ b/test/dexdump/staticfields.txt
@@ -12,8 +12,8 @@
string_ids_off : 112 (0x000070)
type_ids_size : 12
type_ids_off : 224 (0x0000e0)
-proto_ids_size : 1
-proto_ids_off : 272 (0x000110)
+proto_ids_size : 1
+proto_ids_off : 272 (0x000110)
field_ids_size : 12
field_ids_off : 284 (0x00011c)
method_ids_size : 2
@@ -71,12 +71,12 @@
name : 'test05_public_static_final_float_46_47'
type : 'F'
access : 0x0019 (PUBLIC STATIC FINAL)
- value : 46.470001
+ value : 46.47
#6 : (in LStaticFields;)
name : 'test06_public_static_final_double_48_49'
type : 'D'
access : 0x0019 (PUBLIC STATIC FINAL)
- value : 48.490000
+ value : 48.49
#7 : (in LStaticFields;)
name : 'test07_public_static_final_string'
type : 'Ljava/lang/String;'
diff --git a/test/dexdump/staticfields.xml b/test/dexdump/staticfields.xml
index c906f0a..9082f0e 100644
--- a/test/dexdump/staticfields.xml
+++ b/test/dexdump/staticfields.xml
@@ -66,7 +66,7 @@
static="true"
final="true"
visibility="public"
- value="46.470001"
+ value="46.47"
>
</field>
<field name="test06_public_static_final_double_48_49"
@@ -76,7 +76,7 @@
static="true"
final="true"
visibility="public"
- value="48.490000"
+ value="48.49"
>
</field>
<field name="test07_public_static_final_string"
@@ -86,7 +86,7 @@
static="true"
final="true"
visibility="public"
- value="abc \><"'&	
"
+ value="abc \><"'&	
"
>
</field>
<field name="test08_public_static_final_object_null"
diff --git a/test/dexdump/values.dex b/test/dexdump/values.dex
new file mode 100644
index 0000000..84602d0
--- /dev/null
+++ b/test/dexdump/values.dex
Binary files differ
diff --git a/test/dexdump/values.lst b/test/dexdump/values.lst
new file mode 100644
index 0000000..0dbe3a9
--- /dev/null
+++ b/test/dexdump/values.lst
@@ -0,0 +1,3 @@
+#values.dex
+0x000003bc 8 Test <clinit> ()V Test.java 66
+0x000003d4 8 Test <init> ()V Test.java 1
diff --git a/test/dexdump/values.txt b/test/dexdump/values.txt
new file mode 100644
index 0000000..7f831b1
--- /dev/null
+++ b/test/dexdump/values.txt
@@ -0,0 +1,355 @@
+Processing 'values.dex'...
+Opened 'values.dex', DEX version '035'
+DEX file header:
+magic : 'dex\n035\0'
+checksum : 7605eec0
+signature : c197...a065
+file_size : 1864
+header_size : 112
+link_size : 0
+link_off : 0 (0x000000)
+string_ids_size : 70
+string_ids_off : 112 (0x000070)
+type_ids_size : 12
+type_ids_off : 392 (0x000188)
+proto_ids_size : 1
+proto_ids_off : 440 (0x0001b8)
+field_ids_size : 54
+field_ids_off : 452 (0x0001c4)
+method_ids_size : 3
+method_ids_off : 884 (0x000374)
+class_defs_size : 1
+class_defs_off : 908 (0x00038c)
+data_size : 924
+data_off : 940 (0x0003ac)
+
+Class #0 header:
+class_idx : 6
+access_flags : 1 (0x0001)
+superclass_idx : 7
+interfaces_off : 0 (0x000000)
+source_file_idx : 13
+annotations_off : 0 (0x000000)
+class_data_off : 1578 (0x00062a)
+static_fields_size : 54
+instance_fields_size: 0
+direct_methods_size : 2
+virtual_methods_size: 0
+
+Class #0 -
+ Class descriptor : 'LTest;'
+ Access flags : 0x0001 (PUBLIC)
+ Superclass : 'Ljava/lang/Object;'
+ Interfaces -
+ Static fields -
+ #0 : (in LTest;)
+ name : 'mB0'
+ type : 'B'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #1 : (in LTest;)
+ name : 'mB1'
+ type : 'B'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 127
+ #2 : (in LTest;)
+ name : 'mB2'
+ type : 'B'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -128
+ #3 : (in LTest;)
+ name : 'mB3'
+ type : 'B'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1
+ #4 : (in LTest;)
+ name : 'mC0'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #5 : (in LTest;)
+ name : 'mC1'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 32767
+ #6 : (in LTest;)
+ name : 'mC2'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 32768
+ #7 : (in LTest;)
+ name : 'mC3'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 255
+ #8 : (in LTest;)
+ name : 'mC4'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 65520
+ #9 : (in LTest;)
+ name : 'mC5'
+ type : 'C'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 65535
+ #10 : (in LTest;)
+ name : 'mD0'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -inf
+ #11 : (in LTest;)
+ name : 'mD1'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 4.94066e-324
+ #12 : (in LTest;)
+ name : 'mD2'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -0
+ #13 : (in LTest;)
+ name : 'mD3'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #14 : (in LTest;)
+ name : 'mD4'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 1.79769e+308
+ #15 : (in LTest;)
+ name : 'mD5'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : inf
+ #16 : (in LTest;)
+ name : 'mD6'
+ type : 'D'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : nan
+ #17 : (in LTest;)
+ name : 'mF0'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -inf
+ #18 : (in LTest;)
+ name : 'mF1'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 1.4013e-45
+ #19 : (in LTest;)
+ name : 'mF2'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -0
+ #20 : (in LTest;)
+ name : 'mF3'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #21 : (in LTest;)
+ name : 'mF4'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 3.40282e+38
+ #22 : (in LTest;)
+ name : 'mF5'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : inf
+ #23 : (in LTest;)
+ name : 'mF6'
+ type : 'F'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : nan
+ #24 : (in LTest;)
+ name : 'mI0'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #25 : (in LTest;)
+ name : 'mI1'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 2147483647
+ #26 : (in LTest;)
+ name : 'mI2'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -2147483648
+ #27 : (in LTest;)
+ name : 'mI3'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 255
+ #28 : (in LTest;)
+ name : 'mI4'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -16
+ #29 : (in LTest;)
+ name : 'mI5'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -4096
+ #30 : (in LTest;)
+ name : 'mI6'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1048576
+ #31 : (in LTest;)
+ name : 'mI7'
+ type : 'I'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1
+ #32 : (in LTest;)
+ name : 'mJ0'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #33 : (in LTest;)
+ name : 'mJ1'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 9223372036854775807
+ #34 : (in LTest;)
+ name : 'mJ2'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -9223372036854775808
+ #35 : (in LTest;)
+ name : 'mJ3'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 255
+ #36 : (in LTest;)
+ name : 'mJ4'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -16
+ #37 : (in LTest;)
+ name : 'mJ5'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -4096
+ #38 : (in LTest;)
+ name : 'mJ6'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1048576
+ #39 : (in LTest;)
+ name : 'mJ7'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -268435456
+ #40 : (in LTest;)
+ name : 'mJ8'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -68719476736
+ #41 : (in LTest;)
+ name : 'mJ9'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -17592186044416
+ #42 : (in LTest;)
+ name : 'mJa'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -4503599627370496
+ #43 : (in LTest;)
+ name : 'mJb'
+ type : 'J'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1
+ #44 : (in LTest;)
+ name : 'mObject'
+ type : 'Ljava/lang/Object;'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : null
+ #45 : (in LTest;)
+ name : 'mS0'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 0
+ #46 : (in LTest;)
+ name : 'mS1'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 32767
+ #47 : (in LTest;)
+ name : 'mS2'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -32768
+ #48 : (in LTest;)
+ name : 'mS3'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : 255
+ #49 : (in LTest;)
+ name : 'mS4'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -16
+ #50 : (in LTest;)
+ name : 'mS5'
+ type : 'S'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : -1
+ #51 : (in LTest;)
+ name : 'mString'
+ type : 'Ljava/lang/String;'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : "<&\"JOHO\"&>\n"
+ #52 : (in LTest;)
+ name : 'mZ0'
+ type : 'Z'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : false
+ #53 : (in LTest;)
+ name : 'mZ1'
+ type : 'Z'
+ access : 0x0019 (PUBLIC STATIC FINAL)
+ value : true
+ Instance fields -
+ Direct methods -
+ #0 : (in LTest;)
+ name : '<clinit>'
+ type : '()V'
+ access : 0x10008 (STATIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 0
+ outs : 0
+ insns size : 4 16-bit code units
+0003ac: |[0003ac] Test.<clinit>:()V
+0003bc: 1200 |0000: const/4 v0, #int 0 // #0
+0003be: 6900 2c00 |0001: sput-object v0, LTest;.mObject:Ljava/lang/Object; // field@002c
+0003c2: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=66
+ locals :
+
+ #1 : (in LTest;)
+ name : '<init>'
+ type : '()V'
+ access : 0x10001 (PUBLIC CONSTRUCTOR)
+ code -
+ registers : 1
+ ins : 1
+ outs : 1
+ insns size : 4 16-bit code units
+0003c4: |[0003c4] Test.<init>:()V
+0003d4: 7010 0200 0000 |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // method@0002
+0003da: 0e00 |0003: return-void
+ catches : (none)
+ positions :
+ 0x0000 line=1
+ locals :
+ 0x0000 - 0x0004 reg=0 this LTest;
+
+ Virtual methods -
+ source_file_idx : 13 (Test.java)
+
diff --git a/test/dexdump/values.xml b/test/dexdump/values.xml
new file mode 100644
index 0000000..d6ba48d
--- /dev/null
+++ b/test/dexdump/values.xml
@@ -0,0 +1,561 @@
+<api>
+<package name=""
+>
+<class name="Test"
+ extends="java.lang.Object"
+ interface="false"
+ abstract="false"
+ static="false"
+ final="false"
+ visibility="public"
+>
+<field name="mB0"
+ type="byte"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mB1"
+ type="byte"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="127"
+>
+</field>
+<field name="mB2"
+ type="byte"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-128"
+>
+</field>
+<field name="mB3"
+ type="byte"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1"
+>
+</field>
+<field name="mC0"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mC1"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="32767"
+>
+</field>
+<field name="mC2"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="32768"
+>
+</field>
+<field name="mC3"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="255"
+>
+</field>
+<field name="mC4"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="65520"
+>
+</field>
+<field name="mC5"
+ type="char"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="65535"
+>
+</field>
+<field name="mD0"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-inf"
+>
+</field>
+<field name="mD1"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="4.94066e-324"
+>
+</field>
+<field name="mD2"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-0"
+>
+</field>
+<field name="mD3"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mD4"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="1.79769e+308"
+>
+</field>
+<field name="mD5"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="inf"
+>
+</field>
+<field name="mD6"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="nan"
+>
+</field>
+<field name="mF0"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-inf"
+>
+</field>
+<field name="mF1"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="1.4013e-45"
+>
+</field>
+<field name="mF2"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-0"
+>
+</field>
+<field name="mF3"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mF4"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="3.40282e+38"
+>
+</field>
+<field name="mF5"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="inf"
+>
+</field>
+<field name="mF6"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="nan"
+>
+</field>
+<field name="mI0"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mI1"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="2147483647"
+>
+</field>
+<field name="mI2"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-2147483648"
+>
+</field>
+<field name="mI3"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="255"
+>
+</field>
+<field name="mI4"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-16"
+>
+</field>
+<field name="mI5"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-4096"
+>
+</field>
+<field name="mI6"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1048576"
+>
+</field>
+<field name="mI7"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1"
+>
+</field>
+<field name="mJ0"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mJ1"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="9223372036854775807"
+>
+</field>
+<field name="mJ2"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-9223372036854775808"
+>
+</field>
+<field name="mJ3"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="255"
+>
+</field>
+<field name="mJ4"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-16"
+>
+</field>
+<field name="mJ5"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-4096"
+>
+</field>
+<field name="mJ6"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1048576"
+>
+</field>
+<field name="mJ7"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-268435456"
+>
+</field>
+<field name="mJ8"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-68719476736"
+>
+</field>
+<field name="mJ9"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-17592186044416"
+>
+</field>
+<field name="mJa"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-4503599627370496"
+>
+</field>
+<field name="mJb"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1"
+>
+</field>
+<field name="mObject"
+ type="java.lang.Object"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="null"
+>
+</field>
+<field name="mS0"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="0"
+>
+</field>
+<field name="mS1"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="32767"
+>
+</field>
+<field name="mS2"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-32768"
+>
+</field>
+<field name="mS3"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="255"
+>
+</field>
+<field name="mS4"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-16"
+>
+</field>
+<field name="mS5"
+ type="short"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="-1"
+>
+</field>
+<field name="mString"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="<&"JOHO"&>
"
+>
+</field>
+<field name="mZ0"
+ type="boolean"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="false"
+>
+</field>
+<field name="mZ1"
+ type="boolean"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ visibility="public"
+ value="true"
+>
+</field>
+<constructor name="Test"
+ type="Test"
+ static="false"
+ final="false"
+ visibility="public"
+>
+</constructor>
+</class>
+</package>
+</api>