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