출시 빌드에 네이티브 기호 포함

기본적으로 네이티브 코드 라이브러리는 앱의 출시 빌드에서 삭제됩니다. 이 삭제는 앱에서 사용하는 네이티브 라이브러리에 포함된 심볼 테이블과 디버깅 정보를 삭제하는 것으로 구성됩니다. 네이티브 코드 라이브러리를 삭제하면 크기가 크게 절약되지만 클래스 및 함수 이름과 같은 정보가 누락되어 Google Play Console에서 비정상 종료를 진단할 수 없습니다. 비정상 종료를 디버그하려면 Play Console에 앱과 함께 디버그 기호 파일을 포함해야 합니다.

기호 파일 업로드

Google Play Console은 Android vitals에서 네이티브 충돌을 보고합니다. 몇 단계만 거치면 앱의 네이티브 디버그 기호 파일을 생성하고 업로드할 수 있습니다. 이 파일로 Android vitals에서 기호화된 네이티브 비정상 종료 스택 트레이스 (클래스 및 함수 이름 포함)를 사용 설정하여 프로덕션에서 앱을 디버그할 수 있습니다. 이 단계는 프로젝트에서 사용하는 Android Gradle 플러그인의 버전과 Android App Bundle (권장) 또는 APK 사용 여부에 따라 다릅니다.

Android Gradle 플러그인 버전 4.1 이상

프로젝트에서 Android App Bundle (AAB)을 빌드하는 경우 앱을 게시할 때 Play Console에 업로드되도록 AAB에 네이티브 디버그 기호 파일을 자동으로 포함하도록 빌드를 구성할 수 있습니다. 출시 빌드에 이 파일을 포함하려면 앱의 build.gradle.kts 파일에 다음을 추가하세요.

android.buildTypes.release.ndk.debugSymbolLevel = { SYMBOL_TABLE | FULL }

다음에서 디버그 기호 수준을 선택합니다.

  • SYMBOL_TABLE을 사용하여 Play Console의 기호화된 스택 트레이스에서 함수 이름을 가져옵니다. 이 수준은 Tombstone을 지원합니다.
  • FULL을 사용하여 Play Console의 기호화된 스택 트레이스에서 함수 이름, 파일, 행 번호를 가져옵니다.

프로젝트가 APK를 빌드하는 경우 이전에 보여준 android.buildTypes.release.ndk.debugSymbolLevel 설정을 사용하여 네이티브 디버그 기호 파일을 별도로 생성합니다. Google Play Console에 네이티브 디버그 기호 파일을 업로드합니다 (이 프로세스는 스택 트레이스를 가독화하기 위해 매핑 파일을 업로드하는 것과 유사합니다). 빌드 프로세스의 일부로 Android Gradle 플러그인은 다음 프로젝트 위치에 이 파일을 출력합니다.

app/build/outputs/native-debug-symbols/<var>variant-name</var>/native-debug-symbols.zip

종속 항목에 네이티브 라이브러리가 포함된 경우 크기를 줄이기 위해 디버그 정보가 삭제될 수 있습니다. info 로그 수준으로 빌드를 실행하고 debugSymbolLevel = { SYMBOL_TABLE | FULL }를 설정하여 이를 확인할 수 있습니다. 그런 다음 빌드 출력에서 다음 줄을 찾습니다.

Unable to extract native debug metadata from ... because the native debug metadata has already been stripped.

Android Gradle 플러그인 버전 4.0 이하(및 기타 빌드 시스템)

빌드 프로세스의 일부로 Android Gradle 플러그인은 제거되지 않은 라이브러리의 사본을 프로젝트 디렉터리에 유지합니다. 이 디렉터리 구조는 다음과 유사합니다.

app/build/intermediates/cmake/universal/release/obj/
├── armeabi-v7a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── arm64-v8a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── x86/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
└── x86_64/
    ├── libgameengine.so
    ├── libothercode.so
    └── libvideocodec.so
  1. 다음 디렉터리의 콘텐츠를 압축합니다.

    cd app/build/intermediates/cmake/universal/release/obj
    zip -r symbols.zip .
    
  2. Google Play Console에 수동으로 symbols.zip 파일을 업로드합니다.