19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectInputStream;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedInputStream;
219d2d6e14b0932b6a74e01f393d5efed61458941bBob Leeimport java.io.Writer;
229d2d6e14b0932b6a74e01f393d5efed61458941bBob Leeimport java.io.PrintStream;
232e93f65cab0b4b21a1285b83e985559325e87a3aBob Leeimport java.util.Set;
242e93f65cab0b4b21a1285b83e985559325e87a3aBob Leeimport java.util.HashSet;
252e93f65cab0b4b21a1285b83e985559325e87a3aBob Leeimport java.util.TreeSet;
269d2d6e14b0932b6a74e01f393d5efed61458941bBob Leeimport java.util.Iterator;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prints raw information in CSV format.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PrintCsv {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void main(String[] args)
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, ClassNotFoundException {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (args.length != 1) {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Usage: PrintCsv [compiled log file]");
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.exit(0);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Root root = Root.fromFile(args[0]);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        printHeaders(System.out);
439d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
449d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        MemoryUsage baseline = MemoryUsage.baseline();
459d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
469d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        for (LoadedClass loadedClass : root.loadedClasses.values()) {
479d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            if (!loadedClass.systemClass) {
489d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                continue;
499d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            }
509d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
519d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            printRow(System.out, baseline, loadedClass);
529d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        }
539d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee    }
549d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
559d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee    static void printHeaders(PrintStream out) {
569d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.println("Name"
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ",Preloaded"
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ",Median Load Time (us)"
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ",Median Init Time (us)"
602e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee                + ",Process Names"
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ",Load Count"
629d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Init Count"
639d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Managed Heap (B)"
649d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Native Heap (B)"
659d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Managed Pages (kB)"
669d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Native Pages (kB)"
679d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                + ",Other Pages (kB)");
689d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee    static void printRow(PrintStream out, MemoryUsage baseline,
719d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            LoadedClass loadedClass) {
729d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.name);
739d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
749d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.preloaded);
759d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
769d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.medianLoadTimeMicros());
779d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
789d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.medianInitTimeMicros());
799d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
809d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print('"');
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        Set<String> procNames = new TreeSet<String>();
839d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        for (Operation op : loadedClass.loads)
849d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            procNames.add(op.process.name);
859d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        for (Operation op : loadedClass.initializations)
869d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            procNames.add(op.process.name);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        if (procNames.size() <= 3) {
892e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee            for (String name : procNames) {
909d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                out.print(name + "\n");
912e93f65cab0b4b21a1285b83e985559325e87a3aBob Lee            }
929d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        } else {
939d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            Iterator<String> i = procNames.iterator();
949d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(i.next() + "\n");
959d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(i.next() + "\n");
969d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print("...and " + (procNames.size() - 2)
979d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                    + " others.");
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
999d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
1009d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print('"');
1019d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
1029d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.loads.size());
1039d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(',');
1049d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.print(loadedClass.initializations.size());
1059d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
1069d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        if (loadedClass.memoryUsage.isAvailable()) {
1079d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            MemoryUsage subtracted
1089d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee                    = loadedClass.memoryUsage.subtract(baseline);
1099d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
1109d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(',');
1119d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(subtracted.javaHeapSize());
1129d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(',');
1139d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(subtracted.nativeHeapSize);
1149d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(',');
1159d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(subtracted.javaPagesInK());
1169d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(',');
1179d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(subtracted.nativePagesInK());
1189d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(',');
1199d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(subtracted.otherPagesInK());
1209d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
1219d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        } else {
1229d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee            out.print(",n/a,n/a,n/a,n/a,n/a");
1239d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        }
1249d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee
1259d2d6e14b0932b6a74e01f393d5efed61458941bBob Lee        out.println();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
128