diff options
Diffstat (limited to 'dumpeventlog')
-rw-r--r-- | dumpeventlog/.classpath | 7 | ||||
-rw-r--r-- | dumpeventlog/.project | 17 | ||||
-rw-r--r-- | dumpeventlog/Android.mk | 5 | ||||
-rw-r--r-- | dumpeventlog/etc/Android.mk | 8 | ||||
-rwxr-xr-x | dumpeventlog/etc/dumpeventlog | 81 | ||||
-rw-r--r-- | dumpeventlog/etc/manifest.txt | 1 | ||||
-rw-r--r-- | dumpeventlog/src/Android.mk | 14 | ||||
-rw-r--r-- | dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java | 145 |
8 files changed, 278 insertions, 0 deletions
diff --git a/dumpeventlog/.classpath b/dumpeventlog/.classpath new file mode 100644 index 0000000..b0326c8 --- /dev/null +++ b/dumpeventlog/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry combineaccessrules="false" kind="src" path="/ddmlib"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/dumpeventlog/.project b/dumpeventlog/.project new file mode 100644 index 0000000..c416f4f --- /dev/null +++ b/dumpeventlog/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>dumpeventlog</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/dumpeventlog/Android.mk b/dumpeventlog/Android.mk new file mode 100644 index 0000000..7bb870d --- /dev/null +++ b/dumpeventlog/Android.mk @@ -0,0 +1,5 @@ +# Copyright 2007 The Android Open Source Project +# +DUMPEVENTLOG_LOCAL_DIR := $(call my-dir) +include $(DUMPEVENTLOG_LOCAL_DIR)/etc/Android.mk +include $(DUMPEVENTLOG_LOCAL_DIR)/src/Android.mk diff --git a/dumpeventlog/etc/Android.mk b/dumpeventlog/etc/Android.mk new file mode 100644 index 0000000..8094734 --- /dev/null +++ b/dumpeventlog/etc/Android.mk @@ -0,0 +1,8 @@ +# Copyright 2007 The Android Open Source Project +# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_PREBUILT_EXECUTABLES := dumpeventlog +include $(BUILD_HOST_PREBUILT) + diff --git a/dumpeventlog/etc/dumpeventlog b/dumpeventlog/etc/dumpeventlog new file mode 100755 index 0000000..56f8c22 --- /dev/null +++ b/dumpeventlog/etc/dumpeventlog @@ -0,0 +1,81 @@ +#!/bin/sh +# Copyright 2005-2007, 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. + +# 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}"` + newProg=`expr "${newProg}" : ".* -> \(.*\)$"` + if expr "x${newProg}" : 'x/' >/dev/null; then + prog="${newProg}" + else + progdir=`dirname "${prog}"` + prog="${progdir}/${newProg}" + fi +done +oldwd=`pwd` +progdir=`dirname "${prog}"` +cd "${progdir}" +progdir=`pwd` +prog="${progdir}"/`basename "${prog}"` +cd "${oldwd}" + +jarfile=dumpeventlog.jar +frameworkdir="$progdir" +libdir="$progdir" +if [ ! -r "$frameworkdir/$jarfile" ] +then + frameworkdir=`dirname "$progdir"`/tools/lib + libdir=`dirname "$progdir"`/tools/lib +fi +if [ ! -r "$frameworkdir/$jarfile" ] +then + frameworkdir=`dirname "$progdir"`/framework + libdir=`dirname "$progdir"`/lib +fi +if [ ! -r "$frameworkdir/$jarfile" ] +then + echo `basename "$prog"`": can't find $jarfile" + exit 1 +fi + + +# Check args. +if [ debug = "$1" ]; then + # add this in for debugging + java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y + shift 1 +else + java_debug= +fi + +# Mac OS X needs an additional arg, or you get an "illegal thread" complaint. +if [ `uname` = "Darwin" ]; then + os_opts="-XstartOnFirstThread" +else + os_opts= +fi + +if [ "$OSTYPE" = "cygwin" ] ; then + jarpath=`cygpath -w "$frameworkdir/$jarfile"` + progdir=`cygpath -w "$progdir"` +else + jarpath="$frameworkdir/$jarfile" +fi + +# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored +# might need more memory, e.g. -Xmx128M +exec java -Xmx128M $os_opts $java_debug -Djava.ext.dirs="$frameworkdir" -Djava.library.path="$libdir" -jar "$jarpath" "$@" diff --git a/dumpeventlog/etc/manifest.txt b/dumpeventlog/etc/manifest.txt new file mode 100644 index 0000000..0eea915 --- /dev/null +++ b/dumpeventlog/etc/manifest.txt @@ -0,0 +1 @@ +Main-Class: com.android.dumpeventlog.DumpEventLog diff --git a/dumpeventlog/src/Android.mk b/dumpeventlog/src/Android.mk new file mode 100644 index 0000000..bf99375 --- /dev/null +++ b/dumpeventlog/src/Android.mk @@ -0,0 +1,14 @@ +# Copyright 2007 The Android Open Source Project +# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_JAR_MANIFEST := ../etc/manifest.txt +LOCAL_JAVA_LIBRARIES := \ + ddmlib +LOCAL_MODULE := dumpeventlog + +include $(BUILD_HOST_JAVA_LIBRARY) + diff --git a/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java b/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java new file mode 100644 index 0000000..6c528e1 --- /dev/null +++ b/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2008 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.dumpeventlog; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.Device; +import com.android.ddmlib.Log; +import com.android.ddmlib.Log.ILogOutput; +import com.android.ddmlib.Log.LogLevel; +import com.android.ddmlib.log.LogReceiver; +import com.android.ddmlib.log.LogReceiver.ILogListener; +import com.android.ddmlib.log.LogReceiver.LogEntry; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Connects to a device using ddmlib and dumps its event log as long as the device is connected. + */ +public class DumpEventLog { + + /** + * Custom {@link ILogListener} to receive and save the event log raw output. + */ + private static class LogWriter implements ILogListener { + private FileOutputStream mOutputStream; + private LogReceiver mReceiver; + + public LogWriter(String filePath) throws IOException { + mOutputStream = new FileOutputStream(filePath); + } + + public void newData(byte[] data, int offset, int length) { + try { + mOutputStream.write(data, offset, length); + } catch (IOException e) { + if (mReceiver != null) { + mReceiver.cancel(); + } + System.out.println(e); + } + } + + public void newEntry(LogEntry entry) { + // pass + } + + public void setReceiver(LogReceiver receiver) { + mReceiver = receiver; + } + + public void done() throws IOException { + mOutputStream.close(); + } + } + + public static void main(String[] args) { + if (args.length != 2) { + System.out.println("Usage: dumpeventlog <device s/n> <filepath>"); + return; + } + + // redirect the log output to /dev/null + Log.setLogOutput(new ILogOutput() { + public void printAndPromptLog(LogLevel logLevel, String tag, String message) { + // pass + } + + public void printLog(LogLevel logLevel, String tag, String message) { + // pass + } + }); + + // init the lib + AndroidDebugBridge.init(false /* debugger support */); + + try { + AndroidDebugBridge bridge = AndroidDebugBridge.createBridge(); + + // we can't just ask for the device list right away, as the internal thread getting + // them from ADB may not be done getting the first list. + // Since we don't really want getDevices() to be blocking, we wait here manually. + int count = 0; + while (bridge.hasInitialDeviceList() == false) { + try { + Thread.sleep(100); + count++; + } catch (InterruptedException e) { + // pass + } + + // let's not wait > 10 sec. + if (count > 100) { + System.err.println("Timeout getting device list!"); + return; + } + } + + // now get the devices + Device[] devices = bridge.getDevices(); + + for (Device device : devices) { + if (device.getSerialNumber().equals(args[0])) { + try { + grabLogFrom(device, args[1]); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return; + } + } + + System.err.println("Could not find " + args[0]); + } finally { + AndroidDebugBridge.terminate(); + } + } + + private static void grabLogFrom(Device device, String filePath) throws IOException { + LogWriter writer = new LogWriter(filePath); + LogReceiver receiver = new LogReceiver(writer); + writer.setReceiver(receiver); + + device.runEventLogService(receiver); + + writer.done(); + } +} |