(插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。
发布日期:2025-03-29 23:42:47 浏览次数:10 分类:精选文章

本文共 3634 字,大约阅读时间需要 12 分钟。

一个适合 iOS 和 Android 错误信息捕捉的 Unity 插件

随着应用程序的复杂性不断提升,开发者在日常工作中遇到崩溃和莫名错误的问题越来越频繁。这些问题不仅会导致用户体验下降,还可能导致应用在发布后面临用户投诉和bad sectors的风险。在此背景下,我开发了一个能够捕捉iOS和Android端的错误信息的Unity插件,旨在帮助开发人员更好地定位和解决问题。

背景介绍

在开发过程中,尤其是针对移动应用,应用程序的崩溃和异常处理是一个非常棘手的问题。与桌面应用程序相比,移动应用程序的资源更为受限,而开发者还需要确保在错误发生时能够快速处理,以避免用户流失。

对于iOS,尤其是 ZhObject-C 的编程特性,使得任何一个小错误都可能导致整个程序崩溃。类似地,Android端虽然更为包容,但在处理资源的管理上也可能出现意想不到的错误。因此,一个能够全方位捕捉操作系统、框架和应用程序本身错误的插件显得尤为必要。

该插件的主要功能

该插件基于以下原理,旨在为开发者提供一个全面的错误处理和信息收集框架:

  • 错误信息的捕捉:无论是应用程序突然的 crash,还是方向欺骗导致的不确定错误,这个插件都能够对相关信息进行捕捉和保存。
  • 设备信息的收集:包括设备型号、系统版本、运行环境等关键信息,帮助定位问题所在。
  • 错误堆栈和调用信息:对于iOS,捕捉 Objective-C 的错误堆栈信息;对于 Android,则捕捉其相关的 Throwable 对象。
  • 实现原理

    iOS 错误处理

    iOS 的异常处理机制基于其Objective-C语言特性,旨在为开发者提供一个广泛的错误信息处理框架。主要步骤包括:

    • 注册异常处理器:使用 NSSetUncaughtExceptionHandler 注册一个自定义的异常处理器,确保在未被捕获的异常发生时能够得到称为
    • 处理异常信息:在自定义异常处理器中,获取异常对象,并从中提取调用信息、堆栈信息和错误原因
    • 线程堵塞处理:确保在捕捉完错误信息后,进行适当的线程堵塞处理,以便能够及时上传错误信息

    Android 错误处理

    相较于iOS,Android 的错误处理机制更加简单,主要步骤如下:

    • 注册未捕获异常处理器:在 AndroidManifest.xml 中定义一个自定义的未捕获异常处理器类,确保在未被捕获的异常发生时调用相应的方法
    • 获取异常信息:获取 Throwable 对象,并从中提取相关错误信息
    • UI 线程处理:确保所有 UI 操作都在 UI 线程上执行,以避免因线程问题导致的新错误

    插件适配方法

    为了确保插件能够适配不同开发环境,以下方法被采用:

    • iOS 适配
      • 使用 C 的交叉调用技术通过 native 方法来实现错误信息的捕捉和处理
      • 在需要展示错误信息时,使用 UIAlertView 弹出提示框,供用户查看错误详情
    • Android 适配
      • 使用 Java Reflection 和 JNI 绑定 yawt 到 Unity 的错误信息捕捉机制
      • 确保所有 UI 操作都在 UI 线程上执行,以避免因线程问题导致的新错误

    具体实现细节

    错误信息的捕捉与处理

    对于iOS,捕捉的是 Objective-C 的错误堆栈信息,对于 Android则捕捉的是 Throwable 对象中的相关信息。具体实现如下:

    • iOS
      - (void)caughtExceptionHandler:(NSException *exception) {
      NSString *currentTime = [self getCurrentTime];
      CFRunLoopRef runLoop = CFRunLoopGetCurrent();
      CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);
      NSArray *callStack = [exception callStackSymbols];
      NSString *reason = [exception reason];
      NSString *name = [exception name];
      NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
      [dictionary setValue:callStack forKey:@"callStack"];
      [dictionary setValue:reason forKey:@"reason"];
      [dictionary setValue:name forKey:@"name"];
      [dictionary setValue:currentTime forKey:@"time"];
      NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];
      if (jsonData.length > 0) {
      NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
      // 如果网络条件满足:
      [[VKCatchCrash shareCatchCrash] performSelectorOnMainThread:@selector(uploadBug) withObject:nil waitUntilDone:YES];
      while (!dismiss) {
      for (NSString *mode in (__bridge NSArray *)allModes) {
      CFRunLoopRunInMode((__bridge CFStringRef)mode, 0, false);
      }
      }
      CFRelease(allModes);
      NSSetUncaughtExceptionHandler(NULL);
      }
      }
    • Android
      public class MyCrashHandler implements UncaughtExceptionHandler {
      @Override
      public void uncaughtException(Thread thread, Throwable ex) {
      Throwable throwable = ex;
      StringBuilder message = new StringBuilder();
      message.append("应用程序在 ");
      message.append(DateTimeFormatter.ofPattern("MM-dd HH:mm:ss").format(new Date(throwable_TC.getTime())));
      message.append(" 发生了 crash! 原因: ");
      message.append(throwable.getCause().getMessage() != null ? throwable.getCause().getMessage() : "未捕获错误信息");
      uploadCrashInfo(message.toString(), throwable.getStackTrace().join("\n"));
      }
      }

    开发工具

    为了实现上述功能,我使用了以下工具和库:

    • iOS
      • Objective-C 语言
      • Core Foundation 和 CFRunLoop
      • NSException 处理逻辑
    • Android
      • Java语言
      • Android SDK 和 NDK
      • Reflection 和 JNI 绑定

    总结

    通过上述方法,我成功开发了一个能够适配iOS和Android的错误信息捕捉插件。该插件不仅能够快速定位应用程序的 crash 信息,还可以提取相关的调用堆栈和错误原因,便于开发和优化。在实际应用中,我还扩展了一些功能,如错误信息的本地存储和远程上传,确保开发人员能够快速获得所需的开发反馈。

    上一篇:2024版最新SRC漏洞挖掘思路手法(非常详细),零基础入门到精通,收藏这一篇就够了
    下一篇:2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月23日 17时22分40秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    2024年全球顶尖杀毒软件,从零基础到精通,收藏这篇就够了! 2023-01-24
    2024年度“金智奖”揭晓:绿盟科技获双项大奖,创新驱动网络安全新高度。从零基础到精通,收藏这篇就够了! 2023-01-24
    2024年最流行的十大开源渗透测试工具 2023-01-24
    005从零开始学Python—字符串处理 2023-01-24
    2024年网络安全八大前沿趋势,零基础入门到精通,收藏这篇就够了 2023-01-24
    2024年薪酬最高的五个网络安全职位,零基础入门到精通,收藏这一篇就够 2023-01-24
    2024年非科班的人合适转行做程序员吗? 2023-01-24
    2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了! 2023-01-24
    2024最新最全CTF入门指南(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024最新科普什么是大模型?零基础入门到精通,收藏这篇就够了 2023-01-24
    2024最新程序员接活儿搞钱平台盘点 2023-01-24
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    (插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。 2023-01-24
    2024版最新SRC漏洞挖掘思路手法(非常详细),零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024版最新渗透测试零基础入门教程,带你入门到精通(超详细),收藏这篇就够了 2023-01-24
    2024版最新网络安全入门必备读书清单(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024版最新网络安全教程从入门到精通,看完这一篇就够了 2023-01-24
    0/1背包问题——从LeetCode题海中总结常见套路 2023-01-24
    (原创)面向对象的系统对接接口编写。第5篇(完结) 2023-01-24
    2024网络安全岗就业前景如何?零基础入门到精通,收藏这篇就够了 2023-01-24