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를 다시 설정해 주셔야 합니다.

2011년 11월 29일 화요일

2011년 11월 28일 월요일

ubuntu 11.10에서 android(Gingerbread) build error...


ubuntu 11.10으로 업데이트 후 gcc 버전을 확인 해 보면 아래와 같습니다.


[~/projects/ICS/device/samsung]$ gcc --version
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

그래서 android build 시 두가지 에러가 발생합니다.


In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: error: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] 오류 1
make: *** 끝나지 않은 작업을 기다리고 있습니다....
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/format_output.o] 오류 1
true


frameworks/base/libs/utils/Android.mk
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive





error: "_FORTIFY_SOURCE" redefined [-Werror]



build/core/combo/HOST_linux-x86.mk line 61:

-HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0

+HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

2011년 11월 24일 목요일

android에서 USB Mass Storage 사용하기

ODROID-7/A에 USB Host가 있습니다.

거기에 USB 저장장치를 연결하여 자동으로 mnt/sdcard/external_storage란 폴더에 자동으로 마운트가 되도록 수정해 보려고 합니다.

ODROID-A에는 두개의 mmc가 있어서 galaxy s처럼 추가 외부 저장장치를 지원합니다.

vold와 MountService.java를 수정하였습니다.

vold.fstab에 bus node를 등록하면 UMS까지 지원하려고 했지만 usb mass 장치를 붙일때 마다 bus node의 인덱싱이 host1, host2 처럼 증가합니다.

vold의 구조가 동적 증가하는 장치를 지원하지 않는 구조 입니다.

fstab에 등록되어 있는 노드 객체를 만들고 등록된 Volume이 NetlinkEvent의 DEVPATH와 동일하면 처리합니다. 따라서 USB Host에 연결하는 장치와 같이 bus 이름이 증가하는 구조에는 적용이 안됩니다.

그리서 vold에서 강제로 mount 하도록 해 봤습니다.

kernel에 USB Mass Storage support를 추가 한다.

     <*>   USB Mass Storage support   



그리고 system/vold/VolumeManager.cpp에 handleBlockEvent() 함수를 다음과 같이 수정합니다.


bool usb_storage_mounted = false;
bool second_netlinkevent = false;


void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {
    const char *devpath = evt->findParam("DEVPATH");

    /* Lookup a volume to handle this device */
    VolumeCollection::iterator it;
    bool hit = false;
    for (it = mVolumes->begin(); it != mVolumes->end(); ++it) {
        if (!(*it)->handleBlockEvent(evt)) {
#ifdef NETLINK_DEBUG
            SLOGD("Device '%s' event handled by volume %s\n", devpath, (*it)->getLabel());
#endif
            hit = true;
            break;
        }
    }

    if (!hit) {
#ifdef NETLINK_DEBUG
        SLOGW("No volumes handled block event for '%s'", devpath);
#endif


        if (second_netlinkevent) {
            second_netlinkevent = false;
            return;
        }

        char *usb_mass_node = "/devices/platform/s5p-ehci/usb";
        if (usb_storage_mounted) {
            umount("/mnt/sdcard/external_storage");
            usb_storage_mounted = false;
            SLOGE("unmounted USB Mass Storage");
        } else {
            int len = strlen(usb_mass_node);
            if (strncmp(devpath, usb_mass_node, len) == 0) {
                usleep(5000);
                if (Fat::doMount("/dev/block/sda1", "/mnt/sdcard/external_storage", false, false, false,
                 1000, 1015, 0702, true)) {
                    SLOGE("%s failed to mount via VFAT (%s)\n", devpath, strerror(errno));
                } else {
                    SLOGE("mounted USB Mass Storage");
                    usb_storage_mounted = true;
                }
            } else {
                SLOGE("not USB Mass Storage");
            }
        }

        second_netlinkevent = true;
    }

코드를 조금 설명 드리면 USB Mass는 event가 두번 발생하여 second_netlinkevent를 통해 한번만 처리되도록 하였습니다.

usleep은 event가 발생시점에는 node가 없을 수 있기 때문에 대기 하였다 mount 시킵니다.

devpath가 "/devices/platform/s5p-ehci/usb" 까지 동일하고 usb1,2,3... 이렇게 증가 하기 때문에 여기까지 같다면 usb mass storage 장치가 연결된 걸로 처리 합니다.

물론 init.rc에 external_storage 노드를 처리하여야 합니다.

 40 # create mountpoints
 41     mkdir /mnt 0775 root system
 42     mkdir /mnt/sdcard 0000 system system
 43     mkdir /mnt/sdcard/external_storage 0000 system system
 44 
 45 # Create cgroup mount point for cpu accounting
 46     mkdir /acct
 47     mount cgroup none /acct cpuacct
 48     mkdir /acct/uid
 49 
 50 # Backwards Compat - XXX: Going away in G*
 51     symlink /mnt/sdcard /sdcard
 52     symlink /mnt/sdcard/external_storage /sdcard1

그리고 vold에서 external_storage를 만드는 코드를 추가 합니다.

int CommandListener::VolumeCmd::runCommand(SocketClient *cli,
                                                      int argc, char **argv) {
    dumpArgs(argc, argv, -1);

    if (argc < 2) {
        cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing Argument", false);
        return 0;
    }

    VolumeManager *vm = VolumeManager::Instance();
    int rc = 0;

    if (!strcmp(argv[1], "list")) {
        return vm->listVolumes(cli);
    } else if (!strcmp(argv[1], "debug")) {
        if (argc != 3 || (argc == 3 && (strcmp(argv[2], "off") && strcmp(argv[2], "on")))) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume debug ", false);
            return 0;
        }
        vm->setDebug(!strcmp(argv[2], "on") ? true : false);
    } else if (!strcmp(argv[1], "mount")) {
        if (argc != 3) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume mount ", false);
            return 0;
        }
        rc = vm->mountVolume(argv[2]);
        //codewalker
        mkdir("/mnt/sdcard/external_storage", 0777);
    } else if (!strcmp(argv[1], "unmount")) {
        if (argc < 3 || argc > 4 || (argc == 4 && strcmp(argv[3], "force"))) {
            cli->sendMsg(ResponseCode::CommandSyntaxError, "Usage: volume unmount [force]", false);
            return 0;
        }

        bool force = false;
        if (argc >= 4 && !strcmp(argv[3], "force")) {



이렇게 하면 Media Scan이 안되는 문제와 UMS가 안되는 문제가 있습니다.
Astro FileManager 같은데서 직접 폴더를 열어서 사용하는 상황에 맞겠죠.

그리고 여럿 예외 처리가 필요할 걸로 판단됩니다.