IT_Programming/Dev Tools

[펌][안드로이드 스튜디오] Android NDK Debugging / 네이티브 코드 디버깅하기

JJun ™ 2015. 8. 20. 10:56



 출처

 : https://skyfe79.gitbooks.io/android-ndk-debugging/chapter1.html

 : https://skyfe79.gitbooks.io/android-ndk-debugging/chapter9.html





Android NDK Debugging

안드로이드 스튜디오 1.3버전부터 NDK 디버깅을 지원한다. 2015년 7월 30일 Final Beta버전이 출시되었다.
베타 버전에 특별한 문제점이 없다면 1.3 정식 버전도 며칠내에 출시한다고 한다.

안드로이드 스튜디오 1.3버전을 사용하면 네이티브 개발이 무척 쉬워진다. 정리하자면,

  1. javah를 사용하지 않아도 된다. 안드로이드 스튜디오가 자동으로 네이티브 메서드에 대한 인터페이스를 생성해 준다.
  2. Application.mk, Android.mk를 사용하지 않고 build.gradle 파일내에서 네이티브 빌드를 설정한다.
  3. 네이티브 코드를 디버깅할 수 있다.


다만, 네이티브 지원 기능을 사용하기 위해서는 기존 프로젝트 설정을 그대로 사용할 수는 없고 몇가지 변경을 해야 한다.

  1. gradle 2.5 버전을 사용해야 한다. gradle-wrapper 가 있어서 설정만 해주면 된다.
  2. gradle 빌드 도구를 실험 버전으로 사용해야 한다. 이 실험 버전은 gradle의 새로운 모델 컴포넌트를 바탕으로 DSL이 작성되기 때문에 기존의 build.gradle 파일을 새로운 DSL로 작성해 줘야 한다.
  3. 빌드 도구는 버전이 최소 19.0.0 이상이어야 한다.

이 책에서는 네이티브 디버깅을 지원하지 않는 프로젝트를 생성해서 네이티브 디버깅을 지원하는 프로젝트로 변경해 가는 과정을 다룰 것이다.








네이티브 코드 디버깅하기

네이티브 코드를 디버깅하려면 네이티브 디버깅 실행 환경을 만들어 줘야 한다.
이전 장에서 앱을 빌드하고 실행한 환경은 앱 실행 환경이었다.

네이티브 디버깅 실행환경을 만들기 위해서 Edit Configurations...를 실행한다.



대화상자가 나타나면 화살표가 가리키고 있는 + 버튼을 클릭한다.


Android Native 메뉴를 선택한다.



표시한 부분을 설정한다.


사용할 Native Debugger를 선택한다.

Apply 버튼을 누르면 네이티브 코드 디버깅 실행 환경이 만들어진다. 그림처럼 native-debugging 실행 환경을 선택한다.


이제 네이티브 코드로 이동해 브레이크 포인트를 설정해 보자.


디버그 실행 버튼을 눌러 앱을 디버그 모드로 실행한다.
그러면 아래와 같이 디버거와 연결이 되었다는 메세지가 디버그 콘솔에 출력된다

Waiting for device.
Target device: pantech-im_a870k-70cb3852
Uploading file
    local path: /Users/burt/Projects/Repository/Study/temp/HelloJNI/app/build/outputs/apk/app-debug.apk
    remote path: /data/local/tmp/kr.pe.burt.hellojni
Installing kr.pe.burt.hellojni
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/kr.pe.burt.hellojni"
pkg: /data/local/tmp/kr.pe.burt.hellojni
Success
Launching application: kr.pe.burt.hellojni/kr.pe.burt.hellojni.MainActivity.
DEVICE SHELL COMMAND: am start  -n "kr.pe.burt.hellojni/kr.pe.burt.hellojni.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Copying /system/bin/app_process from device.
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=kr.pe.burt.hellojni/.MainActivity }
Copying /system/lib/libc.so from device.
Launching gdbserver: run-as kr.pe.burt.hellojni lib/gdbserver +debugsock --attach 4134
GDBServer launched and port forwarding established.
Now Launching Native Debug Session
Launching gdb: /Users/burt/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb
gdb connection established.


디버거와의 연결을 확인한 다음 버튼을 누르면 아래 그림과 같이 브레이크 포인터에서 실행 컨텍스트가 멈추게 되고
실행 컨텍스트의 환경을 디버거에 출력하게 된다.



이렇게 네이티브 코드를 디버깅 할 수 있다.