Eclipse Debugging Architecture
2014/02/11 화
14:29
<<eclipse debugging 구조.xlsx>>
Eclipse Debugger 구조

http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html
 
파란색은 coding시 import및 symbol 참조를 위한 data 흐름을 나타낸다.

    1. Coding과 Building시에는 PC에서 전적으로 수행하며, Target과 전혀 상관이 없다.
    2. Eclipse Debugger(IDE)가 구동되는 PC는 실제 app source와 framework source등 필요한 java source를 가지고 있다.
    3. 또한 필요한 jar(android.jar, core.jar, ext.jar, 3rd-party.jar) 를 가지고 있다.
    4. 따라서 Coding 시점에 java/class 파일로 부터 symbol들을 참조하게 된다. 이때 해당 symbol이 없으면 빨간색으로, build error로 나타난다.
    5. Build time에는 참조하는 java파일은 같이 compile을 하게 되고, jar경우 그냥 참조만 하게 된다.

 
 
위에서 빨간색은 debugging시 사용되는 data 흐름을 나타낸다.

    1. Target에는 source는 없으며, 실행 가능한 모든 class (jar) 파일만이 존재한다.
    2. Eclipse Debugger(IDE)가 구동되는 PC는 실제 app source와 framework source등 필요한 java source를 가지고 있다.
    3. Target에 탑재된 class는 line number와 method명, class(file명)명 등의 정보를 포함하고 있다.
    4. Target의 VM에서 구동되는 하나의 thread인 JWDP는 PC의 eclipse debugger와 연결된다.
    5. JWDP thread는 Target의 class정보로 부터 class(java 파일)명과 method, variable, line number를 가져온다.
    6. eclipse는 이러한 정보를 바탕으로 debugger에서 source와 symbol 정보를 display해준다.

 
 
 
참고로 eclipse에 연동된 jar는 다음과 같은 경우 필요하다.

    1. Coding        
      1. import intelligence 제공        
      2. code complete 제공        
      3. browsing시 framework소스 제공        

 

    1. Building
      1. app의 sdk build 가능함
      2. app의 full src build 가능함
      3. framework은 build되지 않아야 함

 

    1. Debugging
      1. source path로 자동 symbol loading 가능
      2. break시 symbol sync 정확함
      3. Help 참조가능

 
전제

    1. android.jar나 android_stubs_current_intermediates은 1) coding시 import를 쉽게 하기 위해 사용된다. 2)또한 build할때 api를 참조하기 위해서 사용된다.                                                
    2. property>builders>java builder 에서 check 해제 하면 build안 함                                                        
    3. debugging시에는 source와 target의 sync만 맞으면 되고, jar는 phone에 들어있는 것을 사용한다.                                                        

 
 
4가지 debugging 환경 설정 방법

디버깅 방법 4가지

장/단점

방법1 : Android App 등록방법 + Framework 소스

      1. android app project를 만들고 알맞은 version의 android.jar를 등록한다.
      2. 그리고 compile이후 debugging을 시도한다.
      3. 디버깅을 시도하면서 소스가 안보일 때마다, 해당 소스위치를 별도로 등록한다.
        1. Source Attachment Configuration>External Folder를 등록
        2. Edit the source lookup path에서 file system directory에 등록
        • D:/SRC_WORK/myLAPkk으로 root를 등록하면 너무 느림
        • 따라서 D:/SRC_WORK/myLAPkk/frameworks dir등록, 1개만 등록 가능

단점        

      • API에 수정이나 추가가 있을 경우 디버깅이 불가능해진다. 그러나 기본 API에 대한 변경은 없으므로 단점은 아니다.
      • library쪽에 Method.invokeNative 같은 src는 안보인다. 1개의 dir만 등록 가능하므로 framework이 등록된 상태

        ActivityThread.main 같은 src가 보인다.
        장점
      • default 설정을 사용함으로 편하다.

방법2 : Android App 등록방법 + Framework project (소스가 안보일 때)

      1. android app project를 만들고 알맞은 version의 android.jar를 등록한다.
      2. 그리고 compile이후 debugging을 시도한다.
      3. framework 이라는 java project를 만든다.        
        1. 만들어진 project에 link로 source package의 base 위치들을 등록한다.
        2. network drive로 연결하였다면 F5로 refresh를 해야 한다.
      4. 디버깅을 시도하면서 소스가 안보일 때, framework project를 추가해준다.
        1. Source Attachment Configuration>External Folder를 등록
        2. Edit the source lookup path에서 file system directory에 등록

단점

    • 제대로 된 java project를 만들기 어렵다.

      장점
    • 필요한 소스는 등록(여러 등록가능)만 하면 보인다.

      library쪽에 Method.invokeNative, ActivityThread.main등등
      필요한 소스의 package명까지만 base dir로 등록하면 된다.
    • 분리된 framework project를 다른 app에 재활용 가능하다.

방법3 :         full source java project 사용 (google 추천방식)

      1. android Native Guide로 android project가 아닌 java project이다.        
      2. android root dir에 java project를 만든다        
      • .classpath로 full source로 project를 만든다.        
      • remote debugging으로 debugging을 시도한다        
         

단점         

      • android root dir에서 .classpath로 만들게 되므로 모든 java파일과 다른 C/C++ dir까지 등록시켜 매우 느리다.

        장점
      • full source에 대한 browsing이 가능하다.
      • 어떤 경우라도 src가 다 보인다.

방법4 : compile로 생성된 android.jar 사용(기존 API 변경/추가 시)

      1. android app project를 만들고 기존 android.jar를 지운다.        
      2. 대신 add_external_jar를 통해 full source out directory의 android_stubs_current_intermediates.jar를 등록한다.
      3. 그리고 compile한다.
      4. 디버깅을 시도하면서 소스가 안보일 때마다, 해당 소스위치를 별도로 등록한다.

단점

      • android_stubs_current_intermediates.jar와 sync가 맞아야 한다.
      • 매번 디버깅시 소스 위치를 등록해줘야 한다.

        장점
      • build시 android_stubs_current_intermediates.jar가 생성되므로,custom으로 추가한 added API를 사용하는 app도 build가 가능하다.

방법5 : compile로 생성된 framework.jar family 사용 (hide API사용시)

      1. android app project를 만들고 android.jar외에 추가 lib를 등록한다.
      2. 필요한 lib를 찾아 core, framework, ext.jar 등등을 등록한다.
        • 이때 add_external_jar를 통해 1개씩 등록할 수도 있으며, 혹은
        • user_library인 framework_lib로 위의 lib를 묶어 제공할 수도 있다.
        • 참고로 이때 library 참조 order를 조정해주어야 한다.
      3. 그리고 compile하고 debugging한다.

단점

      • 디버깅 하려는 (산재된) jar를 찾아서 등록해줘야 한다.
      • user_library를 등록시 등록되지 않은 jar로 인한 build error가 많아 힘들다.
      • app build 시에는 interface만 필요하므로 실제 jar까지는 필요가 없다.

        장점
      • hide API를 사용하는 app도 build가 가능하다.
      • debugging시 source와 library사이에 연결이 필요 없다.

따라서 1/2/3은 소스 browsing에 대한 방법이며, 4/5는 build에 대한 방법이라고 있다.

    • 소스 browsing의 방법 중에서는 2번이 가장 추천되므로 2번을 default로 사용하면 된다.
    • build의 방법 중에서는 native만 사용했을 경우는 앞의 2번을, LG에서 변경된 API(interface) 사용시 4번을, Hide API 사용시 5번을 사용하면 된다.
    • 3rd Party library나 GMS api등의 user library 사용시도 5번 방법으로 등록하면 된다.

 
 
참고 내용
방법 1번 : framework을 android.jar혹은 android_stubs_current_intermediates.jar로 디버깅환경 구축
android.jar는 read only로 설정되어 있으므로 source path를 설정할 수 없다. 그러므로 eclipse에서 userlibrary등록
GB version부터는 source path는 설정할 수 있도록 변경되었다.
window > preference > search 창에 User library로 검색
java Library > Build Path > User Libraries 검색되면 선택
new하여 적당한 이름 기록하여 생성 ex) Froyo_Framework
Add JARs 선택후 Android SDK dir에서 android.jar 선택
설정된 Android.jar의 sub category중 Source Attachment선택후 Edit 클릭
External Dir선택후 full source root의 /framework 선택
만약 ArrayList같은 class까지 보고 싶으면 dalvit/libcore/luni/main등도 포함해야 하므로 full source root dir을 선택(참고로 시간이 오래걸림)
Javadoc Location path 선택후 browsering으로 선택
SDK 폴더의 doc선택 ex) android-sdk-windows/docs/reference
User Library설정완료
 
apk Project 생성
File > New > Android Project 선택하여 생성 했다고 침
 
apk Project 설정
해당 project를 마우스로 선택한 후 오른쪽 메뉴에서 Build path > Configure Build Path선택
Libraries tab에서
Add Library > User Library > Next > 위에서 생성한 Froyo_Framework 선택
Ordered and Export Tab에서
Froyo_Framework 선택후 check한후 Top으로 이동시킴

  • 참고로 default로 등록한 android.jar는 제거해도 된다. 제거를 안할 경우는 위의 단계를 반드시 실행시키길 바람
    android.jar를 제거할 경우 디버깅시에도 framework 소스가 제대로 보이게 된다.
     
    Project Refresh 시키고 build
    build path error나면 소스 하나 고치고 다시 build
     
    디버깅
    Debug as Android Application 실행
    break point 설정
    framwork source 가 안보이면 아래의 "Debugging 모드에서 class로 jump하여 소스가 안보일 경우"를 참조하길 바람
     
     
    방법 2번 screen shot : framework Library로 디버깅 환경 구축
    android.jar는 readonly로 설정되어 있으므로 source path를 설정할 수 없다. 그러므로 eclipse에서 userlibrary등록
    GB version부터는 source path는 설정할 수 있도록 변경되었다. 그러나 full source로 개발 시, SDK의 android.jar는 정확한 source로 mapping시킬수 없으므로
    실제로 full source로 build한 jar를 선택하는 것이 바람직하다.
    window > preference > search 창에 User library로 검색
    java Library > Build Path > User Libraries 검색되면 선택
    new하여 적당한 이름 기록하여 생성 ex) Framework_Lib
    Add JARs 선택후 full source가 존재하는 dir에서 out/target/common/obj/JAVA_LIBRARIES로 이동
    아래 dir에서 각각의 class-full-debug.jar 혹은 대응되는 jar선택하고 Source Attachment로 소스 연결
    core_intermediates                        dalvik/libcore/
    framework_intermediates                frameworks
    ext_intermediates                        external/apache-http/src & external/tagsoup 선택, 그러나 한가지 밖에 선택 못한다. (참고로 2개다 선택하려면 workspace로 묶엉야 하나?)
    android.policy_phone_intermediates        frameworks/policies
     
    위와 같이 java source가 여러 곳에 산재되어 있는데, 어떤 class가 어떤 class-debug-full.jar에 들어가는지 알아내려면
    1. grep으로 out/target/common/obj/JAVA_LIBRARIES dir에서 해당 class를 검색하는 방법
    추천!!        2. class가 위치하는 java파일을 찾은후, 그 dir 상위 dir로 이동하며 Android.mk를 찾고 여기서 LOCAL_MODULE tag에 할당된 문자열을 검사한다.
    SystemServer 같은 경우 LOCAL_MODULE:=server라고 기술되어 있고 이는 server_intermediates있다는 이야기 이다.
    Javadoc Location path 선택후 browsering으로 선택
    SDK 폴더의 doc선택 ex) android-sdk-windows/docs/reference
    User Library설정완료
    이하 위와 동일
     

     
     
    방법 3번 : 전체 소스로 project build
    Android Full Source에서 source list copy 하기
    development/ide/eclipse 에서 .classpath file을 Root dir로 copy한다.
    이때 .classpath file에서 c/c++ 등의 framework 이하의 소스는 필요 없으므로, system,device,bionic,bootable,build,hardware,external을 제거
    external중 gdata,protobuf,tagsoup등 몇 개는 필요할 경우가 생기므로 문제가 생기면 .classpath file에 추가해준다.
     
    프로젝트 생성하기
    Eclipse 에서 File > new > Java Project 선택
    Create project from existing source 선택 후 Root dir 위치 지정 하여 전체 source로 project만들기
    Finish 클릭
     
    Build하기
    Build 하고 error 발생하는 경우 아래 작업 확인
    .classpath file에 debugging 하고자 하는 모듈의 path를 추가 (error 나는 module이나 debugging 필요없는 모듈은 path 삭제)
    기타 error가 발생하는 jar 추가
    build path error 날 때, configure build path > order and export에서 library순서 재설정 후 retry, 순서가 이미 올바르더라도 refresh 실시바람
    source error 발생시, configure build path > source에서 필요 없는 소스제거
    import, 즉 jar include error날 때 package explorer에서 원하는 path에 해당 jar/java가 있는지 검사
    이때 com.android.xxx 라고 하면 해당 jar가 여러 곳에 나눠져 있으므로 해당 jar가 있는 dir를 찾아야 한다.
    Build완료
     
    Emulator 실행 및 설정
    디버깅 하고 자하는 Target Image 로 Emulator 실행해야 함
    Emulator에서 Setting > Application > Development 에서 <USB Debugging>, <Stay Awake> 을 on 하여 debugging mode 가능케 함
    Setting > Sound& Display > Screen timeout > Never timeout 을 선택하여 LCD 항상 켜지게 만듦