Android/Platform2009. 12. 1. 12:07

11/30일자 platform/manifest.xml 을 받고 나서 빌드 완료 후
eclipse에서 project를 생성하려고 Mydroid/Development/ide/eclipse/.classpath를 이용하여 New java Project를 하니
아래와 같은 에러가 발생하였다.

An error occurred while creating project. Check log for details.

Reason:
Build path contains duplicate entry: 'frameworks/base/vpn/java' for project 'master'
An error occurred while creating project. Check log for details.

Reason:
Build path contains duplicate entry: 'out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/vpn/java' for project 'master'


본인만 발생하는 것인지 알 수는 없지만 해결 방법에 대해 알아보자.
Order and Export tab을 보면 아래와 같이 frameworks/base/vpn/java 가 2개가 포함이 되어 있다.
그리고 더 내려보면 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java 또한 2개가 포함되어 있다. 




아래 경로에 있는 .classpath파일을 열어서 중복되는 entry를 삭제한다.
~/android/master/development/ide/eclipse/.classpath

<classpathentry kind="src" path="frameworks/base/test-runner"/>
<classpathentry kind="src" path="frameworks/base/tts/java"/>
<classpathentry kind="src" path="frameworks/base/vpn/java"/>
<classpathentry kind="src" path="frameworks/base/wifi/java"/>
<classpathentry kind="src" path="frameworks/base/vpn/java"/> <-- 삭제
<classpathentry kind="src" path="frameworks/policies/base/phone"/>


<classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/telephony/java"/>
<classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/vpn/java"/>
<classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/wifi/java"/>
<classpathentry kind="src" path="out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/vpn/java"/> <-- 삭제

파일을 저장 후 .classpath 파일을 mydroid 폴더로 복사해서 다시 eclipse를 이용해서 project를 생성하면 에러 없이 잘 된다.

eclipse가 열려 있는 상태에서 이미 mydroid 폴더로 복사되어 있는 .classpath파일을 수정하면 파일이 원복이 되니
eclipse를 다고 .classpath는 수정 후 eclipse 다시 로딩하도록 한다.

위와 같이 duplicated entry 라는 에러가 뜰때는 .classpath파일에서 중복되는 entry를 삭제 하고 다시 project를 만들면된다.
Posted by ekwang
Android/Tools2009. 11. 21. 01:12
ubuntu 9.10으로 upgrade를 하고 나서
eclipse에 ADT install (ADT update) 를 하려고 하니 몇몇 버튼이 동작 하지 않는 현상이 있었다.

해결 방법에 대해서는 이미 많은 글들이 소개하고 있다.
gtk로 구현된 application에서 발생하는 문제라고 한다.

아래와 같이 하여 eclipse를 실행 하도록 하면 해결 된다.

~$gedit eclipse.sh

  1. #!/bin/sh  
  2. export GDK_NATIVE_WINDOWS=true  
  3. /home/ekwang/android/eclipse/eclipse

~$chmod +x eclipse.sh

그리고 나서 eclipse.sh을 실행 하면 된다.
Posted by ekwang
Android/Application2009. 11. 5. 18:18

SNS서비스의 이용이 많아지면서 당연 Twitter에도 많은 사람들이 관심을 가지게 되었다.
S/W 개발자라면 TweetAPI를 이용해서 Twitter Client Application을 개발하는데 관심을 가져볼만하다.

간단한 방법만 소개해보겠다.
우선 Twitter는 TwitterAPI라고 하여 Twitter server에 있는 여러 data들을 자유롭게 접근하여 사용할 수 있도록
API를 오픈하고 있다.
물론 완전히 자유롭게는 아니고 약간의 제약이 있긴하다. (이러한 내용은 Twitter API wiki를 통해 확인하도록 하자.)

아무튼 Twitter API는 html base이다.
C, JAVA등에 익숙한 나같은 사람은 html로 application을 개발 할 능력이 없다.(사실 JAVA에도 무뇌한이지만..)
그래서 TwitterAPI를 다양한 언어로 wrapping해놓은 다양한 라이브러리등이 존재한다.

그중 JAVA를 써서 개발한 Twitter4J를 사용한다면 개발이 한결 쉬울 것이다.
사이트로 가서 압축된 파일을 받기만 하면 준비는 끝이다.
그리고 간단한 sample code를 몇개만 보게된다면 당신은 twitter client 프로그램을 손쉽게 개발 할 수 있을것이다!!!

개발과정을 잠깐보고 간단한 예제코드를 Android에 적용해보자.

1. Twitter4J library Add
아래사진과 같이 Package Explore에서 해당 package를 선택 후 Alt+Enter를 누르면 Properties 화면이 뜬다.
여기서 Java Builder Path 메뉴의 Libraries로 이동, Add External JARs를 눌러서
Twitter4J\twitter4j-2.0.10\twitter4j-2.0.10.jar 를 추가하면 준비는 끝이다.

2. 필요한 class를 import.
이런 식으로 import해 주고 Twitter4J의 class, method들을 호출하여 app개발을 하면 된다.
import twitter4j.Twitter;
import twitter4j.Status;
import twitter4j.TwitterException;
import twitter4j.User;


Twitter4J를 이용한 Twitter 로그인, Tweet 보내기 예제는 다음번에 꼭 포스팅하도록 하겠다.
Posted by ekwang
Android/Application2009. 11. 5. 10:03
뒤늦은 감이 있지만 1.6에서 View.OnClickListener를 쉽게 사용하는 방법에 대해서
안드로이드 블로그에 글이 있는 것을 확인했다.
http://android-developers.blogspot.com/?hl=en


UI framework changes in Android 1.6
Easier click Listener
기존에 OnClick을 처리 하기 위해서 OnClickListener를 생성하고 등록하는 코드

View.OnClickListener handler = View.OnClickListener() {
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.myButton: // doStuff
                break;
            case R.id.myOtherButton: // doStuff
                break;
        }
    }
}

findViewById(R.id.myButton).setOnClickListener(handler);
findViewById(R.id.myOtherButton).setOnClickListener(handler);


아래는 1.6에서 추가된 방식
1. view에 대해서 OnClick이 발생하였을 경우 호출할 method를 생성한다.
class MyActivity extends Activity {
    public void myClickHandler(View target) {
        switch (v.getId()) {
            // doStuff
    }
}

2. layout xml파일의 View에 android:onClick 을 추가하고 위에서 생성한 method를 등록해준다.
<Button android:onClick="myClickHandler"
... />

이렇게 하면 상기 Button이 Click 되면 myClickHandler를 호출하게 된다.

안드로이팀은 개발자들이 어플리케이션을 쉽고 효과적으로 만들수 있도록 최선을 다 할것이라고 한다. :)
Posted by ekwang
Android/Tools2009. 10. 28. 09:34

Android 1.6이 릴리즈 된지 불과 한달 보름정도가 지났는데 벌써 2.0 이 릴리즈 되었다.
http://developer.android.com/sdk/android-2.0.html

Android SDK 2.0 는 설치 방법이 기존과 좀 달라졌는데,
android-sdk_r3-windows.zip 를 다운로드 받아서 압축을 풀어보면
tools 폴더의 파일들만 존재하고 그외 add-ons, docs, platforms, usb-driver의 폴더는 파일들은 비어 있는 상태이다.
SDK 2.0에 포함된 tools 외 파일들에 대한 변경 및 배포에 용이 하도록 방식을 수정한 듯 하다.
이후로는 SDK Manager라고 하는 SDK Setup.exe를 이용하여 Eclipse에서의 ADT plugin upgrage와 같이 SDK도 upgrade 받는 방식이 될 것 같다.

SDK Readme.txt 파일을 읽어보시고
SDK Setup.exe파일을 실행하면 그 외의 필요한 파일들을 다운로드 받을 수 있다.

Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml
와 같이 연결 에러가 발생할 경우
아래와 같이 Force https:// ... 에 체크를 하고 
Save & Apply를 한 후 종료한다
그리고 다시 SDK Setup.exe 또는 tools/android 를 실행 하여 
Available Packages에서 주소를 다시 refresh 하면 된다.


ADT 버젼도 0.9.3에서 0.9.4로 upgrade되었으니 eclipse 사용자는 plugin을 update하도록 하자.
DDMS와 ADT tools 모두 upgrade되었는지 확인하도록 하자.
아쉽게도 이번 버젼에서도 AVD생성 경로에 한글이 포함되어 있을 경우 아래와 같은 에러가 발생하게 된다.
해결 방법 링크
emulator: ERROR: bad config: virtual device directory lacks config.ini
emulator: could not find virtual device named 'avd_2_0'


참고로 Android 2.0의 Platform 소스는 이번에도 같이 릴리즈 되진 않았다.
Posted by ekwang
Android/Tools2009. 10. 16. 15:24

window에서 어찌하다보니 JDK설치 후 다른 버젼의 JRE도 설치를 했었다.
정리를 하다가 버젼이 낮은 JRE를 삭제를 하였다.

그 이후 android sdk에 있는 tools에 있는 android, ddms와 같은 툴들을 실행하니 아래와 같은 에러가 발생하였다.

D:\SFF\Android\SDK\android-sdk-windows-1.6_r1\tools>android
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/archquery/Main (Unsupported major.minor version 49.0)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Starting Android SDK Updater
SWT folder '' does not exist.
Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.


문제의 해결 방법은 간단하다.
Window의 환경변수에, 설치 혹은 삭제 후 변경된 JRE의 bin폴더를 등록하면 된다.
ex) C:\Program Files\Java\jdk1.6.0_03\bin

시스템 등록 정보에서 환경변수 수정하였다면 로그오프후 다시 확인을 해봐야 한다.
그래야 변경한 환경 변수가 다시 설정됨.

혹은 cmd 창에서 아래와 같이 입력하면 환경 변수가 바로 변경되어 시스템에 등록된다.

>set PATH=%PATH%C:\Program Files\Java\jdk1.6.0_03\bin
>set PATH

PATH=C:\Program Files\Qualcomm\Brew MP 1.0 SDK Rev 4.3\tools\deprecated\BTIL\host\bin;C:\Tool\Cygwin\bin;C:\Tool\ARM\ADSv1_2\bin;C:\WINDOWS\system32;C
:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\RnD\Rational\ClearCase\bin;D:\SFF\Android\SDK\android-sdk-windows-1.6_r1\tools;C:\Program Files\Rn
D\Rational\common;C:\Program Files\Klocwork\Klocwork 8.0 User\bin;C:\Tool\MinGW\bin;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Pro
gram Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\V
C98\bin;C:\PlaysForSure\DeviceTestKit\Utils;C:\Program Files\Klocwork\Klocwork 8.0 User\bin;C:\Program Files\Java\jdk1.6.0_03\bin;
Posted by ekwang
Android/Platform2009. 10. 16. 14:25

공식적으로 Android Platform 개발 환경으로는 Linux(Ubuntu)와 MAC OS를 언급하고 있다.
http://source.android.com/download

M$의 Window를 사용하고 있는 상태라면
Vvirtual Box등을 통해 ubuntu를 설치하거나, Linux, Window 를 멀티 부팅하게 하여
Android Platform 소스를 받고 컴파일을 하는 방법이 있을 것이다.(상위 링크 참고)

Android Code의 Distribute와 Contribute는 repo와 git라는 툴을 사용해서 한다.
git은 CVS, TortoiseSVN, ClearCase등과 같은 code를 관리하는 툴이라 생각하면 된다.
repo는 git기반으로 작성되었고 git의 많은 저장소들을 쉽게 관리할 수 있도록 도와주는 툴(스크립트)이다.
http://source.android.com/download/using-repo

그렇다.
window에서 git을 사용할 수 있다면 android platform 소스를 다운 받을 수 있는 것이다.
하지만 컴파일은 안된다.

우선 아래 링크를 참고하여 window에서 사용가능한 msysgit을 download하고 설치한다. (cygwin도 설치 해야함)
설치 시 옵션들이 잘 이해가 되지 않는다면
default 값들을 유지하면 Next만 눌러도 된다.

msysgit -
Git on Windows 개발 사이트
http://code.google.com/p/msysgit/

msysgit Download List

http://code.google.com/p/msysgit/downloads/list

설치가 완료되었으면 Git BashGit GUI를 확인 할 수 있다.

그럼 설치된 Git Bash를 실행해보자. terminal이 뜬다.

git을 이용하여 repository에서 소스를 내려 받는 기본 명령은 다음과 같다.

$ git clone git://android.git.kernel.org/platform/manifest.git mydroid


하지만 위와 같이 입력을 하게 되면 mydroid라는 폴더밑에는 default.xml 파일만 다운로드를 받고 작업이 완료된다.
원래 Linux 환경에서는 repo sync 를 이용하면
default.xml 파일을 참고하여서 전체 platform source를 다운을 받게 되는 것이다.
(실제 msysgit에서 curl을 통해서 repo를 설치하고 repo sync를 실행하여 다운로드를 시도해 봤으니
여러가지 에러가 발생하였다.)

하지만 우린 repo를 사용하지 않을 것인데,
그렇다면 160여개가 넘는project 파일들을 어떻게 다 다운 받을 것인가?
아래와 같이 일일이 입력 해줘야 한다!!!

git clone git://android.git.kernel.org/kernel/lk.git
git clone git://android.git.kernel.org/kernel/omap.git
git clone git://android.git.kernel.org/kernel/experimental.git
git clone git://android.git.kernel.org/kernel/msm.git
git clone git://android.git.kernel.org/kernel/common.git
.....

다행히 이러한 작업을 간단히 스크립트로 만들어 둔 분이 계시다.
http://bradchow.wordpress.com/2009/01/20/get-android-source-code-in-m-windows/

Download File :


해당 사이트에서 가져온 스크립트 첨부파일을 다운 받은 다음
아래와 같이 git bash에서 실행을 하게 되면 android full source를 다운 받을 수 있다.

$ sh autogit.sh


총 5.5G 정도의 디스크 공간이 필요하다.
필요한 소스만 받고 싶다면
http://android.git.kernel.org/
사이트를 참고하여서 원하는 project만 다운로드를 받아도 된다.

Posted by ekwang
Android/Tools2009. 10. 12. 13:18
http://source.android.com/using-eclipse
의 내용 중.

Increase Eclipse's Memory Settings

The Android project is large enough that Eclipse's Java VM sometimes runs out of memory while compiling it. Avoid this problem by editing the the eclipse.ini file. On Apple OSX the eclipse.ini file is located at /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini

Memory-related defaults (as of Eclipse 3.4)

-Xms40m
-Xmx256m
-XX:MaxPermSize=256m

Eclipse에서 android source를 보기 위해서는 위와 같이 JVM의 heap size를 증가 시켜주는 것이 eclipse 를 구동하는데 안정적이고 좋다.
만약 heap size를 증가 시키지 않으면 OutOfMemoryErrors 를 자주 보게 될 것이다.

간혹 위의 내용을 참고하여 eclipse.ini 파일을 위와 같이 수정하였으나
아래와 문제가 발생하며 eclipse가 실행되지 않는 현상을 접하는 분들이 있을 것이다.
JVM terminated. Exit code=-1
-Xms256m
-Xmx512m



이때 아래와 같이 eclipse.ini를 수정 후 정상 동작 한다.

-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vm
C:\Program Files\Java\jdk1.6.0_03\bin\javaw.exe

-vmargs
-Xms256m
-Xmx512m
-XX:MaxPermSize=256m


-vm 옵션을 이용하여 javaw의 위치를 정확히 지정해 준 이후에 eclipse가 위의 에러없이 정상 동작 함을 확인 하였다.

추가로 http://wiki.eclipse.org/Eclipse.ini 를 보면 아래와 같은 내용이 있으니 참고한다.
-vmargs 옵션 아래로 선언되는 옵션 값들은 JVM에게 전달해 주는 것이다.
즉 heap size 조정 option들은 -vmargs 아래쪽에 위치 해야 한다는 이야기이다.

Important:
  1. Each option and each argument to an option must be on its own line.
  2. All lines after -vmargs are passed as arguments to the JVM, so all arguments and options for eclipse must be specified before -vmargs (just like when you use arguments on the command-line)

알다시피 eclipse는 JVM에서 구동이 되는 application이므로 우리는 JVM에게 eclipse를 구동하기 위해서 얼마의 heap을 사용 할 수있도록 option값을 주는 것이다.

참고 site:
http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F
Posted by ekwang
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. 23. 18:01
Android Platform 소스를 빌드하고 디버깅 하기 위해서는
http://source.android.com/using-eclipse 사이트를 참고하여 진행하면 된다.

하지만, Eclipse에서 .classpath파일을 이용하여 New Project를 생성을 하고,
Build를 하게 되면 거의 300개에 육박하는 Error가 발생하는 것을 보게된다.

대략 아래와 같은 에러들이 발생하게 되는데..

CertTool cannot be resolved     LoadListener.java       Android_Source/
frameworks/base/core/java/android/webkit        line 1002       Java Problem

CONNECTED cannot be resolved    VpnSettings.java        Android_Source/packages/
apps/Settings/src/com/android/settings/vpn      line 605        Java Problem

DISCONNECTING cannot be resolved        VpnSettings.java        Android_Source/
packages/apps/Settings/src/com/android/settings/vpn     line 608        Java
Problem

IVpnService cannot be resolved  AuthenticationActor.java        Android_Source/
packages/apps/Settings/src/com/android/settings/vpn     line 153        Java
Problem

Keystore cannot be resolved     SecuritySettings.java   Android_Source/
packages/apps/Settings/src/com/android/settings line 905        Java Problem

Keystore cannot be resolved to a type   SecuritySettings.java
Android_Source/packages/apps/Settings/src/com/android/settings  line
487     Java Problem

L2TP cannot be resolved VpnSettings.java        Android_Source/packages/apps/
Settings/src/com/android/settings/vpn   line 541        Java Problem

L2tpIpsecProfile cannot be resolved to a type   L2tpIpsecEditor.java
Android_Source/packages/apps/Settings/src/com/android/settings/vpn
line 69 Java Problem

The import android.net.vpn cannot be resolved   AuthenticationActor.java
Android_Source/packages/apps/Settings/src/com/android/settings/vpn
line 28 Java Problem

.....

하나 하나 해결해 보도록 하자.

우선 아래 이미지와 같이 New Project를 만들때 vpn Package를 Source 에 추가하도록 한다.



Project의 생성이 완료되면 (Build Automatically가 설정되어 있으면 빌드를 중지시키자)
Eclipse에서 project의 Java Build Path를 약간 수정해보자

Project의 Root 를 선택 후 Properties(Alt+Enter) 설정 창을 띄운다.
아래 이미지와 같이 Java Build Path를 선택 한 다음 Source 탭에서
Add Folder... 를 선택 하면 Source Folder Selection 창이 뜨게 된다.

android1.6/frameworks/base/keystore/Java
android1.6/frameworks/base/vpn/Java
두 경로의 Java폴더를 체크하여 추가 해주어야 한다.
위의 파일들이 제대로 import되지 않아서 많은 error가 발생하고 있다.



이렇게 설정을 마치고 Build All을 하면, 우선 90% Error가 사라지게 된다. :)

그럼 계속하여 아래와 같이 남아 있는 Error들을 정리 해보자.
R.java 파일이 없어서 발생하는 문제임을 알 수 있다.

R cannot be resolved    LandingPage.java    android/packages/providers/ImProvider/src/com/android/providers/im    line 141    Java Problem

R cannot be resolved    ProviderListItem.java    android/packages/providers/ImProvider/src/com/android/providers/im    line 64    Java Problem

.....

Package Explore를 통해서
out/target/common/R을 살펴보면
com.android.providers.im 의 Package와 그에 속하는 R.java 파일을 찾을 수가 없다.
android 1.6에서는 ImProvider 를 build 하지 않도록 make 파일이 막혀 있기 때문이다.

위의 Error를 해결 할 방법은 두가지 이다.
Eclipse에서 ImProvider를 build 하지 않거나, ImProvider의 android.mk 파일을 수정하여 제대로 build를 해주는 것이다.

ImProvider를 Eclipse에서 Build하지 않는 방법은 간단하다.
1. packages/providers/ImProvider/src 를 선택 후 마우스 Right Click
2. Build Path -> Configure Inclusion / Exclusion Filters....
를 선택하면 아래 이미지와 같은 창이 뜬다.
3. Exclustion Pattern의   Add.. 를 선택하여 com/android/providers/im을 추가 하게 되면 해당 package는 빌드가 되지 않는다.


다시 Build All(Ctrl+B)를 해보자.
모든 Error 없이 빌드가 완료 됨을 볼 수 있다.


ImProvider를 꼭 써야겠다.. 한다면 위에서 설명한 ImProvider를 Exclusion하는 작업은 하지 말자.
android1.6/packages/providers/ImProviders/Android.mk 파일을 수정하여 다시 make를 하면된다.
ifeq (1,1)  //<----- (0,1) 을 (1,1)로 수정함

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := user

LOCAL_SRC_FILES :=  $(call all-java-files-under,src)

LOCAL_JAVA_LIBRARIES := ext \
                        com.android.im.plugin           # TODO: remove this and load this on demand.
                                                        # (HACK: include this so we can load the
                                                        # classes defined in this plugin package)

LOCAL_PACKAGE_NAME := ImProvider
LOCAL_CERTIFICATE := vendor/google/certs/app

include $(BUILD_PACKAGE)

# additionally, build sub-tests in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))

endif # ifeq (0,1)

위와 같이 파일을 수정 후 다시 make를 한다.
ekwang@ekwang-desktop-ubuntu-vmware:~/android/android1.6$ make
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=Donut
============================================
build/core/copy_headers.mk:15: 경고: 타겟 `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'에 대한 명령어보다 다른 것이 우선합니다
build/core/copy_headers.mk:15: 경고: 타겟 `out/target/product/generic/obj/include/libpv/getactualaacconfig.h'에 대한 과거 명령어들을 무시합니다
Install: out/target/product/generic/system/app/Mms.apk
target Java: ImProviderPermissionTests (out/target/common/obj/APPS/ImProviderPermissionTests_intermediates/classes)
target R.java/Manifest.java: ImProvider (out/target/common/obj/APPS/ImProvider_intermediates/src/R.stamp)
target Java: ImProvider (out/target/common/obj/APPS/ImProvider_intermediates/classes)
Note: packages/providers/ImProvider/src/com/android/providers/im/ImProvider.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
ekwang@ekwang-desktop-ubuntu-vmware:~/android/android1.6$

android1.6/out/target/common/R/com/android/providers/im 폴더에
Manifest.java
R.java
파일이 생성되어 있음을 확인 할 수 있다.

위와 같이 생성한 파일들을 Eclipse Build path에 추가 해야 한다.
Package Explore에서 out/target/common/R 를 선택 후 마우스 Right Click 하여
Build Path -> Configure Inclusion / Exclusion Filters....를 실행 하면 아래와 같은 화면을 볼 수 있다.
Exclusion에 포함되어 있는 com/android/im을 Remove 해줘야 한다.



그다음,
Package Explore에서 out/target/common/R 를 선택 후 마우스 Right Click 하여
New -> Package 를 선택하여  com.android.providers.im 을 추가한다.
아래와 같이 R.java, Manifest.java 파일이 보이지 않는다면 Refresh(F5) 를 해보도록 한다.



다시 Build All 을 하면 깨끗이 빌드가 완료 된다.

사실 위의 과정은 이미 잘못(?) 생성되어 있는 Android project 빌드시 발생하는 error를 해결하는 과정이다.
하지만 android1.6/packages/providers/ImProviders/Android.mk 파일을 수정하여 다시 make를 미리 해둔 상태에서
New Project를 생성한다면 R.com.android.providers.im은 자동으로 추가가 되기 때문에
위의 과정을 진행 할 필요가 없어진다.

추가(10/16) : Android development group의 내용을 뒤지다 보니 위의 ImProviders를 build하는 것 보다 아예 Build에서 빼버리는 것이 좋다고 한다. 참고 하시길..

이제 Android Platform 을 Eclipse를 이용하여 마음껏 디버깅 하기만 하면된다.
그런데 무엇을 디버깅 하지..? ㅠㅠ
Posted by ekwang