APK Analyzer로 빌드 분석

Android 스튜디오에는 빌드 프로세스가 완료된 후 APK 또는 Android App Bundle 구성에 관한 유용한 정보를 즉시 제공하는 APK Analyzer가 포함되어 있습니다. APK Analyzer를 사용하면 앱의 DEX 파일 및 리소스 관련 문제를 디버깅하는 시간을 줄일 수 있고 APK 크기를 줄이는 데 도움이 됩니다. APK Analyzer는 apkanalyzer를 사용하여 명령줄에서도 사용할 수 있습니다.


APK Analyzer를 사용하면 다음 작업을 할 수 있습니다.

  • 앱에 포함된 파일(예: DEX 및 Android 리소스 파일)의 절대 크기와 상대 크기 보기
  • DEX 파일의 구성 이해하기
  • 앱에 포함된 파일(예: AndroidManifest.xml 파일)의 최종 버전 빠르게 보기
  • 두 개의 APK 또는 App Bundle을 나란히 놓고 비교하기

프로젝트가 열려있을 때 APK Analyzer에 액세스하는 방법은 세 가지가 있습니다.

  • APK나 App Bundle을 Android 스튜디오의 Editor 창으로 드래그합니다.
  • Project 창에서 Project 뷰로 전환한 후 기본 build/output/apks/ 디렉터리에서 APK를 더블클릭합니다.
  • 메뉴 바에서 Build > Analyze APK를 선택한 다음 APK 또는 App Bundle을 선택합니다.

파일 및 크기 정보 보기

APK는 ZIP 파일 형식을 따르는 파일입니다. APK Analyzer는 확장하여 폴더로 이동할 수 있는 항목으로 각 파일이나 폴더를 표시합니다. 항목의 계층 구조는 APK 파일의 파일 및 폴더 구조를 반영합니다.

APK Analyzer는 그림 1과 같이 압축된 파일 크기 (또는 '원시 파일 크기')를 표시하고 각 항목의 파일 크기 값을 다운로드합니다. 원시 파일 크기는 총 APK 크기에 대한 항목의 기여도를 나타냅니다. Download Size는 Google Play에서 전송할 것으로 예상되는 항목의 압축된 크기를 나타냅니다. % of Total Download Size는 APK의 총 다운로드 크기 대비 항목이 차지하는 비율을 표시합니다.

그림 1. APK Analyzer에 표시되는 파일 크기

AndroidManifest.xml 보기

프로젝트에 제품 버전 등을 위해 여러 AndroidManifest.xml 파일이 포함되거나 매니페스트 파일을 제공하는 라이브러리가 포함된 경우 파일과 라이브러리는 앱에 하나의 파일로 병합됩니다. 매니페스트 파일은 일반적으로 APK나 App Bundle 내에서는 바이너리 파일이지만 APK Analyzer에서 선택하면 항목의 XML 양식이 재구성되어 표시됩니다.

이 뷰어를 사용하면 빌드 중 앱에서 변경된 내용을 파악할 수 있습니다. 예를 들어 애플리케이션이 사용하는 라이브러리의 AndroidManifest.xml 파일이 최종 AndroidManifest.xml 파일에 어떻게 병합되는지 확인할 수 있습니다.

또한 이 뷰어는 린트 기능을 제공합니다. 경고 또는 오류가 오른쪽 상단에 표시됩니다. 그림 2는 선택된 매니페스트 파일에서 보고된 오류를 보여줍니다.

그림 2. 선택한 매니페스트 파일의 오른쪽 상단에 표시되는 오류 아이콘

DEX 파일 보기

APK Analyzer의 DEX 파일 뷰어를 사용하면 앱에 있는 DEX 파일의 기본 정보에 즉시 액세스할 수 있습니다. 뷰어는 클래스와 패키지, 총 참조, 선언 수를 제공하므로 멀티덱스를 사용할지 여부 또는 64K DEX 제한 미만으로 유지하기 위해 종속 항목을 삭제하는 방법을 결정하는 데 도움이 될 수 있습니다.

그림 3은 64K DEX 제한 미만인 중간 크기의 앱을 보여줍니다. DEX 파일의 각 패키지, 클래스, 메서드 개수는 Defined MethodsReferenced Methods 열에 표시됩니다.

Referenced Methods 열은 DEX 파일이 참조하는 모든 메서드를 계산합니다. 여기에는 일반적으로 코드에 정의된 메서드와 종속 항목 라이브러리, 코드에서 사용하는 표준 자바 및 Android 패키지에 정의된 메서드가 포함됩니다. 이러한 메서드가 각 DEX 파일의 64K 메서드 제한에 포함되는 메서드입니다.

Defined Methods 열은 DEX 파일 하나에 정의된 메서드만 계산합니다. 따라서 Referenced Methods보다 작은 수가 표시됩니다.

그림 3. 중간 크기의 앱

DEX 파일 트리 보기 필터링

APK Analyzer는 Class 목록 바로 위에 선택된 DEX 파일의 콘텐츠 보기에 관한 필터를 제공합니다(그림 4 참고).

그림 4. BuildConfig 필드 및 메서드를 표시하도록 설정된 DEX 필터

필터를 사용하여 클래스 내의 모든 메서드와 필드를 표시하려면 다음 단계를 진행합니다.

  1. File 목록에서 classes.dex 파일을 선택합니다.
  2. Class 목록에서 클래스로 이동하여 선택합니다.
  3. 선택한 클래스를 펼칩니다.
  4. Show fields 를 전환하여 클래스 필드를 표시하거나 숨깁니다.
  5. Show methods 를 전환하여 클래스 메서드를 표시하거나 숨깁니다.
  6. Show all referenced methods or fields 를 전환하여, 참조된 패키지와 클래스, 메서드, 필드를 표시하거나 숨깁니다.

    트리 보기에서 기울임꼴 노드는 선택된 DEX 파일에 정의가 없는 참조입니다. DEX 파일은 다른 파일에 정의된 메서드와 필드를 참조할 수 있습니다. 예를 들어 System.out.println()은 Android 프레임워크의 println() 메서드에 관한 참조입니다.

ProGuard 매핑 로드

필터링 아이콘 옆에 ProGuard 매핑 아이콘이 있습니다. ProGuard 아이콘은 이름을 역난독화하고(mapping.txt), 삭제된 노드를 보여주고(usage.txt), 삭제될 수 없는 노드를 표시하는(seeds.txt) 등의 기능을 DEX 뷰어에 추가하는 일련의 ProGuard 매핑 파일을 로드할 때까지 비활성화되어 있습니다.

ProGuard 매핑 파일은 코드 축소 기능을 사용 설정하고 DEX 파일을 생성한 것과 동일한 빌드에서 가져와야 합니다.

그림 5. ProGuard 매핑 로드

ProGuard 매핑 파일을 로드하려면 다음 단계를 진행합니다.

  1. Load Proguard mappings...를 클릭합니다.
  2. 매핑 파일이 포함된 프로젝트 폴더로 이동하여 모든 파일이나 파일 조합 또는 파일이 포함된 폴더를 로드합니다.

    매핑 파일은 일반적으로 project/app/build/outputs/mappings/release/에 있습니다. 프로젝트 구조를 감지하면 파일 선택기는 release 폴더로 기본 설정됩니다.

    첫째, 파일 선택 도구는 파일 이름이 mapping.txt, seeds.txt, usage.txt와 정확히 일치하는지 확인합니다. 그런 다음 파일 이름에 mapping, usage 또는 seeds가 포함되고 .txt로 끝나는지 확인합니다. 예를 들어 release-seeds-1.10.15.txt는 일치하는 것입니다.

아래의 목록은 매핑 파일의 설명입니다.

  • seeds.txt: 축소 중에 ProGuard 구성이 삭제하지 못하게 하는 노드는 굵게 표시됩니다.
  • mapping.txt: Deobfuscate names 를 사용 설정하여 R8이 난독화한 노드의 원래 이름을 복원할 수 있습니다. 예를 들어 a, b, c와 같이 난독화된 노드 이름을 MyClass, MainActivity, myMethod()로 복원할 수 있습니다.
  • usage.txt: Show removed nodes 를 사용하여 축소 중에 R8에서 삭제한 클래스, 메서드, 필드를 표시할 수 있습니다. 복원된 노드는 취소선으로 표시됩니다.

    R8을 사용하여 코드를 난독화하고 최소화하는 방법에 관한 자세한 내용은 앱 축소, 난독화 및 최적화를 참고하세요.

바이트 코드 표시, 사용법 찾기, Keep 규칙 생성

Class 목록 보기의 노드에는 다음 옵션이 포함된 컨텍스트 메뉴가 있습니다. 이를 통해 바이트 코드를 보고 사용법을 찾으며 선택된 노드를 위해 복사하여 붙여넣을 수 있는 ProGuard 규칙을 보여주는 대화상자를 표시할 수 있습니다. 컨텍스트 메뉴를 표시하려면 Class 목록 보기에서 임의 노드를 마우스 오른쪽 버튼으로 클릭합니다.

바이트 코드 표시: 선택된 클래스나 메서드, 필드를 디컴파일하고 다음과 같이 대화상자에 smali 바이트 코드 표현을 표시합니다.

그림 6. init 메서드의 DEX 바이트 코드

사용법 찾기: DEX 코드의 다른 어떤 부분이 선택된 클래스나 메서드를 참조하고 있는지 보여줍니다(그림 7 참고). seeds.txt가 로드된 경우 굵게 표시된 노드는 ProGuard 구성으로 인해 축소 중에 노드가 삭제되지 않음을 나타냅니다.

그림 7. MyClass에 관한 참조

Proguard Keep 규칙 생성: 프로젝트의 ProGuard 구성 파일에 복사하여 붙여넣을 수 있는 ProGuard 규칙을 보여줍니다(그림 8 참고). 이렇게 하면 코드 축소 단계에서 특정 패키지나 클래스, 메서드, 필드가 삭제되지 않습니다. 자세한 내용은 유지할 코드 맞춤설정을 참고하세요.

그림 8. 대화상자에서 ProGuard 구성 파일로 복사할 수 있는 ProGuard 규칙

코드 및 리소스 항목 보기

다양한 빌드 작업을 통해 앱의 최종 항목이 변경됩니다. 예를 들어 ProGuard 축소 규칙으로 최종 코드가 변경될 수 있고 이미지 리소스는 제품 버전의 리소스로 재정의될 수 있습니다.

APK Analyzer로 파일의 최종 버전을 보려면 텍스트 또는 이미지 항목의 미리보기를 위해 항목을 클릭하세요(그림 9 참고).

그림 9. 최종 이미지 리소스의 미리보기

APK Analyzer는 또한 다양한 텍스트와 바이너리 파일을 표시할 수 있습니다. 예를 들어 resources.arsc 항목 뷰어를 사용하면 문자열 리소스의 언어 번역 같이 구성에 필요한 값을 볼 수 있습니다. 그림 10에서 각 문자열 리소스의 번역을 볼 수 있습니다.

그림 10. 번역된 문자열 리소스 미리보기

파일 비교

APK Analyzer는 두 개의 다른 APK 또는 App Bundle 파일에서 항목 크기를 비교할 수 있습니다. 이 기능은 앱이 이전 출시에 비해 크기가 증가한 이유를 알아야 할 필요가 있을 때 유용합니다.

업데이트된 앱을 게시하기 전에 다음 작업을 실행하세요.

  1. 게시하려는 앱의 버전을 APK Analyzer에 로드합니다.
  2. APK Analyzer의 오른쪽 상단에서 Compare with previous APK...를 클릭합니다.
  3. 선택 대화상자에서 사용자에게 마지막으로 게시된 아티팩트를 찾아 OK를 클릭합니다.

    업데이트가 사용자에게 미칠 수 있는 영향을 평가하는 데 도움이 되는 대화상자가 그림 11과 유사한 형태로 표시됩니다.

그림 11은 특정 앱의 디버그 빌드와 출시 빌드의 차이를 보여줍니다. 빌드 유형 사이에 다른 빌드 옵션이 사용되고 있으므로 기본 항목이 다르게 변경됩니다.

그림 11. 디버그 APK와 출시 APK의 차이