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