2010년 6월 28일 월요일

android windows sdk 만들기...

Linux host에서 android SDK를 만들어 낼 수 있습니다.

eclipse에서 빌드가 되지 않는 몇몇 package를 빌드하기 위해 Linux host PC에서 SDK를 만들어 사용하려고 했지만 몇몇 문제로 그대로 사용 할 수 없는 문제가 있습니다.

간단하게 빌드된 SDK에서 android.jar와 layoutlib.jar 만 변경하여 빌드 환경을 구축 할 수는 있습니다.

위에 방법으로는 emulator까지 확인 할 수 없습니다.

그래서 Linux host PC에서 빌드한 SDK를 Windows버전으로 변경 하는 방법을 알아 보겠습니다.

소스 root에 development/docs/howto_build_SDK.txt란 문서가 있습니다.

이 문서를 따라서 한 것입니다.

먼저 cygwin을 설치하고 필요한 package들을 설치 합니다.
autoconf, bison, curl, flex, gcc, g++, git, gnupg, make,mingw-zlib, python, zip, unzip

linux에서 빌드한 sdk zip이 있으니 소스 받고 컴파일하는 부분은 생략 하겠습니다.

[git root]/development/build/tools/make_windows_sdk.sh [android sdk zip path] 경로
이렇게 실행 시켜 주시면 됩니다.

몇 가지 문제가 있는데 JDK를 보통 Program Files에 설치를 하는데 공백이 들어간 path는 에러가 납니다.

그래서 JDK 폴더를 공백이 없는 폴더에 복사 하시고 build/core/find-jdk/tools-jar.sh를 열어 편집 합니다.

2 echo $ANDROID_JAVA_HOME/lib/tools.jar
3 else
4 # JAVAC=$(which javac)
5 JAVAC=/cygdrive/d/project/jdk1.6.0_20/bin/javac
6 if [ -z "$JAVAC" ] ; then

위에 빨간 색과 같이 복사한 패스를 넣어 줍니다.

그리고 mgwz.dll을 /cygdrive/c/cygwin/bin에서만 찾습니다.
script에 고정 경로로 되어 있는 듯 합니다.
그래서 c:\cygwin\bin에 mgwz.dll을 하나 복사 해 둡니다.

완료가 되면 /tmp/android-sdk_[SDK_NUMBER]_windows폴더가 있고 경로에 zip이 생깁니다.

완료 후 기존 sdk 폴더에서 platform에 있는 것만 복사 하면 properties에서 여러 버전의 platform을 쉽게 바꿀 수 있습니다.

2010년 6월 24일 목요일

Launcher를 eclipse에서 빌드 하기

git에서 소스를 받으면 Launcher가 있습니다.
하지만 Eclipse에서 빌드가 되지 않습니다.

그래서 Eclipse에서 빌드하는 방법을 알아 보겠습니다.

android를 빌드 할 수 있는 Linux Host PC가 있어야 합니다.
환경 설정이 끝나면 빌드를 해 둡니다.

Eclipse에서 Launcher란 프로젝트를 생성하고 [git folder]\packages\apps\Launcher 폴더의 내용을 덮어 씁니다.

main.xml이 error가 납니다. main.xml을 삭제합니다.

이제 부터 eclipse상에서 빌드 에러 나는 부분을 하나씩 정리 하도록 하겠습니다.

수정 해야 할 path는 frameworks/base/core/java 폴더 입니다.

frameworks/base/core/java/android/app/Dialog.java:998:
frameworks/base/core/java/android/app/StatusBarManager.java:29:
frameworks/base/core/java/android/app/SearchManager.java:1282:
frameworks/base/core/java/android/view/View.java:1500:
frameworks/base/core/java/android/view/View.java:1552:
frameworks/base/core/java/android/view/View.java:1560:
frameworks/base/core/java/android/view/View.java:1568:
frameworks/base/core/java/android/view/View.java:1576:
frameworks/base/core/java/android/view/View.java:1585:
frameworks/base/core/java/android/view/View.java:1593:
frameworks/base/core/java/android/view/View.java:1696:
frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java:761:
frameworks/base/core/java/android/os/Vibrator.java:29:
frameworks/base/core/java/android/widget/CursorAdapter.java:53:
frameworks/base/core/java/android/content/Context.java:1240:
frameworks/base/core/java/android/content/DialogInterface.java:97:
frameworks/base/core/java/com/android/internal/util/XmlUtils.java:35:

위에 나열된 파일의 line을 보면 @hide가 있습니다. 이부분을 삭제하고 make sdk를 통해 sdk를 만듭니다.

완료가 되면 out/hos/linux-x86/sdk/android-sdk_[lang].[user]_linux-x86.zip이 생성 됩니다.

압축을 풀면 android.com에서 받은 sdk와 동일 구조의 폴더가 생깁니다.

linux에서 빌드된 sdk를 윈도우 버전으로 만드는 방법도 있습니다.

간단하게 기존 sdk에서 [android sdk root]/platforms/android-7/android.jar와 [android sdk root]/platforms/android-7/data/layoutlib.jar를 덮어씁니다.

layoutlib.jar에는 com.android.internal.util.XmlUtils와 같은 anroid.jar에 포함되지 않는 몇몇 class들이 들어 있습니다.

여기서 부터 제가 엄청 삽질 했던 부분입니다. 처음에는 Properties에서 Add JARs...를 통해 layoutlib.jar를 했었는데 아래 에러가 납니다.



Add JARs..가 아니고 Add Library...를 합니다.

아래 그림과 같이 Add Library에서 User Library를 하고 임의의 이름을 선택 후 layoutlib.jar를 선택 합니다.





그럼 몇몇 package에서 찾지 못하던 class들이 에러가 나지 않습니다.

eclipse에서 빌드는 되는데 설치 및 실행은 현재 상태로는 안됩니다. 런처를 설치 하기 위해서는 몇가지 단계가 있어 보입니다.

이 부분은 추후 수정 하도록 하겠습니다.

2010년 6월 9일 수요일

ListView.getCheckItemIds() 에러에 대해서...

안드로이드 2.1에서 ListView.getCheckItemIds()를 사용하면 return 값이 제대로 처리되어 넘어 오지 않습니다.


위에 링크를 따라 가봐도 bug report가 되어 있는 상황이다.

그래서 다른 방법으로 check된 id를 구해 오는 방법입니다.

public class TestActivity extends ListActivity {
{
private ListView mList;

protected void onCreate(Bundle savedInstanceState) {
...
mList = getListView();
...
}

protected void onPause() {
super.onPause();
List list = new ArrayList();
SparseBooleanArray a = mList.getCheckedItemPositions();
for(int i = 0; i <>
if (a.valueAt(i)) {
list.add(mList.getAdapter().getItemId((a.keyAt(i)));
}
}
}

getCheckItemIds()가 대신 getCheckedItemPositions()으로 position들을 구해서 apater에서 ids를 구해 오도록 하였다.