Apiclude中Talkingdata模組異常日誌不能收集問題
最近發現talkingdata的異常日誌收集的頁面中沒有任何異常資訊。期初還認為是前端配置有問題,就去檢查了一遍遍配置資訊和官方的一模一樣。既然前段沒問題那問題很可能是在前端,自己在android原生程式碼中故意丟擲一個異常,還是不能收集到任何異常資訊。這次意識到問題可能出在Talkingdata模組的java程式碼中。下面記錄一下問題的原因。
原因
下面我們先看AS中列印的部分日誌資訊
01-16 18:09:09.068 30338-30338/? W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'void com.tendcloud.tenddata.ao.c(boolean)' on a null object reference at com.tendcloud.tenddata.ac.a(td:286) at com.tendcloud.tenddata.TCAgent.setReportUncaughtExceptions(td:175) at com.talkingdata.apicloud.TalkingDataDelegate.onApplicationCreate(TalkingDataDelegate.java:28) at com.uzmap.pkg.uzcore.t.a(Unknown Source:41) at com.uzmap.pkg.uzcore.t.a(Unknown Source:24) at com.uzmap.pkg.openapi.APICloud.<init>(Unknown Source:37) at com.uzmap.pkg.openapi.APICloud.initialize(Unknown Source:6) at xxx.xxxxx.xxx.xxxxxxx.MyApp.onCreate(MyApp.java:26) 複製程式碼
這裡面有一個NullPointerException但這個異常包的很詭異,我一開始被這段異常誤導了很久,期初還以為是騰訊的一個os檔案報出的警告沒太在意。下面xxx.xxxxx.xxx.xxxxxxx.MyApp.onCreate(MyApp.java:26)指向的位置是Application繼承類的onCreate()方法即APICloud框架的初始化方法
//初始化APICloud,SDK中所有的API均需要初始化後方可呼叫執行 APICloud apiCloud = APICloud.initialize(appContext); 複製程式碼
這個警告報的也是讓人不明白。我自己也是檢視官方文件和superwebview的文件也是沒有任何問題啊。雖然上面有TCAgent.setReportUncaughtExceptions(td:175)資訊。因為很早之前我遇到這個警告那個時候還沒有使用到Talkingdata的異常收集功能所以當時沒有在意。看到警告下意識的就去有檢視藍色表示的日誌。(所以不認真看日誌真的很容易掉坑啊),因此當今天在看到這個日誌後一下子及想到了這個日誌是Talkingdata原始碼中程式碼有關,於是就按照日誌資訊檢視,果然被我找到了問題的原因。 TalkingData_module.jar是官方出的用於Js端和原生的Talkingdata互動的包,問題就出在該包中TalkingDataDelegate.java類中的onApplicationCreate()方法中。
public void onApplicationCreate(Context context, AppInfo info) { super.onApplicationCreate(context, info); //獲取widget資料夾的config.xml檔案中配置的資訊 boolean logEnable = Boolean.valueOf(info.getFeatureValue("TalkingData", "logEnable")); String channel = info.getFeatureValue("TalkingData", "channel"); String exceptionReportEnabled = info.getFeatureValue("TalkingData", "exceptionReportEnabled"); TCAgent.LOG_ON = logEnable; //開啟異常收集 TCAgent.setReportUncaughtExceptions(true); //關閉異常 if (exceptionReportEnabled != null && !Boolean.valueOf(exceptionReportEnabled)) { TCAgent.setReportUncaughtExceptions(false); } TCAgent.init(context, "apicloud_" + info.appId, channel == null ? "" : channel); } 複製程式碼
從上面的程式碼中可以看出問題,Talkingdata的異常收集要早於初始化執行。即初始化還沒完成,就已經開啟了異常收集,所以才不能收集到異常資訊。解決的辦法很簡單。就是先初始化完成,再開啟異常收集。
//初始化 TCAgent.init(context, "apicloud_" + info.appId, channel == null ? "" : channel); //開啟異常收集 TCAgent.setReportUncaughtExceptions(true); //關閉異常 if (exceptionReportEnabled != null && !Boolean.valueOf(exceptionReportEnabled)) { TCAgent.setReportUncaughtExceptions(false); } 複製程式碼