近期项目出现了网络状态切换时,android手机会出现高概率崩溃的情况。话不多说,直接上crash日志:

E/CRASH: signal 6 (SIGABRT), code 0 (?), fault addr --------

unity android lib unity android libc.so崩溃_Android CRASH


出现这种CRASH,网上也都有详细介绍,一搜一大堆介绍,但对我排错没啥帮助,不是重点,这里跳过。

然后我们筛选崩溃的这个线程的日志,会从里面找到这个线程crash之前的一些操作日志,比如:

unity android lib unity android libc.so崩溃_libil2cpp_02


前面的是执行堆栈地址,由下往上执行的,后面是执行所在的库文件,我们找到libil2cpp.so的日志,这里面是我们的游戏主逻辑代码。

如果有大佬可以通过这些简单的日志(外加游戏自身的log)判断出问题所在,从这里可以return了。

接下来,我们要做的就是
1】利用IDA解析libil2cpp.so文件
2】利用Il2CppDumper.exe读取global-metadata.dat文件中的信息,获取我们项目文件源代码以及偏移地址。

Unity在生成libil2cpp.so时,同时会在目录assets\bin\Data\Managed\Metadata下生成资源文件global-metadata.dat。游戏中使用的字符串都被保存在了一个叫global-metadata.dat的资源文件里(对应关系),只有在动态运行时才会将这些字符串读入内存。这使得用IDA对游戏进行静态分析变得更加困难。那么为了解决这个困难,有人造了轮子,即Il2CppDumper.exe。此可读取global-metadata.dat文件中的信息,并与libil2cpp.so结合起来。这样可以根据地址定位到我们的源代码。

所需要的工具以及文件列表整理好了,请查收。
链接:https://pan.baidu.com/s/1jbnymRshJaLuPX_G35Nz6A
提取码:kkgh

首先第一步,我们安装并打开IDA,直接将apk拖入IDA内即可,自己会处理的(解析后选择libil2cpp.so 或者直接将libil2cpp.so拖入)。
第二步,打开Il2CppDumper.exe,先选择libil2cpp.so文件,再选择global_metadata.bat文件,后面自己会处理的。
处理完成,会生成一个dump.cs文件(还会生成很多东西,有兴趣可以自己尝试),这就是我们逻辑代码的一些信息(地址偏移)
第三步,我们随便找到一个崩溃日志里的地址016932dc,回到IDA中,在IDA View-A栏中按g输入,回车,就找到了这个地址的实际执行位置,如果后面是sub_xxx格式的,xxx就是地址偏移,复制sss,回到dump.cs文件中搜索,就能找到这个方法了。
(有兴趣的可以看下这些汇编语言,还挺有意思的。)

unity android lib unity android libc.so崩溃_libil2cpp_03


继续在IDA的界面往上拖动,找到该方法是从哪里调用的。

unity android lib unity android libc.so崩溃_unity_04


在dump.cs中搜索1692D70,找到调用的方法

unity android lib unity android libc.so崩溃_Android CRASH_05


完美,原来是这个方法。(如此往复,把这一连串的地址都查一遍把,你认识的堆栈就出来了,完美解决。)

PS:有一些查不到的不用管,我们只要查到几个我们认识的方法,相信你心中定会有了答案的。

好了,以上就是通过解析libil2cpp.so文件查看Android Crash崩溃原因,毫不夸张的说,熟练应用反编译libunity.so文件查看崩溃原因后,就像是学会了万能方法,再也不怕任何崩溃的出现了。