Android/Android&Kernel2009/04/15 15:05
[출처 : Korea Android]
안녕하세요.. 재호아빠에요..
 
매번 잘 몰라서 질문만하고 삽질만 하다가... 다른분들에게 도움이 되고자 글을 써봅니다..
 
얼마전에 새롭게 branch된 cupcake가 update되었더군요...
Android repository에서 받아서 compile해서 target에 올려보았습니다. (저는 12/23일 날짜로 받았습니다.)
 
자세한 내용은 http://source.android.com/roadmap/cupcake 참고하시면 될것 같습니다.
 
* 제가 파악한 바로는 기존 r1대비 main 수정사항은 
   1. x86 / armv4t 지원
   2. virtual keyboard (softkeyboard)
   3. 여러가지 버그 수정..
   4. 갤러리에서 동영상도 직접 플레이가능하군요..
     더 많은것 같은데.하나하나 파악해보고 보고 있는 중입니다.
 
 
* r1포팅하면서 다른점은.......
 
1. dpi정보를 정확하게 줘야되더군요.. 화면의 icon이나 글자가 dpi에 정확하게 연동되던것 같습니다. 저같은경우
    걍 compile했더니 아이콘하고 글자가 너무 작게 나오더군요..    (r1에는 그렇지 않던데..)
   - frameworks/base/libs/surfacefilling/displayhardware/displayhardware.cpp 에 보시면
     void DisplayHardware::init(uint32_t dpy) 에서 mDpiX,mDpiY 값을 사용하시는 LCD의 res와 mm size정보가
     정확히 반영된 dpi값이 들어가는지 확인하셔야 합니다.(저는 정확하게 안들어가길래 여기서 일단 제가 강제로
     계산된 dpi값을 줬습니다) 
 
2. 기존 r1에서 잘나오던 audio가 안나오는군요.. r1과 다른게 있나본데 살펴보는중입니다.
   - /dev/eac의 node가 default로 만들어지지 않는듯..
 
3. adb가 개선되어서 그런지 r1에서 DDMS 접속이 불안했었는데 아주 잘 붙네요,,
 
4. toolbox가 개선된듯.. init / logcat후에  shell # 진입시 별 문제없이 control이 전 잘되는군요.
 
5. key들은 안되지만 google 검색입력창이나 브라우저에서 keyboard없이 버추얼키보드가 되네요..개인적으로
   맘에 듭니다..
 
6. old upcake버젼을 가지고 compile할때는 몇가지 에러가 나서 patch해야된다고 하네요(구글그룹스,,)
   제가 작업한 12/23일 이후꺼면 아무 문제없이 compile되는것 같습니다.
 
7. 동영상 play하기위해 API demo를 이용했었는데.. 갤러리에서 바로 mmc에 있는 동영상화일이 parsing되고
   화면크기에 따라 회전도 자동으로 되면서 전체 화면에 fitting이 되는군요...
 
 
 
 
DDMS로 target과 연동해서 일단 화면을 아래와 같이 capture 해보았습니다. 
 
     
 
 
    
Posted by mirwing
Android/Android&Kernel2009/04/15 15:03
[출처 : Korea Android]


Posted by mirwing
Android/Android&Kernel2009/04/15 14:57
출처 : Korea Android]
Compile Kernel with Android Patches Browse git 
1- Clone beagle kernel with android patches :-
    $git clone git://source.mvista.com/git/linux-omap-2.6-historic.git
    $cd linux-omap-2.6
    $git remote add labs.embinux git://labs.embinux.org/linux-omap-2.6
    $git remote update
    For 2.6.25 Kernel-
    $git checkout -b beagle.android labs.embinux/android
    For 2.6.27 Kernel-
    $git checkout -b beagle.android-2.6.27 labs.embinux/android-2.6.27
    $make ARCH=arm omap3_beagle_android_defconfig
    $make ARCH=arm CROSS_COMPILE=PATH_TO_CODE_SOURCERY_TOOL_CHAIN uImage

Compile Android Build 
1- Get Android build from  http://source.android.com/download
 Follow the instruction in above link to get source 

2- Apply tls & gl wrapper patch given below to Android build
TLS patch 
$cd  ~/android_build/bionic
$patch -p1 < ~/Tls.patch
 Tls.patch
GL_WRAPPER patch
$cd ~/android_build/frameworks/base
$patch -p1 < ~/Gl_wrapper.patch
 Gl_wrapper.patch

ALSA Support 
1- $cd ~
2- Clone alsa-lib from 
 $git clone git://android.git.kernel.org/platform/external/alsa-lib.git
3- Clone ALSA based libaudio
 $git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git
4- Apply following patches to build

Alsa_sound patch
$cd ~/alsa_sound
$patch -p1 < ~/Alsa_sound-v1.1.patch
 Alsa_sound.patch
5-Change directory to the root "android_build"
 $ cd ~/android_build
6- Add ALSA audio support to the board config file and comment out generic audio support.
$vim ~/android_build/build/target/board/generic/BoardConfig.mk
add BOARD_USES_ALSA_AUDIO := true 
#BOARD_USES_GENERIC_AUDIO := true
7- Copy ALSA support supporting code from steps 3 and 4 above
$cd ~/android_build
$cp -a ~/alsa-lib  external
$cp -a ~/alsa_sound hardware
8-Compile build
$cd ~/android_build
$make

Root file System of Android 
After compilation of build, root file system of android is generated at ~/android_build/out/target/product/generic
$cd  ~/android_build/out/target/product/generic
$mkdir ~/Android_rfs
$cp -a root/* ~/Android_rfs
$cp -a data/* ~/Android_rfs/data/
$cp -a system/* ~/ Android_rfs/system/
Apply patch to init.rc 
$cd ~/Android_rfs
$patch -p1 <  ~/Initrc.patch
 Initrc.patch
Apply qwerty.kl patch 
Apply this patch Android_rfs/system/usr/keylayout/qwerty.kl

$cd ~/Android_rfs/system/usr/keylayout
$path -p1 < Qwerty.patch
 Qwerty.patch
Key mapping is as follows 
Keyboard Key      Android Event
ESC               Back
Right Window      Menu 
Page up           Volume up
Page down         Volume down 
Left Window       Power 
Scroll lock       Explorer 
Right arrow       DPAD
Left arrow        DPAD left 
Up arrow          DPAD up 
Down arrow        DPAD down
Enter             Enter 
Home              Home
Tab               Tab

Along with above keys alphabetical characters & Digit keys(above qwerty keyboard) are mapped.

Ownership 
Do the following as either root or use sudo
$cd ~/Android_rfs
$chown -R root.root *
$chmod -R 777 data system
Boot Arguments of Beagle 
console=ttyS2,115200n8 root=/dev/nfs rw nfsroot=192.168.1.5:/data/target
ip=192.168.1.1::255.255.255.0 nolock,rsize=1024,wsize=1024 rootdelay=2
video=omapfb:mode:1280x720@50 init=/init
Boot the kernel on board with Android_rfs on nfs 
Once board is up you will find following new dir in Android_rfs
  /sqlite_stmt_journals
  /sdcard
  soft link of /etc to /system/etc
  /data/dalvik-cache 
  /data/anr 
  /data/app-private 
  /data/property
  /data/local 
  /data/misc 
If Android GUI dosen't appear on screen 
Execute logcat command to get all logs of all application running on Dalvik VM
Check here all .apk files are getting converted to .dex file inside /data/dalvik-cache
Play mp3 on Android 
$copy song.mp3 on your SD card partition1(/dev/mmcblk0p1), before inserting card into beagleboard.
$mount -t vfat /dev/mmcblk0p1 /sdcard
$setprop EXTERNAL_STORAGE_STATE mounted
$am broadcast -a android.intent.action.MEDIA_MOUNTED --ez read-only false -d  file:///sdcard
Start Network 
1-Connect eth0 interface to usb hub via ethernet to usb converter
2-Modify init.rc
#basic network init
setprop net.dns1 <primary-dns-server-ip> 


3-boot up board

4-Execute following commands from minicom
$netcfg eth0 up
$netcfg eth0 dhcp
Watch Android booting on Beagle 



 
Posted by mirwing
Android/Android&Kernel2009/04/15 14:44
[출처 : Korea Android]
한글로 작성해뒀던 Porting가이드 입니다.  아마 인베인님의 질문에 대한 답도 대충 포함되리라고 판단됩니다.
참고삼아서 2.6.10 kernel은 23과 diff를 해서 merge작업을 해 봤는데 양이 너무 많아서 gg치고 포기를 했습니다.
최소한 EABI가 지원되는 kernel이후에서 작업을 하는 것이 맞다고 판단됩니다.  

아래 내용은 작업자가 그냥 작업하면서 정리해뒀던 것으로 틀리는 것도 있을 수 있습니다~~

-----------

Porting guide ¶

  1. kernel config
    • CONFIG_AEABI=y : 필수. Android binary들이 EABI system call을 사용한다.
    • CONFIG_BINDER=y : 필수. Android에서 사용하는 IPC
    • CONFIG_LOW_MEMORY_KILLER=y : 필수? Android process 개수를 제한하는데 사용되는 것으로 추측 중..
    • CONFIG_INITRAMFS_SOURCE="" : Option.
    • CONFIG_CC_OPTIMIZE_FOR_SIZE=y : Option.
  2. device drivers
    • framebuffer
      • yres_virtual을 yres*2로 수정하고 mmap buffer를 할당하도록 수정.
      • 아마 Android graphic engine에서 double buffering(정확히는 double buffer changing??)에 사용하기 위해서 위와 같이 하는 것으로 추측.
    • touchscreen
      • Android Emulator는 Emulator에서 mouse 위치와 버튼 정보를 정확하게 event 장치에 넘겨 준다.
        반면에 touchscreen driver는 touch device 자체의 좌표를 넘겨준다.
        이 때문에 touch device driver에 좌표 보정 기능을 추가하고 calibration data를 sysfs를 통해서 입력받을 수 있게 기능을 추가했다.
    • keyboard
      • Android Emulator는 Emulator에서 key 입력을 위 touchscreen event 장치에 넘겨주면서, ESC key를 BACK key로 remapping 해주고 있다.
        이 때문에 keyboard device driver에서 ESC==>BACK key remapping을 하도록 수정했다.
  3. Android /system,/data
    • Board에는 Flash가 32MB가 내장되어 있다. 하지만, Android /system 용량만 해도 64MB로 저장이 불가능하다.
      이 때문에 /system,/data를 ext2 image로 만들고 외부 USB MemoryStick에 저장하여, lookback mounting을 이용하는 방법을 사용한다.
    • see> a-setup.sh
  4. Android executing scripts
    • /home/a-setup.sh
      • /init이 하는 일 중에 init script가 처리하지 않은 작업을 처리할 목적으로 만들어진 script.
      • 현재는 외부 USB MemoryStick에 저장된 /system, /data를 mount하는 작업만을 하고 있다.
    • /home/a-run.sh
      • Android를 실행하는 script. Android 실행을 위해서 PATH 등의 핵심 env var가 수정해야 하기 때문에 한번에 수행하는 script가 필요하게 됐다.
      • 첨부된 a-run.sh의 경우, Benno의 app_process/dbus-daemon/runtime 방식을 사용하여 실행했던 내용도 남아있다. 작업했던 내용을 남기기 위해서 제거하지 않았다.
      • /init(/init-modified)를 사용하는 경우에는 이 script가 굳이 필요하지 않다. /init 자체가 이런 설정을 모두 하기 때문이다.
  5. /init-modified
    • network 설정을 위해서 system property를 사용하기 위해서 Android /init을 실행한다.
      아래 내용에 따라 실행이 안되기 때문에 writable shared file을 tmpfs로 mount된 /tmp에 생성되도록 binary patch를 한다.
      /system_property ==> /tmp/sy_property
    • /init 실행이 실패하는 이유는 rootfs로 사용된 JFFS2의 특성 때문으로 파악된다. 이 file system은 writable shared file mmap을 지원하지 않는다고 한다.
      아마 Flash 기반의 fs이기 때문에 성능 하락을 우려하여 제한을 둔 것 같다..
  6. network configuration
    • 다음 property들을 설정한다.
      • net.eth0.dns1 = DNS
      • net.gprs.local-ip = LOCALIP
      • ro.radio.use-ppp = no
      • ro.config.nocheckin = yes
    • 스크립트와 수정 내용
      • init.rc
        • qemu-init.sh 실행을 제거하고 set_network.sh를 실행한다.<pre class="wiki">....
          ## qemu-init {
          ## exec /etc/qemu-init.sh
          ## }
          network-property {
          exec /etc/set_network.sh
          }
          ....
          </pre>
      • set_network.sh
        • 현재 IP 설정을 Android system property에 설정하는 script.<pre class="wiki">export PATH=/sbin:/bin:/usr/bin:/system/bin

          LOCALIP=`ifconfig|grep "inet addr" |head -1|sed -e "s/.*addr:([0-9.]*) .*/1/g"`
          DNSIP=`nslookup localhost|grep Address|head -1|sed -e "s/.* //g"`

          /system/bin/setprop net.eth0.dns1 $DNSIP
          /system/bin/setprop net.gprs.local-ip $LOCALIP
          /system/bin/setprop ro.radio.use-ppp no
          /system/bin/setprop ro.config.nocheckin yes
          </pre>
  7. file/directory permission
    • 다음 /dev들의 퍼미션이 모든 사용자 쓰기(a+w)여야 한다.
      • /dev/binder, /dev/fb0
    • 다음 directory들의 퍼미션이 모든 사용자 쓰기(a+w) 여야 한다.
      • /data, /tmp, /home
      • /dev 장치의 permission을 수정하기 위해서 /etc/udev/rules.d/50-udev.rules에서 수정해야 한다. 자세한 내용은 "man udev" 참고.
    • /init(/init-modified)가 실행되는 directory는 all-user writable permission(a+w)을 가지고 있어야 한다.
Posted by mirwing