1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.BufferedReader;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream;
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.IOException;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.InputStreamReader;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.ArrayList;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Parses and analyzes a log, pulling our PRELOAD information. If you have
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * an emulator or device running in the background, this class will use it
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * to measure and record the memory usage of each class.
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * TODO: Should analyze lines and select substring dynamically (instead of hardcoded 19)
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class Compile {
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public static void main(String[] args) throws IOException {
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (args.length != 2) {
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.err.println("Usage: Compile [log file] [output file]");
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.exit(0);
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Root root = new Root();
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        List<Record> records = new ArrayList<Record>();
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        BufferedReader in = new BufferedReader(new InputStreamReader(
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                new FileInputStream(args[0])));
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        String line;
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int lineNumber = 0;
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        while ((line = in.readLine()) != null) {
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            lineNumber++;
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (line.startsWith("I/PRELOAD")) {
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                try {
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    String clipped = line.substring(19);
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    records.add(new Record(clipped, lineNumber));
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                } catch (RuntimeException e) {
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    throw new RuntimeException(
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                            "Exception while recording line " + lineNumber + ": " + line, e);
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                }
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (Record record : records) {
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            root.indexProcess(record);
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (Record record : records) {
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            root.indexClassOperation(record);
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        in.close();
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        root.toFile(args[1]);
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
74