/* * 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.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemProperties; import android.provider.Settings; 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 *
This is also used to marshal around stack traces of ANRs and
* StrictMode violations which aren't necessarily crashes, but have
* a lot in common.
*/
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;
/**
* For StrictMode violations, the wall time duration of the
* violation, when known.
*/
public long durationMillis = -1;
/**
* 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();
durationMillis = in.readLong();
}
/**
* 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);
dest.writeLong(durationMillis);
}
/**
* 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);
if (durationMillis != -1) {
pw.println(prefix + "durationMillis: " + durationMillis);
}
}
}
/**
* 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);
}
}
/**
* Describes a battery usage report.
*/
public static class BatteryInfo {
/**
* Percentage of the battery that was used up by the process.
*/
public int usagePercent;
/**
* Duration in microseconds over which the process used the above
* percentage of battery.
*/
public long durationMicros;
/**
* Dump of various info impacting battery use.
*/
public String usageDetails;
/**
* Checkin details.
*/
public String checkinDetails;
/**
* Create an uninitialized instance of BatteryInfo.
*/
public BatteryInfo() {
}
/**
* Create an instance of BatteryInfo initialized from a Parcel.
*/
public BatteryInfo(Parcel in) {
usagePercent = in.readInt();
durationMicros = in.readLong();
usageDetails = in.readString();
checkinDetails = in.readString();
}
/**
* Save a BatteryInfo instance to a parcel.
*/
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(usagePercent);
dest.writeLong(durationMicros);
dest.writeString(usageDetails);
dest.writeString(checkinDetails);
}
/**
* Dump a BatteryInfo instance to a Printer.
*/
public void dump(Printer pw, String prefix) {
pw.println(prefix + "usagePercent: " + usagePercent);
pw.println(prefix + "durationMicros: " + durationMicros);
pw.println(prefix + "usageDetails: " + usageDetails);
pw.println(prefix + "checkinDetails: " + checkinDetails);
}
}
public static final Parcelable.Creator