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; 27cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrickimport android.os.SystemClock; 2821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.os.SystemProperties; 2921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackbornimport android.provider.Settings; 30f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskiimport android.util.Printer; 315b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 32b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.PrintWriter; 33b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnorimport java.io.StringWriter; 34f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 35f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski/** 36f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application error. 37f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * 38f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * A report has a type, which is one of 39f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <ul> 40271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_NONE} uninitialized instance of {@link ApplicationErrorReport}. 41f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_CRASH} application crash. Information about the crash 42f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * is stored in {@link #crashInfo}. 43f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * <li> {@link #TYPE_ANR} application not responding. Information about the 44f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * ANR is stored in {@link #anrInfo}. 45271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_BATTERY} user reported application is using too much 46271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * battery. Information about the battery use is stored in {@link #batteryInfo}. 47271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * <li> {@link #TYPE_RUNNING_SERVICE} user reported application is leaving an 48271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * unneeded serive running. Information about the battery use is stored in 49271c2fe0eb36fbf872535bedf3ee8156e3087847Dianne Hackborn * {@link #runningServiceInfo}. 50f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * </ul> 51f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 52f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 53f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazskipublic class ApplicationErrorReport implements Parcelable { 5421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining error report receiver for system apps 5521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String SYSTEM_APPS_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.system.apps"; 5621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 5721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // System property defining default error report receiver 5821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static final String DEFAULT_ERROR_RECEIVER_PROPERTY = "ro.error.receiver.default"; 5921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 60f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 61f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Uninitialized error report. 62f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 63f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_NONE = 0; 64f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 65f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 66f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application crash. 67f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 68f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_CRASH = 1; 69f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 70f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 71f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * An error report about an application that's not responding. 72f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 73f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final int TYPE_ANR = 2; 74f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 75f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 7621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * An error report about an application that's consuming too much battery. 7721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 7821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static final int TYPE_BATTERY = 3; 7921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 8021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 81cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * A report from a user to a developer about a running service that the 82cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * user doesn't think should be running. 8314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 8414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public static final int TYPE_RUNNING_SERVICE = 5; 8514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 8614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 87f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Type of this report. Can be one of {@link #TYPE_NONE}, 88cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * {@link #TYPE_CRASH}, {@link #TYPE_ANR}, {@link #TYPE_BATTERY}, 89cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick * or {@link #TYPE_RUNNING_SERVICE}. 90f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 91f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int type; 92f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 93f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 94f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application. 95f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 96f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String packageName; 97f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 98f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 99f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Package name of the application which installed the application this 100f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * report pertains to. 1014d7bc65538c7cd9fbb1fbbcf22d1da47fcee1219Dirk Dougherty * This identifies which market the application came from. 102f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 103f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String installerPackageName; 104f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 105f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 106f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Process name of the application. 107f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 108f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String processName; 109f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 110f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 111f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Time at which the error occurred. 112f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 113f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public long time; 114f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 115f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 116e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski * Set if the app is on the system image. 117e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski */ 118e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski public boolean systemApp; 119e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski 120e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski /** 121f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_CRASH}, contains an instance 122f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of CrashInfo describing the crash; otherwise null. 123f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 124f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo crashInfo; 125f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 126f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 127f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * If this report is of type {@link #TYPE_ANR}, contains an instance 128f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * of AnrInfo describing the ANR; otherwise null. 129f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 130f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo anrInfo; 131f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 132f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 133151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * If this report is of type {@link #TYPE_BATTERY}, contains an instance 134151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * of BatteryInfo; otherwise null. 13521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 136151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo batteryInfo; 137cb9ceb1029036363a81952d8ed5dfcbc83e6ff72Brad Fitzpatrick 13821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 13914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * If this report is of type {@link #TYPE_RUNNING_SERVICE}, contains an instance 14014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * of RunningServiceInfo; otherwise null. 14114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 14214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo runningServiceInfo; 14314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 14414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 145f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of {@link ApplicationErrorReport}. 146f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 147f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport() { 148f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 149f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 150f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 151f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of {@link ApplicationErrorReport} initialized from 152f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * a parcel. 153f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 154f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski ApplicationErrorReport(Parcel in) { 15528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski readFromParcel(in); 156f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 157f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 15821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn public static ComponentName getErrorReportReceiver(Context context, 15921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String packageName, int appFlags) { 16021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // check if error reporting is enabled in secure settings 161625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey int enabled = Settings.Global.getInt(context.getContentResolver(), 162625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.SEND_ACTION_APP_ERROR, 0); 16321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (enabled == 0) { 16421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 16521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 16621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn PackageManager pm = context.getPackageManager(); 16821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 16921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // look for receiver in the installer package 17021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String candidate = pm.getInstallerPackageName(packageName); 17121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ComponentName result = getErrorReportReceiver(pm, packageName, candidate); 17221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 17321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 17421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 17521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 17621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if the error app is on the system image, look for system apps 17721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // error receiver 17821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if ((appFlags&ApplicationInfo.FLAG_SYSTEM) != 0) { 17921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(SYSTEM_APPS_ERROR_RECEIVER_PROPERTY); 18021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn result = getErrorReportReceiver(pm, packageName, candidate); 18121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (result != null) { 18221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return result; 18321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 18421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 18521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 18621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // if there is a default receiver, try that 18721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn candidate = SystemProperties.get(DEFAULT_ERROR_RECEIVER_PROPERTY); 18821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return getErrorReportReceiver(pm, packageName, candidate); 18921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 19087d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski 19121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn /** 19221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * Return activity in receiverPackage that handles ACTION_APP_ERROR. 19321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * 194ae96f634eccf86ff80e339c9e9a2abbad3f2a02dMadan Ankapura * @param pm PackageManager instance 19521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param errorPackage package which caused the error 19621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @param receiverPackage candidate package to receive the error 19721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * @return activity component within receiverPackage which handles 19821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * ACTION_APP_ERROR, or null if not found 19921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn */ 20021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn static ComponentName getErrorReportReceiver(PackageManager pm, String errorPackage, 20121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn String receiverPackage) { 20221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage == null || receiverPackage.length() == 0) { 20321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 20421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 20521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 20621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn // break the loop if it's the error report receiver package that crashed 20721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (receiverPackage.equals(errorPackage)) { 20821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 20921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 21021f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 21121f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn Intent intent = new Intent(Intent.ACTION_APP_ERROR); 21221f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn intent.setPackage(receiverPackage); 21321f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn ResolveInfo info = pm.resolveActivity(intent, 0); 21421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn if (info == null || info.activityInfo == null) { 21521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return null; 21621f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 21721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn return new ComponentName(receiverPackage, info.activityInfo.name); 21821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn } 21921f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn 220f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 221f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeInt(type); 222f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(packageName); 223f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(installerPackageName); 224f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(processName); 225f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeLong(time); 226e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski dest.writeInt(systemApp ? 1 : 0); 227f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 228f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 229f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 230f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.writeToParcel(dest, flags); 231f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 232f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 233f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.writeToParcel(dest, flags); 234f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 23521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 236151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.writeToParcel(dest, flags); 23721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 23814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn case TYPE_RUNNING_SERVICE: 23914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo.writeToParcel(dest, flags); 24014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn break; 241f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 242f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 243f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 244fd0bdcc344488df468ae6d7e89a32febd4bfe300Jacek Surazski public void readFromParcel(Parcel in) { 24528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski type = in.readInt(); 24628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski packageName = in.readString(); 24728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski installerPackageName = in.readString(); 24828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski processName = in.readString(); 24928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski time = in.readLong(); 250e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski systemApp = in.readInt() == 1; 25128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 25228b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski switch (type) { 25328b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_CRASH: 25428b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = new CrashInfo(in); 25528b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = null; 256151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 25714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 25828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 25928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski case TYPE_ANR: 26028b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski anrInfo = new AnrInfo(in); 26128b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski crashInfo = null; 262151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = null; 26314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 26421f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 26521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 266151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo = new BatteryInfo(in); 26721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn anrInfo = null; 26821f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn crashInfo = null; 26914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = null; 27014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn break; 27114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn case TYPE_RUNNING_SERVICE: 27214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn batteryInfo = null; 27314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn anrInfo = null; 27414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn crashInfo = null; 27514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn runningServiceInfo = new RunningServiceInfo(in); 27628b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski break; 27728b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 27828b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski } 27928b0e5d06a04f6fa13edbb28de1dd226a158f724Jacek Surazski 280f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 281f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application crash. 282f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 283f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class CrashInfo { 284f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 285f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class name of the exception that caused the crash. 286f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 287f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String exceptionClassName; 288f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 289f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 290f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski * Message stored in the exception. 291f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski */ 292f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski public String exceptionMessage; 293f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski 294f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski /** 295f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * File which the exception was thrown from. 296f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 297f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwFileName; 298f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 299f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 300f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Class which the exception was thrown from. 301f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 302f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwClassName; 303f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 304f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 305f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Method which the exception was thrown from. 306f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 307f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String throwMethodName; 308f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 309f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 3105a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski * Line number the exception was thrown from. 3115a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski */ 3125a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski public int throwLineNumber; 3135a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski 3145a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski /** 315f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Stack trace. 316f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 317f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String stackTrace; 318f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 319f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 320f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of CrashInfo. 321f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 322f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo() { 323f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 324f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 325f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 326b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor * Create an instance of CrashInfo initialized from an exception. 327b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor */ 328b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor public CrashInfo(Throwable tr) { 329b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor StringWriter sw = new StringWriter(); 330b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr.printStackTrace(new PrintWriter(sw)); 331b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor stackTrace = sw.toString(); 33260d8762413e8daba5f73559786312a9ec5e3b827Dan Egnor exceptionMessage = tr.getMessage(); 333b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 334b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor // Populate fields with the "root cause" exception 3358e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn Throwable rootTr = tr; 336b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor while (tr.getCause() != null) { 337b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor tr = tr.getCause(); 3388e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) { 3398e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn rootTr = tr; 3408e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 341b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor String msg = tr.getMessage(); 342b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor if (msg != null && msg.length() > 0) { 343b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor exceptionMessage = msg; 344b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 345b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 346b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 3478e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn exceptionClassName = rootTr.getClass().getName(); 3488e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn if (rootTr.getStackTrace().length > 0) { 3498e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn StackTraceElement trace = rootTr.getStackTrace()[0]; 3508e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwFileName = trace.getFileName(); 3518e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwClassName = trace.getClassName(); 3528e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwMethodName = trace.getMethodName(); 3538e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwLineNumber = trace.getLineNumber(); 3548e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } else { 3558e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwFileName = "unknown"; 3568e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwClassName = "unknown"; 3578e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwMethodName = "unknown"; 3588e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn throwLineNumber = 0; 3598e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn } 360b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor } 361b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor 362b7f0367cec1c744aa66ef397b0244e25d507491cDan Egnor /** 363f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of CrashInfo initialized from a Parcel. 364f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 365f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public CrashInfo(Parcel in) { 366f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski exceptionClassName = in.readString(); 367f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski exceptionMessage = in.readString(); 368f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwFileName = in.readString(); 369f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwClassName = in.readString(); 370f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski throwMethodName = in.readString(); 3715a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski throwLineNumber = in.readInt(); 372f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski stackTrace = in.readString(); 373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save a CrashInfo instance to a parcel. 377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(exceptionClassName); 380f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski dest.writeString(exceptionMessage); 381f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwFileName); 382f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwClassName); 383f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(throwMethodName); 3845a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski dest.writeInt(throwLineNumber); 385f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(stackTrace); 386f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 387f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 388f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 389f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump a CrashInfo instance to a Printer. 390f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 391f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 392f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "exceptionClassName: " + exceptionClassName); 393f829a78f6c78141d2cf8074f00fcded37fbf9007Jacek Surazski pw.println(prefix + "exceptionMessage: " + exceptionMessage); 394f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwFileName: " + throwFileName); 395f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwClassName: " + throwClassName); 396f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "throwMethodName: " + throwMethodName); 3975a12373277f6ce14101f08580bc4f08f9a3d7c50Jacek Surazski pw.println(prefix + "throwLineNumber: " + throwLineNumber); 398f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "stackTrace: " + stackTrace); 399f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 400f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 401f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 402f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 403f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Describes an application not responding error. 404f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 405f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static class AnrInfo { 406f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 407f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Activity name. 408f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 409f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String activity; 410f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 411f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 412f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Description of the operation that timed out. 413f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 414f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String cause; 415f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 416f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 417f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Additional info, including CPU stats. 418f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 419f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public String info; 420f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 421f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 422f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an uninitialized instance of AnrInfo. 423f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 424f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo() { 425f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 426f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 427f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 428f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Create an instance of AnrInfo initialized from a Parcel. 429f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 430f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public AnrInfo(Parcel in) { 431f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski activity = in.readString(); 432f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski cause = in.readString(); 433f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski info = in.readString(); 434f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 435f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 436f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 437f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Save an AnrInfo instance to a parcel. 438f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 439f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void writeToParcel(Parcel dest, int flags) { 440f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(activity); 441f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(cause); 442f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski dest.writeString(info); 443f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 444f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 445f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 446f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump an AnrInfo instance to a Printer. 447f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 448f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 449f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "activity: " + activity); 450f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "cause: " + cause); 451f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "info: " + info); 452f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 453f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 454f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 455151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 456151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Describes a battery usage report. 457151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 458151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public static class BatteryInfo { 459151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 460151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Percentage of the battery that was used up by the process. 461151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 462151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public int usagePercent; 463151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 464151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 465151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Duration in microseconds over which the process used the above 466151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * percentage of battery. 467151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 468151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public long durationMicros; 469151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 470151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 471151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump of various info impacting battery use. 472151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 473151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String usageDetails; 474151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 475151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 476151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Checkin details. 477151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 478151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public String checkinDetails; 479151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 480151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 481151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an uninitialized instance of BatteryInfo. 482151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 483151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo() { 484151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 485151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 486151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 487151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Create an instance of BatteryInfo initialized from a Parcel. 488151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 489151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public BatteryInfo(Parcel in) { 490151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usagePercent = in.readInt(); 491151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski durationMicros = in.readLong(); 492151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski usageDetails = in.readString(); 493151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski checkinDetails = in.readString(); 494151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 495151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 496151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 497151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Save a BatteryInfo instance to a parcel. 498151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 499151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void writeToParcel(Parcel dest, int flags) { 500151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeInt(usagePercent); 501151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeLong(durationMicros); 502151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(usageDetails); 503151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski dest.writeString(checkinDetails); 504151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 505151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 506151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski /** 507151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski * Dump a BatteryInfo instance to a Printer. 508151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski */ 509151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski public void dump(Printer pw, String prefix) { 510151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usagePercent: " + usagePercent); 511151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "durationMicros: " + durationMicros); 512151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "usageDetails: " + usageDetails); 513151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski pw.println(prefix + "checkinDetails: " + checkinDetails); 514151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 515151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski } 516151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski 51714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 51814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Describes a running service report. 51914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 52014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public static class RunningServiceInfo { 52114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 52214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Duration in milliseconds that the service has been running. 52314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 52414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public long durationMillis; 52514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 52614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 52714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Dump of debug information about the service. 52814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 52914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public String serviceDetails; 53014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 53114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 53214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Create an uninitialized instance of RunningServiceInfo. 53314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 53414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo() { 53514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 53614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 53714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 53814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Create an instance of RunningServiceInfo initialized from a Parcel. 53914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 54014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public RunningServiceInfo(Parcel in) { 54114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn durationMillis = in.readLong(); 54214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn serviceDetails = in.readString(); 54314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 54414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 54514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 54614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Save a RunningServiceInfo instance to a parcel. 54714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 54814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public void writeToParcel(Parcel dest, int flags) { 54914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn dest.writeLong(durationMillis); 55014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn dest.writeString(serviceDetails); 55114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 55214bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 55314bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn /** 55414bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn * Dump a BatteryInfo instance to a Printer. 55514bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn */ 55614bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn public void dump(Printer pw, String prefix) { 55714bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn pw.println(prefix + "durationMillis: " + durationMillis); 55814bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn pw.println(prefix + "serviceDetails: " + serviceDetails); 55914bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 56014bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn } 56114bfa398a4e8697ce5822861a684b7d1245e4a85Dianne Hackborn 562f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public static final Parcelable.Creator<ApplicationErrorReport> CREATOR 563f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski = new Parcelable.Creator<ApplicationErrorReport>() { 564f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport createFromParcel(Parcel source) { 565f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport(source); 566f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 567f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 568f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public ApplicationErrorReport[] newArray(int size) { 569f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return new ApplicationErrorReport[size]; 570f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 571f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski }; 572f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 573f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public int describeContents() { 574f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return 0; 575f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 576f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 577f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski /** 578f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski * Dump the report to a Printer. 579f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski */ 580f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski public void dump(Printer pw, String prefix) { 581f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "type: " + type); 582f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "packageName: " + packageName); 583f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "installerPackageName: " + installerPackageName); 584f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "processName: " + processName); 585f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski pw.println(prefix + "time: " + time); 586e0ee6efb1e5bc6cf219555e333635ce98531bc85Jacek Surazski pw.println(prefix + "systemApp: " + systemApp); 587f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 588f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski switch (type) { 589f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_CRASH: 590f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski crashInfo.dump(pw, prefix); 591f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 592f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski case TYPE_ANR: 593f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski anrInfo.dump(pw, prefix); 594f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski break; 59521f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn case TYPE_BATTERY: 596151de3d9df60cf0340e06a3aa1e7a31691fd9bf9Jacek Surazski batteryInfo.dump(pw, prefix); 59721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn break; 59887d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski case TYPE_RUNNING_SERVICE: 59987d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski runningServiceInfo.dump(pw, prefix); 60087d0b2f42209ab1dd4eed71e3b74b31bbcccf663Jacek Surazski break; 601f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 602f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 603f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski} 604