Unity 通过解析libil2cpp.so文件查看Android Crash崩溃原因

Unity 通过解析libil2cpp.so文件查看Android Crash崩溃原因

Unity 通过解析libil2cpp.so文件查看Android Crash崩溃原因-优快云博客

Unity 通过解析libil2cpp.so文件查看Android Crash崩溃原因
置顶 少侠Smile丶 2020-07-18 19:20:07 2184 收藏 3
分类专栏: Unity Android 文章标签: unity Android CRASH IDA libil2cpp
版权

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

E/CRASH: signal 6 (SIGABRT), code 0 (?), fault addr --------
在这里插入图片描述
出现这种CRASH,网上也都有详细介绍,一搜一大堆介绍,但对我排错没啥帮助,不是重点,这里跳过。
然后我们筛选崩溃的这个线程的日志,会从里面找到这个线程crash之前的一些操作日志,比如:
在这里插入图片描述
前面的是执行堆栈地址,由下往上执行的,后面是执行所在的库文件,我们找到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文件中搜索,就能找到这个方法了。
(有兴趣的可以看下这些汇编语言,还挺有意思的。)

在这里插入图片描述
继续在IDA的界面往上拖动,找到该方法是从哪里调用的。
在这里插入图片描述
在dump.cs中搜索1692D70,找到调用的方法
在这里插入图片描述
完美,原来是这个方法。(如此往复,把这一连串的地址都查一遍把,你认识的堆栈就出来了,完美解决。)
PS:有一些查不到的不用管,我们只要查到几个我们认识的方法,相信你心中定会有了答案的。

好了,以上就是通过解析libil2cpp.so文件查看Android Crash崩溃原因,毫不夸张的说,熟练应用反编译libunity.so文件查看崩溃原因后,就像是学会了万能方法,再也不怕任何崩溃的出现了。
————————————————
版权声明:本文为优快云博主「少侠Smile丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/smile_Ho/article/details/107432806

<think>好的,我现在需要解答用户关于UnityAPK中libil2cpp.so文件的作用及功能的问题。首先,我得回忆一下之前用户提到的引用内容,看看有没有相关的信息可以利用。引用[1]提到Unity通过解析libil2cpp.so来分析Android崩溃原因,这说明这个文件崩溃分析中很重要。引用[2]和[3]讨论了在APK中提取该文件以及升级Unity版本时可能出现的问题,特别是gradle配置错误导致该文件无法生成,进而引发崩溃。引用[4]和[5]进一步说明了在特定Unity版本中libil2cpp.so缺失的情况,以及如何通过修改gradle文件来修复。 用户现在的问题是想了解libil2cpp.soUnityAPK中的作用和功能。我需要整合这些引用中的信息,并补充自己的知识来形成回答。首先,libil2cpp.soUnity使用IL2CPP(Intermediate LanguageToC++)技术生成的本地库文件。IL2CPP将C#代码编译成C++,再生成so文件,提升性能和安全性。这个文件包含了游戏的核心逻辑,所以当它缺失或损坏时,应用会崩溃,如引用[3]和[5]所述。此外,该文件崩溃分析中的作用也很重要,如引用[1]所示,开发者需要解析这个文件来定位崩溃的堆栈信息。同时,引用[2]提到在解压APK时需要提取该文件和global-metadata.dat,这两者配合才能正确解析符号。接下来,我需要组织这些点,分结构说明作用和功能。可能分为核心功能、性能优化、平台兼容性、安全加固等方面。同时,要指出常见问题,如版本升级导致的生成失败,引用[3][4][5]中的例子。还要注意用户提到的系统指令,比如正确使用LaTeX格式,不过这个问题可能用不上数学公式,但需要检查是否有变量或路径需要用$符号包裹。例如,路径中的文件名可能需要用$libil2cpp.so$,但根据示例,可能不需要,除非有数学表达式。最后生成相关问题,可以围绕IL2CPP机制、崩溃分析、版本兼容性问题、手动修复方法等方面提问,参考用户之前的问题和引用中的内容。现在需要确保引用标记正确,每个引用点对应正确的来源,比如引用[1]对应崩溃分析,引用[3][4][5]对应生成问题等。同时,回答结构要清晰,分点说明,并附上相关问题。</think>### Unity APK中`libil2cpp.so`文件的作用及功能 `libil2cpp.so`是Unity引擎使用**IL2CPP(Intermediate Language To C++)**技术生成的核心动态链接库文件,在Android APK中承担以下关键作用: --- #### 一、核心功能 1. **代码转换与执行** - 将Unity的C#脚本代码通过IL2CPP技术转换为C++代码,并编译为平台原生的二进制文件(`.so`文件)[^3][^5] - 负责在运行时执行游戏逻辑,包括对象管理、内存分配和垃圾回收(GC)等核心功能 2. **跨语言桥接** - 作为C#代码与Android底层(JNI/NDK)之间的桥梁,实现托管代码与非托管代码的交互[^4] --- #### 二、性能优化 1. **执行效率提升** - 相比Mono虚拟机,IL2CPP生成的C++代码具有更优的编译优化,减少虚拟机开销,提升运行效率[^3] - 支持64位架构(如ARM64),避免32位应用的性能瓶颈[^2] 2. **内存占用优化** - 通过静态编译减少运行时内存碎片,提高内存访问局部性 --- #### 三、平台兼容性与安全加固 1. **多平台适配** - 针对不同CPU架构(如`armeabi-v7a`、`arm64-v8a`)生成对应的`.so`文件,确保兼容性[^2] 2. **代码混淆保护** - 原生二进制代码比C#字节码更难以反编译,增强应用安全性[^1] --- #### 四、常见关联问题 1. **文件缺失导致的崩溃** - 若Unity版本升级时未正确配置Gradle任务(如`BuildIl2CppTask`),可能导致`libil2cpp.so`未生成,引发启动崩溃[^3][^5] 2. **符号解析依赖** - 分析崩溃堆栈时需同时使用`libil2cpp.so`和`global-metadata.dat`文件,才能还原C#代码符号信息[^1][^2] --- ### 示例:APK中文件结构 ``` apk/ ├── lib/ │ └── armeabi-v7a/ │ └── libil2cpp.so # IL2CPP生成的核心库 └── assets/ └── bin/Data/Managed/ └── Metadata/ └── global-metadata.dat # 符号映射文件[^2] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值