Android/Platform2009. 9. 24. 11:58
바로 앞 포스팅에 이어, Eclipse에서 Android Platform Build가 끝난 상태에서
Eclipse와 emulator를 연결하여 debuging을 하려다가 다시 문제에 봉착했다.
원인을 알고 나면 부끄러워지게 된다.


http://source.android.com/using-eclipse 를 참고하여 진행한다.

터미널에서 아래와 같이 입력하여 emulator를 실행 시키고,
~$ cd /path/to/android/root
~$ . build/envsetup.sh
~$ lunch 1   # to build the emulator
~$ make      # if you didn't already do this
~$ emulator  # you should see a GUI picture of a phone


다시 다른 터미널을 열어서 아래와 같이 입력하여 DDMS를 실행한다.
~$ cd /path/to/android/root
~$ ddms      # you should get a splufty debugging console

그리고 나서 eclipse의 debug를 연결시키면 되는데..

1. Run > Open Debug Dialog...
2. Right-click "Remote Java Application", select "New".
3. Pick a name, "android-debug" or anything you like.
4. Set the "Project" to your project ("android-java" or whatever).
5. Keep the "Host" set to "localhost", but change "Port" to 8700.
6. Click the "Debug" button and you should be all set.


위와 똑같이 진행하였지만
Eclipse에서는 아래와 같은 error popup이 발생하였다.

Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running. If it's being used by something else, choose a new port number in the preferences.

'Launching android' has encountered a problem. Failed to connect to remote VM



http://source.android.com/using-eclipse 를 상세히 읽어 보니,
아래 내용을 지나쳣다!

Note that port 8700 is attached to whatever process is currently selected in the DDMS console, so you need to sure that DDMS has selected the process you want to debug.

port 8700은 DDMS console에서 현재 선택된 process와 연결이 되기 때문에 디버그 하고자하는 process를 DDMS에서 확실히 선택해야 한다.

그렇다. 아래 이미지와 같이 원하는 process를 선택하게 되면
포트옆에 8700 port가 연결이 된다.


다시 Eclipse에서 Debug 를 실행 해보면 eclipse - ddms - emulator 가 연결되어 정상적으로
디버깅이 됨을 알 수 있다.

process가 debug상태가 되면 녹색 벌레가 출현한다.





http://developer.android.com/guide/developing/tools/ddms.html
위 사이트에 있는 DDMS의 기동에 대한 간단한 설명이다.

  1. DDMS 시작 시 adb server, client가 연결되고 둘간의 device monitoring service가 시작된다. device가 연결되거나 끊어질 경우 DDMS에게 알려준다.
  2. device가 연결되면 target의 adb와 DDMS간에 VM monitoring service가 생성된다. 그 후 디바이스의 VM(process)가 종료되거나 시작되면 DDMS에 알려준다.
  3. VM이 구동 되면, DDMS는 adb를 통해서 VM pocess의 pid 값을 검색한 후 디바이스의 adb daemon을 통해서 VM의 debugger와 연결 한다.
  4. DDMS는 custom wire protocol을 이용해서 target의 VM(process)과 통신할 수 있다.
  5. device의 각 VM을 위해서 DDMS는 디버거와 연결할 port를 연다.
  6. 첫번째 VM을 위해서 DDMS는 8600번 포트를 통해 debugger를 연결한다. 다음은 8601..
  7. debugger(eclipse)가 이 중 한 port와 연결이 되면 그 VM의 정보들을 받을 수 있게 된다.
  8. DDMS는 base port인 8700 local port를 연다. 8700port가 일반적으로 debugger가 연결이 되어야 하는 port임.

DDMS는 adb(android debug bridge) daemon, adb client, adb server를 사용하여 돌아가는 server, client 를 이용한다.
그리고 emulator에서 실행되는 모든 application들은 하나의 process(각 process는 각자 하나의 dalvik VM을 포함함)를 가지게 되는데, DDMS가 emulator나 real target device와 연결을 하게 되면
target으로 부터 각 process의 정보를 받아오고 adb를 통해 각각에 port(process port 8600~)를 할당해준다.

위와 같이 정상적으로 연결된 상태라면 DDMS에서 하나의 process를 선택하게 되면 default Debug VM port인 8700번으로 선택한 Process port forwarding 을 하게 되어 외부(Eclipse)에서 DDMS를 통해서 원하는 Process를 debug 할 수 있게 되는 것이다.

※잘못된 정보에 대해서는 가차없는 지적 바랍니다.

Posted by ekwang
Android/Platform2009. 9. 19. 15:38
얼마전 Android SDK 1.6 이 Release 되었다.
뒤늦게 upgrade를 하고 Eclipse에서 Emulator를 구동하니 아래와 같은 두가지 문제가 발생하였다.
해결 방법을 알아보자.





Eclipse 에서 Run 동작 시 Console에 아래와 같은 에러 발생함.
An internal error occurred during: "Launching Android Test".
com.android.ddmlib.AndroidDebugBridge.getDevices()[Lcom/android/ddmlib/IDevice;


해결책 :
아래 이미지와 같이 ADT, DDMS의 버젼이 최신인 0.9.3을 유지하고 있는지 확인해야 한다.
위와 같은 에러가 발생할 경우 DDMS의 버젼이 0.9.1로 남아 있을 경우가 있다.
DDMS를 다시 update하여 0.9.3을 다운 받은 후 Run을 하면 위의 에러가 발생하지 않는다.








Eclipse 에서 Run 동작 시 Console에 아래와 같은 에러 발생함.
Emulator]emulator: ERROR: bad config: virtual device directory lacks config.ini
Emulator]emulator: could not find virtual device named 'avd_1_6
'

해결책 :
1. 이미 AVD를 생성한 경우 move 해주는 방법
window에서 로그인 계정이 한글일 경우( AVD 경로에 한글이 포함된 경우, 한글이름 계정 ),
SDK 1.6에서 AVD 생성 후 emulator 를 동작 할때 AVD를 찾지 못해서 위와 같은 에러가 발생할 수 있다.

AVD를 생성 할때 기본설정에 따라
C:\Documents and Settings\한글계정\.android\avd 에 AVD가 생성 된다.
> android move -n avd_1_6 -p c:\avd\avd_1_6

와 같은 식으로 AVD를 한글 path가 없는 곳으로 이동 하면 정상적으로 emulator가 구동 된다.

또는 애초에 avd를 create할때 부터 -p 옵션을 이용해서 default path가 아닌 영문으로 된 곳으로 지정을 해주면 된다.

2. 새로운 AVD를 생성하는 방법

아래와 같이 avd를 한글이 포함되지 않은 경로에 avd를 생성한다. (android SDK 2.0, 2.0 이하의 경우 -t 3 이하로..)
> android create avd -n avd_2_0 -p c:\avd\avd_2_0 -t 4

SDK에서 제공하는 여러 Tool들을 consol(terminal)에서 다루는 방법을 익혀둔다면 개발에 유용할 것이다.
Posted by ekwang