am 8e88bab0: Keep annotated classes in main dex list
* commit '8e88bab04f03edbbc74fb61b31a847c22106bfab':
Keep annotated classes in main dex list
diff --git a/tools/hprof-conv/HprofConv.c b/tools/hprof-conv/HprofConv.c
index bd8bc4f..bd61e36 100644
--- a/tools/hprof-conv/HprofConv.c
+++ b/tools/hprof-conv/HprofConv.c
@@ -25,6 +25,7 @@
#include <stdint.h>
#include <errno.h>
#include <assert.h>
+#include <unistd.h>
//#define VERBOSE_DEBUG
#ifdef VERBOSE_DEBUG
@@ -84,9 +85,17 @@
HPROF_PRIMITIVE_ARRAY_NODATA_DUMP = 0xc3,
} HprofHeapTag;
+typedef enum HprofHeapId {
+ HPROF_HEAP_DEFAULT = 0,
+ HPROF_HEAP_ZYGOTE = 'Z',
+ HPROF_HEAP_APP = 'A',
+ HPROF_HEAP_IMAGE = 'I',
+} HprofHeapId;
+
#define kIdentSize 4
#define kRecHdrLen 9
+#define kFlagAppOnly 1
/*
* ===========================================================================
@@ -423,13 +432,15 @@
* Crunch through a heap dump record, writing the original or converted
* data to "out".
*/
-static int processHeapDump(ExpandBuf* pBuf, FILE* out)
+static int processHeapDump(ExpandBuf* pBuf, FILE* out, int flags)
{
ExpandBuf* pOutBuf = ebAlloc();
unsigned char* origBuf = ebGetBuffer(pBuf);
unsigned char* buf = origBuf;
int len = ebGetLength(pBuf);
int result = -1;
+ int heapType = HPROF_HEAP_DEFAULT;
+ int heapIgnore = FALSE;
pBuf = NULL; /* we just use the raw pointer from here forward */
@@ -480,16 +491,31 @@
break;
case HPROF_INSTANCE_DUMP:
subLen = computeInstanceDumpLen(buf+1, len-1);
+ if (heapIgnore) {
+ justCopy = FALSE;
+ }
break;
case HPROF_OBJECT_ARRAY_DUMP:
subLen = computeObjectArrayDumpLen(buf+1, len-1);
+ if (heapIgnore) {
+ justCopy = FALSE;
+ }
break;
case HPROF_PRIMITIVE_ARRAY_DUMP:
subLen = computePrimitiveArrayDumpLen(buf+1, len-1);
+ if (heapIgnore) {
+ justCopy = FALSE;
+ }
break;
-
/* these were added for Android in 1.0.3 */
case HPROF_HEAP_DUMP_INFO:
+ heapType = get4BE(buf+1);
+ if ((flags & kFlagAppOnly) != 0
+ && (heapType == HPROF_HEAP_ZYGOTE || heapType == HPROF_HEAP_IMAGE)) {
+ heapIgnore = TRUE;
+ } else {
+ heapIgnore = FALSE;
+ }
justCopy = FALSE;
subLen = kIdentSize + 4;
// no 1.0.2 equivalent for this
@@ -570,7 +596,7 @@
/*
* Filter an hprof data file.
*/
-static int filterData(FILE* in, FILE* out)
+static int filterData(FILE* in, FILE* out, int flags)
{
const char *magicString;
ExpandBuf* pBuf;
@@ -645,12 +671,11 @@
goto bail;
}
- if (type == HPROF_TAG_HEAP_DUMP ||
- type == HPROF_TAG_HEAP_DUMP_SEGMENT)
- {
+ if (type == HPROF_TAG_HEAP_DUMP
+ || type == HPROF_TAG_HEAP_DUMP_SEGMENT) {
DBUG("Processing heap dump 0x%02x (%d bytes)\n",
type, length);
- if (processHeapDump(pBuf, out) != 0)
+ if (processHeapDump(pBuf, out, flags) != 0)
goto bail;
ebClear(pBuf);
} else {
@@ -668,57 +693,75 @@
return result;
}
-/*
- * Get args.
- */
+static FILE* fopen_or_default(const char* path, const char* mode, FILE* def) {
+ if (!strcmp(path, "-")) {
+ return def;
+ } else {
+ return fopen(path, mode);
+ }
+}
+
int main(int argc, char** argv)
{
- FILE* in = stdin;
- FILE* out = stdout;
- int cc;
+ FILE* in = NULL;
+ FILE* out = NULL;
+ int flags = 0;
+ int res = 1;
- if (argc != 3) {
- fprintf(stderr, "Usage: hprof-conf infile outfile\n\n");
- fprintf(stderr,
- "Specify '-' for either or both to use stdin/stdout.\n\n");
-
- fprintf(stderr,
- "Copyright (C) 2009 The Android Open Source Project\n\n"
- "This software is built from source code licensed under the "
- "Apache License,\n"
- "Version 2.0 (the \"License\"). You may obtain a copy of the "
- "License at\n\n"
- " http://www.apache.org/licenses/LICENSE-2.0\n\n"
- "See the associated NOTICE file for this software for further "
- "details.\n");
-
- return 2;
- }
-
- if (strcmp(argv[1], "-") != 0) {
- in = fopen(argv[1], "rb");
- if (in == NULL) {
- fprintf(stderr, "ERROR: failed to open input '%s': %s\n",
- argv[1], strerror(errno));
- return 1;
- }
- }
- if (strcmp(argv[2], "-") != 0) {
- out = fopen(argv[2], "wb");
- if (out == NULL) {
- fprintf(stderr, "ERROR: failed to open output '%s': %s\n",
- argv[2], strerror(errno));
- if (in != stdin)
- fclose(in);
- return 1;
+ int opt;
+ while ((opt = getopt(argc, argv, "z")) != -1) {
+ switch (opt) {
+ case 'z':
+ flags |= kFlagAppOnly;
+ break;
+ case '?':
+ default:
+ goto usage;
}
}
- cc = filterData(in, out);
+ int i;
+ for (i = optind; i < argc; i++) {
+ char* arg = argv[i];
+ if (!in) {
+ in = fopen_or_default(arg, "rb", stdin);
+ } else if (!out) {
+ out = fopen_or_default(arg, "wb", stdout);
+ } else {
+ goto usage;
+ }
+ }
+ if (in == NULL || out == NULL) {
+ goto usage;
+ }
+
+ res = filterData(in, out, flags);
+ goto finish;
+
+usage:
+ fprintf(stderr, "Usage: hprof-conf [-z] infile outfile\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, " -z: exclude non-app heaps, such as Zygote\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "Specify '-' for either or both files to use stdin/stdout.\n");
+ fprintf(stderr, "\n");
+
+ fprintf(stderr,
+ "Copyright (C) 2009 The Android Open Source Project\n\n"
+ "This software is built from source code licensed under the "
+ "Apache License,\n"
+ "Version 2.0 (the \"License\"). You may obtain a copy of the "
+ "License at\n\n"
+ " http://www.apache.org/licenses/LICENSE-2.0\n\n"
+ "See the associated NOTICE file for this software for further "
+ "details.\n");
+ res = 2;
+
+finish:
if (in != stdin)
fclose(in);
if (out != stdout)
fclose(out);
- return (cc != 0);
+ return res;
}