커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 2

2023. 3. 4. 19:46모바일프로그래밍/안드로이드

728x90

잘 설명된 블로그를 번역 하였음...내 나름의 해석이라 뭐라고 그러는 사람 없기..

 이클립스에서 ADT 플러그인을 제공하기는 하나, 좀 더 저수준 레벨에서 모든 것을 관리 하려면 필요하다.

다행히도, 안드로이드 SDK에서 커맨드라인에서 개발을 할 수 있는 모든 툴을 제공한다.

프로젝트 생성하기

tools 디렉토리에 가보면, 안드로이드 바이너리가 있으며, 다음과 같이 쓰면 된다.

android create project \
--target <target_ID> \
--name <your_project_name> \
--path path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
 

​정보를 좀 더 원한다면 다음2을 참고하라 :

 

빌드하기

 

아파치 Ant를 사용해서 다음의 명령으로 빌드한다.

ant debug
 

위의 명령어는 필요한 apk 파일들을 빌드하고 사인 해 준다.

커맨드라인으로 빌드하기3에 좀 더 세세한 설명들이 들어 있다.

구동하기

 

디바이스에 인스톨 : adb -d install -r bin/your-application-debug.apk
에뮬레이터: adb -e install -r bin/your-application-debug.apk
 

-r 플래그는 인스톨하기 보다는 다시 재 인스톨을 해 주라는 명령이다. 이 말은 즉슨, 없는 어플리케이션을 인스톨 하려 한다면 에러를 낼 것이라는 것.

메뉴 터치 없이 어플리케이션을 구동하도록 하려면 다음 명령어가 유용하다.

adb -d shell "am start -a android.intent.action.MAIN -n com.your.package/.YourActivity"
 

스트리밍

 

다음은 저자가 사용하는 쉘 스크립트이다.


#!/bin/bash
if [ $1 == "clean" ]
then ant clean; # force rebuild
fi

ant debug && adb -d install -r bin/myproject-debug.apk
​adb -d shell "am start -a android.intent.action.MAIN -n com.my.project/.MyActivity"
 

​물론 아파치 #Ant 를 사용하면 build.xml 파일을 사용하여 자동으로 구동 할 수 있을 것이다.

추가 팁들

 

 따라서 platform-tools와 tools 경로를 PATH에 넣어 두면 전체 경로를 칠 필요 없이 이런 툴들을 사용 할 수 있을 것이다.

이상.

 

커맨드라인으로 안드로이드 개발하기 : 디버깅4

 

계속해서 커맨드라인으로 안드로이드 개발하기를 시작해 보자.

오늘은 커맨드라인에서 애플리케이션을 디비깅 할 수 있는 몇가지 기술에 대해서 알아보자

IDE에 약간 알레르기 반응이 있는 사람은 좀 더 간편하고 가벼운 솔루션을 찾게 되는 데,

이는 편리함을 내 코딩 생활에서 제외 하는 것이 될 수도 있다.

말인 즉슨, 이클립스에서 일어나지 않는 오류를 머리를 쥐어 띁어 가며 잡지 않기 위해서 저수준 레벨 즉 그 아래에서 일어나는 일을 알 필요도 있을 것이란 거다.

비록 모든 프로토콜 특징을 지원하지 않지만 Dalvik VM은 Java Debug Wire Protocol5을 장착하고 있는 데, JDWP 류의 디버거는 안드로이드 단말기에 첨가 될 수 있다는 뜻이기도 하다.

또한 이클립스 디버거는 이 프로토콜을 사용한다.

그렇지만 이 프로토콜을 사용하기 위해서는 자바 디버거가 설치되어 있어야만 한다

이런 자바 디버거를 jdb라 부르며 gdb와 같이 커맨드라인 디버거이다. 

Java Debugger6

jdb로 안드로이드 어플리케이션 디버깅하기

 

Dalvik VM 내부에서 구동되는 안드로이드 어플리케이션에 jdb를 첨가(Attach) 하기 위해서는

adb 명령을 사용해야 한다.

adb는 어플리케이션과 개발/디버깅 환경과의 차이에 대한 다리 역할을 한다

Dalvik VM은 특정 포트/프로세스 아이디로 디버거가 첨부될 수 있도록 모든 애플리케이션에

JDWP 쓰레드를 생성한다.

디버깅 어플리케이션의 JDWP 아이디를 찾기 위해서 adb jdwp 명령어를 사용하는 데 이 명령어는 현재 살아있는 JDWP 프로세스들의 리스트를 리턴하게 된다.

바로 마지막 숫자가 마지막 디버깅 어플리케이션이 올라가 있는 JDWP가 된다는 것이다.

원격 VM으로 jdb를 첨부하기 위해서 우리는 원격 JDWP 포트/프로세스 아이디를 로컬 포트로 포워드 시키는 adb forward 명령을 다음 예 처럼 입력해야 한다.

adb forward tcp:7777 jdwp:JDWP_PORT
 

adb는 내가 연결 할 수 있는 로컬 TCP 소켓 포트를 열어 줄 것이고, 로컬 TCP 소켓에서 기기/에뮬레이터상에 구동되는 JDWP 프로세스로 모든 전송 데이터를 포워딩 시켜 준다.

다음 예 처럼 해보자.

jdb -sourcepath /your/project/src -attach localhost:7777
 

sourcepath는 내 프로젝트의 소스 디렉토리 경로를 뜻하고, 만약 프로젝트에서 직접 jdb를 올리려고 한다면 단순히 다음과 같이 입력하면 된다.

-sourcepath src 혹은 -sourcepath ./src . - 현재 프로젝트 디렉토리에서 이렇게 치라는 말이다.

모든 절차에 대한 예로써, 워드프로세스 안드로이드 어플리케이션을 빌드하고 구동 시킨다.

이 때 android:debuggable="true" 를 어플리케이션의 AndroidManifest.xml 파일 안에

넣어 주어야 함을 명심하자.

:~/code/wordpress-android/2.0.5$ adb jdwp
5384
6385
7051 # <- 마지막에 구동된 것
:~/code/wordpress-android/2.0.5$ adb forward tcp:7777 jdwp:7051
:~/code/wordpress-android/2.0.5$ jdb -sourcepath src -attach localhost:7777
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
>
 

어플리케이션은 구동 상태이고, 디버깅 할 거리가 없는 데 그럼 이걸로 뭘하자고?.

기본적으로 jdb는 어떤 브레이크 포인트가 세팅되어 있지 않다.

브레이크 시점은 예외(Exception)들이 발생 했을 때 뿐이다.

그럼 브레이크 포인트를 넣기 위해서

issue stop in과 out을 커맨드 상에서 번갈아 가면서 사용하면 되겠다.

전자는 메서드에 들어가는 방법이고 후자는 클래스의 특정 라인에다 브레이크를 거는 것이다.

> stop in org.wordpress.android.AddAccount.onCreate
Set breakpoint org.wordpress.android.AddAccount.onCreate
>
Breakpoint hit: "thread=<1> main", org.wordpress.android.AddAccount.onCreate(), line=67 bci=2
67 super.onCreate(savedInstanceState);
<1> main[1] list
63 private int blogCtr = 0;
64 public ArrayList<CharSequence> aBlogNames = new ArrayList<CharSequence>();
65 @Override
66 protected void onCreate(Bundle savedInstanceState) {
67 => super.onCreate(savedInstanceState);
68 setContentView(R.layout.add_account);
69
70 this.setTitle("WordPress - " + getResources().getText(R.string.add_account));
71
72 if (WordPress.wpDB == null)
<1> main[1]
 

내용을 살펴 보면 AddAccount Activity 의 onCreate 메서드에 브레이크 포인터를 걸었고,

“Add self-hosted WordPress blog”문자가 나올 때 걸어지게 된다. list 명령어는 소스의 리스트를 보여준다.

앞으로 나아가기 위해서는,

step 명령어로(현재 라인을 실행하고 step into 하라),

next(step over),

step up(현재 메서드가 리턴 될때까지 step).

issue help 명령어를 사용하여 언제든 가용한 명령어 리스트를 빨리 찾아 볼 수도 있다.

브레이크 포인트 세팅을 자동으로 하기 위해서는, 특히 메인 액티비티의 onCreate 메서드 내에 브레이크 포인트를 넣고 싶을 때, .jdbrc 나 jdb.ini 파일 둘 중에 하나를 사용 할 수 있다.

jdb로 부터 구동되고 있는 디렉토리에 이 파일들을 생성 할 수 있다. 그러면 이 파일 내용이 프로세스가 첨부(attach) 되기 전에 실행 될 것이다.

구동될 때 애플리케이션을 더 나가지 못하게 하려면(freezing),

android.os.Debug.waitForDebugger() 메서드를 사용하라.

어플리케이션은 진행하기 전에 디버거가 자신을 첨부 할 때까지 기다리고 진행하지 않을 것이다.

ddms7

 

Dalvik Debug Monitor Server는 안드로이드 기기로부터 스크린샷 찍는 것 같은 많은 일들을 할 수 있도록 해줄 것이다. ddms는 JDWP 포트를 로컬 TCP 포트로 자동으로 포워딩 할 것이다.

logcat

 

브레이크 포인트를 걸기 전에 해당 내용에 대해 추적된 내용에 대한 덤프를 볼 수 있다.

결론

 

만약 내가 시간 싸움을 하고 있다면, jdb는 빨리 이런 일들을 도와 주지는 못할 것이다. 하지만 Dalvik VM과 내 어플리케이션과 좀 더 친숙해지고 싶다면 바로 이런 일 들이 아닐까?

찾아보면 정말 많은 JDWP 류의 비쥬얼 툴들이 많을 것이다. 이것들을 사용하면 빠른 디버깅을 위해서 IDE를 다 구동하지 않아도 될 것으로 보인다. 하나만 소개 하자면

jSwat8을 소개하고 싶다.

이것 보다 더 많은 정보를 공유하고 싶다면 코멘트를 날려 주면 좋겠다

(저에게도 남겨 주세요...)

좀 더 공부하고 싶다면...

 

Using jdb with adb (no ADT)9 – provides a simple shell script that automates parsing of JDWP ports and forwards them to TCP ports, launches Dalvik VM through adb shell

Android Development without Eclipse 10– great overview on how to deal with the fact

Tips on Android Development Using Emacs11 – it can even organize missing imports

 

이상.

 

 

 

이상.


728x90