Apiclude中Talkingdata模組異常日誌不能收集問題

韓明澤發表於2019-02-26

最近發現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);
}
複製程式碼

步驟:

  1. 再自己專案中克隆TalkingData_module.jar包(這不清楚可以看上篇文章開頭部分)
  2. 修改TalkingDataDelegate.java類中的onApplicationCreate()方法程式碼。
  3. 刪除libs資料夾中的TalkingData_module.jar包

總結

其實這個問題還是因為自己馬虎,以前沒有認真看日誌中的警告資訊。另外ApiCloud平臺模組庫中有一些元件是存在問題,如極光推送點選狀態列資訊不能跳轉、微信分享和登入註冊了動態廣播不需要的時候沒有登出等。如果自己專案出了問題要多去論壇看看。

相關文章