版权声明:转载请邮件联系我([email protected]),以取得授权,谢谢! https://blog.csdn.net/yeshennet/article/details/85000854
crash日志收集这个已经有许多成熟的第三方库实现了这个功能了,大多是以服务的方式提供,这里有个上传日志的需求,在用户本地的信息需要采集和数据处理。
- 如果是创业公司,国内建议使用
网易云捕
或者腾讯Bugly
- 国外建议使用Crashlytics
- 如果要自己搭建服务器收集,可以参考这个项目:ACRA
但是如果你要自己从头写一个的话,可以参考我这篇文章。
JVM异常
android支持jvm代码(java/kotlin),也支持native代码。jvm的异常可以这样获得。
这个就是在JVM虚拟机在中断退出之前调用的
public class CustomCrashHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler PreviousHandler;
void Init(Context context) {
PreviousHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
// TODO handle crash
PreviousHandler.uncaughtException(t, e);
}
}
这里有一个点,就是我们的Android代码通常会有一个混淆的过程,混淆之后,函数名就变成一些奇奇怪怪的abc,但是有个mapping文件,通过这个mapping文件,可以解混淆。PS:IOS也有类似的机制。
现在很多的日志收集库只有一个收集点,就是在上面代码中的TODO
中做处理。一般会抓取手机的很多信息。举个例子:
New Trace collected :
=====================
Error Report collected on : Fri Dec 14 11:37:05 GMT+09:00 2018
Version : 1.0
Package : org.yeshen.crash.crash
FilePath : null
Phone ModelNexus 5
Android Version : 6.0.1
Board : hammerhead
Brand : google
Device : hammerhead
Display : M4B30Z
Finger Print : google/hammerhead/hammerhead:6.0.1/M4B30Z/3437181:user/release-keys
Host : wpdu6.hot.corp.google.com
ID : M4B30Z
Model : Nexus 5
Product : hammerhead
Tags : release-keys
Time : 1478203422000
Type : user
User : android-build
Total Internal memory : 13478064128
Available Internal memory : 9637191680
Custom Informations :
=====================
Stack :
java.lang.RuntimeException: what the fuck
Cause :
=======
**** End of current Report ***
前端在这里会有缓存策略,不会实时上传。后端这里有不少工作量,一个是文件存储与分析,二是数据统计与展示。好一点的处理平台还会对通用错误做修复提示。
收集日志的服务我们会比较在意,是因为这里有大量的漏洞信息/用户信息。如果收集日志的服务提供商节操低一点或者是竞争对手的话,就有点糟糕了。
native 异常
native的异常通常是触发了硬件中断的信号,native层的异常可以通过signalhandler
来处理。分析上报可以通过jni走回jvm层或存成文件等重启之后待jvm代码一并处理。
从头做也许没什么概念,所以是先参考了一些现成的经典的库的:
breakpad
breakpad的文档看 这里
Android适配参考 breakpad-for-android
// TODO