首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之全方位定位Android闪退(九十三)
2017
12-23

Unity3D研究院之全方位定位Android闪退(九十三)

首先强烈建议大家安卓打包一定要用il2cpp,我们项目对比了mono发现il2cpp闪退方面比mono少了很多。平常给QA打包推荐勾选Development Build 和 Autocontent Profiler 。这样如果发生了闪退可以直接从log中定位,或者真机连profiler。

我们来看一个闪退的日志

如下图所示,WorldSceneMgr.cs 是我们自己写的c#代码,这里已经可以直接定位在哪一行闪退,通过完整堆栈即可定位到此时的闪退是由于WorldSceneMgr.cs CheckEventGenerator方法调用了物理相关函数,导致unity的物理引擎挂了。

Unity3D研究院之全方位定位Android闪退(九十三) - 雨松MOMO程序研究院 - 1

如果是releas正式包,那么在打包的时候必须要将我们自己写的c#代码生成的符号表.so保存下来。保存方法大家可以参考unity的文档

https://support.unity3d.com/hc/en-us/articles/115000177543-Where-I-can-get-the-symbols-file-for-the-libil2cpp-so-library-in-an-Android-IL2CPP-build-to-symbolicate-call-stacks-from-crashes-on-my-production-builds-

在闪退日志中查询到崩溃地址,使用addr2line即可还原出来。 详细方法同样可以参考unity的文档。

https://support.unity3d.com/hc/en-us/articles/115000292166-Symbolicate-Android-crash

如果你的项目还在使用mono,同样也可以利用上面的方法还原出来崩溃堆栈。

可能大家都会接崩溃汇报的sdk,无论如何我们有带符号表的.so都可以还原崩溃堆栈。平常开发每天都会打包,但是版本号和包名都是一致的。但是每个包的.so文件都不一样,所以在崩溃汇报的时候还需要发送一个唯一的标志,用于日后来做区分。

后来我们又发现一个问题,QA在测试的时候有时候,他们会跑出来崩溃, 或者由于代码报错了导致界面异常或者逻辑异常。由于他们在报 bug的时候没有详细log日志,不太明确的bug技术只能靠猜来改。所以我们由给QA做了个一键提取log的工具。

如图下图所示,技术在自己的android sdk目录下拷贝出 adb.ext  AdbWinApi.dll AdbWinUsbApi.dll fastboot.ext 这些adb需要的依赖库。

Unity3D研究院之全方位定位Android闪退(九十三) - 雨松MOMO程序研究院 - 2

 

脚本就是run.bat

QA测试当跑出来bug或者闪退 只要在2分钟内(很短的一段时间)连上电脑, 快速双击 run.bat 就可以自动提取出当前手机的完整log了,在提交bug我们技术看就方便多啦。

注意:如果测试在PC上安装了360手机助手,adb端口就会被占用(强杀360都不行)。需要在360助手设置界面关闭 开机启动 设备连接时提醒我  关闭悬浮框 重启一下电脑。

或者也可以不安装360手机助手,我测试过豌豆荚就没有这问题,或者别的助手也可以,毕竟QA就是手机助手用来装驱动和apk包。 现在我们的测试在提取安卓日志已经很6啦。呼呼~

最后,欢迎大家在下面给我留言,我们互相讨论~

 

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之全方位定位Android闪退(九十三)》有 8 条评论

  1. Boom 说:

    11-26 20:31:17.123 17324 17342 E Unity : AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
    11-26 20:31:17.123 17324 17342 E Unity : java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
    11-26 20:31:17.123 17324 17342 E Unity : at com.aeroband.myapplication.MainActivity.execContext(Unknown Source:2)
    11-26 20:31:17.123 17324 17342 E Unity : at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
    11-26 20:31:17.123 17324 17342 E Unity : at com.unity3d.player.UnityPlayer.c(Unknown Source:0)
    11-26 20:31:17.123 17324 17342 E Unity : at com.unity3d.player.UnityPlayer$e$2.queueIdle(Unknown Source:72)
    11-26 20:31:17.123 17324 17342 E Unity : at android.os.MessageQueue.next(MessageQueue.java:394)
    11-26 20:31:17.123 17324 17342 E Unity : at android.os.Looper.loop(Looper.java:142)
    11-26 20:31:17.123 17324 17342 E Unity : at com.unity3d.player.UnityPlayer$e.run(Unknown Source:32)
    11-26 20:31:17.123 17324 17342 E Unity : Caused by: java.lang.ClassNotFoundException: Didn’t find class “kotlin.jvm.internal.Intrinsics” on path: DexPathList[[zip file “/data/app/com.aeroband.myapplication-_ekzEBlYkvbVe59WAuHc_A==/base.apk”],nativeLibraryDirectories=[/data/app/com.aeroband.myapplication-_ekzEBlYkvbVe59WAuHc_A==/lib/arm, /data/app/com.aeroband.myapplication-_ekzEBlYkvbVe59WAuHc_A==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor
    求助 我这个也是闪退问题 unity和kotlin交互的 是说没有虚拟机 我这个没在手机上运行 是在头显上运行的

  2. SNAKE 说:

    adb被占用的问题可以在执行自己adb命令之前运行adb kill-server

  3. 111 说:

    不是直接监听LOG发邮件?

  4. 咪噜噜 说:

    现在项目只能用mono导包,如果用il2cpp的话报错问题好多,要改挺多东西。。
    现在的做法是再导多一个ios包来测试
    2017版本,好像用il2cpp也有些问题

  5. sam319 说:

    请问能推荐unity哪个版本以上用il2cpp打包android会比较稳定吗?谢谢

留下一个回复

你的email不会被公开。