php Android 开源 mysql shell 微软 linux google centos Windows wordpress Firefox Python java nginx Ubuntu 程序员 编程 apache 云计算

Android Crash的跟蹤方法,使用騰訊Bugly來捕捉一些疑難雜癥,讓我們APP穩定上線

Android Crash的跟蹤方法,使用騰訊Bugly來捕捉一些疑難雜癥,讓我們APP穩定上線

我們在開發中常常會註意到一些Crash,這正是很頭疼的,而且Crash會帶來很多意想不到的狀態,很惡心,所以今天,我們來著重研究一下Crash,同時,我們也將使用第三方SDK,也就是騰訊的Bugly來撲捉這些Crash,讓他無所遁形。

一.糟糕的Android Crash

作為開發人員,很容易就能碰到Crash,但是作為用戶,我相信也有很大部分人碰到過Crash,這些原因,也正是Android的平臺差異化和適配所導致的,而且,你要是你安裝一個軟件就Crash,我想你會立馬把他卸載掉。同時心理嘲笑了一下開發人員,有些用戶還有可能會去商店給你差評之類的,這就不多說了,反正會直接影響到你APP的口碑和市場競爭能力,你要是一些用戶很多的APP的話,你還得考慮用戶留存和收入的問題了

而在以前,我們是怎麽處理Crash的呢?一般有三個補救措施吧,感覺,當然,還有其他,待補充:

1.等待用戶反饋,這樣很被動
2.了解出錯原因,讓用戶提供日誌和使用場景,不靠譜,攢人品吧
3.提示用戶反饋,這樣對用戶體驗有點糟糕
而在以前,很多廠商基本都這樣搞過,歸根究底,還是現在的APP質量,仍然不敢恭維

我今天講的是騰訊的Bugly處理Crash的方式,主要還是因為他使用比較簡單吧,初始化也就一行代碼,而且可以監控和獲取日誌,挺不錯的

二. Crash分類

一般Crash也是分了兩類

JAVA Crash
java代碼觸發,Jvm虛擬機退出,系統彈框提醒用戶,這個我們可以看log查看報錯原因,Crash工具都能捕獲到。

Native Crash
C/C++代碼觸發,Linux進程退出,無系統提示,這就需要一些第三方工具去捕獲了

三.模擬Crash的產生

其實我們可以非常簡單的實現一個java的Crash,比如空指針,很正常就能產生,我們這樣來寫MainActivity

public class MainActivity extends AppCompatActivity {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button.setText("Android Crash");
    }
}
我都沒給這個button初始化就賦值,肯定會報空指針異常,效果如上圖,而在我們上圖中是提到的,我們可以使用log去收集錯誤

我們可以看到他的錯誤是空指針,而錯誤在MainActivity的16行

這樣我們的問題就一下子找到了

而如果集成了騰訊Bugly的話,他輸出的日誌就比較詳細了,那具體是怎樣的輸出,我們現在就來集成一下把!

四.集成騰訊Bugly

要集成Bugly,肯定要去Bugly的官網

Bugly官網:http://bugly.qq.com/


當然,Bugly的集成還是相對來說比較簡單的,我們只要按照他的官方文檔來

http://bugly.qq.com/androidfast
首先要做的,就是下載SDK了(如果你添加依賴的話,就不需要下載)

下載之後,我們可以看到他裏面包含著四個文件

我們可以根據他們的接入指南來,因為我們是android studio開發,所以我把流程走一遍

在Module的build.gradle文件中添加依賴和屬性配置:

dependencies {
    compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本號,也可以指定明確的版本號,例如2.1.5
}
這裏要註意了,Bugly還提供了ndk動態庫,我們如果要看C的日誌可以使用

如果你集成了這些的話,你在Module的build.gradle文件中添加依賴和屬性配置:

android {
   defaultConfig {
        ndk {
            // 設置支持的SO庫架構
            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }
}
dependencies {
    compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本號,也可以指定明確的版本號,例如2.1.5
    compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新版本號,也可以指定明確的版本號,例如2.2.0
}
可以參考官方提供的這張圖

註意:自動集成時會自動包含Bugly SO庫,建議在Module的build.gradle文件中使用NDK的“abiFilter”配置,設置支持的SO庫架構。
如果在添加“abiFilter”之後Android Studio出現以下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
則在項目根目錄的gradle.properties文件中添加:

android.useDeprecatedNdk=true
接著你就可以添加他所需要的一些權限了

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
好,現在我們需要去註冊一個APP了,進入你的後陽臺選擇註冊app

註冊成功之後就可以看到全貌了,並且可以看到appid了,我們需要這個id

現在我們拿到了APPID:900033301,那我們可以去初始化了,建議是在Application中,所以我新建一個Application,並在清單文件,Application的根節點添加name屬性

package com.lgl.androidcrash;

import android.app.Application;

import com.tencent.bugly.crashreport.CrashReport;

/**
 * Application初始化
 * Created by LGL on 2016/6/10.
 */
public class CrashApplication extends Application {

    //初始化
    @Override
    public void onCreate() {
        super.onCreate();
        //是否調試
        CrashReport.initCrashReport(getApplicationContext(), "900033301", false);

    }
}
到這裏,Bugly的配置基本上是OK的,我們可以引起一個bug,然後日誌過濾一下

便可以看到

當然,你也可以去Bugly的後臺查看

我們可以查看詳情

分析的很透徹,我們很容易就找到問題的所在了

延伸阅读

    评论