崩溃日志上传方案详解
1.实现一个Service类继承于 pj.android.crash.CrashUploadService 并实现 uploadCrash(CrashInfo crashInfo) 方法 该方法中的crashInfo对象就是具体的崩溃信息在该方法中调用接口上传crashInfo (由于每个APP的网络请求格式都不统一,所以通过继承来让每个APP自行调用自己的底层网络框架来请求,没有做统一封装到框架层,后续集成统一的网络框架后可将请求挪到框架层)
2.将该Service类注册到请单文件时指定process,即该服务将在新的进程中工作。
<Service
android:name=".base.RomeCrashService"
android:process=":RomeCrashService">
3.在Applicaition初始化的时初始化崩溃收集模块 初始化需要三个参数分别是
Application context 、UploadHandler 对象复写setUpCrash、上面定义的service类名
PJCrashHandler.getInstance(this, newUploadHandler() {
@Override
public voidsetUpCrash(CrashInfo crashInfo) {
SharedPreferences sharedPreferences = getSharedPreferences("user",Context.MODE_PRIVATE);
String account = sharedPreferences.getString(SpConstants.USER_NAME,"");
/*由于开启了新的进程进行上传,新进程读取不到主进程的内存,所以读取到的url是不正确的,故在主进程先读取后再开启新进程,并且在新进程中将用户id赋值,由于每个应用的用户id保存不是 一致的,所以需要app自行处理 */
crashInfo.crashUploadUrl= DefaultNetConfig.getInstance().getServerUrl();
Log.e("error","pid="+ android.os.Process.myPid() +"crashUploadUrl"+ DefaultNetConfig.getInstance().getServerUrl());
crashInfo.account= account;
}
},RomeCrashService.class);
4.PJCrashHandler 继承UncaughtExceptionHandler接口,PJCrashHandler 初始化时设置了Thread.setDefaultUncaughtExceptionHandler(this);,这样在发生崩溃的时候交给PJCrashHandler 对象来处理,并 调用复写的uncaughtException(Thread thread, Throwable ex)方法将Throwable封装成CrashInfo对象后启动以上自定义的Remote Service(独立进程)
5. CrashUploadService 是一个IntentService ,IntentService继承与Service,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来依次处理所有Intent请求对象所对应的任务。IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。 ServiceHandler把处理一个intent所对应的事务都封装到叫做onHandleIntent的abstract函数;因此我们直接实现abstract函数onHandleIntent,再在里面根据Intent的不同进行不同的事务处理就可以了。我们在onHandleIntent()方法中将PJCrashHandler 传递过来的CrashInfo 上传到接口就可以实现在APP崩溃后不影响主进程的正常结束,并能对日志进行上传。
6.CrashUploadService 不仅能抓取主进程的崩溃,也能抓取到其他独立进程的崩溃,当我们指定Android的一个组件运行在独立进程中并启动这些组件的时候系统会判断该进程是否存在,如不存在则初始化进程,在初始化进程时会执行Application 的oncreate方法对进程进行初始化,在Application中PJCrashHandler初始化过程也会被执行,并对当前进程的DefaultUncaughtExceptionHandler进行处理,当进程中发生崩溃PJCrashHandler仍能启动CrashUploadService 来上传日志。