[출처 : Korea Android]
한글로 작성해뒀던 Porting가이드 입니다. 아마 인베인님의 질문에 대한 답도 대충 포함되리라고 판단됩니다.
참고삼아서 2.6.10 kernel은 23과 diff를 해서 merge작업을 해 봤는데 양이 너무 많아서 gg치고 포기를 했습니다.
최소한 EABI가 지원되는 kernel이후에서 작업을 하는 것이 맞다고 판단됩니다.
아래 내용은 작업자가 그냥 작업하면서 정리해뒀던 것으로 틀리는 것도 있을 수 있습니다~~
-----------
참고삼아서 2.6.10 kernel은 23과 diff를 해서 merge작업을 해 봤는데 양이 너무 많아서 gg치고 포기를 했습니다.
최소한 EABI가 지원되는 kernel이후에서 작업을 하는 것이 맞다고 판단됩니다.
아래 내용은 작업자가 그냥 작업하면서 정리해뒀던 것으로 틀리는 것도 있을 수 있습니다~~
-----------
Porting guide ¶
- 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.
- 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를 통해서 입력받을 수 있게 기능을 추가했다.
- Android Emulator는 Emulator에서 mouse 위치와 버튼 정보를 정확하게 event 장치에 넘겨 준다.
- keyboard
- Android Emulator는 Emulator에서 key 입력을 위 touchscreen event 장치에 넘겨주면서, ESC key를 BACK key로 remapping 해주고 있다.
이 때문에 keyboard device driver에서 ESC==>BACK key remapping을 하도록 수정했다.
- Android Emulator는 Emulator에서 key 입력을 위 touchscreen event 장치에 넘겨주면서, ESC key를 BACK key로 remapping 해주고 있다.
- framebuffer
- Android /system,/data
- Board에는 Flash가 32MB가 내장되어 있다. 하지만, Android /system 용량만 해도 64MB로 저장이 불가능하다.
이 때문에 /system,/data를 ext2 image로 만들고 외부 USB MemoryStick에 저장하여, lookback mounting을 이용하는 방법을 사용한다. - see> a-setup.sh
- Board에는 Flash가 32MB가 내장되어 있다. 하지만, Android /system 용량만 해도 64MB로 저장이 불가능하다.
- 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 자체가 이런 설정을 모두 하기 때문이다.
- /home/a-setup.sh
- /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이기 때문에 성능 하락을 우려하여 제한을 둔 것 같다..
- network 설정을 위해서 system property를 사용하기 위해서 Android /init을 실행한다.
- 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>
- qemu-init.sh 실행을 제거하고 set_network.sh를 실행한다.<pre class="wiki">....
- 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>
- 현재 IP 설정을 Android system property에 설정하는 script.<pre class="wiki">export PATH=/sbin:/bin:/usr/bin:/system/bin
- init.rc
- 다음 property들을 설정한다.
- 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)을 가지고 있어야 한다.
- 다음 /dev들의 퍼미션이 모든 사용자 쓰기(a+w)여야 한다.
'Android > Android&Kernel' 카테고리의 다른 글
| Config 가이드 (for Android Cupcake 1.5 +) (0) | 2009/04/15 |
|---|---|
| 안드로이드 포팅 가이드 - kernel config (0) | 2009/04/15 |
| Android Porting Guide (0) | 2009/04/15 |
| Android Platform 분석 (0) | 2009/04/15 |
| Android - Invoke JNI based methods (Bridging C/C++ and Java) (0) | 2009/04/15 |
| 구글 안드로이드 - JNI : native binding to java (0) | 2009/04/15 |