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.javaR.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를 이용하여 마음껏 디버깅 하기만 하면된다.
그런데 무엇을 디버깅 하지..? ㅠㅠ