Android

[Fabric제거] Firebase Crashlytics SDK 로 업그레이드 하기

FireBase로 부터 메일 한통이 왔다. 

[Action Required] Update your apps to use latest Firebase Crashlytics SDKs before November 15, 2020

 

Hi [ ] [ ],

We are writing to let you know that the Fabric Crashlytics SDK is now deprecated and will continue reporting your app’s crashes until November 15, 2020. After this date, the Fabric Crashlytics SDK and beta versions of the Firebase Crashlytics SDK will stop sending crash reports for your app.

What happened?

We are replacing Fabric Crashlytics SDKs and beta versions of the Firebase Crashlytics SDKs with the generally available Firebase Crashlytics SDKs.

What’s Next?

To continue getting crash reports in the Firebase console, make sure to upgrade your apps to the Firebase Crashlytics SDK versions 17.0.0+ for Android, 4.0.0+ for iOS, and 6.15.0+ for Unity before November 15, 2020.

The following project(s) linked with your account include apps that have enabled Crashlytics:

………………………………..앱 리스트 생략

……………………………….

As always, if you have any questions or need any assistance, feel free to reach out to us for more assistance.

Thanks,

Shobhit, on behalf of the Firebase team

 

잘 사용해왔던 Fabric Crashlytics SDK 서비스가 종료되었기 때문이다. Fabric 서비스가  종료되면서 Firebase로 마이그레이션 서비스를 제공했었다. 그런데 이제 SDK도 바꿔줘야하는 모양새다. 그래서 시작하였다.

작업을 시작해보자. 

 

■build.gradle(project-level) 파일을 열어 기존 패브릭 SDK 제거하자.

//제거전
buildscript {
    repositories {
        //mavenLocal()
        maven {
            url 'https://maven.fabric.io/public'
        }
        google()
    }
    dependencies {
        classpath 'io.fabric.tools:gradle:1.30.0'
        //classpath 'io.fabric.tools:gradle:1.26.1'
        //classpath 'io.fabric.tools:gradle:1.+'
    }
}



//제거 후
buildscript {
    repositories {
        google()
    }
    dependencies {
    	//.....
    	// Add the Google Services Gradle plugin (if it's not there already).
		classpath 'com.google.gms:google-services:4.3.3'
        
        // Add the Firebase Crashlytics Gradle plugin.
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
    }
}

■build.gradle(app-level ) 파일을 열어 기존 패브릭 플러그인을 제거하자.  

//제거전
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
 
 
 
//제거 후 
apply plugin: 'com.android.application'

// Apply the Google Services plugin (if it's not there already). 기존에 사용중이라면 추가할 필요 없다.
apply plugin: 'com.google.gms.google-services'

// Add the Firebase Crashlytics plugin.
apply plugin: 'com.google.firebase.crashlytics'

■build.gradle(app-level ) 파일을 열고 기존 Fabric Crashlytics SDK를 제거하고 새로운 Firebase Crashlytics SDK로 교체한다. 버전은 17.0.0 이상을 추가한다.(2020 년 11 월 15 일부터 충돌 보고서가 Firebase 콘솔에 표시되어야 함).

//제거전
dependencies {
	................... 생략
    implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') {
        transitive = true
    }
}



//제거후
dependencies {
	................... 생략
    
  // Add the Firebase Crashlytics SDK.
  implementation 'com.google.firebase:firebase-crashlytics:17.0.1'

  // Recommended: Add the Google Analytics SDK.  추가해도 되고 안해도 되고...
  implementation 'com.google.firebase:firebase-analytics:17.4.3'
}

작업을 끝냈다면, Sync를 클릭한다. 그러면 변경된 SDK를 다운받게된다.

 

■ 이제 백앤드 코드를 수정해야한다.

//제거대상 패브릭 코드들...
import com.crashlytics.android.Crashlytics;
import io.fabric.sdk.android.Fabric;

    void initFabric(){
        //init fabric
        try {
            Fabric.with(this, new Crashlytics());

            //Enable Debugging  : 마켓등록시 주석처리하자
            final Fabric fabric = new Fabric.Builder(this)
                    .kits(new Crashlytics())
                    .debuggable(true)
                    .build();
            Fabric.with(fabric);

        }catch (Exception e){
            Crashlytics.logException(new CustomException("Fabric 초기화 오류 발생")); //추가로 핸들링을 한 에러들에 대해 직접 로그를 남길수도 있다.
        }

    }
    
    

//FireBase Crashlytics 테스트 코드추가

// Operations on FirebaseCrashlytics.
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.log("my message");

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message");
 


// Explicit initialization of Crashlytics is no longer required.
// Crashlytics의 명시 적 초기화는 더 이상 필요하지 않습니다.
// OPTIONAL: If crash reporting has been explicitly disabled previously, add:
// 선택 사항 : 충돌보고가 이전에 명시 적으로 비활성화 된 경우 다음을 추가하십시오.
// 그러니까 기존에 false 처리한 적이 없다면 굳이 사용할 필요가 없다.
// 최초로 설정중이라면 설정할 필요가 없음을 의미한다.
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);

//기존에 Fabric SDK 사용시 try.catch문에 사용하였다면 변경해야한다.
try {
/* Code that can throw checked exceptions. */
 

} catch (Exception e) {
   Crashlytics.logException(e);  <--- 패브릭 코드
}


//변경 후

try {
/* Code that can throw checked exceptions. */
 

} catch (Exception e) {
	FirebaseCrashlytics.getInstance().recordException(e);
}

 

■ AndroidManifest.xml 파일을 열고 io.fabric.ApiKey 값 제거하자.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.your_app_package">

   <application>
      <activity android:name=".MainActivity"/>

      <!--Remove this line if it exists  제거 대상-->
      <meta-data android:name="io.fabric.ApiKey"
          android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

   </application>
</manifest>

 

■제대로 동작하는지 테스트를 해보자

throw new RuntimeException("This is a crash");

앱을 실행하면 FireBase SDK가 동작하기 시작했음을 로그창에서 확인할 수 있다.

2020-06-12 09:39:09.922 12623-12672/ddolcat.test I/FirebaseCrashApiImpl: FirebaseCrash reporting API initialized
2020-06-12 09:39:09.923 12623-12672/ddolcat.test I/FirebaseCrash: FirebaseCrash reporting initialized com.google.android.gms.internal.crash.zzo@534e30f
2020-06-12 09:39:09.924 12623-12672/ddolcat.test D/FirebaseCrash: Firebase Analytics Listener for Firebase Crash is initialized
2020-06-12 09:39:09.944 12623-12680/ddolcat.test V/FA: Connecting to remote service
2020-06-12 09:39:09.957 12623-12680/ddolcat.test V/FA: Connection attempt already in progress
2020-06-12 09:36:51.694 12159-12159/ddolcat.test E/UncaughtException: java.lang.RuntimeException: Unable to create application ddolcat.test.HiLottoApplication: java.lang.RuntimeException: This is a crash
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6715)
        at android.app.ActivityThread.access$1300(ActivityThread.java:226)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1898)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7615)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
     Caused by: java.lang.RuntimeException: This is a crash
        at ddolcat.test.HiLottoApplication.forceCrash(HiLottoApplication.java:259)
        at ddolcat.test.HiLottoApplication.onCreate(HiLottoApplication.java:77)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6710)
        at android.app.ActivityThread.access$1300(ActivityThread.java:226) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1898) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7615) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) 

파이어베이스에서 로그인 후 확인하면 끝!!.. 잘 올라고 있다. 실시간으로 바로 올라오지는 않는다. 몇 분 지나야 올라온다.


[참고 자료]

Upgrade to the FireBase Crashlytics SDK

 

[관련 자료]
명료한 오류 보고서 얻기

Leave a Reply

error: Content is protected !!