# Android 심볼

> Generate symbols to help you debug a built Android application.

Unity는 네이티브 Unity 라이브러리에 대한 디버그 메타데이터를 담은 심볼 파일이 포함된 패키지를 생성하여 애플리케이션 디버깅을 지원합니다. 심볼 파일에는 활성 메모리 주소를 메서드 이름과 같이 사용할 수 있는 정보로 변환하는 심볼 테이블(`.symtab`)이라는 실행 파일 섹션이 있습니다. 이러한 변환 프로세스를 심볼화라고 합니다. 또한 Google Play 콘솔에 심볼 패키지를 업로드하여 [Android Vitals](https://developer.android.com/topic/performance/vitals) 대시보드에서 사람이 읽을 수 있는 형태의 스택 추적을 확인할 수도 있습니다.

실행 파일(ELF) 섹션에 대한 상세 내용은 [Wikipedia](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format)를 참조하십시오.

Unity는 다음 라이브러리에 대해 심볼 파일을 생성할 수 있습니다.

* `libmain`: 로직을 로드하는 초기 Unity 엔진을 담당합니다. 심볼 파일이 미리 컴파일되었습니다.

* `libunity`: Unity의 엔진 코드:

  * **Strip Engine Code** 프로퍼티가 비활성화되면 심볼 파일이 미리 컴파일됩니다.
  * **Strip Engine Code** 프로퍼티가 활성화되면 Unity는 빌드 프로세스 동안 심볼 파일을 컴파일합니다.

* `libil2cpp`: C# 스크립트 포함:

  * 프로젝트를 익스포트하지 않으면 Unity는 빌드 프로세스 동안 심볼 파일을 컴파일합니다.
  * 프로젝트를 익스포트하면 Gradl이 심볼 파일을 컴파일합니다.

Gradle이 남은 심볼 파일을 생성합니다.

애플리케이션 빌드 포맷에 따라 Unity는 다음 두 가지 방법으로 심볼 파일을 생성합니다.

* `apk` 또는 `aab` 모두에 대해 생성할 수 있는 zip 파일
* `aab`에 기호 파일을 직접 임베드. Unity는 심볼 파일을 `apk`에 임베드하지 않습니다.

[UserBuildSettings.DebugSymbols.format](ScriptRef:Android.UserBuildSettings.DebugSymbols-format) API를 사용하여 심볼 패키지의 포맷을 설정합니다.

## 심볼 파일 유형##types-of-symbol-files

Unity는 Gradle의 [debugSymbolLevel](https://developer.android.com/reference/tools/gradle-api/7.3/com/android/build/api/dsl/Ndk#debugSymbolLevel\(\)) 프로퍼티를 사용하여 심볼 파일을 생성합니다. 다음과 같이 두 종류의 심볼 파일이 있습니다.

* 공용: 심볼 표 섹션이 포함된 작은 파일입니다. 자세한 내용은 [공용 심볼](#public-symbols)을 참조하십시오.
* 디버깅: 공용 심볼 파일에 들어 있는 모든 내용을 포함하고 있으며 더욱 심층적인 디버깅에 사용할 수 있는 전체 디버깅 정보를 포함하고 있습니다. 자세한 내용은 [심볼 디버깅](#debugging-symbols)을 참조하십시오.

필요한 유형의 심볼 파일을 생성하려면 [UserBuildSettings.DebugSymbols.level](ScriptRef:Android.UserBuildSettings.DebugSymbols-level)을 사용하십시오.

**참고:** 기본적으로 Gradle은 `.so.sym` 또는 `.so.dbg` 확장자를 사용하여 기호 파일을 생성합니다. 일부 디지털 배포 서비스는 이러한 확장자를 인식하지 않으며 확장자가 `.so`인 파일을 요구합니다. 이러한 경우 [Unity.Android.Types.DebugSymbolFormat.LegacyExtensions](/engine/6000.0/script-reference/unity-android-types/debug-symbol-format/legacy-extensions.md) API를 사용하여 `.so` 확장자가 있는 기호 파일을 생성합니다.

```
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle | DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;
```

### 공용 심볼##public-symbols

공개 심볼 파일에는 함수 주소를 사람이 읽을 수 있는 문자열로 변환하는 정보가 포함되어 있습니다. 이러한 파일에는 디버깅 정보가 없습니다. 이렇게 하면 공용 심볼 파일이 [디버깅 심볼](#debugging-symbols) 파일보다 작아집니다.

### 디버깅 심볼##debugging-symbols

심볼 디버깅 파일에는 모든 디버깅 정보와 심볼 표가 포함되어 있습니다. 이를 사용하여 다음을 수행할 수 있습니다.

* 스택 추적을 해결하고 소스 코드를 사용할 수 있는 애플리케이션을 디버그할 수 있습니다.
* 애플리케이션에 네이티브 디버거를 연결하여 코드를 디버그할 수 있습니다.

**참고:** 디버깅 심볼을 사용할 수 없는 경우 Unity는 빌드 시점에 프로젝트에 [공용 심볼](#public-symbols) 파일을 저장합니다. `libmain` 및 `libunity` 라이브러리에 대해서는 디버깅 심볼을 사용할 수 없으며 Unity는 항상 공용 파일을 생성합니다.

### 커스텀 심볼##custom-symbols

추가 심볼 파일을 포함하도록 Unity에 지시할 수 있습니다. 공유되는 라이브러리를 사용하는 경우 애플리케이션이 충돌할 때 로컬 디버거와 Google Play가 공유되는 라이브러리 스택 추적을 해결하려는 경우에 유용합니다.

Unity에 커스텀 심볼 파일을 포함하려면:

1. 프로젝트 창에서 파일 확장자가 `.so`인 플러그인을 선택합니다.
2. 인스펙터에서 **Platform settings** 섹션을 찾습니다.
3. **CPU**를 심볼 파일이 호환되는 CPU 아키텍처로 설정합니다.
4. **Shared Library Type**을 **Symbol**로 설정합니다.

Unity는 심볼 패키지를 생성할 때마다 심볼 패키지에 추가 심볼 파일을 추가합니다.

Unity에 C# 스크립트의 커스텀 심볼 파일을 포함하려는 경우 **UnityEditor.Android** 네임스페이스에는 각각 **CPU** 및 **Shared Library Type**을 설정하는 다음 API가 포함되어 있습니다.

* [PluginImporter.SetAndroidCPU](/engine/6000.0/script-reference/unity-editor-android/android-plugin-importer-utilities/set-android-cpu.md)
* [PluginImporter.SetAndroidSharedLibraryType](/engine/6000.0/script-reference/unity-editor-android/android-plugin-importer-utilities/set-android-shared-library-type.md)

**참고:** 심볼 파일 이름은 해당 심볼 파일이 있는 공유 라이브러리의 이름과 일치해야 합니다. 예를 들어 공유 라이브러리의 이름이 **mylibrary.so**라면 심볼 파일의 이름도 **mylibrary.so**여야 합니다. 파일 이름 충돌을 방지하려면 심볼 파일과 공유되는 라이브러리가 별도의 디렉터리에 있어야 합니다.

**중요:** 심볼 파일이 최신 상태이고 실행 코드가 포함된 공유되는 라이브러리와 호환되는지 확인하십시오. 그렇지 않으면 로컬 디버거와 Google Play가 공유되는 라이브러리에 있는 코드의 스택 추적을 확인하지 못합니다.


**Frame:**
![](/api/media?file=/engine/6000.0/media/images/android_custom_symbol.png)

## 심볼 패키지 생성##generating-a-symbols-package

애플리케이션을 위한 심볼 패키지 생성을 활성화하는 데는 두 가지 방법이 있습니다.

* **Build Settings** 창 사용
* [UserBuildSettings.DebugSymbols.level](ScriptRef:Android.UserBuildSettings.DebugSymbols-level) 및 [UserBuildSettings.DebugSymbols.format](ScriptRef:Android.UserBuildSettings.DebugSymbols-format) API 사용

빌드 설정 창을 통해 심볼 패키지 생성을 활성화하려면:

1. Build Profiles 창(메뉴: **File** > **Build Profiles**)을 엽니다.

2. Android 플랫폼을 선택합니다.

3. 다음 중 한 가지 방법으로 **디버그 심볼**을 설정합니다.

   * [Public](#public-symbols)
   * [Debugging](#debugging-symbols)

4. **Symbols output options**를 **.zip**으로 설정합니다.

심볼 패키지 생성을 활성화한 후 프로젝트를 빌드하면 `libmain` 및 `libunity` 라이브러리용 심볼 파일이 포함된 `.zip` 파일이 생성됩니다. [스크립팅 백엔드](/engine/6000.0/manual/scripting/compilation-and-code-reload/backends.md)를 **IL2CPP**로 설정하면 `.zip` 파일에 `libil2cpp` 라이브러리용 심볼 파일도 포함됩니다. Unity는 이 심볼 패키지를 출력 디렉토리 내에 저장합니다.

ndroid 빌드 설정에서 **Export Project**를 활성화하면 Unity는 프로젝트를 빌드하지 않습니다. 대신 Unity는 Android Studio용 프로젝트를 익스포트하고 `libmain` 및 `libunity`에 대한 심볼을 생성하여 출력 디렉토리의 `unityLibrary/symbols/<architecture>/` 내에 배치합니다. Android Studio에서 익스포트된 프로젝트를 빌드할 때 Gradle은 `libil2cpp` 심볼 파일을 생성하여 이를 `libmain` 및 `libunity`심볼 파일과 함께 `unityLibrary/symbols/<architecture>/` 디렉토리 내부에 배치합니다.

## Google Play 콘솔에서 심볼 사용##using-symbols-in-the-google-play-console

### 내장된 시스템##embedded-symbols

Android 앱 번들(aab)을 제작하는 경우, 심볼을 `aab`에 직접 임베드하여 Google Play에 업로드할 수 있습니다.

**참고:** Unity는 심볼을 `apk`에 임베드하지 않습니다. 이 경우 심볼이 포함된 zip 파일을 별도로 업로드해야 합니다.

```
UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.IncludeInBundle;
```

### 압축된 심볼##zipped-symbols

압축된 심볼 패키지를 생성하려면 다음 코드를 사용하십시오.

```
UserBuildSettings.DebugSymbols.level = DebugSymbolLevel.SymbolTable;
UserBuildSettings.DebugSymbols.format = DebugSymbolFormat.Zip | DebugSymbolFormat.LegacyExtensions;
```

애플리케이션을 Google Play에 업로드한 후에는 [공용 심볼](#public-symbols) zip 패키지를 업로드할 수 있습니다. 이를 수행하는 자세한 방법은 Google 기술 자료: [크래시 스택 추적을 가독화 또는 심볼화](https://support.google.com/googleplay/android-developer/answer/9848633)를 참조하십시오.

**참고:** Google Play는 심볼 패키지가 업로드되기 전에 애플리케이션이 받은 크래시를 기호화하지 않습니다.
