| /* |
| * 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 android.app; |
| |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| import android.util.Printer; |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| |
| /** |
| * Describes an application error. |
| * |
| * A report has a type, which is one of |
| * <ul> |
| * <li> {@link #TYPE_CRASH} application crash. Information about the crash |
| * is stored in {@link #crashInfo}. |
| * <li> {@link #TYPE_ANR} application not responding. Information about the |
| * ANR is stored in {@link #anrInfo}. |
| * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. |
| * </ul> |
| * |
| * @hide |
| */ |
| |
| public class ApplicationErrorReport implements Parcelable { |
| /** |
| * Uninitialized error report. |
| */ |
| public static final int TYPE_NONE = 0; |
| |
| /** |
| * An error report about an application crash. |
| */ |
| public static final int TYPE_CRASH = 1; |
| |
| /** |
| * An error report about an application that's not responding. |
| */ |
| public static final int TYPE_ANR = 2; |
| |
| /** |
| * Type of this report. Can be one of {@link #TYPE_NONE}, |
| * {@link #TYPE_CRASH} or {@link #TYPE_ANR}. |
| */ |
| public int type; |
| |
| /** |
| * Package name of the application. |
| */ |
| public String packageName; |
| |
| /** |
| * Package name of the application which installed the application this |
| * report pertains to. |
| * This identifies which Market the application came from. |
| */ |
| public String installerPackageName; |
| |
| /** |
| * Process name of the application. |
| */ |
| public String processName; |
| |
| /** |
| * Time at which the error occurred. |
| */ |
| public long time; |
| |
| /** |
| * Set if the app is on the system image. |
| */ |
| public boolean systemApp; |
| |
| /** |
| * If this report is of type {@link #TYPE_CRASH}, contains an instance |
| * of CrashInfo describing the crash; otherwise null. |
| */ |
| public CrashInfo crashInfo; |
| |
| /** |
| * If this report is of type {@link #TYPE_ANR}, contains an instance |
| * of AnrInfo describing the ANR; otherwise null. |
| */ |
| public AnrInfo anrInfo; |
| |
| /** |
| * Create an uninitialized instance of {@link ApplicationErrorReport}. |
| */ |
| public ApplicationErrorReport() { |
| } |
| |
| /** |
| * Create an instance of {@link ApplicationErrorReport} initialized from |
| * a parcel. |
| */ |
| ApplicationErrorReport(Parcel in) { |
| readFromParcel(in); |
| } |
| |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeInt(type); |
| dest.writeString(packageName); |
| dest.writeString(installerPackageName); |
| dest.writeString(processName); |
| dest.writeLong(time); |
| dest.writeInt(systemApp ? 1 : 0); |
| |
| switch (type) { |
| case TYPE_CRASH: |
| crashInfo.writeToParcel(dest, flags); |
| break; |
| case TYPE_ANR: |
| anrInfo.writeToParcel(dest, flags); |
| break; |
| } |
| } |
| |
| public void readFromParcel(Parcel in) { |
| type = in.readInt(); |
| packageName = in.readString(); |
| installerPackageName = in.readString(); |
| processName = in.readString(); |
| time = in.readLong(); |
| systemApp = in.readInt() == 1; |
| |
| switch (type) { |
| case TYPE_CRASH: |
| crashInfo = new CrashInfo(in); |
| anrInfo = null; |
| break; |
| case TYPE_ANR: |
| anrInfo = new AnrInfo(in); |
| crashInfo = null; |
| break; |
| } |
| } |
| |
| /** |
| * Describes an application crash. |
| */ |
| public static class CrashInfo { |
| /** |
| * Class name of the exception that caused the crash. |
| */ |
| public String exceptionClassName; |
| |
| /** |
| * Message stored in the exception. |
| */ |
| public String exceptionMessage; |
| |
| /** |
| * File which the exception was thrown from. |
| */ |
| public String throwFileName; |
| |
| /** |
| * Class which the exception was thrown from. |
| */ |
| public String throwClassName; |
| |
| /** |
| * Method which the exception was thrown from. |
| */ |
| public String throwMethodName; |
| |
| /** |
| * Line number the exception was thrown from. |
| */ |
| public int throwLineNumber; |
| |
| /** |
| * Stack trace. |
| */ |
| public String stackTrace; |
| |
| /** |
| * Create an uninitialized instance of CrashInfo. |
| */ |
| public CrashInfo() { |
| } |
| |
| /** |
| * Create an instance of CrashInfo initialized from an exception. |
| */ |
| public CrashInfo(Throwable tr) { |
| StringWriter sw = new StringWriter(); |
| tr.printStackTrace(new PrintWriter(sw)); |
| stackTrace = sw.toString(); |
| exceptionMessage = tr.getMessage(); |
| |
| // Populate fields with the "root cause" exception |
| while (tr.getCause() != null) { |
| tr = tr.getCause(); |
| String msg = tr.getMessage(); |
| if (msg != null && msg.length() > 0) { |
| exceptionMessage = msg; |
| } |
| } |
| |
| exceptionClassName = tr.getClass().getName(); |
| StackTraceElement trace = tr.getStackTrace()[0]; |
| throwFileName = trace.getFileName(); |
| throwClassName = trace.getClassName(); |
| throwMethodName = trace.getMethodName(); |
| throwLineNumber = trace.getLineNumber(); |
| } |
| |
| /** |
| * Create an instance of CrashInfo initialized from a Parcel. |
| */ |
| public CrashInfo(Parcel in) { |
| exceptionClassName = in.readString(); |
| exceptionMessage = in.readString(); |
| throwFileName = in.readString(); |
| throwClassName = in.readString(); |
| throwMethodName = in.readString(); |
| throwLineNumber = in.readInt(); |
| stackTrace = in.readString(); |
| } |
| |
| /** |
| * Save a CrashInfo instance to a parcel. |
| */ |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeString(exceptionClassName); |
| dest.writeString(exceptionMessage); |
| dest.writeString(throwFileName); |
| dest.writeString(throwClassName); |
| dest.writeString(throwMethodName); |
| dest.writeInt(throwLineNumber); |
| dest.writeString(stackTrace); |
| } |
| |
| /** |
| * Dump a CrashInfo instance to a Printer. |
| */ |
| public void dump(Printer pw, String prefix) { |
| pw.println(prefix + "exceptionClassName: " + exceptionClassName); |
| pw.println(prefix + "exceptionMessage: " + exceptionMessage); |
| pw.println(prefix + "throwFileName: " + throwFileName); |
| pw.println(prefix + "throwClassName: " + throwClassName); |
| pw.println(prefix + "throwMethodName: " + throwMethodName); |
| pw.println(prefix + "throwLineNumber: " + throwLineNumber); |
| pw.println(prefix + "stackTrace: " + stackTrace); |
| } |
| } |
| |
| /** |
| * Describes an application not responding error. |
| */ |
| public static class AnrInfo { |
| /** |
| * Activity name. |
| */ |
| public String activity; |
| |
| /** |
| * Description of the operation that timed out. |
| */ |
| public String cause; |
| |
| /** |
| * Additional info, including CPU stats. |
| */ |
| public String info; |
| |
| /** |
| * Create an uninitialized instance of AnrInfo. |
| */ |
| public AnrInfo() { |
| } |
| |
| /** |
| * Create an instance of AnrInfo initialized from a Parcel. |
| */ |
| public AnrInfo(Parcel in) { |
| activity = in.readString(); |
| cause = in.readString(); |
| info = in.readString(); |
| } |
| |
| /** |
| * Save an AnrInfo instance to a parcel. |
| */ |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeString(activity); |
| dest.writeString(cause); |
| dest.writeString(info); |
| } |
| |
| /** |
| * Dump an AnrInfo instance to a Printer. |
| */ |
| public void dump(Printer pw, String prefix) { |
| pw.println(prefix + "activity: " + activity); |
| pw.println(prefix + "cause: " + cause); |
| pw.println(prefix + "info: " + info); |
| } |
| } |
| |
| public static final Parcelable.Creator<ApplicationErrorReport> CREATOR |
| = new Parcelable.Creator<ApplicationErrorReport>() { |
| public ApplicationErrorReport createFromParcel(Parcel source) { |
| return new ApplicationErrorReport(source); |
| } |
| |
| public ApplicationErrorReport[] newArray(int size) { |
| return new ApplicationErrorReport[size]; |
| } |
| }; |
| |
| public int describeContents() { |
| return 0; |
| } |
| |
| /** |
| * Dump the report to a Printer. |
| */ |
| public void dump(Printer pw, String prefix) { |
| pw.println(prefix + "type: " + type); |
| pw.println(prefix + "packageName: " + packageName); |
| pw.println(prefix + "installerPackageName: " + installerPackageName); |
| pw.println(prefix + "processName: " + processName); |
| pw.println(prefix + "time: " + time); |
| pw.println(prefix + "systemApp: " + systemApp); |
| |
| switch (type) { |
| case TYPE_CRASH: |
| crashInfo.dump(pw, prefix); |
| break; |
| case TYPE_ANR: |
| anrInfo.dump(pw, prefix); |
| break; |
| } |
| } |
| } |