OSDN Git Service

Fix HierarchyViewer2 to run on MacOS X correctly.
authorXavier Ducrohet <xav@android.com>
Wed, 1 Sep 2010 00:50:58 +0000 (17:50 -0700)
committerXavier Ducrohet <xav@android.com>
Wed, 1 Sep 2010 02:21:40 +0000 (19:21 -0700)
This also fix the issue with the app never closing correctly
(throwing an exception).

Also updated the launcher script to match the new ones we use in
the other Java based tools.

Change-Id: I851f0732a78c6e6c072728f05e611f01eee8fc19

ddms/app/src/com/android/ddms/Main.java
hierarchyviewer2/app/etc/hierarchyviewer
hierarchyviewer2/app/etc/manifest.txt
hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplication.java
hierarchyviewer2/app/src/com/android/hierarchyviewer/HierarchyViewerApplicationDirector.java
hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/QuitAction.java
hierarchyviewer2/app/src/com/android/hierarchyviewer/actions/ShowOverlayAction.java
hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt [new file with mode: 0644]
hierarchyviewer2/libs/hierarchyviewerlib/src/Android.mk
traceview/src/com/android/traceview/MainWindow.java

index 050519f..cd01fc9 100644 (file)
@@ -25,8 +25,6 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
 import java.util.Properties;
@@ -49,12 +47,7 @@ public class Main {
     private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
         public void uncaughtException(Thread t, Throwable e) {
             Log.e("ddms", "shutting down due to uncaught exception");
-
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            e.printStackTrace(pw);
-            Log.e("ddms", sw.toString());
-
+            Log.e("ddms", e);
             System.exit(1);
         }
     }
index 18a3aca..32dd2b8 100755 (executable)
@@ -15,6 +15,7 @@
 
 # Set up prog to be the path of this script, including following symlinks,
 # and set up progdir to be the fully-qualified pathname of its directory.
+
 prog="$0"
 while [ -h "${prog}" ]; do
     newProg=`/bin/ls -ld "${prog}"`
@@ -52,6 +53,7 @@ then
     exit 1
 fi
 
+
 # Check args.
 if [ debug = "$1" ]; then
     # add this in for debugging
@@ -61,9 +63,12 @@ else
     java_debug=
 fi
 
+javaCmd="java"
+
 # Mac OS X needs an additional arg, or you get an "illegal thread" complaint.
 if [ `uname` = "Darwin" ]; then
-    os_opts="-XstartOnFirstThread"
+    os_opts=
+#    os_opts="-XstartOnFirstThread"
 else
     os_opts=
 fi
@@ -72,12 +77,7 @@ if [ `uname` = "Linux" ]; then
     export GDK_NATIVE_WINDOWS=true
 fi
 
-if [ "$OSTYPE" = "cygwin" ] ; then
-    jarpath=`cygpath -w  "$frameworkdir/$jarfile"`
-    progdir=`cygpath -w  "$progdir"`
-else
-    jarpath="$frameworkdir/$jarfile"
-fi
+jarpath="$frameworkdir/$jarfile"
 
 # Figure out the path to the swt.jar for the current architecture.
 # if ANDROID_SWT is defined, then just use this.
@@ -87,7 +87,7 @@ swtpath=""
 if [ -n "$ANDROID_SWT" ]; then
     swtpath="$ANDROID_SWT"
 else
-    vmarch=`java -jar "${frameworkdir}"/archquery.jar`
+    vmarch=`${javaCmd} -jar "${frameworkdir}"/archquery.jar`
     if [ -n "$ANDROID_BUILD_TOP" ]; then
         osname=`uname -s | tr A-Z a-z`
         swtpath="${ANDROID_BUILD_TOP}/prebuilt/${osname}-${vmarch}/swt"
@@ -96,10 +96,7 @@ else
     fi
 fi
 
-# Combine the swtpath and the framework dir path.
-if [ -d "$swtpath" ]; then
-    frameworkdir="${swtpath}:${frameworkdir}"
-else
+if [ ! -d "$swtpath" ]; then
     echo "SWT folder '${swtpath}' does not exist."
     echo "Please export ANDROID_SWT to point to the folder containing swt.jar for your platform."
     exit 1
@@ -107,4 +104,4 @@ fi
 
 # need to use "java.ext.dirs" because "-jar" causes classpath to be ignored
 # might need more memory, e.g. -Xmx128M
-exec java -Xmx512M $java_debug -Djava.ext.dirs="$frameworkdir" -Dcom.android.hierarchyviewer.bindir="$progdir" -jar "$jarpath" "$@"
+exec "$javaCmd" -Xmx5126M $os_opts $java_debug -Dcom.android.hierarchyviewer.bindir="$progdir" -classpath "$jarpath:$swtpath/swt.jar" com.android.hierarchyviewer.HierarchyViewerApplication "$@"
index c1b0666..52759c9 100644 (file)
@@ -1,2 +1,2 @@
 Main-Class: com.android.hierarchyviewer.HierarchyViewerApplication
-Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar swt.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar sdklib.jar
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar sdklib.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
index df4f08f..25943c4 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.android.hierarchyviewer;
 
+import com.android.ddmlib.Log;
 import com.android.ddmuilib.ImageLoader;
 import com.android.hierarchyviewer.actions.AboutAction;
 import com.android.hierarchyviewer.actions.LoadAllViewsAction;
@@ -81,77 +82,65 @@ import org.eclipse.swt.widgets.Shell;
 public class HierarchyViewerApplication extends ApplicationWindow {
 
     private static final int INITIAL_WIDTH = 1024;
-
     private static final int INITIAL_HEIGHT = 768;
 
-    private static HierarchyViewerApplication mApp;
+    private static HierarchyViewerApplication sMainWindow;
 
     // Images for moving between the 3 main windows.
-
     private Image mDeviceViewImage;
-
     private Image mPixelPerfectImage;
-
     private Image mTreeViewImage;
-
     private Image mDeviceViewSelectedImage;
-
     private Image mPixelPerfectSelectedImage;
-
     private Image mTreeViewSelectedImage;
 
     // And their buttons
-
     private Button mTreeViewButton;
-
     private Button mPixelPerfectButton;
-
     private Button mDeviceViewButton;
 
     private Label mProgressLabel;
-
     private ProgressBar mProgressBar;
-
     private String mProgressString;
 
     private Composite mDeviceSelectorPanel;
-
     private Composite mTreeViewPanel;
-
     private Composite mPixelPerfectPanel;
-
     private StackLayout mMainWindowStackLayout;
-
     private DeviceSelector mDeviceSelector;
-
     private Composite mStatusBar;
-
     private TreeView mTreeView;
-
     private Composite mMainWindow;
-
     private Image mOnBlackImage;
-
     private Image mOnWhiteImage;
-
     private Button mOnBlackWhiteButton;
-
     private Button mShowExtras;
-
     private LayoutViewer mLayoutViewer;
-
     private PixelPerfectLoupe mPixelPerfectLoupe;
-
     private Composite mTreeViewControls;
 
-    public static final HierarchyViewerApplication getApp() {
-        return mApp;
+    private HierarchyViewerDirector mDirector;
+
+    /*
+     * If a thread bails with an uncaught exception, bring the whole
+     * thing down.
+     */
+    private static class UncaughtHandler implements Thread.UncaughtExceptionHandler {
+        public void uncaughtException(Thread t, Throwable e) {
+            Log.e("HierarchyViewer", "shutting down due to uncaught exception");
+            Log.e("HierarchyViewer", e);
+            System.exit(1);
+        }
+    }
+
+    public static final HierarchyViewerApplication getMainWindow() {
+        return sMainWindow;
     }
 
     public HierarchyViewerApplication() {
-        super(null);
+        super(null /*shell*/);
 
-        mApp = this;
+        sMainWindow = this;
 
         addMenuBar();
     }
@@ -171,25 +160,17 @@ public class HierarchyViewerApplication extends ApplicationWindow {
     }
 
     public void run() {
-        HierarchyViewerDirector director = HierarchyViewerApplicationDirector.createDirector();
-        director.initDebugBridge();
-        director.startListenForDevices();
-        director.populateDeviceSelectionModel();
-        TreeViewModel.getModel().addTreeChangeListener(treeChangeListener);
-        PixelPerfectModel.getModel().addImageChangeListener(imageChangeListener);
-
         setBlockOnOpen(true);
 
         open();
 
-        TreeViewModel.getModel().removeTreeChangeListener(treeChangeListener);
-        PixelPerfectModel.getModel().removeImageChangeListener(imageChangeListener);
+        TreeViewModel.getModel().removeTreeChangeListener(mTreeChangeListener);
+        PixelPerfectModel.getModel().removeImageChangeListener(mImageChangeListener);
 
-        Display.getCurrent().dispose();
         ImageLoader.dispose();
-        director.stopListenForDevices();
-        director.stopDebugBridge();
-        director.terminate();
+        mDirector.stopListenForDevices();
+        mDirector.stopDebugBridge();
+        mDirector.terminate();
     }
 
     @Override
@@ -218,6 +199,15 @@ public class HierarchyViewerApplication extends ApplicationWindow {
 
     @Override
     protected Control createContents(Composite parent) {
+        // create this only once the window is opened to please SWT on Mac
+        mDirector = HierarchyViewerApplicationDirector.createDirector();
+        mDirector.initDebugBridge();
+        mDirector.startListenForDevices();
+        mDirector.populateDeviceSelectionModel();
+
+        TreeViewModel.getModel().addTreeChangeListener(mTreeChangeListener);
+        PixelPerfectModel.getModel().addImageChangeListener(mImageChangeListener);
+
         loadResources();
 
         Composite control = new Composite(parent, SWT.NONE);
@@ -591,10 +581,13 @@ public class HierarchyViewerApplication extends ApplicationWindow {
         MenuManager mm = getMenuBarManager();
         mm.removeAll();
 
-        MenuManager file = new MenuManager("&File");
-        mm.add(file);
+        String os = System.getProperty("os.name"); //$NON-NLS-1$
+        if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+            MenuManager file = new MenuManager("&File");
+            mm.add(file);
 
-        file.add(QuitAction.getAction());
+            file.add(QuitAction.getAction());
+        }
 
         MenuManager device = new MenuManager("&Devices");
         mm.add(device);
@@ -633,10 +626,13 @@ public class HierarchyViewerApplication extends ApplicationWindow {
         MenuManager mm = getMenuBarManager();
         mm.removeAll();
 
-        MenuManager file = new MenuManager("&File");
-        mm.add(file);
+        String os = System.getProperty("os.name"); //$NON-NLS-1$
+        if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+            MenuManager file = new MenuManager("&File");
+            mm.add(file);
 
-        file.add(QuitAction.getAction());
+            file.add(QuitAction.getAction());
+        }
 
         MenuManager treeViewMenu = new MenuManager("&Tree View");
         mm.add(treeViewMenu);
@@ -680,10 +676,13 @@ public class HierarchyViewerApplication extends ApplicationWindow {
         MenuManager mm = getMenuBarManager();
         mm.removeAll();
 
-        MenuManager file = new MenuManager("&File");
-        mm.add(file);
+        String os = System.getProperty("os.name"); //$NON-NLS-1$
+        if (os.startsWith("Mac OS") == false) { //$NON-NLS-1$
+            MenuManager file = new MenuManager("&File");
+            mm.add(file);
 
-        file.add(QuitAction.getAction());
+            file.add(QuitAction.getAction());
+        }
 
         MenuManager pixelPerfect = new MenuManager("&Pixel Perfect");
         pixelPerfect.add(SavePixelPerfectAction.getAction(getShell()));
@@ -791,7 +790,7 @@ public class HierarchyViewerApplication extends ApplicationWindow {
         }
     };
 
-    private ITreeChangeListener treeChangeListener = new ITreeChangeListener() {
+    private ITreeChangeListener mTreeChangeListener = new ITreeChangeListener() {
         public void selectionChanged() {
             // pass
         }
@@ -819,7 +818,7 @@ public class HierarchyViewerApplication extends ApplicationWindow {
         }
     };
 
-    private IImageChangeListener imageChangeListener = new IImageChangeListener() {
+    private IImageChangeListener mImageChangeListener = new IImageChangeListener() {
 
         public void crosshairMoved() {
             // pass
@@ -866,11 +865,9 @@ public class HierarchyViewerApplication extends ApplicationWindow {
     };
 
     public static void main(String[] args) {
-        Display.getDefault().syncExec(new Runnable() {
-            public void run() {
-                new HierarchyViewerApplication().run();
-            }
-        });
-        System.exit(0);
+        Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());
+
+        Display.setAppName("HierarchyViewer");
+        new HierarchyViewerApplication().run();
     }
 }
index 23b6210..d1a5b8c 100644 (file)
@@ -62,9 +62,9 @@ public class HierarchyViewerApplicationDirector extends HierarchyViewerDirector
     public void executeInBackground(final String taskName, final Runnable task) {
         mExecutor.execute(new Runnable() {
             public void run() {
-                HierarchyViewerApplication.getApp().startTask(taskName);
+                HierarchyViewerApplication.getMainWindow().startTask(taskName);
                 task.run();
-                HierarchyViewerApplication.getApp().endTask();
+                HierarchyViewerApplication.getMainWindow().endTask();
             }
         });
     }
index 3e9598d..b5a8c5f 100644 (file)
@@ -39,6 +39,6 @@ public class QuitAction extends Action {
 
     @Override
     public void run() {
-        HierarchyViewerApplication.getApp().close();
+        HierarchyViewerApplication.getMainWindow().close();
     }
 }
index 987386d..72adb5f 100644 (file)
@@ -55,7 +55,7 @@ public class ShowOverlayAction extends Action implements ImageAction, IImageChan
 
     @Override
     public void run() {
-        HierarchyViewerApplication.getApp().showOverlayInLoupe(sAction.isChecked());
+        HierarchyViewerApplication.getMainWindow().showOverlayInLoupe(sAction.isChecked());
     }
 
     public Image getImage() {
diff --git a/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt b/hierarchyviewer2/libs/hierarchyviewerlib/manifest.txt
new file mode 100644 (file)
index 0000000..ac6ab55
--- /dev/null
@@ -0,0 +1 @@
+Class-Path: ddmlib.jar ddmuilib.jar hierarchyviewerlib.jar org.eclipse.jface_3.4.2.M20090107-0800.jar org.eclipse.core.commands_3.4.0.I20080509-2000.jar org.eclipse.equinox.common_3.4.0.v20080421-2006.jar
index ecaabde..ded20e1 100644 (file)
@@ -18,6 +18,8 @@ include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 LOCAL_JAVA_RESOURCE_DIRS := resources
 
+LOCAL_JAR_MANIFEST := ../manifest.txt
+
 LOCAL_JAVA_LIBRARIES := ddmlib \
     ddmuilib \
     swt \
index 00fcc8b..1a8e96c 100644 (file)
@@ -58,7 +58,6 @@ public class MainWindow extends ApplicationWindow {
     public void run() {
         setBlockOnOpen(true);
         open();
-        Display.getCurrent().dispose();
     }
 
     @Override
@@ -221,6 +220,8 @@ public class MainWindow extends ApplicationWindow {
             reader = new DmTraceReader(traceName, regression);
         }
         reader.getTraceUnits().setTimeScale(TraceUnits.TimeScale.MilliSeconds);
+
+        Display.setAppName("Traceview");
         new MainWindow(traceName, reader).run();
     }
 }