2011년 12월 27일 화요일

android ICS 해상도, density에 따른 UI 변화

해상도 중 짧은 쪽이 600pixel 이상 일때 emulator의 화면입니다.




그리고 600pixel 미만일 때 emulator의 화면입니다.



동일한 AVD에서 해상도만 1024 x 600에서 800 x 480으로 변경한 것입니다.

해상도의 짧은 쪽이 600이상 일 때는 tablet의 UI를 보여 주고 600 미만 일 때는 phone의 UI를 보여 줍니다.

그리고 짧은 쪽이 600이상이 되면 자동으로 status bar가 하단에 위치 하고 screen buttons(Navigation Bar로 내부적으로 표현함)이 포함됩니다.

phone의 UI는 기본이 portrait이고 tablet의 UI는 landscape입니다.

600미만인 android에 landscape를 default로 주고 Screen Buttons(Navigation Bar)를 주면 제대로 그려지지 않습니다.

PhoneWindowManager.java를 보면 resolution, dpi를 가지고 판단하는 코드가 있습니다.


 870         // Determine whether the status bar can hide based on the size
 871         // of the screen.  We assume sizes > 600dp are tablets where we
 872         // will use the system bar.
 873         int shortSizeDp = shortSize
 874                 * DisplayMetrics.DENSITY_DEFAULT
 875                 / DisplayMetrics.DENSITY_DEVICE;
 876         mStatusBarCanHide = shortSizeDp < 600;
 877         mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
 878                 mStatusBarCanHide
 879                 ? com.android.internal.R.dimen.status_bar_height
 880                 : com.android.internal.R.dimen.system_bar_height);
 881


결론은 600미만의 device를 만드실 때는 반드시 portrait 타입에 LCD를 사용하시기 바랍니다.

그리고 odroid-7으로 테스트 한 것인데 ro.sf.lcd_density=120으로 주니 tablet UI로 동작은 합니다.





2011년 12월 24일 토요일

ODROID-7 ICS 복구 이미지

ODROID-7 ICS 복구 이미지 배포합니다.

기존 버전에는 kernel framebuffer가 landscape로 되어 있고 android를 270도 회전하여 화면 회전시 또는 멀티태스크 화면에 thumbnail 이미지 회전과 찌부러진 이미지 문제를 해결하였습니다.

터치 및 센서들도 Landscape mode로 수정하였습니다


http://dl.dropbox.com/u/4485660/odroid7_ics.zip





2011년 12월 23일 금요일

android screen button 사용하기

ICS에 Screen button이 가능하도록 수정해 보겠습니다.

frameworks/base/core/res/res/values/config.xml 에 보면 
   



config_showNavigationBar을 true가 되면 아래 보시는 것 처럼 screen button이 나옵니다.

보통 저 파일은 device 밑에 overlay폴더로 관리합니다.

device/hardkernel/odroid7/overlay/frameworks/base/core/res/res/values/config.xml
이 파일을 수정하시면 됩니다.





xda 사이트 참고하였습니다.
http://forum.xda-developers.com/showthread.php?t=1364757


2011년 12월 22일 목요일

android Airplane mode uncheck 안되는 문제...

modem이 없는 android 시스템에서 airplane 모드를 체크하면 다시 uncheck되지 않는 문제가 있습니다.

airplane의 설정이 ril-daemon과 상호 작용하여야 되는지 ril-daemon이 없거나 modem이 없는데 ril-daemon만 동작하면 이런 현상이 있습니다.

그래서 android/package/app/settings/src/com/android/settings/AirplaneModeEnabler.java를 아래와 같이 수정 합니다.


 85     private void setAirplaneModeOn(boolean enabling) {
 86         //codewalker
 87         if (SystemProperties.get("init.svc.ril-daemon").equals("running")) {
 88             mCheckBoxPref.setEnabled(false);
 89             mCheckBoxPref.setSummary(enabling ? R.string.airplane_mode_turning_on
 90                 : R.string.airplane_mode_turning_off);
 91         } else {
 92             mCheckBoxPref.setChecked(true);
 93             mCheckBoxPref.setSummary(null);
 94         }

init.svc.ril-daemon property로 ril-daemon 동작 여부를 확인 할 수 있습니다.

그리고 init.rc에 ril-daemon을 제거 합니다.

#service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so
#    socket rild stream 660 root radio
#    socket rild-debug stream 660 radio system
#    user root
#    group radio cache inet misc audio sdcard_rw



android screen timeout 무한대로 설정하기

아래 링크를 보면 screen timeout를 무한대로 만드는 방법이 있습니다.

http://www.aesop.or.kr/34931
sqlite3 /data/data/com.android.providers.settings/databases/settings.db "INSERT INTO system (name, value) VALUES ('screen_off_timeout', -1);"


settings app를 수정하여 무한대로 설정 할 수 있도록 수정 해 보겠습니다.


android/pacakge/app/Settings/res/values/arrays.xml을 -1 item을 추가 합니다.



 74 
 75    
 76    
 77         15 seconds
 78         30 seconds
 79         1 minute
 80         2 minutes
 81         10 minutes
 82         30 minutes
 83         off
 84    
 85     
 86    
 87    
 88        
 89         15000
 90        
 91         30000
 92        
 93         60000
 94        
 95         120000
 96        
 97         600000
 98        
 99         1800000
100        
101         -1
102    


그럼 아래와 같이 UI 화면이 구성이 되고 off를 선택 하시면 -1 값이 db에 입력 되어 screen timeout이 안 걸립니다.


2011년 12월 1일 목요일

Unable to create netlink socket: Protocol not supported


D/dalvikvm(   55): GC_EXPLICIT freed 27K, 50% free 1044K/2048K, paused 0ms+0ms
I/Netd    (   91): Netd 1.0 starting
E/Netd    (   91): Unable to create netlink socket: Protocol not supported
E/Netd    (   91): Unable to open quota2 logging socket
E/Netd    (   91): Unable to start DnsProxyListener (Protocol not supported)

E/SocketListener(   53): Obtaining file descriptor socket 'dnsproxyd' failed: Protocol not supported



odroid-7에 ICS Porting중인데 위와 같은 메세지가 나오면서 문제가 되는데 해결 방법을 못 찾고 있다.

kernel에 netlink(netfilter)와 IPv6, quota 관련 feature을 켜도 해결이 안되네요.

system/netd/NetlinkManager.cpp를 보면 socket에서 error를 return하고 error message가 
Protocol not supported 면 kernel configure만 맞춰주면 될 듯한데...

 63     nladdr.nl_groups = groups;
 64 
 65     if ((*sock = socket(PF_NETLINK, SOCK_DGRAM, netlinkFamily)) < 0) {
 66         LOGE("Unable to create netlink socket: %s", strerror(errno));
 67         return NULL;
 68     }

하루 종일 googling해도 답이 없고 XDA 역시 위에 문제만 나와 있고 해결 방법이 없어요...


http://www.groupsrv.com/linux/about152575.html

위에 설명에 의하면
16이 af_netlink이고 커널 메세지를 보면 아래와 같다... 그럼 netlink protocol이 등록된 것 아닌지...

0.606927] NET: Registered protocol family 16

검색하다 아래 페이지를 찾았는데 kernel이 3.0 여야되는 것 처럼 보인다.

http://android.modaco.com/topic/330834-advent-vega-kernel-source-code-now-available/page__st__820

부팅 log도 보면 /proc/net/xt_qtaguid/stats 노드를 찾는다.
xt_qtaguid.c는 3.0 커널에 만 존재하는 파일이다.

F/BatteryStatsImpl(  122): Caused by: java.io.FileNotFoundException: /proc/net/xt_qtaguid/stats: open failed: ENOENT (No such file or directory)

2011년 11월 30일 수요일

android OpenJDK vs Sun JDK build

Ubuntu 11.10 업데이트 후 자동으로 설치되었는지 확인은 되지 않지만 OpenJDK가 설치 되어 있습니다.

android build시 gingerbread까지는 OpenJDK로 build하여도 문제가 없는데 ICS build시 아래와 같은 에러가 발생합니다.


error: error reading out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/javalib.jar; invalid header field
1 error
make: *** [out/target/common/obj/APPS/FrameworksCoreSystemPropertiesTests_intermediates/classes-full-debug.jar] 오류 41

googling 하여 보니 OpenJDK로 build는 가능하나 Sun JDK를 사용하기를 권장하는 것 같습니다.

synatic에서 OpenJDK를 삭제하시고 Sun JDK로 설치하시고


[~/projects/ICS]$ sudo update-alternatives --config jar
[sudo] password for codewalker:
대체 항목 jar에 대해 (/usr/bin/jar 제공) 2개 선택이 있습니다.

  선택       경로                           우선순  상태
------------------------------------------------------------
* 0            /usr/bin/fastjar                  100       자동 모드
  1            /usr/bin/fastjar                  100       수동 모드
  2            /usr/lib/jvm/java-6-sun/bin/jar   63        수동 모드

기본 사항[*]을 사용하려면 엔터, 다른 것을 사용하려면 번호를 입력하십시오: 2

jar도 위와 같이 java-6-sun/bin/jar를 선택하십시오.



http://groups.google.com/group/android-building/browse_thread/thread/f82cc424d451e409/91e29dac50ee1970?show_docid=91e29dac50ee1970

아직도 ICS AOSP가 빌드가 되지 않고 있습니다.


Preparing output jar [/home/codewalker/projects/ICS/out/target/common/obj/APPS/WAPPushManager_intermediates/proguard.classes.jar]
  Copying resources from program jar [/home/codewalker/projects/ICS/out/target/common/obj/APPS/WAPPushManager_intermediates/classes.jar]
target Java: FrameworksServicesTests (out/target/common/obj/APPS/FrameworksServicesTests_intermediates/classes)
target Dex: android.core.tests.libcore.package.com.no-core-tests-res
target Dex: android.core.tests.libcore.package.dalvik.no-core-tests-res
target Dex: android.core.tests.libcore.package.libcore.no-core-tests-res
target Dex: android.core.tests.libcore.package.org.no-core-tests-res
target Dex: android.core.tests.libcore.package.sun.no-core-tests-res
target Dex: android.core.tests.libcore.package.tests.no-core-tests-res

이 단계에서 top을 해 보면 java가 몇개 돌고 있고 메모리를 거의 다 사용하고 있어서 시스템이 거의 동작하지 않고 build 역시 안되는 것 같습니다. 여기서 해결이 안되네요. ㅡㅡ;

https://groups.google.com/group/android-building/browse_thread/thread/1d01d0cd635c7f9e

여기 설명대로 -j 옵션을 없애니 컴파일이 계속되네요. 이해가 안가네요.

결과 Ubuntu 11.10 최신 버전을 사용하고 있었는데 OS가 문제가 있어서 다시 설치해야 하서 결국 Google에서 recommend하는 10.04로 재설치 하였습니다.

그런데 package/app들 build하다가 아래 링크의 설명 처럼 에러가 발생합니다.


fix "bad class file error" android build error



http://rxwen.blogspot.com/2011/08/fix-bad-class-file-error-android-build.html

eclipse를 설치하고 나면 jar가 fastjar로 바뀝니다.
그래서 결국 android ICS build 하려면 jar를 다시 설정해 주셔야 합니다.