崩潰日志上傳方案詳解
1.實現(xiàn)一個Service類繼承于? pj.android.crash.CrashUploadService? ? 并實現(xiàn)? uploadCrash(CrashInfo crashInfo) 方法 該方法中的crashInfo對象就是具體的崩潰信息在該方法中調(diào)用接口上傳crashInfo (由于每個APP的網(wǎng)絡(luò)請求格式都不統(tǒng)一堰酿,所以通過繼承來讓每個APP自行調(diào)用自己的底層網(wǎng)絡(luò)框架來請求乙埃,沒有做統(tǒng)一封裝到框架層,后續(xù)集成統(tǒng)一的網(wǎng)絡(luò)框架后可將請求挪到框架層)
2.將該Service類注冊到請單文件時指定process,即該服務(wù)將在新的進程中工作塌衰。?
<Service?
android:name=".base.RomeCrashService"
android:process=":RomeCrashService">
3.在Applicaition初始化的時初始化崩潰收集模塊 初始化需要三個參數(shù)分別是
Application context 恨课、UploadHandler 對象復(fù)寫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,"");
/*由于開啟了新的進程進行上傳,新進程讀取不到主進程的內(nèi)存窿吩,所以讀取到的url是不正確的,故在主進程先讀取后再開啟新進程艾栋,并且在新進程中將用戶id賦值爆存,由于每個應(yīng)用的用戶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 初始化時設(shè)置了Thread.setDefaultUncaughtExceptionHandler(this);先较,這樣在發(fā)生崩潰的時候交給PJCrashHandler 對象來處理携冤,并 調(diào)用復(fù)寫的uncaughtException(Thread thread, Throwable ex)方法將Throwable封裝成CrashInfo對象后啟動以上自定義的Remote Service(獨立進程)
5. CrashUploadService? ? 是一個IntentService ,IntentService繼承與Service闲勺,用來處理異步請求曾棕。客戶端可以通過startService(Intent)方法傳遞請求給IntentService菜循。IntentService在onCreate()函數(shù)中通過HandlerThread單獨開啟一個線程來依次處理所有Intent請求對象所對應(yīng)的任務(wù)翘地。IntentService在處理事務(wù)時,還是采用的Handler方式癌幕,創(chuàng)建一個名叫ServiceHandler的內(nèi)部Handler衙耕,并把它直接綁定到HandlerThread所對應(yīng)的子線程。 ServiceHandler把處理一個intent所對應(yīng)的事務(wù)都封裝到叫做onHandleIntent的abstract函數(shù)勺远;因此我們直接實現(xiàn)abstract函數(shù)onHandleIntent橙喘,再在里面根據(jù)Intent的不同進行不同的事務(wù)處理就可以了。我們在onHandleIntent()方法中將PJCrashHandler 傳遞過來的CrashInfo 上傳到接口就可以實現(xiàn)在APP崩潰后不影響主進程的正常結(jié)束胶逢,并能對日志進行上傳厅瞎。
6.CrashUploadService? ? 不僅能抓取主進程的崩潰,也能抓取到其他獨立進程的崩潰初坠,當(dāng)我們指定Android的一個組件運行在獨立進程中并啟動這些組件的時候系統(tǒng)會判斷該進程是否存在和簸,如不存在則初始化進程,在初始化進程時會執(zhí)行Application 的oncreate方法對進程進行初始化碟刺,在Application中PJCrashHandler初始化過程也會被執(zhí)行锁保,并對當(dāng)前進程的DefaultUncaughtExceptionHandler進行處理,當(dāng)進程中發(fā)生崩潰PJCrashHandler仍能啟動CrashUploadService 來上傳日志南誊。