사전 빌드된 APK 디버그

Android 스튜디오 3.0 이상에서는 Android 스튜디오 프로젝트에서 빌드하지 않고도 APK를 프로파일링하고 디버그할 수 있습니다. 단, 디버깅 사용 설정 상태에서 APK를 사용해야 합니다.

APK 디버그를 시작하려면 Android 스튜디오 시작 화면에서 Profile or debug APK를 클릭합니다. 프로젝트가 이미 열려 있는 경우에는 메뉴 바에서 File > Profile or Debug APK를 클릭합니다. 그 다음 나타나는 대화상자 창에서 Android 스튜디오로 가져오려는 APK를 선택하고 OK를 클릭합니다.

그러면 그림 1처럼 Android 스튜디오에 압축해제된 APK 파일이 표시됩니다. 이 파일은 .smali 파일의 보다 읽기 쉬운 버전인 .dex 파일을 제공하지만 완전히 컴파일 해제된 파일 세트는 아닙니다.

그림 1. Android 스튜디오에 사전 빌드 APK 가져오기

Project 창의 Android 뷰에서는 APK의 다음과 같은 내용을 검사할 수 있습니다.

  • APK 파일: APK를 더블클릭하면 APK Analyzer가 열립니다.
  • 매니페스트: APK에서 추출한 앱 매니페스트가 포함됩니다.
  • java: Android 스튜디오가 APK의 DEX 파일에서 .smali 파일로 분해하는 Kotlin/자바 코드가 포함됩니다. 이 디렉터리의 각 .smali 파일이 하나의 Kotlin/자바 클래스에 해당합니다.
  • cpp: 앱에 네이티브 코드가 포함된 경우, 이 디렉터리는 APK의 네이티브 라이브러리(.so 파일)를 포함합니다.
  • External Libraries: Android SDK가 포함됩니다.

즉시 Android 프로파일러를 사용하여 앱의 성능 테스트를 시작할 수 있습니다.

앱의 Kotlin/자바 코드를 디버그하려면 Kotlin/자바 소스를 연결하고 .kt/.java 파일에 중단점을 추가해야 합니다. 마찬가지로, 네이티브 코드를 디버그하려면 네이티브 디버그 기호를 연결해야 합니다.

Kotlin/자바 소스 연결하기

기본적으로 Android 스튜디오는 APK에서 Kotlin/자바 코드를 추출하고 .smali 파일로 저장합니다. 중단점을 사용하여 Kotlin/자바 코드를 디버그하려면 디버그할 .smali 파일에 해당하는 .kt 또는 .java 소스 파일로 IDE를 가리켜야 합니다.

Kotlin/자바 소스를 연결하려면 다음 단계를 진행하세요.

  1. Project 창에서 .smali 파일을 더블클릭합니다(Android 뷰 사용). 파일을 열면 Kotlin/소스를 선택하라는 배너가 편집기에 표시됩니다.

소스 연결하기 배너

  1. 편집기 창 상단의 배너에서 Kotlin/자바 소스 연결하기를 클릭합니다.
  2. 앱의 Kotlin/자바 소스 파일이 있는 디렉터리로 이동한 다음 Open을 클릭합니다.

Project 창에서 IDE가 .smali 파일을 해당하는 .kt 또는 .java 파일로 바꿉니다. IDE에는 내부 클래스도 자동으로 포함됩니다. 이제 평소처럼 중단점을 추가하고 앱을 디버그할 수 있습니다.

네이티브 디버그 기호 연결하기

APK에 디버그 기호를 포함하지 않는 네이티브 라이브러리(.so 파일)이 포함된 경우 그림 1에 나온 것처럼 IDE가 배너를 표시합니다. 디버그 가능 네이티브 라이브러리를 연결해야만 APK의 네이티브 코드를 디버그할 수 있습니다.

빌드 ID를 사용하여 APK에서 네이티브 라이브러리를 빌드하면 Android 스튜디오는 기호 파일의 빌드 ID가 네이티브 라이브러리의 빌드 ID와 일치하는지 확인하고 일치하지 않으면 기호 파일을 거부합니다. 빌드 ID를 사용하여 빌드하지 않은 경우에는 잘못된 기호 파일을 제공하면 디버깅에 문제가 발생할 수 있습니다.

디버그 가능 네이티브 라이브러리를 연결하려면 다음 단계를 진행하세요.

  1. 아직 NDK와 도구를 다운로드하지 않았다면 다운로드합니다.
  2. Project 창의 cpp 디렉터리(Android 뷰를 선택한 경우에만 표시됨. 그림 2 참조) 아래에서 디버그 기호가 포함되지 않은 네이티브 라이브러리 파일을 더블클릭합니다. APK가 지원하는 모든 ABI가 편집기에 테이블로 나타납니다.
  3. 편집기 창 오른쪽 상단에서 Add를 클릭합니다.
  4. 연결하려는 디버그 가능 네이티브 라이브러리가 포함된 디렉터리로 이동하여 OK를 클릭합니다.

APK와 디버깅 가능 네이티브 라이브러리가 서로 다른 워크스테이션을 사용하여 빌드된 경우 다음 단계에 따라 디버그 기호의 로컬 경로도 지정해야 합니다.

  1. 누락된 디버그 기호의 로컬 경로를 추가하려면 편집기 창의 Path Mappings 섹션에 있는 Local Paths 열 아래의 필드를 수정합니다(그림 2 참조). 대부분의 경우 루트 폴더 경로를 제공하기만 하면 됩니다. 그러면 Android 스튜디오가 자동으로 하위 디렉터리를 검사하여 추가 소스를 매핑합니다. IDE도 자동으로 원격 NDK 경로를 로컬 NDK 다운로드에 매핑합니다.
  2. 편집기 창의 Path Mappings 섹션에 있는 Apply Changes를 클릭합니다.

그림 2. 로컬 디버그 기호 경로 제공하기

이제 네이티브 소스 파일이 Project 창에 나타납니다. 네이티브 파일을 열고 평소처럼 중단점을 추가하고 앱을 디버그합니다. 편집기 창의 Path Mappings 섹션에 있는 Clear를 클릭하여 매핑을 삭제할 수도 있습니다.

알려진 문제: 디버그 기호를 APK에 연결할 때 APK와 디버그 가능한 .so 파일은 모두 동일한 워크스테이션이나 빌드 서버를 사용하여 빌드해야 합니다.

Android 스튜디오 3.6 이상에서는 APK를 IDE 외부에서 업데이트할 때 더 이상 새 프로젝트를 만들 필요가 없습니다. Android 스튜디오에서는 APK의 변경사항을 감지하고 다시 가져올 수 있는 옵션을 제공합니다.

그림 3. Android 스튜디오 외부에서 업데이트된 APK 다시 가져오기