1f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/* 2f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Copyright (C) 2008 The Android Open Source Project 3f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 4f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Licensed under the Apache License, Version 2.0 (the "License"); 5f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * you may not use this file except in compliance with the License. 6f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * You may obtain a copy of the License at 7f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 8f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * http://www.apache.org/licenses/LICENSE-2.0 9f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 10f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Unless required by applicable law or agreed to in writing, software 11f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * distributed under the License is distributed on an "AS IS" BASIS, 12f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * See the License for the specific language governing permissions and 14f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * limitations under the License. 15f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 16f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 17f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipackage android.app; 18f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 1921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.ComponentName; 2021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Context; 2121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.Intent; 2221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ApplicationInfo; 2321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.PackageManager; 2421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.content.pm.ResolveInfo; 25f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcel; 26f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.os.Parcelable; 2721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.os.SystemProperties; 2821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.provider.Settings; 29f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer; 3073d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackbornimport android.util.Slog; 318c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackbornimport com.android.internal.util.FastPrintWriter; 325b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 33b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter; 34b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter; 35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/** 37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error. 38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of 40f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul> 41271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. 42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash 43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}. 44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the 45f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}. 46271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_BATTERY} user reported application is using too much 47271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * battery. Information about the battery use is stored in {@link #batteryInfo}. 48271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_RUNNING_SERVICE} user reported application is leaving an 49271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * unneeded serive running. Information about the battery use is stored in 50271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * {@link #runningServiceInfo}. 51f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul> 52f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 53f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 54f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable { 5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining error report receiver for system apps 5621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps"; 5721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining default error report receiver 5921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default"; 6021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Uninitialized error report. 63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_NONE = 0; 65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application crash. 68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_CRASH = 1; 70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application that's not responding. 73f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 74f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_ANR = 2; 75f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 76f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 7721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * An error report about an application that's consuming too much battery. 7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 7921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static final int TYPE_BATTERY = 3; 8021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 8121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 82cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * A report from a user to a developer about a running service that the 83cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * user doesn't think should be running. 8414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 8514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public static final int TYPE_RUNNING_SERVICE = 5; 8614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 8714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 88f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Type of this report. Can be one of {@link #TYPE_NONE}, 89cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, {@link #TYPE_BATTERY}, 90cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * or {@link #TYPE_RUNNING_SERVICE}. 91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int type; 93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application. 96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String packageName; 98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application which installed the application this 101f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * report pertains to. 1024d7bc65538c7cd9fbb1fbbcf22d1da47fcee1219Dirk Dougherty * This identifies which market the application came from. 103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String installerPackageName; 105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Process name of the application. 108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String processName; 110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Time at which the error occurred. 113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public long time; 115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 116f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 117e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski * Set if the app is on the system image. 118e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski */ 119e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski public boolean systemApp; 120e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski 121e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski /** 122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_CRASH}, contains an instance 123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of CrashInfo describing the crash; otherwise null. 124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo crashInfo; 126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_ANR}, contains an instance 129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of AnrInfo describing the ANR; otherwise null. 130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo anrInfo; 132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 133f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 134151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * If this report is of type {@link #TYPE_BATTERY}, contains an instance 135151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * of BatteryInfo; otherwise null. 13621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 137151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo batteryInfo; 138cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick 13921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 14014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance 14114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * of RunningServiceInfo; otherwise null. 14214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 14314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo runningServiceInfo; 14414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 14514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 146f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of {@link ApplicationErrorReport}. 147f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 148f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport() { 149f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 150f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 151f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 152f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of {@link ApplicationErrorReport} initialized from 153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * a parcel. 154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 155f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski ApplicationErrorReport(Parcel in) { 15628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski readFromParcel(in); 157f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 158f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static ComponentName getErrorReportReceiver(Context context, 16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String packageName, int appFlags) { 16121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // check if error reporting is enabled in secure settings 162625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey int enabled = Settings.Global.getInt(context.getContentResolver(), 163625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.SEND_ACTION_APP_ERROR, 0); 16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (enabled == 0) { 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn PackageManager pm = context.getPackageManager(); 16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // look for receiver in the installer package 17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String candidate = pm.getInstallerPackageName(packageName); 17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ComponentName result = getErrorReportReceiver(pm, packageName, candidate); 17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if the error app is on the system image, look for system apps 17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // error receiver 17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY); 18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn result = getErrorReportReceiver(pm, packageName, candidate); 18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if there is a default receiver, try that 18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY); 18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return getErrorReportReceiver(pm, packageName, candidate); 19021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 19187d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski 19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * Return activity in receiverPackage that handles ACTION_APP_ERROR. 19421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * 195ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura * @param pm PackageManager instance 19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param errorPackage package which caused the error 19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param receiverPackage candidate package to receive the error 19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @return activity component within receiverPackage which handles 19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * ACTION_APP_ERROR, or null if not found 20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage, 20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String receiverPackage) { 20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage == null || receiverPackage.length() == 0) { 20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // break the loop if it's the error report receiver package that crashed 20821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage.equals(errorPackage)) { 20921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 21021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 21121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 21221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Intent intent = new Intent(Intent.ACTION_APP_ERROR); 21321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn intent.setPackage(receiverPackage); 21421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ResolveInfo info = pm.resolveActivity(intent, 0); 21521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (info == null || info.activityInfo == null) { 21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 21721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return new ComponentName(receiverPackage, info.activityInfo.name); 21921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 22021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeInt(type); 223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(packageName); 224f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(installerPackageName); 225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(processName); 226f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeLong(time); 227e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski dest.writeInt(systemApp ? 1 : 0); 228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 229f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.writeToParcel(dest, flags); 232f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 233f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 234f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.writeToParcel(dest, flags); 235f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 23621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 237151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.writeToParcel(dest, flags); 23821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 23914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn case TYPE_RUNNING_SERVICE: 24014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo.writeToParcel(dest, flags); 24114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn break; 242f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 243f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 244f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 245fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski public void readFromParcel(Parcel in) { 24628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski type = in.readInt(); 24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski packageName = in.readString(); 24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski installerPackageName = in.readString(); 24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski processName = in.readString(); 25028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski time = in.readLong(); 251e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski systemApp = in.readInt() == 1; 25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski switch (type) { 25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_CRASH: 25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = new CrashInfo(in); 25628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = null; 257151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 25814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 25928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 26028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_ANR: 26128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = new AnrInfo(in); 26228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = null; 263151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 26414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 26621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 267151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = new BatteryInfo(in); 26821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn anrInfo = null; 26921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn crashInfo = null; 27014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 27114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn break; 27214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn case TYPE_RUNNING_SERVICE: 27314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn batteryInfo = null; 27414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn anrInfo = null; 27514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn crashInfo = null; 27614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = new RunningServiceInfo(in); 27728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 27828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 27928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 28028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application crash. 283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class CrashInfo { 285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class name of the exception that caused the crash. 287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String exceptionClassName; 289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 290f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 291f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski * Message stored in the exception. 292f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski */ 293f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski public String exceptionMessage; 294f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski 295f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski /** 296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * File which the exception was thrown from. 297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwFileName; 299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class which the exception was thrown from. 302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwClassName; 304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Method which the exception was thrown from. 307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwMethodName; 309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 310f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 3115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski * Line number the exception was thrown from. 3125a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski */ 3135a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski public int throwLineNumber; 3145a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski 3155a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski /** 316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Stack trace. 317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String stackTrace; 319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of CrashInfo. 322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo() { 324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 326f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor * Create an instance of CrashInfo initialized from an exception. 328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor */ 329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor public CrashInfo(Throwable tr) { 330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StringWriter sw = new StringWriter(); 3318c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn PrintWriter pw = new FastPrintWriter(sw, false, 256); 3328c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn tr.printStackTrace(pw); 3338c84109b9fbbf473b225707a38261ff5f99d95fbDianne Hackborn pw.flush(); 334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor stackTrace = sw.toString(); 33560d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor exceptionMessage = tr.getMessage(); 336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor // Populate fields with the "root cause" exception 3388e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Throwable rootTr = tr; 339b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor while (tr.getCause() != null) { 340b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr = tr.getCause(); 3418e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) { 3428e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn rootTr = tr; 3438e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 344b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor String msg = tr.getMessage(); 345b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor if (msg != null && msg.length() > 0) { 346b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionMessage = msg; 347b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 348b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 349b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 3508e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn exceptionClassName = rootTr.getClass().getName(); 3518e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (rootTr.getStackTrace().length > 0) { 3528e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn StackTraceElement trace = rootTr.getStackTrace()[0]; 3538e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwFileName = trace.getFileName(); 3548e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwClassName = trace.getClassName(); 3558e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwMethodName = trace.getMethodName(); 3568e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwLineNumber = trace.getLineNumber(); 3578e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } else { 3588e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwFileName = "unknown"; 3598e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwClassName = "unknown"; 3608e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwMethodName = "unknown"; 3618e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwLineNumber = 0; 3628e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 363b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 364b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 365b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor /** 366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of CrashInfo initialized from a Parcel. 367f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo(Parcel in) { 369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski exceptionClassName = in.readString(); 370f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski exceptionMessage = in.readString(); 371f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwFileName = in.readString(); 372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwClassName = in.readString(); 373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwMethodName = in.readString(); 3745a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski throwLineNumber = in.readInt(); 375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski stackTrace = in.readString(); 376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save a CrashInfo instance to a parcel. 380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 38273d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn int start = dest.dataPosition(); 383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(exceptionClassName); 384f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski dest.writeString(exceptionMessage); 385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwFileName); 386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwClassName); 387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwMethodName); 3885a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski dest.writeInt(throwLineNumber); 389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(stackTrace); 39073d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn int total = dest.dataPosition()-start; 391f85e7af4d009862fc799c7232ec5cf9e2dc9fa34Dianne Hackborn if (total > 20*1024) { 39273d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: exClass=" + exceptionClassName); 39373d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: exMsg=" + exceptionMessage); 39473d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: file=" + throwFileName); 39573d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: class=" + throwClassName); 39673d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: method=" + throwMethodName + " line=" + throwLineNumber); 39773d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: stack=" + stackTrace); 39873d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn Slog.d("Error", "ERR: TOTAL BYTES WRITTEN: " + (dest.dataPosition()-start)); 39973d6a821aeecd6003c70c32f7ae6c38f062c4290Dianne Hackborn } 400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump a CrashInfo instance to a Printer. 404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "exceptionClassName: " + exceptionClassName); 407f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski pw.println(prefix + "exceptionMessage: " + exceptionMessage); 408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwFileName: " + throwFileName); 409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwClassName: " + throwClassName); 410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwMethodName: " + throwMethodName); 4115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski pw.println(prefix + "throwLineNumber: " + throwLineNumber); 412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "stackTrace: " + stackTrace); 413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application not responding error. 418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class AnrInfo { 420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Activity name. 422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String activity; 424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Description of the operation that timed out. 427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String cause; 429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Additional info, including CPU stats. 432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String info; 434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 435f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 436f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of AnrInfo. 437f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 438f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo() { 439f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 440f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 441f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 442f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of AnrInfo initialized from a Parcel. 443f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 444f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo(Parcel in) { 445f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski activity = in.readString(); 446f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski cause = in.readString(); 447f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski info = in.readString(); 448f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 449f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 450f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 451f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save an AnrInfo instance to a parcel. 452f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 453f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 454f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(activity); 455f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(cause); 456f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(info); 457f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 458f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 459f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 460f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump an AnrInfo instance to a Printer. 461f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 462f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 463f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "activity: " + activity); 464f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "cause: " + cause); 465f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "info: " + info); 466f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 467f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 468f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Describes a battery usage report. 471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public static class BatteryInfo { 473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Percentage of the battery that was used up by the process. 475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public int usagePercent; 477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Duration in microseconds over which the process used the above 480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * percentage of battery. 481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public long durationMicros; 483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump of various info impacting battery use. 486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String usageDetails; 488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Checkin details. 491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String checkinDetails; 493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an uninitialized instance of BatteryInfo. 496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 497151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo() { 498151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 499151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 500151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 501151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an instance of BatteryInfo initialized from a Parcel. 502151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 503151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo(Parcel in) { 504151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usagePercent = in.readInt(); 505151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski durationMicros = in.readLong(); 506151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usageDetails = in.readString(); 507151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski checkinDetails = in.readString(); 508151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 509151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 510151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Save a BatteryInfo instance to a parcel. 512151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 513151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void writeToParcel(Parcel dest, int flags) { 514151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeInt(usagePercent); 515151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeLong(durationMicros); 516151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(usageDetails); 517151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(checkinDetails); 518151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 519151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 520151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 521151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump a BatteryInfo instance to a Printer. 522151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 523151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void dump(Printer pw, String prefix) { 524151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usagePercent: " + usagePercent); 525151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "durationMicros: " + durationMicros); 526151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usageDetails: " + usageDetails); 527151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "checkinDetails: " + checkinDetails); 528151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 529151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 530151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 53114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 53214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Describes a running service report. 53314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 53414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public static class RunningServiceInfo { 53514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 53614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Duration in milliseconds that the service has been running. 53714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 53814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public long durationMillis; 53914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 54014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 54114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Dump of debug information about the service. 54214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 54314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public String serviceDetails; 54414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 54514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 54614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Create an uninitialized instance of RunningServiceInfo. 54714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 54814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo() { 54914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 55014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 55114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 55214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Create an instance of RunningServiceInfo initialized from a Parcel. 55314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 55414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo(Parcel in) { 55514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn durationMillis = in.readLong(); 55614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn serviceDetails = in.readString(); 55714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 55814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 55914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 56014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Save a RunningServiceInfo instance to a parcel. 56114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 56214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 56314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn dest.writeLong(durationMillis); 56414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn dest.writeString(serviceDetails); 56514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 56614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 56714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 56814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Dump a BatteryInfo instance to a Printer. 56914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 57014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public void dump(Printer pw, String prefix) { 57114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn pw.println(prefix + "durationMillis: " + durationMillis); 57214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn pw.println(prefix + "serviceDetails: " + serviceDetails); 57314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 57414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 57514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 576f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final Parcelable.Creator<ApplicationErrorReport> CREATOR 577f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski = new Parcelable.Creator<ApplicationErrorReport>() { 578f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport createFromParcel(Parcel source) { 579f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport(source); 580f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 581f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 582f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport[] newArray(int size) { 583f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport[size]; 584f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 585f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski }; 586f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 587f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int describeContents() { 588f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return 0; 589f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 590f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 591f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 592f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump the report to a Printer. 593f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 594f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 595f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "type: " + type); 596f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "packageName: " + packageName); 597f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "installerPackageName: " + installerPackageName); 598f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "processName: " + processName); 599f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "time: " + time); 600e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski pw.println(prefix + "systemApp: " + systemApp); 601f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 602f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 603f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 604f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.dump(pw, prefix); 605f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 606f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 607f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.dump(pw, prefix); 608f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 60921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 610151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.dump(pw, prefix); 61121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 61287d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski case TYPE_RUNNING_SERVICE: 61387d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski runningServiceInfo.dump(pw, prefix); 61487d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski break; 615f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 616f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 617f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski} 618