처음 담당?한 일은 과제로 받았던 내용인 안드로이드 네이티브기능 구현(와이파이 체크)과
firebase에서 제공하는 crashlytics기능 구현이었다
그런데.. 없다!
아무리 검색해봐도 언리얼에서 crashlytics 기능을 사용하는 방법에 대한 가이드가 전혀없다
(심지어 firebase 공식 도큐먼트에도 flutter나 unity는 있으면서 언리얼은 없다....)
물론 한참 고생해서 만들고나니.. 가이드가 굳이 필요없을수도 있다는 생각이 들긴했다
간단하게 요약하자면, upl로 관련 안드로이드 패키지를 전부 임포트 시키고 진행하면 된다 간단간단(한걸 2주를..)
가장 먼저 할일은 역시 firebase의 기능을 쓰는거지 firebase에 계정등록부터 해야된다
로그인 - Google 계정
이메일 또는 휴대전화
accounts.google.com

프로젝트를 등록한 다음 Android 앱 등록까지 진행해주자

중간에 2번항목인 구성 파일 다운로드 단계에서 google json파일은 미리 받아두자
사진 설명을 입력하세요.
이후 안드로이드 항목으로 crashlytic sdk 등록 가이드가 나오는데 추가로 작업을 더 해줘야한다
여기까지 했으면 언리얼을 준비하자


그리고 upl파일을 xml형식으로 생성해준다

플러그인 설정은 아예 블루프린트 플러그인으로 시작했다
우선 upl 코드부터 추가
<resourceCopies>
<copyFile src="$S(PluginDir)/Raw/google-services.json" dst="$S(BuildDir)/gradle/app/google-services.json" />
</resourceCopies>
위에서부터.. google-services.json 경로를 잡아주고
<buildGradleAdditions>
<insert>
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
dependencies {
implementation 'com.google.android.gms:play-services-games:21.0.0'
implementation platform('com.google.firebase:firebase-bom:30.2.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-analytics-ktx'
implementation 'com.google.firebase:firebase-crashlytics-ndk'
}
apply plugin: 'com.google.firebase.crashlytics'
android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
buildTypes {
release {
firebaseCrashlytics {
nativeSymbolUploadEnabled true
unstrippedNativeLibsDir "../androidLibraryModule/obj"
strippedNativeLibsDir "../androidLibraryModule/libs"
}
}
debug {
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'build/intermediates/stripped_native_libs/debug/out/lib'
unstrippedNativeLibsDir 'src/main/jniLibs'
}
}
}
}
</insert>
</buildGradleAdditions>
아까의 firebase 안드로이드 가이드와 비교해보면서 작성하자
이때 주의할게 순서인데, 위에서 부터 하나씩 추가하기때문에 '어? 없는데?' 하는 경우가 발생할수 있으니 주의하자
물론 안드로이드 가이드 대로만 하면 에러가 발생하니 몇가지 더 추가해줘야하는데
- gms관련 duplicate에러 발생
implementation 'com.google.android.gms:play-services-games:21.0.0'
com.google.firebase:firebase-analytics-ktx
https://firebase.google.com/docs/android/setup?hl=ko
3. 버전관련 오류 Invoke-customs are only supported starting with Android O (--min-api 26)
android {
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
buildTypes {
release {
firebaseCrashlytics {
nativeSymbolUploadEnabled true
unstrippedNativeLibsDir "../androidLibraryModule/obj"
strippedNativeLibsDir "../androidLibraryModule/libs"
}
}
debug {
firebaseCrashlytics {
nativeSymbolUploadEnabled true
strippedNativeLibsDir 'build/intermediates/stripped_native_libs/debug/out/lib'
unstrippedNativeLibsDir 'src/main/jniLibs'
}
}
}
<buildscriptGradleAdditions>
<insert>
dependencies {
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
}
</insert>
</buildscriptGradleAdditions>
그리고 androidX를 위한 항목추가
<gradleProperties>
<insert>
android.useAndroidX=true
android.enableJetifier=true
</insert>
</gradleProperties>
마지막으로 몇가지 퍼미션까지 추가
<androidManifestUpdates>
<addPermission android:name="android.permission.INTERNET" />
<addPermission android:name="android.permission.ACCESS_WIFI_STATE" />
<addPermission android:name="android.permission.ACCESS_NETWORK_STATE" />
</androidManifestUpdates>
이거로 설정은 끝이다
(upl 전문은 맨 아래 깃허브를 참고)
해당 내용 그대로 빌드를 실행하면...
google-service.json이 없다고 에러가 발생한다..!!
이제 아까 받아왔던 해당 파일을 아래 경로에 옮겨다준다
사진 설명을 입력하세요.
이제 빌드가 진행된다!
안드로이드 기기에서 해당 빌드를 실행한다음 로그캣(logcat)을 확인해보면
FirebaseInitProvider: FirebaseApp initialization successful
해당 로그가 나온다
연결이 잘 됬는지 확인해보려면 crashlytics 대시보드로 가보면
사진 설명을 입력하세요.
해당 위치에 '앱 감지됨' 관련 안내메세지가 뜨게된다
마지막으로 강제 크래시를 발생시켜서 실제로 로그가 기록되는지 확인하기위해 블루프린트로 기능하나를 추가하자
UCLASS()
class UCrashlyticsPluginBPLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
UFUNCTION(BlueprintCallable, Category = "Crashlytics Test")
static void Crash();
};
CrashlyticsPluginBPLibrary.h 파일에 함수하나 만들어주고
#include "CrashlyticsPluginBPLibrary.h"
#include "CrashlyticsPlugin.h"
#if PLATFORM_ANDROID
#include "Android/AndroidJNI.h"
#include "Android/AndroidApplication.h"
#include <android_native_app_glue.h>
#endif
UCrashlyticsPluginBPLibrary::UCrashlyticsPluginBPLibrary(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
void UCrashlyticsPluginBPLibrary::Crash()
{
#if PLATFORM_ANDROID
if (JNIEnv* Env = FAndroidApplication::GetJavaEnv())
{
static jmethodID Method = FJavaWrapper::FindMethod(Env, FJavaWrapper::GameActivityClassID, "AndroidThunkJava_ForceCrash", "()V", false);
FJavaWrapper::CallVoidMethod(Env, FJavaWrapper::GameActivityThis, Method);
}
#endif
}
CrashlyticsPluginBPLibrary.cpp에 같은 이름의 함수를 넣어준다
이때, 해당 에러로그는 android에서 firebase로 보내는식이라 관련 함수도 jni로 전달해줘야한다
상단부의 androidJNI.h를 포함하는 부분도 같이 확인해서 작성해준다
사진 설명을 입력하세요.
적당히 시작이벤트로 넣어주면 끝
이제 앱을 빌드&실행해서 crash가 발생하는지, 발생했을때 기록이 되는지 확인하자
사진 설명을 입력하세요.
강제종료가 발생할때마다 firebase 대시보드에 위와 같이 기록이된다!
다만, 강제종료가 발생 직후에 기록되진않고
다시 앱을 켰을때 전송한다고 한다
끝..!!
https://github.com/havergooday/unreal-crashlytics
GitHub - havergooday/unreal-crashlytics: firebase crashlytics in unreal5
firebase crashlytics in unreal5. Contribute to havergooday/unreal-crashlytics development by creating an account on GitHub.
github.com
'언리얼 > 실습' 카테고리의 다른 글
ue5_ for loop with delay (0) | 2022.09.12 |
---|---|
언리얼5 입문 - 안드로이드 빌드 (0) | 2022.09.12 |
언리얼5 입문 - 프로젝트 생성 (0) | 2022.09.12 |