2013년 11월 30일 토요일

Nexus.S takes KitKat

AOSP 4.4 KitKat + Nexus.S

이제는 좀 쉬게 해줘야 할 Nexus.S 에 "kitkat" 이라는 새로운 옷을 입혀주고 조금 더 같이 살자고 꼬셨습니다. :)
AOSP 공개된 이후 바로 입혔었는데, 정리를 못하고 지금까지 지냈습니다.


언제나 처럼 이전 버전에서 사용되었던 device/* 파일을 가져다 넣고 일단 컴파일합니다.

libhwcomposer 관련 type mis-match 에러가 발생합니다.
아래 github에서 libhwcomposer 관련 수정사항(ibhwcomposer / Update to API version 1.0 참조.)을 적용하면 처리됩니다.
- steven676 / android_device_samsung_crespo (https://github.com/steven676/android_device_samsung_crespo)

위 github의 소스를 그냥 사용하면 Dialer가 없어서 전화발신을 못합니다.
아래처럼 한 줄 수정해 주시면 Dialer 만날 수 있습니다.

device/samsug/crespo/full_crespo.mk
# Inherit from those products. Most specific first.
- $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
+ $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)

device/samsug/crespo/soju.mk
# Inherit from those products. Most specific first.
- $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
+ $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)


위 내용으로 일단 컴파일은 문제없이 진행되었으나,
EGL Error로 인해 부팅이 안되는 문제가 있더군요. ㅡ.ㅡ;;

EGL error.
  38 11-07 09:55:59.210 E/libEGL  (   89): eglQuerySurface:590 error 300d (EGL_BAD_SURFACE)
  39 11-07 09:55:59.210 E/libEGL  (   89): eglQuerySurface:590 error 300d (EGL_BAD_SURFACE)

EGL Error는 아래 4가지 patch 적용으로 해결이 가능합니다.
- 참조 : http://forum.xda-developers.com/showthread.php?p=47067391

steven676 / 0003-libEGL-also-work-around-Google-bug-10194508-on-S5PC1.patch
https://gist.github.com/steven676/7287471

------------------------------------------------
steven676 / 0004-libEGL-restore-SYSTEMUI_PBSIZE_HACK.patch
https://gist.github.com/steven676/7287482

------------------------------------------------
steven676 / 0001-SurfaceFlinger-try-dropping-features-from-EGL-config.patch
https://gist.github.com/steven676/7276901

------------------------------------------------
steven676 / 0002-Restore-support-for-glReadPixels-screenshot-path.patch
https://gist.github.com/steven676/7276913


cn.fyodor 에 의해 공개된 버전에서 발생하는 문제는 다 나타납니다.
AOSP plain 버전에 별다른 수정을 하지 않았으니 당연한 현상이죠.
렌더링 관련 문제는 수정을 해야 할텐데, 시간과 능력의 한계에 부딪혀 진행이 안되네요.
임시로 chrome browser 깔아서 꾸역~꾸역~ 사용하고 있습니다.


[ 참조 ]
XDA member cn.fyodor
[ROM][07-11-2013] AOSP KitKat 4.4 for Nexus S - alpha Build 2
- http://forum.xda-developers.com/showthread.php?t=2410844
- binary : http://pan.baidu.com/s/1Lkdy

libhwcomposer / Update to API version 1.0 참조.
steven676 / android_device_samsung_crespo
- https://github.com/steven676/android_device_samsung_crespo/tree/kitkat


2013년 11월 21일 목요일

[Android] Booting 시간 Debuging 하기

* BootChart 활용법

0. 사전 준비 - 리눅스 PC에 분석 툴 설치
    웹 혹은 첨부의 bootchart.jar 파일을 Linux BootChart Log 분석 폴더로 복사
    $ sudo apt-get install bootchart

1. Target Board에 Bootchart Log 저장을 위한 소스 수정.
    ./android/system/core/init/bootchart.h
    #define BOOTCHART 1//로 수정.

2. Build
   $ export INIT_BOOTCHART=true <== Build PC 환경 변수 설정 후 Full Build

3. Target Board Bootchart Log 저장을 위한 환경 설정.
   - Target Board 부팅 후
    $ adb shell
    # mkdir /data/bootchart
    # echo 120 > /data/bootchart-start <== Polling Time 설정.

4. Target Board 재부팅 후 Bootchart Log 확보
    $ adb shell
    # echo 1 > /data/bootchart-stop <= Bootchart stop
    $ adb pull /data/bootchart ./Linux_PC_LogPath

5. Linux_PC_LogPath bootchart.png 생성
    $ tar czf bootchart.tgz *
    $ java -jar bootchart.jar ./bootchart.tgz
   ==> bootchart.png 생성 됨

Process별로 CPU 사용정보 및 I/O 정보 확인

* Kernel initcall Debuging

./kernel/init/main.c
int initcall_debug = 1; // 0 -> 1변경 후 빌드
==> Booting 시 전체 initcall section별로 호출되는 함수 및 소요 시간 정보 아래와 같이 출력됩니다.

callingcpu_stop_init+0x0/0xcc @ 1 <== 호출되는 시점.
initcall cpu_stop_init+0x0/0xcc returned 0 after 19531 usecs <== 소요 시간

2013년 11월 16일 토요일

[Android] Android.mk 디버깅 로그 출력하기.

Android MK 파일 디버깅 로그.

$(warning ######  my debug start)

출력은 이렇게..

Makefile:3: ######  my debug start

[Android] Property를 이용한 Log Level 조절로 Log 출력하기.

Property를 이용한 Log Level 조절로 Log 출력하기.


- 형식
#setprop log.tag.<log_tag> <level>


- 예제
public class SQLiteQueryBuilder
{
    private static final String TAG = "SQLiteQueryBuilder";

        if (Log.isLoggable(TAG, Log.DEBUG)) {
            Log.d(TAG, "Performing query: " + sql);
        }
}

위와 같은 경우, Log.isLoggable 을 확인해 보면,
log.tag."TAG" 값이 DEBUG 이상이면 동작한다.
ex) adb shell setprop log.tag.SQLiteQueryBuilder DEBUG


Framework Log.javapublic final class Log {
    /**
     * Priority constant for the println method; use Log.v.
     */
    public static final int VERBOSE = 2;
    /**
     * Priority constant for the println method; use Log.d.
     */
    public static final int DEBUG = 3;
    /**
     * Priority constant for the println method; use Log.i.
     */
    public static final int INFO = 4;
    /**
     * Priority constant for the println method; use Log.w.
     */
    public static final int WARN = 5;
    /**
     * Priority constant for the println method; use Log.e.
     */
    public static final int ERROR = 6;
    /**
     * Priority constant for the println method.
     */
    public static final int ASSERT = 7;
}

Native android_util_log.cppstruct levels_t {
    jint verbose;
    jint debug;
    jint info;
    jint warn;
    jint error;
    jint assert;
};

static levels_t levels;
static int toLevel(const char* value)
{
    switch (value[0]) {
        case 'V': return levels.verbose;
        case 'D': return levels.debug;
        case 'I': return levels.info;
        case 'W': return levels.warn;
        case 'E': return levels.error;
        case 'A': return levels.assert;
        case 'S': return -1; // SUPPRESS
    }
    return levels.info;
}

int register_android_util_Log(JNIEnv* env)
{
    jclass clazz = env->FindClass("android/util/Log");
    if (clazz == NULL) {
        LOGE("Can't find android/util/Log");
        return -1;
    }
 
    levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
    levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
    levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
    levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
    levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
    levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));
             
    return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
}

2013년 11월 14일 목요일

[Android] Ubuntu 12.04 LTS 설치

오래전 메모해 두었던 내용들을 한곳으로 모아서 정리합니다.

Android 개발과는 조금 무관한 Linux 서버 설정방법에 대한 내용입니다.
가끔 새로 setup 해야 하는데 머리속 지우개가 점점 커지는 관계로...

Android 개발환경관련 내용은 Android Open Source Project 를 참조하는 것이 가장 좋은 것 같습니다.

=====================================================

1. OS

- Ubuntu 12.04 LTS

2. Network 설정 

  • Network Interface

      $ sudo vi /etc/network/interfaces
       auto lo
       iface lo inet loopback
       auto eth0
       iface eth0 inet static
       address 192.168.1.81
       netmask 255.255.255.0
       network 192.168.1.0
       broadcast 192.168.1.255
       gateway 192.168.1.1

  • DNS 서버 설정

      Ubuntu 12.04에서는 /etc/resolve.conf 가 아닌 /etc/resolvconf/resolv.conf.d/head 파일을 수정해 주셔야 합니다. /etc/resolve.conf 에 작성해 두신 내용은 reboot 하시면 사라집니다. (참조 : http://www.stgraber.org/2012/02/24/dns-in-ubuntu-12-04/)


      Ubuntu 12.04
      $ sudo vi /etc/resolvconf/resolv.conf.d/head
         # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
         # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
         nameserver 168.126.63.1
         nameserver 168.126.63.2

      Ubunut 12.04 이전 버전      $ vi /etc/resolv.conf
         nameserver 168.126.63.1
         nameserver 168.126.63.3

3. Tools 설치.


  • Windows 환경과 병행해서 사용해야 하므로 ssh 및 samba 설정을 합니다.
      $ sudo apt-get install xinetd ssh smbfs samba nfs-kernel-server dhcp3-server

    samba 설정
      $ sudo vi /etc/samba/smb.conf
        [soma]
           comment = soma's Samba Directory.
           path = /home3/soma
           writable = yes
           guest ok = no
           browseable = yes
           create mask = 0644
           directory mask = 0755

    samba password 추가
      $ sudo smbpasswd -a soma

    samba daemon restart
      $ sudo /etc/init.d/smbd restart


  • 기타 utils 
      vi 유틸리티 설치.
      $ sudo apt-get install vim cscope ctags tree libqt3-mt

      svn client : ubuntu 12.04 이후 버전에서는 subversion 1.7 이상의 버전이 필요함.
      - http://sisbsoma.blogspot.kr/2013/07/svn-error-svnmalformed-network-data.html

4. Toolchain (arm-eabi04.6)설치


  • export ARCH=arm
  • export CROSS_COMPILE=/opt/toolchains/arm-eabi-4.6/bin/arm-eabi-
  • PATH="./:$PATH:/sbin:/opt:/opt/p4v-dir/bin:/usr/lib/jvm/java-6-sun/bin:$HOME/android-sdks/platform-tools/:$HOME/android-sdks/tools/"


[Android] Installing Sun JDK6 - Ubuntu 12.04 64bit

How to install Sun JDK 6

Android 개발환경을 위한 JDK6 설치했던 방법을 정리합니다.- OS : 64bit Ubuntu 12.04 LTS


Installing Sun JDK 6 Update on Ubuntu 12.04
  1. Download the jdk-6u32-linux-i586.bin from the Sun Java Download Centre. If you are on 64-bit Ubuntu, you should grab jdk-6u32-linux-x64.bin.
  2. Make the bin file executable:
    1chmod +x jdk-6u32-linux-x64.bin
  3. Extract the bin file:
    1./jdk-6u32-linux-x64.bin
  4. Move extracted folder to this location:
    1sudo mv jdk1.6.0_32 /usr/lib/jvm/
  5. Install the new Java source in system:
    1sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_32/bin/javac 1
    2sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_32/bin/java 1
    3sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_32/bin/javaws 1
  6. Choose default Java:
    1sudo update-alternatives --config javac
    2sudo update-alternatives --config java
    3sudo update-alternatives --config javaws
  7. Check the Java version:
    1java -version
  8. Verify the symlinks all point to the new Java location:
    1ls -la /etc/alternatives/java*