본 문서는 Android APK 파일을 Device에서 동적 디버깅 방법에 대해 작성 하였습니다.
안드로이드 기반 동적 디버깅 환경 구축(emulator): http://teamcrak.tistory.com/342
테스트 환경은 아래와 같습니다.
- OS: Window 7
- Java version: jdk6
- APKTools: 1.4.1
- NetBeans IDE: 7.3
- APK Sign tool
- Galaxy S2
APKTool 1.4.1 버전 사용 이슈
APK Tool 1.4.1 이상 버전부터 디버그모드(-d) 일 때 java파일이 생성되지 않아 동적 디버깅을 할 수 없다고 합니다. |
우선 APKTool 1.4.1 다운로드 합니다.
APKTool 1.4.1: https://android-apktool.googlecode.com/files/apktool1.4.1.tar.bz2
기존 APKTool을 사용하고 있었다면 다음경로의 파일을 삭제해야 에러가 발생하지 않습니다.
C:\Users\<USER_NAME>\apktool\framework\1.apk
다운로드 후 디버깅옵션으로 smali code를 생성합니다.
apktool.bat d –d <file>.apk
[그림1] APKTool 을 이용한 smali code 생성
AndroidManifest.xml 파일에서 아래 항목을 추가해줍니다.
Android:debuggable="true" //디버깅 허용 ------------------------------------------------------------------------------------------------------- <intent -filter="-filter"> <action android:name="android.intent.action.MAIN"> // 테스크의 첫 액티비티로 액티비티를 시작한다. <category android:name="android.intent.category.LAUNCHER"> //액티비티가 어플리케이션의 런처에 표시되고 테스크의 첫 액티비티가 될 수 있다. </intent> |
[그림2] AndroidManifest.xml 패치
추가 및 패치하기 전 DDMS 화면을 보면 attach 할 수 있는 프로세스가 없습니다.
[그림3] attach 프로세스 유무 확인
다시 apktool로 패키징 후 코드사인 합니다.
[그림4] 패치후 리패키징
패치 된 APK 설치 전 디바이스에서 환경설정 > 개발자 옵션 > USB디버깅 체크해줍니다.
[그림5] USB 디버깅 모드
어플리케이션 설치 후 연결된 디바이스에서 attach 할 수 있는 프로세스를 확인할 수 있습니다.
[그림6] 접근 가능한 프로세스 확인
NetBeans 7.3 버전들 다운로드 후 설치합니다.
NetBeans Download: https://netbeans.org/downloads/
NetBeans 설정은 다음과 같이 진행합니다.
[그림7] 새 프로젝트 작성
[그림8] 프로젝트 위치 지정
APKTool 1.4.1 로 디코딩 한 smali 경로를 설정해 줍니다.
[그림9] smali code 위치 설정
[그림10] API Level에 맞춰 라이브러리를 설정
[그림11] API Level에 맞춰 라이브러리 추가
[그림12] 테스트로 작성된 어플리케이션 실행
Debug > Attach Debugger 를 선택합니다.
[그림13] Attach Debugger
[그림14] 호스트, 포트 입력
Attach 에 성공하면 형광색 아이콘이 생겨 디바이스에서 디버깅을 시작할 수 있습니다.
[그림15] 디버깅 시작
지금까지 디버깅 환경 설정을 살펴보았습니다.
이제부터 실제로 디버깅을 시작하기 위해 어플리케이션 실행 시부터 디버깅 할 수 있는 방법에 대해 알아보겠습니다.
디버깅을 어플리케이션이 시작과 동시에 하기 위해서 smali code에서 onCreate 메소드 호출 시 'invoke-static {}, Landroid/os/Debug;->waitForDebugger()V' 를 삽입해 줍니다.
[그림16] 디버깅 대기를 위한 코드패치
코드 패치 + 리패키징 + 코드사인 후 어플리케이션을 설치합니다.
어플리케이션을 실행하게 되면 DDMS 에서 붉은색 아이콘이 생성되며 attach 전까지 대기하게 됩니다.
[그림17] 디버깅 대기
[그림18] 디버깅 전 화면
NETBeans에서 attach 하기 전 ctrl+shift+F8 단축키를 눌러 bp를 설정합니다.
[그림19] break point 설정
Attach 시 debugging wait 에서 벗어나 호출된 함수에서 break point 가 걸리게 됩니다.
[그림20] break point 지점 확인
[그림21] 라인별로 smali code, java code를 보며 디버깅을 시작
[그림22] 어플리케이션 시작
버튼 이벤트 발생 시 break point를 설정하여 디버깅 할 수 있습니다.
Ctrl+shift+F8 단축키를 이용하여 break point 지점을 설정합니다.
[그림23] 버튼 이벤트 메소드 확인
[그림24] 버튼 이벤트 동작
[그림25] 동작 지점 확인
[그림26] 디버깅 메뉴를 이용하여 분석
이상으로 디바이스에서 APK 동적 디버깅 환경을 살펴 보았습니다.
마지막으로 APK 동적 디버깅 순서 정리하면 아래와 같습니다.
|
참고자료
http://d-kovalenko.blogspot.kr/2012/08/breakpoints-in-smali-code.html
http://d-kovalenko.blogspot.kr/2012/08/debugging-smali-code-with-apk-tool-and.html
http://dztall.blogspot.kr/2011/01/blog-post.html
http://i5on9i.blogspot.kr/2012/10/smali-apk-debugger.html
http://code.google.com/p/android-apktool/issues/detail?id=339