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/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. 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
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
Linux2009. 9. 17. 18:02
알다시피 EcliseColorer Plugin은 Syntax Highlighting을 해주는 Eclipse 의 Plugin editor이다.
(http://colorer.sf.net/eclipsecolorer/ 주소를 통해서 Plugin을 설치 하면 된다.)

설치 후 Window->Preference->Colorer Library Editor 에서
설정을 변경 하려고 할때 아래와 같은 경고 메시지가 발생 할 때의 해결 방법을 알아보자.

Error in initialization of native part of the Colorer library. This can be caused by absent net_sf_colorer.dll (libnet_sf_colorer.so) library in paths of Java machine. Or, colorer can't find catalog.xml file, which must be placed in '%PLUGIN_DIR%/colorer/catalog.xml'
null

우선 .bashrc 파일을 편집하여

export JAVA_HOME="JAVA_DIR_PATH"

와 같이 해당 시스템에 설치된 JRE의 경로를 추가 해준다.
그리고 나서 terminal에서 아래와 같이 입력하여 JAVA_HOME이 정상적으로 등록됨을 확인 한 후

~$source .bashrc
~$echo $JAVA_HOME
/usr/lib/jvm/java-1.5.0-sun-1.5.0.18/jre

문제의 libnet_sf_colorer.so 가 정상적으로 로딩되지 않는 원인을 찾는다.

~$ldd /home/ekwang/android/Tools/eclipse/plugins/net.sf.colorer_0.7.2/os/linux/x86/libnet_sf_colorer.so
    linux-gate.so.1 =>  (0xb7fc1000)
    libstdc++.so.5 => not found
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7efc000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d98000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7d89000)
    /lib/ld-linux.so.2 (0xb7fc2000)

본인의 시스템에서는 libstdc++ 이라는 GNU 표준 C++ library가 설치되지 않아서 문제가 발생한 것이다.

~$sudo apt-get install libstdc++5

apt-get 을 이용하여 정상적으로 설치를 마친 후 ldd 를 통해서 다시 확인 해 보면
libstdc++5 가 로딩 됨을 확인 할 수 있다.

Eclipse를 다시 시작 하게 되면 Colorer Editor를 사용할 수 있게 된다.

아래 이미지와 같이 원하는 파일에 Colorer Editor를 default 로 설정하면 사용하기 편리하다.



하지만 막상 사용해 보니 Source Insight에 익숙해져서 그런지, 정확한 설정을 하지 않아서 그런지
원하는 만큼 Syntax Highlighting이 아름답진 않았다. ^^

java 파일을 colorer editor로 열어본 모습


Posted by ekwang