
因为打包时的优化,导致堆栈中记录的行号和源代码对不上(源代码SpaceDataScan中根本就没有36248行),所以这里通过dumpdex的方式找到对应的代码行号
解压apk文件
|
|
查找SpaceDataScan这个类在哪一个dex文件中
|
|
说明这个类在classes3.dex中,那么我们就需要dumpdex
dexdump
|
|
用vim打开dump出来的这个文件
|
|
搜索崩溃的类定义(Class)
|
|

在这个类定义后面搜索找到对应的方法定义
|
|

在这个方法后面搜索对应的崩溃行号
|
|

行号前面的0x0110代表执行这一行代码的具体偏移地址,从0x0110到0x0138都是36248这一行代码要执行的内容,在这之间产生的崩溃都会上报到36248这一行
向上翻找到0x0110

从崩溃堆栈可以看到,崩溃的地方时执行了list.get(9), 然后在上图中找到0124到0128正是在调用这个方法,这个list是Lcom/cleanmaster/ui/space/newitem/q的一个静态变量a,通过打包时产生的mapping文件找到Lcom/cleanmaster/ui/space/newitem/q这个类,然后找到静态变量a,最后发现这个list里面一共只有9个元素,所以调用list.get(9)时导致崩溃。