2011년 10월 29일 토요일

최신 AOSP 의 CtsVerifier 에서의 빌드 에러.


얼마전 복구된 AOSP 소스를 받아 빌드해 보면 CtsVerifier 에서 아래와 같은 에러 메세지를 뿜으면서 빌드에 실패한다.

cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:191: onCreateDialog(int,android.os.Bundle) in android.app.Activity cannot implement onCreateDialog(int,android.os.Bundle) in com.android.cts.verifier.PassFailButtons.PassFailActivity; attempting to assign weaker access privileges; was public
    private static <T extends android.app.Activity & PassFailActivity>


이는 Sun JDK 가 아닌, Open JDK 를 쓰기 때문이다. Ubuntu 기본 JDK는 Open JDK 다.
Open JDK 가 아직은 좀 불안정하다고 한다. Google 측에서도 Sun JDK를 권장하고 있다.
자신이 쓰고 있는 jdk 를 확인해보자.



$ java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1~10.04.2)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)


Open JDK를 쓰고 있음을 알 수 있다.

아래의 명령으로 Sun JDK 를 설치, 사용하도록 설정한다.


$ sudo add-apt=repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ sudo update-java-alternatives -s java-6-sun


이제 다시 java 버전을 확인해보면, 아래와 같이 Sun JDK를 쓰고 있음을 알 수 있다.


$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)




이제, 빌드하면 성공할 것이다.

2011년 10월 18일 화요일

맥북 에어 11" 사용 1주년 소감.

작년 10월, 미국 출장을 나가 있던 난 당시 판매를 시작한지 얼마 되지 않았던 신형(물론 또다시 성능은 업그레이드 되고 가격은 그대로인 신형이 나왔지만) 맥북에어 11" 모델을 질렀다.

1년 사용해보고 소감이나 정리해 보려 했는데, 어느새 1년이 지났다.




1. 외관
뭐니뭐니해도 맥북에어는 외관이 일단 먹고 들어간다. 지금은 여기저기서 많이 보이지만, 처음 사들고 귀국했을 땐 한국은 아직 판매를 시작하지 않았을 때라 밖에서 펴들면 여기저기서 시선이 느껴졌다.

2. 이동성
태블릿 PC 에 비견하고 싶을 정도.
얇고 가벼운 만큼, 이동성은 최고다.
하지만, 1kg 정도의 중량은 잠시 들었을 땐 깃털 같지만, 동일 부피 대비 책에 비해 중량이 많이 나가기 때문에, 가방에 책도 좀 넣고 오래 들고 다니면 어깨가 약간 아프긴 하다.
하지만 역시 들고 다니기 편하기 때문에, 실외에서 코딩할 때 최고다.

3. 배터리
이건 이동성이랑 좀 겹치는 항목이긴 하지만... 30일의 대기시간, 10시간의 구동시간이라고 살당시 광고하고 있었는데.
10시간까진 좀 오바인 것 같고, 이클립스 띄우고 웹페이지도 30여 탭 열고 열심히 가지고 놀면 대략 4시간정도 가는 것 같다.
하지만 대기시간은 확실히 배터리 소모가 거의 없기 때문에, 그정도면 충분한 것 같다. 충전기는 집에 두고 들고 다닌지 오래됐다.

4. 성능
올해 나온 모델은 i5, i7 탑재이니 성능에서도 최고이지만, 내 경우 구매 당시 가장 많이 망설여졌던 부분이다. 내가 산 모델은 intel core2 duo를 탑재하고 있기 때문이다.
하지만 SSD 덕에 큰 무리는 가지 않는다. 애초에 게임도 하지 않고, 데스크탑을 메인으로 쓰고 어디까지나 실외에서의 서브 컴퓨터로 소스 리뷰 정도로 쓸 목적이었기에, 성능으로 고심해 본 적은 없다.
다만, 영화를 오래 틀면 팬이 돌아가기 시작하는데 그건 좀 신경쓰인다.

5. 화면 크기
주변에 맥북에어 사려는 사람들이 11"냐 13"냐로 고민하는 경우를 좀 보는데, 이동성이 목표라면 11", 메인으로 쓸거라면 13" 이상도 상관 없을 것 같다.
11"도 독을 치우면 그다지 화면 보는데 문제 있는 수준은 아니다.
더구나 11"는 거의 A4 용지 정도 크기라서, 그냥 책가방에도 잘 들어간다.


6. OSX
조금 적응기간이 필요하긴 하지만, 익숙해지면 더할나위 없이 편하다.
인터넷 뱅킹이나 액티브X는 가상머신에 Windows 깔면 되긴 하는데, 난 어차피 서브 컴퓨터 목적이기 때문에 데스크탑에서만 인터넷 뱅킹을 쓴다.

7. 아이패드? 맥북에어?
원체 슬림하다 보니 아이패드와도 조금 포지셔닝이 겹쳐버리는 문제가 있다.
나는 데이터를 소비하려는 목적이라면 아이패드(혹은 다른 태블릿 컴퓨터), 데이터를 생산하려는 목적이라면 맥북에어(혹은 다른 울트라 슬림 노트북)가 맞다고 생각한다.
이동성은 분명히 태블릿 컴퓨터가 압도적이고, 맥북에어는 할 수 있는 일에 있어 분명히 태블릿 컴퓨터에 압도적이다.
내 경우는 코드 리뷰와 간단한 테스트 코드 작성이 주목적이었기에 GNU 툴과 빌드 시스템 구축이 필요해서 일고의 고민 없이 맥북에어를 선택했다.

2011년 10월 16일 일요일

Selector 를 이용해 widget(Button, CheckBox 등)의 모양 바꾸기

Gingerbread 부터 많이 나아졌지만, Android 의 기본 widget(버튼, 체크박스, 등등...)은 별로 예쁘지 않기로 유명하다.

특히 버튼이나 체크박스의 경우 앱의 디자인에 어울리는 모습으로 커스터마이징 해야 하는 경우가 많은데, selector 를 이용하는 게 편하다.

기존 widget 과 전혀 다른 동작을 하길 원하는 커스터마이징이라면 상속을 받아 새로운 widget 을 만들어야겠지만, 단순한 모양 변화라면 selector 가 적당하다.

selector 는 Android resource system 에서 사용되는 XML drawable 의 element 중 하나로, 말 그대로 selection 가능한 drawable 을 의미하며, 내부 element 로 각 상황(포커스를 받았는지, 터치 되었는지, 포커스를 잃었는지, 비활성화 되었는지 등) 에 따른 형태를 표현할 수 있다.

0. 커스텀해서 사용할 이미지를 준비한다.
이미지 파일을 준비해서 res/drawable 아래 적당한 위치(drawable-hdpi 가 될수도 있고, drawable-mdpi 가 될수도 있고...)에 넣는다.
꼭 이미지가 아니라 xml drawable 이 될수도 있겠다.

1. res/drawable/ 아래에 적당한 이름의 xml 파일을 만들고 다음과 같은 형식으로 입력한다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:state_checked="true"
        android:drawable="@drawable/my_check_on" />

    <item android:state_enabled="true" 
        android:state_checked="false"
        android:drawable="@drawable/my_check_off" />

    <item android:state_enabled="false"
        android:drawable="@drawable/my_check_disabled" />
</selector>

위의 예는 체크박스를 위한 drawable 을 정의한 것으로, 활성화 되었고 체크 되었을 때에는 my_check_on.png 를, 활성화 되었고 체크되지 않았을 때에는 my_check_off.png 를, 비활성화 되었을 때에는 체크 여부에 관계없이 my_check_disabled.png 를 보여주게 될 것이다.
기타 상태 정보를 위해 사용가능한 selector 와 item 의 attributes 정보는 다음 링크에서 확인 가능하다.

2. 사용할 widget 의 적절한 속성으로 앞서 작성한 xml 파일의 이름을 준다.
적절한 속성은 사용할 widget 마다 다르다. Button 이라면 android:background 를 지정해 주면 되고, 예를 들고 있는 CheckBox 라면 android:button 이다.
예를 들면 다음과 같은 식이다.

    <CheckBox android:layout_height="wrap_content"
        android:text="" android:id="@+id/my_checkbox"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:button="@drawable/my_checkbox_drawable_selector"      
    />


2011년 10월 6일 목요일

RIP, My great hero who changed the world.


Apple 을 별로 안좋아한다. Steve jobs 또한 좋아하지 않는다.
구매해본 Apple 제품은 작년 10월에 구입한 MBA 11" 하나가 유일하다.
하지만, 나는 Steve jobs 와 그의 Apple 을 존경했다.

존경합니다, 그리고 감사합니다.
세상을 바꾼 위대한 영웅, 편안하시길.




---------------------------------------------------------------------------------------------------------------------------------
추모하는 의미로, 몇가지 영상 및 정보를 여기에 모아볼까 합니다.

스티브 잡스 본인의 육성으로 녹음된 The crazy ones 영상.
Apple 의 유명한 광고 The crazy ones 를 스티브 잡스 본인의 육성으로 녹음한 영상으로, 최종적으로는 방영되지 않은 버전이라는군요.


많이 회자되는 스탠포드 대학 졸업식 연설


스티브 잡스와 빌게이츠의 젊은 시절을 그린 영화, 실리콘밸리의 신화(원제 : Pirates Of Silicon Valley - 실리콘밸리의 해적 - )
스티브 잡스와 빌게이츠의 Apple, MS 설립 및 부흥기부터 잡스의 Apple 퇴출까지를 다루고 있습니다.
http://movie.daum.net/moviedetail/moviedetailMain.do?movieId=30849


젊은 스티브 잡스의 Macintosh 발표/데모 현장.
Macintosh 개발에 대한 이야기는 위의 실리콘밸리의 해적 영화에서도 비교적 자세히 다루어지며, 당시를 다룬 책으로 "미래를 만든 Geeks(http://www.yes24.com/24/goods/3794589)" 라는 책이 있습니다. 책에는 데모 준비에 대해서도 상세한 내용이 있죠.






이미 모아놓은 곳이 있군요 :)
http://ebizstory.com/681

2011년 10월 3일 월요일

Android package(APK) 파일 디컴파일 하기.

APK 를 압축프로그램으로 압축해제 하면, AndroidManifest.xml, assets, res 디렉토리와 classes.dex 파일이 나온다.
아래의 dex2jar 를 이용해 classes.dex 를 jar 로 변경 후, jar 파일을 압축 프로그램으로 압축 해제 하면 classes 파일이 나온다.
이걸 jad 로 디컴파일해 java 소스를 얻을 수 있다.

1. dex2jar
dex(dalvik executable) 포맷의 파일을 jar 포맷으로 변경해 주는 툴이다.

다운로드 : http://code.google.com/p/dex2jar/downloads/list
사용법 : # dex2jar <dex 파일 주소>
             ex) # dex2jar classes.dex
실행 위치에 jar 로 변경된 파일을 생성한다.


2. jad
classes 파일을 java 로 디컴파일 해준다.

다운로드 : http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/JAD.shtml
사용법 : # jad -o -sjava -r -d<target 경로> <디컴파일할 class 파일들 위치 경로>/**/*.class
             ex) # jad -o -sjava -r -ddecompiled src/**/*.class
<디컴파일할 class 파일들 위치 경로> 하위의 모든 class 파일들을 디컴파일해 <target 경로> 아래로 위치시킨다.


3. AXMLPrinter
APK 를 압축해제해 나온 xml 파일들은 binary 화 되어 있다. 이를 원래대로 되돌려준다.


다운로드 : http://code.google.com/p/android4me/downloads/list
사용법 : # java -jar <AXMLPrinter2.jar 경로> <decompile 할 xml 파일 위치>
             ex) # java -jar ../tools/AXMLPrinter2.jar AndroidManifest.xml
복원한 xml 파일을 화면에 출력해 준다. redirection(>) 등을 이용해 파일에 저장하면 되겠다.




참고 사이트 : http://hwangji.kr/sub/dev_leader/devstory/default.aspx?NHBBSID=NHBoardAppStory&NHBBSIDX=4