出现crash,我们首先找到crash log(源于system log)
通过filter key——“类似AndroidRuntime: Process: com.android.settings”可以快速定位。
通常,crash的原因有很多,包括error/exception(属于uncheckd Throwable),如图:
Error
1.ArrayIndexOutOfBoundsException
06-30 14:42:44.584 26276 26276 E AndroidRuntime: FATAL EXCEPTION: main
06-30 14:42:44.584 26276 26276 E AndroidRuntime: Process: com.android.settings, PID: 26276
06-30 14:42:44.584 26276 26276 E AndroidRuntime: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
06-30 14:42:44.584 26276 26276 E AndroidRuntime: at android.util.ContainerHelpers.binarySearch(ContainerHelpers.java:28)
06-30 14:42:44.584 26276 26276 E AndroidRuntime: at android.util.ArraySet.indexOf(ArraySet.java:86)
可以直接追溯stack向下找到所研究的app里调用的位置。
2.OutOfMemoryError
05-25 07:40:47.946 9987 7816 E AndroidRuntime: java.lang.OutOfMemoryError: Failed to allocate a 48 byte allocation with 16 free bytes and 16B until OOM, max allowed footprint 268435456, growth limit 268435456
05-25 07:40:47.946 9987 7816 E AndroidRuntime: at com.android.internal.os.BatteryStatsImpl$Uid.readFromParcelLocked(BatteryStatsImpl.java:7540)
05-25 07:40:47.946 9987 7816 E AndroidRuntime: at com.android.internal.os.BatteryStatsImpl.readFromParcelLocked(BatteryStatsImpl.java:12834)
05-25 07:40:47.946 9987 7816 E AndroidRuntime: at com.android.internal.os.BatteryStatsImpl.readFromParcel(BatteryStatsImpl.java:12633)
05-25 07:40:47.946 9987 7816 E AndroidRuntime: at com.android.internal.os.BatteryStatsImpl.<init>(BatteryStatsImpl.java:8931)
OOM的问题不一定追溯stack就能找到原因(new对象过多导致的内存溢出/没有及时回收对象导致的内存泄露),所以通过filter key——"leak",我们找到真正内存开始泄露的地方(原因其实是没有及时unbind service)。
05-25 03:39:46.057 13289 13289 E ActivityThread: Activity com.android.settings.Settings$NetworkDashboardActivity has leaked ServiceConnection android.bluetooth.BluetoothPan$2@656fbcf that was originally bound here
05-25 03:39:46.057 13289 13289 E ActivityThread: android.app.ServiceConnectionLeaked: Activity com.android.settings.Settings$NetworkDashboardActivity has leaked ServiceConnection android.bluetooth.BluetoothPan$2@656fbcf that was originally bound here
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1532)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:1424)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1605)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.app.ContextImpl.bindServiceAsUser(ContextImpl.java:1565)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.content.ContextWrapper.bindServiceAsUser(ContextWrapper.java:691)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.bluetooth.BluetoothPan.doBind(BluetoothPan.java:148)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.bluetooth.BluetoothPan.<init>(BluetoothPan.java:141)
05-25 03:39:46.057 13289 13289 E ActivityThread: at android.bluetooth.BluetoothAdapter.getProfileProxy(BluetoothAdapter.java:2051)
05-25 03:39:46.057 13289 13289 E ActivityThread: at com.android.settings.network.TetherPreferenceController.onCreate(TetherPreferenceController.java:135)
05-25 03:39:46.057 13289 13289 E ActivityThread: at com.android.settingslib.core.lifecycle.Lifecycle.onCreate(Lifecycle.java:74)