APK Analyzer로 빌드 분석

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

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

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

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

  • APK를 Android 스튜디오의 Editor 창에 드래그하기
  • Project 창에서 Project 관점으로 전환한 후 기본 build/output/apks/ 디렉터리에서 APK를 더블클릭하기
  • 메뉴 바에서 Build > Analyze APK를 선택한 다음 APK 선택하기

중요: 디버그 빌드를 분석할 때는 Build > Build APK를 선택하거나 gradle 명령어를 사용하여 만든 APK를 사용해야 합니다. 툴바에서 Run을 클릭하면 Instant Run을 사용할 수 있는 APK가 생성되는데, 이 APK는 개발용으로만 사용되고 대부분의 리소스를 동적으로 로드하기 때문에 APK Analyzer에서 최적화 작업을 위해서는 사용할 수 없습니다. instant-run.zip 파일이 삽입되어 있다면 Instant Run APK인 것을 알 수 있습니다.

파일 및 크기 정보 보기

APK는 ZIP 파일 형식을 따르는 파일입니다. APK Analyzer는 각 파일 또는 폴더를 폴더로 이동하는 데 사용할 수 있는 확장 기능을 가진 항목으로 표시합니다. 항목의 계층 구조는 APK 파일의 파일과 폴더의 구조를 반영합니다.

APK Analyzer는 그림 1에서 보는 것과 같이 각 항목의 원시 파일 크기와 다운로드 파일 크기 값을 보여줍니다. Download Size는 Google Play에서 전송할 것으로 예상되는 항목의 압축된 크기를 나타내는 반면 Raw File Size는 디스크에서 항목의 압축이 해제된 크기를 나타냅니다. % of Total Download Size는 APK의 총 다운로드 크기 대비 항목이 차지하는 비율을 표시합니다.

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

AndroidManifest.xml 보기

프로젝트에 제품 버전 등을 위해 여러 AndroidManifest.xml 파일이 포함되거나 manifest 파일을 제공하는 라이브러리가 포함된 경우 파일과 라이브러리는 APK에 하나의 파일로 병합됩니다. manifest 파일은 일반적으로 APK 내에서는 바이너리 파일이지만 APK Analyzer에서 선택하면 항목의 XML 양식이 재구성되어 표시됩니다. 이 뷰어를 사용하면 빌드 중 앱에서 변경된 내용을 이해할 수 있습니다. 예를 들어 애플리케이션이 종속성을 갖는 라이브러리의 AndroidManifest.xml 파일이 최종 AndroidManifest.xml 파일에 어떻게 병합되었는지 알 수 있습니다.

또한 이 뷰어는 일부 Lint 기능을 제공하고 경고와 오류가 오른쪽 상단에 표시됩니다. 그림 2는 선택된 manifest 파일에서 보고된 오류를 보여줍니다.

그림 2. 선택된 manifest 파일의 오른쪽 여백에 표시된 오류 아이콘

DEX 파일 보기

APK Analyzer의 DEX 파일 뷰어를 사용하면 앱 DEX 파일의 기본 정보에 즉시 액세스할 수 있습니다. 클래스, 패키지, 전체 참조 및 선언 횟수가 뷰어 내에 제공되며 Multidex의 사용 여부와 64K DEX 제한 미만으로 종속성을 삭제하는 방법을 결정하는 데 도움이 됩니다.

그림 3은 64k DEX 제한 미만인 중간 크기의 앱을 보여줍니다. DEX 파일의 각 패키지, 클래스, 메서드 개수는 Defined MethodsReferenced Methods 열에 표시됩니다. Referenced Methods 열은 DEX 파일에서 참조하는 모든 메서드를 계산합니다. 여기에는 일반적으로 코드에 정의된 메서드, 종속성 라이브러리, 코드에서 사용하는 표준 자바와 Android 패키지에 정의된 메서드가 포함됩니다. 이러한 메서드는 각 DEX 파일의 64k 메서드 제한에 반영됩니다. Defined Methods 열은 DEX 파일 하나에 정의된 메서드만 계산합니다. 따라서 Referenced Methods보다 작은 수가 표시됩니다. 참고로 APK에 종속성을 패키징하면 종속성에 정의된 메서드는 양쪽 메서드 수에 모두 추가됩니다. 또한 소스 코드가 컴파일된 후 압축 및 Proguard 축소로 인해 DEX 파일의 콘텐츠가 상당히 변경될 수 있습니다.

그림 3. 중간 크기의 앱

DEX 파일 트리 보기 필터링하기

APK Analyzer는 Class 바로 위에 선택한 DEX 파일의 콘텐츠를 볼 수 있는 필터를 제공합니다.

그림 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 매핑 파일은 Proguard를 사용 설정하고 빌드한 APK에 적용되며 APK를 생성한 동일한 빌드에서 가져와야 합니다.

그림 5. Proguard 매핑 로드

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

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

    매핑 파일은 일반적으로 project/app/build/outputs/mappings/release/에 있습니다. 프로젝트 구조를 감지하면 파일 선택기는 release 폴더로 기본 설정됩니다. 첫째, 파일 선택기는 파일 이름이 mapping.txt, seeds.txtusage.txt와 정확히 일치하는지 확인합니다. 다음 파일 이름이 mapping, usage 또는 seeds를 포함하고 .txt로 끝나는지 확인합니다. 예를 들어 release-seeds-1.10.15.txt는 일치합니다.

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

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

    Proguard를 사용하여 코드를 난독화하고 최소화하는 방법에 관한 자세한 정보는 코드와 리소스 축소를 참조하세요.

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

Class 목록 보기의 노드에는 바이트코드를 보고 사용법을 찾고 선택된 노드에 복사하여 붙여넣을 수 있는 Proguard 규칙을 보여주는 대화상자를 표시하는 아래의 옵션을 가진 컨텍스트 메뉴가 있습니다. 컨텍스트 메뉴를 표시하려면 Class 목록 보기에서 한 노드를 오른쪽 클릭합니다.

바이트코드 보기: 선택된 클래스, 메서드 또는 필드를 역컴파일하고 다음과 같이 대화상자에 smali(자바 코드 아님) 바이트코드 표현을 표시합니다.

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

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

그림 7. MyClass에 관한 참조

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

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

코드와 리소스 항목 보기

다양한 빌드 작업은 APK 파일의 최종 항목을 변경합니다. 예를 들어 Proguard 축소 규칙은 최종 코드를 변경할 수 있고 이미지 리소스는 제품 버전에 따라 재정의될 수 있습니다. APK Analyzer를 사용하면 파일의 최종 버전을 쉽게 볼 수 있습니다. 즉, 항목을 클릭하면 그림 9와 같이 텍스트 또는 이미지 항목의 미리보기가 아래 표시됩니다.

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

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

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

APK 파일 비교

APK Analyzer는 두 개의 다른 APK 파일에서 항목 크기를 비교할 수 있습니다. 이 기능은 앱이 이전 출시에 비해 크기가 증가한 이유를 알아야 할 필요가 있을 때 유용합니다. 업데이트된 APK를 게시하기 전에 다음 작업을 수행하세요.

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

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

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

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