Android/Tools2009. 12. 15. 13:48
2009년 12월 10일 android blog에 새로운 글이 포스팅 되었다.

Optimize your layouts

Android application 은 xml 파일을 작성하여 UI layout을 생성할 수 있다.
이 UI layout을 위한 xml파일이 효율적으로 작성이 되어 있는지를 검사해주는 툴이 layoutopt 이다.

사용 법은 간단하다.
usage: layoutopt <directories/files to analyze>

$ layoutopt samples/samples/compound.xml
  7:23 The root-level <FrameLayout/> can be replaced with <merge/>
  11:21 This LinearLayout layout or its FrameLayout parent is useless samples/simple.xml
  7:7 The root-level <FrameLayout/> can be replaced with <merge/>
samples/too_deep.xml
  -1:-1 This layout has too many nested layouts: 13 levels, it should have <= 10!
  20:81 This LinearLayout layout or its LinearLayout parent is useless
  24:79 This LinearLayout layout or its LinearLayout parent is useless
  28:77 This LinearLayout layout or its LinearLayout parent is useless
  32:75 This LinearLayout layout or its LinearLayout parent is useless
  36:73 This LinearLayout layout or its LinearLayout parent is useless
  40:71 This LinearLayout layout or its LinearLayout parent is useless
  44:69 This LinearLayout layout or its LinearLayout parent is useless
  48:67 This LinearLayout layout or its LinearLayout parent is useless
  52:65 This LinearLayout layout or its LinearLayout parent is useless
  56:63 This LinearLayout layout or its LinearLayout parent is useless
samples/too_many.xml
  7:413 The root-level <FrameLayout/> can be replaced with <merge/>
  -1:-1 This layout has too many views: 81 views, it should have <= 80! samples/useless.xml
  7:19 The root-level <FrameLayout/> can be replaced with <merge/>
  11:17 This LinearLayout layout or its FrameLayout parent is useless

하지만 Window 환경에서 layoutopt를 수정없이 사용하게 되면 아래와 같은 에러를 보게 될 것이다.

Exception in thread "main" java.lang.NoClassDefFoundError: lib\layoutopt/jar
Caused by: java.lang.ClassNotFoundException: lib\layoutopt.jar
        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)
Could not find the main class: lib\layoutopt.jar.  Program will exit.

포스팅된 글을 끝까지 잘 읽어보면 해결책이 나와있다.

Windows users: to start layoutopt, open the file called layoutopt.bat in the tools directory of the SDK and on the last line, replace %jarpath% with -jar %jarpath


쉽게 이해가 안되면 아래와 같이 따라하자.

1. \sdk\android-sdk-windows\tools\layoutopt.bat 파일을 편집기로 연다.

2. 파일의 제일 마지막을 다음과 같이 수정한다.

수정 전  call java %java_debug% -Djava.ext.dirs=%javaextdirs% %jarpath% %*
수정 후  call java %java_debug% -Djava.ext.dirs=%javaextdirs% -jar %jarpath% %*

3. 파일을 저장 후 layoutopt를 사용한다.
파일명을 직접 입력 하거나, xml 파일이 있는 폴더명을 입력해주면 해당 폴더 내의 모든 xml 파일을 분석한다.

분석 내용이 길어질 경우를 대비에 > 를 사용해 출력을 analyze.txt에 담아도 좋다.

> layoutopt main.xml > analyze.txt
> layoutopt ./res/layout/

만약 분석을 요청한 파일에 특별한 내용이 없을 경우에는 
입력한 parameter만 출력이 되고 동작을 멈춘다.

[U]
Posted by ekwang
사용기2009. 12. 9. 15:10
"Use mouse strokes to accelerate your operations."

크롬 익스텐션 중 마우스 제스쳐를 인식하여 기능을 수행하게 해주는 것이 있다.

위의 사이트에서 설치하고,

옵션 - 확장 프로그램 - Mouse Stroke - Option을 선택하면 아래 화면을 볼 수 있다.


설정 Option 화면을 보면 위와 같다.

개인적으로 수정하여 사용하는 것도 좋지만, 기본 제스쳐 만으로도 충분히 편리하게 사용이 가능하다.
기본설정에서 모든 제스쳐는 마우슨 오른쪽 버튼을 누른 상태에서 동작을 해야 인식이 된다.
정상동작시 아래 캡쳐화면과 같이 화면에 마우스 괘적을 따라 선이 그려지고 chrome 왼쪽 구석에는 U,D,R,L를 이용하여 인식 상태가 표시된다.

예상하다시피 
  U : 아래에서 위로 선을 긋는 동작
  D : 위에서 아래로 선을 긋는 동작
  R : 왼쪽에서 오른쪽으로 선을 긋는 동작
  L : 오른쪽에서 왼쪽으로 선을 긋는 동작
을 말한다.


아래는 R D L 을 인식한 모습이다.


간단히 자주 쓸만한 몇가지 제스쳐를 그려보자.

Navigation 동작
  U : 페이지의 제일 위로 이동
  D : 페이지의 제일 아래로 이동
  L : 히스토리의 Backword 사이트로 이동
  R : 하스토리의 Foward 사이트로 이동

Window 제어 관련 동작 
  U D R U : 새로운 chrome을 실행 한다.
  L U R : 현재 chrome 을 종료한다.

Tab 관련 동작
  R D : 새로운 탭을 생성
  L U R : 현재 탭을 닫는다.
  
기타 동작들
  U D : 화면을 다시 로드 한다.
  R L R L : 화면을 캡쳐한다.

그 외 자신이 자주 쓰는 제스쳐를 기억해두거나, 자신만의 제스쳐를 등록해서
chrome을 사용하면 훨씬더 빠르고 편한 탐색이 될 것이다.
Posted by ekwang
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
사용기2009. 11. 25. 23:53
어떠한 이유(IE8이 critical error가 발생하며 계속 죽음!!)로 Chrome을 설치 하였다.
stable version의 chrome은 IE8에 비하면 기능면에서 참 simple하였고, 안정적이고 빨랐다.
물론 ActiveX 때문에 몇몇 사이트는 사용에 어려움이 있다.

하지만 Chrome을 메인 browser로 계속 사용하다보니 아~ 너무 simple하다..
그래서 찾은 것이 extension의 설치를 통한 기능 확장이었다.
Chrome extensions : http://www.chromeextensions.org/

그럼 바로 chrome 개발자 버젼의 설치, 그리고 extension 설치에 대해서 살펴보자.

첫번째 방법은 Window 사용자의 경우 공식 사이트에서 다운을 받은 후 channel changer를 이용하여 개발자 버젼으로 update 받는 방법이다.

  1. http://www.google.com/chrome 에서 우선 chrome stable 버젼을 다운 받아 설치합니다.
  2. 설치가 완료되면 윈도우 일 경우 http://chromium.googlecode.com/files/chromechannel-2.0.exe (chrome channel changer)를 다운로드로드 받아서 실행합니다.
  3. google chrome channel switcher가 뜨면 3번째 Dev: The latest features and bugfixes (~weekly updates). 를 선택하고 update 버튼을 누릅니다.
  4. 다시 chrome을 실행하여 옵션메뉴로 들어가 Google 크롬 정보를 선택합니다.
  5. 정보 창에서 지금 업데이트 버튼을 누르면 개발자 버젼으로 update가 진행 됩니다. 완료 후 chorme을 다시 시작합니다.
  6. http://www.chromeextensions.org/ 사이트에서 필요한 extensions를 선택해서 사용하면 됩니다.

두번째 방법, 아래 사이트에서 직접 다운로드 받아서 설치 한다. Mac, Linux 사용자.

Subscribing to a channel

Windows

Download and run the installer for the desired channel:
You'll need to restart Google Chrome to get the update. If this didn't work to get the latest build on a channel, try using the Channel Changer.

Mac

Requirements: Intel CPU; Mac OS X 10.5.6 or later.

Note: The Mac build still lacks certain privacy features, and is not appropriate for general consumer use.

Download and open the disk image for the desired channel: Then drag the app to the usual place.

Linux

Requirements: Intel Pentium 4 / Athlon 64 or later CPU; 32- or 64-bit Ubuntu 8.04 or later, or 32-bit Debian 5. Support for other Linux distributions is planned; unpacking the .deb files by hand may work. 

Note: Installing Google Chrome will add the Google repository so your system will automatically keep Chrome up to date. If you don't want Google's repository, do "sudo touch /etc/default/google-chrome" before installing the package.

Download and install the package appropriate for your system (just clicking on it should do the right thing):

http://www.chromeextensions.org/ 사이트의 검색창에서, gmail, reader, wave, twitter 등으로 검색해서 설치 하면 된다.


Posted by ekwang
기타2009. 11. 25. 23:04
저는 이미 JaeHo 님으로부터 google wave 초대장을 받아서 wave를 사용 중이었습니다.

그런데 오늘 wave를 통해서 wave 초대장이 8개가 왔네요.
한달 전에 google wave 사이트에서 등록하고 초대장을 신청해 놓은 상태였는데,
그것이 온건 아닌거 같고.. 왜냐하면 gmail로 신청을 했었으니 말이죠.

아마 기존 wave 사용자들에게 배포하는 건수가 있나봅니다.
별다르게 활동하지도 않은것 같은데 배포할 기회를 주었네요.

그래서 배풀어야죠.
댓글에 메일 알려주시면(비밀댓글로 작성하세요. 스팸조심해야죠) 선착순 
또는 정말 사용해 봐야만 될 것 같은 분들에게 나눠드릴께요.

Invitations will not be sent immediately. We have a lot of stamps to lick.
밀린 우편이 많아서 초대장이 바로 가진 않는다고 합니다.

그리고 제 wave 주소는 ekwange@googlewave.com 입니다.

초대장 받고 등록이 되시면 wave주소 남겨주시고 같이 wave해 보아요.


'기타' 카테고리의 다른 글

티스토리 초대장 5장 나눠드립니다.  (0) 2009.11.19
Posted by ekwang
Linux/Ubuntu2009. 11. 23. 22:48

ubuntu 9.10 에서 android full source 빌드 해보자.
9.04에서와 별 다른게 없어야 하지만, java version때문에 약간의 문제가 발생하였다.

ubuntu 9.10 설치 후 아마 android sdk 사용을 위해서 sun-java6-jre, jdk package를 설치 하였나 보다.
아니면 java 1.5, 1.6 이 설치되어 있는 상태에서 9.10으로 업그레이드를 하면서, 
구패키지인 1.5가 자동으로 삭제가 되었거나..

************************************************************
You are attempting to build with the incorrect version
of java.
 
Your version is: java version "1.6.0_15".
The correct version is: 1.5.
 
Please follow the machine setup instructions at
    http://source.android.com/download
************************************************************
build/core/main.mk:111: *** stop.  멈춤.

android full src 컴파일 하기 위해서 make를 하게되면
위와 같이 ubuntu 9.10 에서 java 1.5 가 설치 되어야 한다는 경고 문구를 볼 수 있다.

java5 설치를 위해서 apt-cache search jre를 해보지만 ubuntu 9.10 저장소에서 java5 버젼의 검색이 안된다.
9.04에서는 저장소에 sun-java5-jre, jdk 버젼이 있었던것 같은데..
아무튼 java6 이하 버젼을 설치하기 위해서는 파일을 다운로드 받아서 설치하거나, 
jdk 구버젼이 존재하는 저장소를 추가하여야 한다.

참고로, jre1.5 (jre5) 를 설치하게 될 경우 emulator동작을 위한 파일은 설치가 되지만
build에 필요한 javac등이 설치되지 않으므로 jdk5를 설치해야 한다.

그럼 ubuntu에서 jdk1.5 (jdk5) 설치 하는 방법을 알아보자.

1. 저장소를 추가하는 방법
위의 글을 참고 하여 아래의 저장소를 추가 한 후 jdk5 설치 한다.(
source.list 파일은 백업)
deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb 
http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

설치 완료 후에는 source.list 파일을 원복시키고 apt-get update 를 하여 karmic 주소로 다시 원복 시켜주어야 이후에 ubuntu사용에 혼란이 없을 것이다.
다음으로 아래와 같이 하여 java 1.5로의 환경 설정을 마칠 수 있다.
sudo apt-get update
$ sudo apt-get install sun-java5-jdk

$ sudo update-java-alternatives -s java-1.5.0-sun

위와 같이 하였으나 잘 되지 않으면(java, javac 등을 찾지 못할 경우)
본 글 아래의 update-alternatives 관련 내용을 참고하여
java 등 필요한 것들의 환경 설정을 변경하도록 한다.

2. 재미있게 jdk5를 직접 다운로드 받아서 설치하는 방법을 알아보자.

jre(java)만 설치하게 되면 javac, jar 등이 없으므로 아래의 jdk를 설치하자.


상기 링크를 통해 본인의 PC 환경에 맞는 파일을 선택하여 저장하도록 한다.

자동압축풀기설치를 위해서 rpm.bin 을 다운로드 받았다. rpm으로 설치를 하면 적절한 위치에 알아서 설치가 된다.
(jdk-1_5_0_22-linux-i586.bin 파일을 받았다면 설치할 폴더로(/usr/java/ 등..) 파일을 move 한 후 파일에 execute 모드를 주고 실행하면 된다.)

$chmod a+x jdk-1_5_0_22-linux-i586.rpm.bin
$sudo ./
jdk-1_5_0_22-linux-i586.rpm.bin

와 같이 실행하면 라이센스에 대한 문구가 출력이 된다.
space 키 입력하면서 모두 읽고나서 마지막으로 yes를 입력하여 확인 하고 나면
jdk-1_5_0_22-linux-i586.rpm 파일이 생성된다.

ubuntu에서는 rpm을 ubuntu용 설치 패키지 파일인 deb 포맷으로 변환해서 설치를 하여야 한다.

rpm to deb 로 변환을 위해서는 alien을 설치해야 한다.

$sudo apt-get install alien

alien 설치가 완료되었다면
deb로 변환해보자.

$sudo alien -c jdk-1_5_0_22-linux-i586.rpm

변환이 완료되면 jdk-1_5_0_22-linux-i586.deb 파일이 생성이 된다.

그럼 dpkg를 이용하여 최종 설치를 하면된다.

$ sudo dpkg -i jdk_1.5.0_22-1_i386.deb
전에 선택하지 않은 jre 패키지를 선택합니다.
(데이터베이스 읽는중 ...현재 129261개의 파일과 디렉토리가 설치되어 있습니다.)
jre 패키지를 푸는 중입니다 (jre_1.5.0_21-1_i386.deb에서) ...
jre (1.5.0_21-1) 설정하는 중입니다 ...
/usr/java/jdk1.5.0_22

위의 디렉토리로 패키지의 설치를 마쳤다.

마지막으로 java 1.5로 각 링크들을 변경하기 위해 아래와 같이 입력한다.
java 와 같이 기존에는 설치가 되어 있는 것들은 --config을 통해서 
selection을 변경해주어야 한다.

그 이외 javac, jar, javah 와 같이 jdk를 통해 새로 설치된 것들을 install

$sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk1.5.0_22/jre/bin/java" 1
$sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                  Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-6-sun/jre/bin/java   63        auto mode
* 1            /usr/java/jre1.5.0_21/bin/java         1         manual mode
  2            /usr/lib/jvm/java-6-sun/jre/bin/java   63        manual mode

Press enter to keep the current choice[*], or type selection number: 1

$sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/java/jdk1.5.0_22/bin/javac" 63
$sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/java/jdk1.5.0_22/bin/jar" 63
$sudo update-alternatives --install "/usr/bin/javah" "javah" "/usr/java/jdk1.5.0_22/bin/javah" 63
$sudo update-alternatives --install "/usr/bin/javadoc" "javadoc" "/usr/java/jdk1.5.0_22/bin/javadoc" 63

update-alternatives 명령을 이용해 java, javac 등 의 링크를 새로 설치한 것으로 수정했다.

참고로 update-alternatives의 help를 보면 아래와 같다.
  --install <link> <name> <path> <priority>
<priority> is an integer; options with higher numbers have higher priority in
  automatic mode.
위의 예에서는 4번째 파라메터에 1 값을 주었는데 만약 64값을 주게 되면 auto mode에서도 알아서 /usr/java/jdk1.5.0_22/jre/bin/java 
로 링크가 될 것 같다.


그리고 user home 에서 .bashrc 파일을 열어서 아래와 같이 JAVA_HOME을 설정하자.
*주의  =(equal) 앞뒤로 space는 허락하지 않는다.

$cd ~
$gedit .bashrc

# set PATH
export JAVA_HOME=/usr/java/jdk1.5.0_22/bin
export ANDROID_JAVA_HOME=$JAVA_HOME


파일 저장 후 편집한 bashrc를 아래와 같이 source를 이용하여 환경에 바로 적용하자.

$cd ~
$source .bashrc


설정한 JAVA_HOME이 적용되었는지 확인

$echo $JAVA_HOME
/usr/java/jdk1.5.0_22

마지막으로 모두 제대로 설정되었는지 확인.

$which java
/usr/bin/java
$java -version
java version "1.5.0_21"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_21-b01)
Java HotSpot(TM) Client VM (build 1.5.0_21-b01, mixed mode, sharing)
$which javac
/usr/bin/javac
$which jar
/usr/bin/jar
$which jar
/usr/bin/jar
$which javah
/usr/bin/javah

apt-get으로 설치 했을 경우에는 update-alternatives 를 사용할 필요가 없었는데,
dpkg -i deb로 설치를 하니 할일이 참 많다.
java, javac, jar, javah, javadoc 등이 모두 설치 되었음을 확실히 해야 한다.

여기까지 하였다면 다시 make를 하면 정상적으로 빌드가 시작된다.

비슷한 문제로 고민하는 이들이 있군요.
Posted by ekwang
Linux/Ubuntu2009. 11. 23. 22:08
출처 : http://ubuntu.or.kr/viewtopic.php?f=9&t=7454
deb 패키지 삭제 방법.  package 수동 삭제.

adobe-flashplugin 설치가 정상적으로 마무리 되지 않아서 
" ~ 아카이브를 찾을 수 없습니다." 라는 오류 문구와 함께
시냅틱 패키지 관리자, dpkg, apt-get 어느것 하나 정상 적으로 동작 하지 않는 문제가 발생하였다.


상기 링크에서 해결 방법을 찾았다.
dpkg 정보에 포함되어 있는 adobe-flashplugin관련 정보를 모두 삭제 후
apt-get install 하여 재 설치 하니 정상 동작 하였다.

$cd /var/lib/dpkg
$sudo gedit status

하여 adobe-flashplugin pakage 정보를 제거.

$sudo gedit available

한 후 마찬가지로 adobe-flashplugin pakage 정보를 제거.

출처 링크에 보면 이후 .list에 설치된 내용들도 삭제를 하라고 하고 있는데,
위에서 한 것 처럼 status, available 에서 package정보만 삭제 후
다시 install 하여도 정상적으로 잘 됨을 확인 하였다. 


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
Linux/Ubuntu2009. 11. 21. 00:31
매번 폰트 설치 할 때 마다 찾아보게 되니 간단히 기록 하도록 하자.

1. user의 홈디렉토리에 .fonts 폴더를 생성한다. ($cd ~)
2. 설치할 ttf 폰트 파일을 .fonts에 copy한다.
(개인적으로 나눔고딕, 나눔코딩고딕 폰트가 깔끔하게 좋다.)
3. sudo fc-cache -r -fv
4. system font들이 anti aliasing이 제대로 안될 경우(글씨가 못나게 출력되는 경우)
     gksu rm /etc/fonts/conf.d/29-language-selector-ko-kr.conf 


Posted by ekwang
기타2009. 11. 19. 18:22
블로그 잘 쓰실분들, 
.. 이 아니더라도 그냥 필요하신 분 댓글 남겨주시면 됩니다. 

초대권 배포가 넘쳐나는 것 같은데,
왜 초대형식으로 하는 걸까요?

'기타' 카테고리의 다른 글

google wave 초대장 배포합니다.(8장)  (9) 2009.11.25
Posted by ekwang