aboutsummaryrefslogtreecommitdiff
path: root/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java
diff options
context:
space:
mode:
Diffstat (limited to 'dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java')
-rw-r--r--dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java148
1 files changed, 148 insertions, 0 deletions
diff --git a/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java b/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java
new file mode 100644
index 000000000..0669e33fd
--- /dev/null
+++ b/dumpeventlog/src/com/android/dumpeventlog/DumpEventLog.java
@@ -0,0 +1,148 @@
+/*
+ * 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.AdbCommandRejectedException;
+import com.android.ddmlib.AndroidDebugBridge;
+import com.android.ddmlib.IDevice;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.TimeoutException;
+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
+ IDevice[] devices = bridge.getDevices();
+
+ for (IDevice device : devices) {
+ if (device.getSerialNumber().equals(args[0])) {
+ try {
+ grabLogFrom(device, args[1]);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+ }
+
+ System.err.println("Could not find " + args[0]);
+ } finally {
+ AndroidDebugBridge.terminate();
+ }
+ }
+
+ private static void grabLogFrom(IDevice device, String filePath) throws IOException,
+ TimeoutException, AdbCommandRejectedException {
+ LogWriter writer = new LogWriter(filePath);
+ LogReceiver receiver = new LogReceiver(writer);
+ writer.setReceiver(receiver);
+
+ device.runEventLogService(receiver);
+
+ writer.done();
+ }
+}