iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 29
0

今天輕鬆一下不寫程式,來介紹一個很重要的東西:Firebase Crashlytics,即時回報crash時的log訊息和裝置資訊,幫助我們了解用戶的錯誤情況以盡速修正,進而提升用戶滿意度。

Crashlytics後來被Google收購並列入Firebase的服務項目中,將來會成為Firebase主力的錯誤回報機制,今天的建置將以Firebase版本為例。

Connect to Firebase

在使用Firebase的服務之前需先將App連結至Firebase,使用Android Studio的工具可以很快完成。

  1. Android Studio -> Tools -> Firebase,右邊會出現選單列出Firebase的服務項目,隨便選一項,因為每一項的第一步都是連結App和Firebase,而我們也只需要做第一步。選第一項Analytics之後按Log an Analystics event
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849Ab65IcUNL4.png

  2. 接著只要做第一步Connect to Firebase就好
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849NIQRBENVNC.png

  3. 照著指示登入Google帳號,完成後會出現Success
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849QwYAaCifUq.png

  4. 回到Android Studio,會看到Connect to Firebase視窗,取好專案名稱就可以Connect了。專案中可以包含多個App,所以不一定要取為目前的App名稱。
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849QLKj4TfRFg.png

  5. 執行片刻後會出現Connected表示Firebase連結完成,在app資料夾中會多一個json檔,紀錄Firebase專案資訊,到這邊選單就可以關掉了。
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849tFxVw1QiZp.png

  6. Firebase的運作需要Google Services plugin,依照Document修改project-level gradle

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:3.1.2' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        // ...
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }
    }
}
  1. 修改app-level gradle
apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  compile 'com.google.firebase:firebase-core:11.8.0'
  
  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

Enable Crashlytics

  1. 登入Firebase console,選擇剛剛建立的專案
    https://ithelp.ithome.com.tw/upload/images/20180117/201038498DeeKO7Kau.png

  2. 左邊選擇Crashlytics,右邊按照步驟做,最後3個步驟都打勾就好了
    https://ithelp.ithome.com.tw/upload/images/20180117/2010384901mA6GwBvD.png
    https://ithelp.ithome.com.tw/upload/images/20180117/20103849qih7idAT5b.png

  3. 回到Android Studio,於project-level gradle新增

buildscript {
    repositories {
        // ...
        maven {
           url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        // ...
        classpath 'io.fabric.tools:gradle:1.24.4'
    }
}
  1. 於app-level gradle新增
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

dependencies {
    // ...
    compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
       transitive = true
    }
    compile 'com.google.firebase:firebase-core:11.8.0'
}

到這邊就建置完成了。

Test Firebase Crashlytics implementation

使用Crashlytics.getInstance().crash()故意發出錯誤訊息測試有沒有建置成功,例如:

binding.btnSearch.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Crashlytics.getInstance().crash();
    }
});

crash之後會在Logcat看到紀錄已上傳的訊息
https://ithelp.ithome.com.tw/upload/images/20180118/20103849o4lTob4lp2.png

回到Firebase console會看到剛剛的錯誤內容就表示測試完成了。
https://ithelp.ithome.com.tw/upload/images/20180118/20103849ICekplUfoD.png

然後!可以按上面的關閉表示此錯誤已修正,會有可愛的動畫!

另外Crashlytics也可以回報Exception,更多運用可參考Document

try {
    methodThatThrows();
} catch (Exception e) {
    Crashlytics.logException(e);
    // handle your exception here
}

Disable Crashlytics on Debug Build

開發的過程中我們可以關閉Crashlytics,只在釋出的版本中啟用,以免開發時做了蠢事還被記錄下來加上郵件通知,造成心靈上的二度傷害。

manifestPlaceholders來決定是否啟用,於app-level gradle的buildTypes中新增:

android {
    ...
    defaultConfig {
        ...
    }

    buildTypes {
        debug {
            manifestPlaceholders = [crashlyticsEnabled:"false"]
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            manifestPlaceholders = [crashlyticsEnabled:"true"]
        }
    }

    ...
}

接著到AndroidManifest新增<meta-data>就完成了。

<application
    android:name=".GithubApp"
    ...>

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="${crashlyticsEnabled}" />
        
    <activity android:name=".MainActivity">
       ...
    </activity>
</application>

Firebase Crashlytics的錯誤回報功能比Play商店的強很多,不論速度或詳細度,而且會自動處理proguard不用每次手動上傳,如果目前還是使用Play商店的回報機制,建議花大約半小時把Firebase Crashlytics建置起來。

建置遇到錯誤的話可以參考官方文件和底下的原始碼,手動檢查一下gradle有沒有漏掉東西,尤其是Google Services的部分要留意一下。

GitHub source code:
https://github.com/IvanBean/ITBon2018/tree/day29-firebase-crashlytics


上一篇
RxJava2 and LiveData
下一篇
Hello Kotlin
系列文
Android Architecture30

尚未有邦友留言

立即登入留言