/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.traceview; import com.android.sdkstats.SdkStatsService; import org.eclipse.jface.window.ApplicationWindow; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import java.io.File; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.util.HashMap; public class MainWindow extends ApplicationWindow { private final static String PING_NAME = "Traceview"; private final static String PING_VERSION = "1.0"; private TraceReader mReader; private String mTraceName; // A global cache of string names. public static HashMap<String, String> sStringCache = new HashMap<String, String>(); public MainWindow(String traceName, TraceReader reader) { super(null); mReader = reader; mTraceName = traceName; } public void run() { setBlockOnOpen(true); open(); Display.getCurrent().dispose(); } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText("Traceview: " + mTraceName); shell.setBounds(100, 10, 1282, 900); } @Override protected Control createContents(Composite parent) { ColorController.assignMethodColors(parent.getDisplay(), mReader.getMethods()); SelectionController selectionController = new SelectionController(); GridLayout gridLayout = new GridLayout(1, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; gridLayout.horizontalSpacing = 0; gridLayout.verticalSpacing = 0; parent.setLayout(gridLayout); Display display = parent.getDisplay(); Color darkGray = display.getSystemColor(SWT.COLOR_DARK_GRAY); // Create a sash form to separate the timeline view (on top) // and the profile view (on bottom) SashForm sashForm1 = new SashForm(parent, SWT.VERTICAL); sashForm1.setBackground(darkGray); sashForm1.SASH_WIDTH = 3; GridData data = new GridData(GridData.FILL_BOTH); sashForm1.setLayoutData(data); // Create the timeline view new TimeLineView(sashForm1, mReader, selectionController); // Create the profile view new ProfileView(sashForm1, mReader, selectionController); return sashForm1; } /** * Convert the old two-file format into the current concatenated one. * * @param base Base path of the two files, i.e. base.key and base.data * @return Path to a temporary file that will be deleted on exit. * @throws IOException */ private static String makeTempTraceFile(String base) throws IOException { // Make a temporary file that will go away on exit and prepare to // write into it. File temp = File.createTempFile(base, ".trace"); temp.deleteOnExit(); FileChannel dstChannel = new FileOutputStream(temp).getChannel(); // First copy the contents of the key file into our temp file. FileChannel srcChannel = new FileInputStream(base + ".key").getChannel(); long size = dstChannel.transferFrom(srcChannel, 0, srcChannel.size()); srcChannel.close(); // Then concatenate the data file. srcChannel = new FileInputStream(base + ".data").getChannel(); dstChannel.transferFrom(srcChannel, size, srcChannel.size()); // Clean up. srcChannel.close(); dstChannel.close(); // Return the path of the temp file. return temp.getPath(); } public static void main(String[] args) { TraceReader reader = null; boolean regression = false; // ping the usage server SdkStatsService.ping(PING_NAME, PING_VERSION); // Process command line arguments int argc = 0; int len = args.length; while (argc < len) { String arg = args[argc]; if (arg.charAt(0) != '-') { break; } if (arg.equals("-r")) { regression = true; } else { break; } argc++; } if (argc != len - 1) { System.out.printf("Usage: java %s [-r] trace%n", MainWindow.class.getName()); System.out.printf(" -r regression only%n"); return; } String traceName = args[len - 1]; File file = new File(traceName); if (file.exists() && file.isDirectory()) { System.out.printf("Qemu trace files not supported yet.\n"); System.exit(1); // reader = new QtraceReader(traceName); } else { // If the filename as given doesn't exist... if (!file.exists()) { // Try appending .trace. if (new File(traceName + ".trace").exists()) { traceName = traceName + ".trace"; // Next, see if it is the old two-file trace. } else if (new File(traceName + ".data").exists() && new File(traceName + ".key").exists()) { try { traceName = makeTempTraceFile(traceName); } catch (IOException e) { System.err.printf("cannot convert old trace file '%s'\n", traceName); System.exit(1); } // Otherwise, give up. } else { System.err.printf("trace file '%s' not found\n", traceName); System.exit(1); } } reader = new DmTraceReader(traceName, regression); } reader.getTraceUnits().setTimeScale(TraceUnits.TimeScale.MilliSeconds); new MainWindow(traceName, reader).run(); } }