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.BufferedReader;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStreamReader;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parses and analyzes a log, pulling our PRELOAD information. If you have
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an emulator or device running in the background, this class will use it
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to measure and record the memory usage of each class.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Should analyze lines and select substring dynamically (instead of hardcoded 19)
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Compile {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void main(String[] args) throws IOException {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (args.length != 2) {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Usage: Compile [log file] [output file]");
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.exit(0);
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Root root = new Root();
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List<Record> records = new ArrayList<Record>();
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        BufferedReader in = new BufferedReader(new InputStreamReader(
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new FileInputStream(args[0])));
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String line;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lineNumber = 0;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((line = in.readLine()) != null) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            lineNumber++;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (line.startsWith("I/PRELOAD")) {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String clipped = line.substring(19);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    records.add(new Record(clipped, lineNumber));
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (RuntimeException e) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException(
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Exception while recording line " + lineNumber + ": " + line, e);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Record record : records) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.indexProcess(record);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (Record record : records) {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            root.indexClassOperation(record);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        in.close();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root.toFile(args[1]);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
74