· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Android Porting On Real Target/ko


1. Introduction


±¸±ÛÀº ¾Èµå·ÎÀ̵尡 ¿î¿µÃ¼Á¦, ¹Ìµé¿þ¾î ±×¸®°í Áß¿ä ÇÁ·Î±×·¥À» Æ÷ÇÔÇÏ´Â ÀÓº£µðµå µð¹ÙÀ̽º¸¦ À§ÇÑ ¼ÒÇÁÆ®¿þ¾î ½ºÅÃÀ̶ó°í ¼³¸íÇÕ´Ï´Ù. ÀÌ ¹®¼­´Â ±¸±Û ¾Èµå·ÎÀÌµå ¾ÆÅ°ÅØó¿¡ ´ëÇØ ¼³¸íÇÏ°í ½ÇÁ¦ Çϵå¿þ¾î¿¡ Æ÷ÆÃÇÏ´Â ÀýÂ÷¸¦ ¼³¸íÇÕ´Ï´Ù. ¼³¸íÀº ¾Èµå·ÎÀÌµå ¿¡¹Ä·¹ÀÌÅÍÀÇ m3 SDK ¹öÀü¿¡ ±âÃÊÇؼ­ ¼³¸íÇÕ´Ï´Ù.

¿©·¯ºÐÀÌ Ä¿³Î ÆÐÄ¡, ÆÐÄ¡ÀÇ °ÅºÎ ÇØ°á, ·¥µð½ºÅ© À̹ÌÁö ¸¸µé±â, ¸®´ª½º Ä¿³Î ÀÚü¿¡ ´ëÇÑ ÃæºÐÇÑ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù¸é ÀÌ ¾ÆƼŬÀº ½¬¿ï °ÍÀÔ´Ï´Ù.

2. Copyright and Acknowledgements


ÀÌ ¹®¼­ÀÇ ¼ÒÀ¯±ÇÀº Kwangwoo Lee <Kwangwoo.lee@gmailREMOVETHIS.com> ¿¡°Ô ÀÖ½À´Ï´Ù. ÀÌ ¹®¼­¿¡ ´ëÇÑ º¹»ç, ¹èÆ÷, ¼öÁ¤¿¡ ´ëÇÑ ±Ç¸®´Â GNU Free Documentation License ¸¦ µû¸¨´Ï´Ù.

¹ø¿ªÀº ¾çÁ¤¼®(dasomoli@gmailREMOVETHIS.com) ÀÌ ÇÏ¿´½À´Ï´Ù¸¸, ÀÌ»óÇÑ °÷ÀÌ ÀÖ´Ù¸é °¡Â÷¾øÀÌ ¼öÁ¤ÇØ ÁÖ¼¼¿ä. :) ¿ø¹® : http://wiki.kldp.org/wiki.php/AndroidPortingOnRealTarget

3. ¾Èµå·ÎÀÌµå ¾ÆÅ°ÅØóÀÇ ¿ä¾à ºÐ¼®


3.1. ¾Èµå·ÎÀ̵å Ä¿³Î


¾Èµå·ÎÀ̵å Ä¿³ÎÀÇ °¡Àå Å« Â÷ÀÌÁ¡Àº ARM EABI(Embedded Application Binary Interface)¿Í OpenBinder IPC(Inter Process Communication)¸¦ »ç¿ëÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿©·¯ºÐÀÌ ARM EABI¸¦ Áö¿øÇÏ´Â Ä¿³ÎÀ» ÄÄÆÄÀÏÇÏ·Á¸é, ARM EABI¸¦ Áö¿øÇϱâ À§ÇÑ ÅøüÀÎ(toolchains)À» »õ·Î ºôµåÇÏ¿©¾ß ÇÕ´Ï´Ù.

¾Èµå·ÎÀ̵å SDK´Â Qemu¸¦ »ç¿ëÇÏ¿© goldfish ¾ÆÅ°ÅØó¸¦ ¿¡¹Ä·¹À̼ÇÇÕ´Ï´Ù. alsa´Â ¾Èµå·ÎÀ̵åÀÇ ¿Àµð¿À¸¦ À§Çؼ­ »ç¿ëµË´Ï´Ù. goldfish ¾ÆÅ°ÅØó µð·ºÅ丮ÀÇ audio.c ÆÄÀÏÀ» º¸°í, µå¶óÀ̹ö´Â ¾Èµå·ÎÀÌµå ½Ã½ºÅÛ »óÀÇ ¿Àµð¿À¸¦ À§ÇÑ /dev/eac¸¦ »ç¿ëÇÕ´Ï´Ù. ¶ÇÇÑ RTC(Real Time Clock) ÀåÄ¡´Â /dev/rtc0¸¦ ÅëÇØ »ç¿ëµË´Ï´Ù.

´ÙÀ½ ÆÄÆ®µéÀº ÁÖµÈ Â÷ÀÌÁ¡À» ¼³¸íÇÕ´Ï´Ù:

3.1.1. ARM EABI


EABI´Â ARM»ç(ARM Ltd.)¿¡ ÀÇÇÑ »õ·Î¿î "ÀÓº£µðµå" ABIÀÔ´Ï´Ù. ±× Â÷ÀÌ´Â µ¥ºñ¾È À§Å°¿¡ Á¤¸®µÇ¾î ÀÖ½À´Ï´Ù.

  • FPU¸¦ ¾²°Å³ª ¾²Áö ¾Ê´Â, ºü¸¥ ½Ç¼ö ¿¬»ê(floating point) ¼º´É
  • soft ¿Í hardfloat ÄÚµåÀÇ È¥¿ë °¡´É
  • ÀÌÀü¿¡ »ç¿ëµÇ¾îÁö´ø °Í°ú °°ÀÌ ±¸Á¶Ã¼ ÆÑÅ·(packing)ÀÌ °íÅ뽺·´Áö ¾Ê½À´Ï´Ù.
  • ´Ù¸¥ Åøµé°úÀÇ ´õ ³ªÀº ȣȯ¼º(compatibility)
  • ´õ È¿À²ÀûÀÎ syscall °ü·Ê(convention). (http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=3105/4)

long ftruncate64(unsigned int fd, loff_t length); ÀÇ ¿¹:

±âÁ¸ ABI:
- put fd into r0 (fd¸¦ r0·Î ³ÖÀ½)
- put length into r1-r2 (±æÀ̸¦ r1-r2·Î ³ÖÀ½)
- Ä¿³Î È£ÃâÀ» À§Çؼ­ "swi #(0x900000 + 194)" »ç¿ë.

»õ·Î¿î ARM EABI:
- put fd into r0 (fd¸¦ r0·Î ³ÖÀ½)
- put length into r2-r3 (skipping over r1) (±æÀ̸¦ r2-r3·Î ³ÖÀ½. r1Àº ¹«½Ã)
- put 194 into r7 (194¸¦ r7·Î ³ÖÀ½)
- use "swi 0" to call the kernel (Ä¿³ÎÀ» È£ÃâÇϱâ À§Çؼ­ "swi 0" »ç¿ë)

¾Èµå·ÎÀ̵å´Â EABI Ä¿³Î ±â´ÉÀ» »ç¿ëÇÕ´Ï´Ù. CONFIG_AEABI ¿Í CONFIG_OABI_COMPATÀÇ Ä¿³Î ¿É¼ÇÀ» È°¼ºÈ­ Çϼ¼¿ä. ¿©·¯ºÐÀº ´ÙÀ½°ú °°Àº ½ÇÇà ¹ÙÀ̳ʸ®ÀÇ Â÷À̸¦ º¼ ¼ö ÀÖ½À´Ï´Ù:

  • ±âÁ¸ ABI
$ arm-softfloat-linux-gnu-objdump -x t7-demo | grep private
private flags = 202: [APCS-32] [FPA float format] [software FP] [has entry point]

$ file t7-demo
t7-demo: ELF 32-bit LSB executable, ARM, version 1 (ARM), 
for GNU/Linux 2.4.3, dynamically linked (uses shared libs), 
for GNU/Linux 2.4.3, stripped

  • ARM EABI
$ arm-softfloat-linux-gnueabi-objdump -x t7-demo  | grep private
private flags = 4000002: [Version4 EABI] [has entry point]

$ file t7-demo
t7-demo: ELF 32-bit LSB executable, ARM, version 1 (SYSV), 
for GNU/Linux 2.6.14, dynamically linked (uses shared libs), 
for GNU/Linux 2.6.14, stripped


ARM ¾ÆÅ°ÅØó¸¦ À§ÇÑ ABI°¡ ¹«¾ùÀΰ¡¿ä? ARM EABI¿Í °°Àº °Ç°¡¿ä?

ARM ¾ÆÅ°ÅØóÀÇ ABI´Â ARM¿Í (CodeSourcery¸¦ Æ÷ÇÔÇÏ´Â) ±× ÆÄÆ®³Êµé¿¡ ÀÇÇØ °³¹ßµÈ ¾î¶»°Ô ÄÄÆÄÀÏ·¯¿Í ¾î¼Àºí·¯¿Í ¸µÄ¿¿Í ´Ù¸¥ ºñ½ÁÇÑ ÅøµéÀÌ Object ÆÄÀÏ°ú ½ÇÇà ÆÄÀÏÀ» »ý¼ºÇؾ߸¸ ÇÏ´ÂÁö¸¦ ¼³¸íÇϴ ǥÁØÀÔ´Ï´Ù. ARM ¾ÆÅ°ÅØóÀÇ ABI¸¦ Á¤È®È÷ ±¸ÇöÇÑ ÅøµéÀº »óÈ£ ¿î¿ë(interoperate)µÉ ¼ö ÀÖ½À´Ï´Ù:¿¹¸¦ µé¸é, ´Ù¸¥ ÅøüÀο¡¼­ ºôµåµÈ Object ÆÄÀÏ°ú ¶Ç ´Ù¸¥ ÅøüÀο¡¼­ ºôµåµÈ ObjectÆÄÀÏÀÌ ¾ç ÂÊÀÇ ÄÄÆÄÀÏ·¯°¡ ARM ¾ÆÅ°ÅØóÀÇ ABI¸¦ »ç¿ëÇÑ´Ù¸é ÇÔ²² ÇÕÃÄÁú ¼ö ÀÖ½À´Ï´Ù. "ARM EABI"´Â ARM ¾ÆÅ°ÅØó ABIÀÇ ¶Ç´Ù¸¥ À̸§ÀÔ´Ï´Ù.

3.1.2. OpenBinder


OpenBinder´Â °´Ã¼ÁöÇâ(object-oriented) ¿î¿µÃ¼Á¦ ȯ°æÀ» Á¦°øÇÕ´Ï´Ù. ÀüÅëÀûÀÎ Ä¿³Î¿¡ È£½ºÆÃ(to be hosted)µÇ¾îÁöµµ·Ï ¼³°èµÇ¾ú½À´Ï´Ù. ÀÌ ÇÁ·ÎÁ§Æ®´Â BeOS ´ÙÀ½¹ø »ý¼ºÀÇ ÀϺηΠBe. Inc¿¡¼­ ½ÃÀ۵Ǿú°í, Cobalt ½Ã½ºÅÛÀÇ ÄÚ¾î ºÎºÐÀ¸·Î PalmSource¿¡ ±¸ÇöÀÌ ¿Ï·áµÇ¾ú½À´Ï´Ù. ±× °ÍÀº ½Ã½ºÅÛÀÌ Application¿¡ ÁöÇ⺸´Ù´Â ÄÄÆ÷³ÍÆ® ¾ÆÅ°ÅØó¿¡ ÁöÇâÀûÀÌ°í, ÇÁ·Î¼¼½º °£ÀÇ IPC, ½º·¹µåÇ®, ¸Þ¸ð¸® °ü¸®¿Í Ŭ¸° ¾÷(clean up) ±â´ÉÀ» ¹ÙÀδõ ObejctÀÇ ÂüÁ¶ÀÇ ³¡¿¡¼­ Á¦°øÇÕ´Ï´Ù. ¹Ù´Ò¶ó(vanilla) Ä¿³ÎÀº OpenBinder IPC ¸ÞÄ«´ÏÁòÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¹Ç·Î, ¿©·¯ºÐÀº Ä¿³Î¿¡ ÆÐÄ¡ÇÏ¿©¾ß ÇÕ´Ï´Ù. OpenBinder´Â ½Ã½ºÅÛÀÇ ½º·¹µå °ü¸®¸¦ /dev/binder¸¦ ÅëÇؼ­ Á¦°øÇÕ´Ï´Ù. ±× °ÍÀÌ ¾Èµå·ÎÀ̵尡 ½º·¹µå ¶óÀ̺귯¸®¸¦ Á¦°øÇÏÁö ¾Ê´Â ÀÌÀ¯ÀÔ´Ï´Ù.

Ä¿³Î ÆÐÄ¡ ÈÄ¿¡, ¿©·¯ºÐÀº /drivers/binder/¿¡¼­ ¹ÙÀδõ¸¦ À§ÇÑ ÆÄÀÏÀ» º¼ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

3.1.3. ÇÁ·¹ÀÓ ¹öÆÛ


±âº»ÀûÀÎ ÇÁ·¹ÀÓ ¹öÆÛ µå¶óÀ̹ö´Â ÀÌ¹Ì ±¸ÇöµÇ¾îÁ® ÀÖ¾î¾ß¸¸ ÇÕ´Ï´Ù. ±× ÈÄ¿¡ ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ ¾ÆÅ°ÅØó µå¶óÀ̹ö¿Í goldfish µå¶óÀ̹ö °£ÀÇ Â÷À̸¦ ±¸ÇöÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù.

goldfish ¾ÆÅ°ÅØóÀÇ ÇÁ·¹ÀÓ ¹öÆÛ µå¶óÀ̹ö´Â struct fp_opsÀÇ fb_pan_display ÇÔ¼ö¸¦ Áö¿øÇÕ´Ï´Ù. ±× °ÍÀº ½ÇÁ¦ ÇÁ·¹ÀÓ Å©±âº¸´Ù µÎ ¹èÀÇ ¸Þ¸ð¸®°¡ ÇÒ´çµÇ¾î¾ß ÇÔÀ» ÀǹÌÇÕ´Ï´Ù.

  • ÇÁ·¹ÀÓ ¹öÆÛ Á¤º¸ ÃʱâÈ­
struct fb_info *fbinfo;
...
fbinfo->fix.ypanstep	= 1;
fbinfo->var.yres_virtual    = gm->lcd.yres * 2;
fbinfo->fix.smem_len        =	(gm->lcd.xres *
                                gm->lcd.yres *
                                gm->lcd.bpp / 8) * 2;

  • ÇÁ·¹ÀÓ ¹öÆÛ ¸Þ¸ð¸® ÇÒ´ç
struct mvfb_info *fbi;
...
fbi->map_size = PAGE_ALIGN(fbi->fb->fix.smem_len + PAGE_SIZE);
fbi->map_cpu  = dma_alloc_writecombine(fbi->dev, fbi->map_size,
                                       &fbi->map_dma, GFP_KERNEL);

  • fb_pan_display ÇÔ¼ö ÈÄÅ· ±¸Çö
static int mvfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fb)
{
...
}

static struct fb_ops mvfb_ops = {
        .owner		= THIS_MODULE,

        .fb_check_var	= mvfb_check_var,
        .fb_set_par	= mvfb_set_par,	
        .fb_setcolreg	= mvfb_setcolreg,
        .fb_blank	= mvfb_blank,
        .fb_pan_display = mvfb_pan_display,

        .fb_fillrect	= cfb_fillrect,
        .fb_copyarea	= cfb_copyarea,
        .fb_imageblit	= cfb_imageblit,

        .fb_mmap	= mvfb_mmap,	
};

±× µð¹ÙÀ̽º ÆÄÀÏÀº /dev/graphics/fb0¿¡ À§Ä¡ÇØ ÀÖ½À´Ï´Ù.

3.1.4. ÀÔ·Â ÀåÄ¡


¾Èµå·ÎÀ̵å´Â »ç¿ëÀÚ ÀÔ·ÂÀ» À§ÇÑ À̺¥Æ® µð¹ÙÀ̽º¸¦ »ç¿ëÇÕ´Ï´Ù. °Å±â¿¡´Â Å°Æеå¿Í ÄõƼ2(qwerty2) Å°º¸µå¿Í ¸¶¿ì½º¿Í °°Àº ¼¼°¡Áö µð¹ÙÀ̽º°¡ ÀÖ½À´Ï´Ù. ÄõƼ2(qwerty2) Å°º¸µå¿Í ¸¶¿ì½º´Â º¸Åë µð¹ÙÀ̽ºÀÔ´Ï´Ù. ±×·¡¼­ ¸¶¿ì½º µð¹ÙÀ̽º¸¦ ´ëüÇÏ´Â Å°Æеå¿Í ÅÍÄ¡½ºÅ©¸°À» ¼³¸íÇÏ°Ú½À´Ï´Ù.

¾Èµå·ÎÀÌµå ½©¿¡¼­ /proc/bus/input/{devices,handlers}¸¦ cat Çϸé, ¾Èµå·ÎÀ̵忡¼­ »ç¿ëµÇ´Â µð¹ÙÀ̽ºµéÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.
$ adb shell

# cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="goldfish-events-keyboard"
P: Phys=
S: Sysfs=/class/inut/input0
U: Uniq=
H: Handlers=kbd mouse0 event0
...
#
# cat /proc/bus/input/handlers
N: Number=0 Name=kbd
N: Number=1 Name=mousedev Minor=32
N: Number=2 Name=evdev Minor=64
#

  • Å°Æеå
Qemu´Â goldfish-events-keyboard¸¦ ¿¡¹Ä·¹ÀÌÆ®ÇÕ´Ï´Ù. ±× °ÍÀº À̺¥Æ® µð¹ÙÀ̽º(/dev/input/event0)¸¦ »ç¿ëÇÏ´Â Å°ÆеåÀÔ´Ï´Ù. ±×·¡¼­ ¿©·¯ºÐÀº À̺¥Æ® µð¹ÙÀ̽º·ÎºÎÅÍ ½ÇÁ¦ È°¼ºÈ­µÈ ¾Èµå·ÎÀ̵å ÇÁ·Î±×·¥À¸·Î Àü´ÞµÇ¾îÁö´Â Å° À̺¥Æ®ÀÇ Á¾·ù¿Í °ªÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ±×·¸°Ô Çϱâ À§Çؼ­ event0 µð¹ÙÀ̽º¸¦ catÀ¸·Î Àаí ÆÄÀÏ·Î ±× Ãâ·ÂÀ» ÀçÁöÁ¤(redirect)ÇÕ´Ï´Ù. ¸¸¾à ¿¡¹Ä·¹ÀÌÅÍ »óÀÇ Å° ¹öÆ°ÀÌ ´­¸®°í ¶¼¾îÁö¸é ±× Ãâ·Â °ªÀÌ ÀúÀåµÉ °ÍÀÔ´Ï´Ù.

±× Ãâ·Â Çü½ÄÀº input_event ±¸Á¶Ã¼ ÀÔ´Ï´Ù. ±×·¡¼­ °¢ eventÀÇ Ãâ·ÂÀº ½Ã°£À» À§ÇÑ 8 ¹ÙÀÌÆ®, ŸÀÔÀ» À§ÇÑ 2 ¹ÙÀÌÆ®, Äڵ带 À§ÇÑ 2 ¹ÙÀÌÆ®, °ªÀ» À§ÇÑ 4¹ÙÀÌÆ®·Î ÃÑ 16 ¹ÙÀÌÆ®ÀÔ´Ï´Ù. ¸®´ª½º Ä¿³Î ¼Ò½º ÄÚµåÀÇ Documentation/input µð·ºÅ丮ÀÇ ÀÔ·Â À̺¥Æ® µð¹ÙÀ̽º(input event device)¿¡ °üÇÑ input.txt¸¦ Àаí, input-programming.txt¸¦ ÀÐÀ¸¼¼¿ä.
struct input_event {
        struct timeval time;
        unsigned short type;
        unsigned short code;
        unsigned int value;
};

Tiger7 °³¹ß º¸µå´Â ±× °íÀ¯ÀÇ scancode Å×À̺íÀ» °¡Áý´Ï´Ù. ´ÙÀ½Àº °³¹ßº¸µåÀÇ Å° ·¹À̾ƿô°ú scancode Å×À̺í°ú ¾Èµå·ÎÀ̵å Å° Äڵ带 º¸ÀÔ´Ï´Ù:
/*
 *  Key Layout       Scancode Table
 *
 *   1  2  3        0x1  0x10  0x100
 *   4  5  6        0x2  0x20  0x200
 *   7  8  9        0x4  0x40  0x400
 *   *  0  #        0x8  0x80  0x800
 */

static unsigned short android_keycode[] = {
        /*
         *  0x66 0x67 0x9e	Home  Up   Back
         *  0x69 0xe8 0x6a	Left  Ok   Right
         *  0xe7 0x6c 0x6b	Send  Down Hangup
         *  0xe5		Menu       just_distinction_for_private
         */
        KEY_HOME,         KEY_UP,       KEY_BACK,
        KEY_LEFT,         KEY_REPLY,    KEY_RIGHT,
        KEY_SEND,         KEY_DOWN,     KEY_END,
        KEY_KBDILLUMDOWN, KEY_RESERVED, KEY_PLAY
};

¿¡¹Ä·¹ÀÌÅÍ¿¡´Â Àü¿ø(power) ¹öÆ°ÀÌ ÀÖ½À´Ï´Ù. ±×·¯³ª Ãâ·Â °ªÀ» ¾ò±â À§Çؼ­ ¹«½ÃÇß½À´Ï´Ù.

Å°ÆеåÀÇ ÀÎÅÍ·´Æ®°¡ °¨Áö(caught)µÇ¸é À§ Å×À̺íÀÇ ¾Èµå·ÎÀ̵åÀÇ Å° ÄÚµå·Î scancode¸¦ º¯È¯ÇÏ°í »ç¿ëÀÚ °ø°£(user space) ÇÁ·Î±×·¥À¸·Î À̺¥Æ®¸¦ º¸³À´Ï´Ù.
...
keycode = translate_keycode(scancode);
...
input_event(keydev->input, EV_KEY, keycode, KEY_PRESSED);
or
input_event(keydev->input, EV_KEY, keycode, KEY_RELEASED);
...

°íÁ¤¹Ðµµ ŸÀÌ¸Ó - hrtimer´Â Å°Æеå debounce¸¦ ÁÙÀ̱â À§Çؼ­ »ç¿ëµÇ¾ú½À´Ï´Ù.

  • ÅÍÄ¡ ½ºÅ©¸°

Æ÷ÀÎÆà µð¹ÙÀ̽º¸¦ À§ÇÑ À̺¥Æ® ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏ´Â ÅÍÄ¡½ºÅ©¸° µå¶óÀ̹ö¸¦ °®°í ÀÖ´Ù¸é, Àß µ¿ÀÛÇÒ °ÍÀÔ´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é, ´Ù¸¥ Æ÷ÀÎÆà µð¹ÙÀ̽º¸¦ »ç¿ëÇϰųª ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. ´ÙÇེ·´°Ôµµ °³¹ßº¸µå´Â ÀÌ¹Ì ¾Èµå·ÎÀ̵å Æ÷ÆÃÀ» ½ÃÀÛÇϱâ Àü¿¡ ¸¸µé¾îÁø ÅÍÄ¡½ºÅ©¸° µå¶óÀ̹ö - drivers/input/touchscreen/tsc2007.c -°¡ ±¸ÇöµÇ¾î ÀÖ¾ú½À´Ï´Ù. ¿©·¯ºÐ °íÀ¯ÀÇ µå¶óÀ̹ö¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â drivers/input/touchscreen/ ÀÇ µå¶óÀ̹ö¿Í Documentation/input/ÀÇ ÅؽºÆ® ÆÄÀÏÀ» Âü°íÇϼ¼¿ä.
¿©±â °³¹ß º¸µå »óÀÇ /proc/bus/input/{devices,handlers}ÀÇ Ãâ·ÂÀÌ ÀÖ½À´Ï´Ù.
# cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="MVT7 KEYPAD"
P: Phys=
S: Sysfs=/class/input/input0
U: Uniq=
H: Handlers=kbd event0 evbug
B: EV=f
...

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="TSC2007 Touchscreen"
P: Phys=0-0090/input0
S: Sysfs=/class/input/input1
U: Uniq=
H: Handlers=event1 evbug
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

# cat /proc/bus/input/handlers
N: Number=0 Name=kbd
N: Number=1 Name=evdev Minor=64
N: Number=2 Name=evbug

°á°ú¿¡¼­ º¸´Â °Í°ú °°ÀÌ, ÇÁ·Î±×·¥ °èÃþ(application layer)¿¡¼­ Å°Æеå´Â /dev/input/event0¸¦ »ç¿ëÇÏ°í, ÅÍÄ¡½ºÅ©¸° ÀÎÅÍÆäÀ̽º´Â /dev/input/event1¸¦ »ç¿ëÇÕ´Ï´Ù.

3.1.5. Low Memory Killer


¸®´ª½º Ä¿³ÎÀº ÇÁ·Î¼¼½ºÀÇ ¿äûÀ» À§ÇÑ ÇÒ´çÀ» À§Çؼ­ ³²Àº ¸Þ¸ð¸®°¡ ¾ø´Â »óȲÀ» À§ÇÑ OOM(Out of Memory) ų·¯¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. ±× °ÍÀº ¸ðµç ÇÁ·Î¼¼½º¸¦ ½ÃÇèÇÏ°í ¾î¶² Á¦¾àÀ¸·Î Á¡¼ö¸¦ ¸Å±é´Ï´Ù. ÃÖ°í Á¡¼öÀÇ initÀ» Á¦¿ÜÇÑ ÇÁ·Î¼¼½º´Â Á׿©Áý´Ï´Ù.

¾Èµå·ÎÀ̵åÀÇ Low Memory Killer´Â OOM ų·¯¿Í ¾à°£ ´Ù¸¨´Ï´Ù. ±× °ÍÀº ±×·ìÀÇ Á߿伺¿¡ µû¶ó ÇÁ·Î¼¼½º¸¦ ºÐ·ùÇÏ°í °¡Àå ³·Àº ±×·ìÀÇ ÇÁ·Î¼¼½º¸¦ Á×ÀÔ´Ï´Ù. ±× °ÍÀº ½Ã½ºÅÛÀ» ÃÖÁ¾ »ç¿ëÀÚ(end user) °üÁ¡¿¡¼­ ¾ÈÁ¤ÀûÀÌ°Ô ¸¸µì´Ï´Ù. ¿¹¸¦ µé¸é, UI ÇÁ·Î¼¼½º - foreground process -´Â ÃÖÁ¾ »ç¿ëÀÚ¿¡°Ô °¡Àå Áß¿äÇÑ ÇÁ·Î¼¼½ºÀÔ´Ï´Ù. ±×·¡¼­ ÇÁ·Î¼¼½º¸¦ ÁöÅ°´Â °ÍÀº ´Ù¸¥ background ÇÁ·Î¼¼½ºÀÇ »îÀ» ÁöÅ°´Â °Íº¸´Ù ´õ ¾ÈÁ¤ÀûÀ¸·Î º¸ÀÌ´Â °ÍÀ» »ì¸³´Ï´Ù.

Ä¿³Î ÆÐÄ¡ ÈÄ¿¡ CONFIG_LOW_MEMORY_KILLER ¸¦ È°¼ºÈ­Çϼ¼¿ä.

3.1.6. ¾Èµå·ÎÀÌµå ·Î°Å(Android Logger)


¿©·¯ºÐÀÌ ÀÌ ±â´ÉÀ» È°¼ºÈ­Çϸé /dev/log/main¸¦ ÅëÇØ ¾Èµå·ÎÀ̵忡 °üÇÑ À¯¿ëÇÑ Á¤º¸¸¦ º¼ ¼ö ÀÖ½À´Ï´Ù. main, events, radio °°Àº /dev/log »óÀÇ ¼¼°¡Áö µð¹ÙÀ̽º ÆÄÀÏÀÌ ÀÖ½À´Ï´Ù. /dev/log/radio ÆÄÀÏÀº ¾Èµå·ÎÀÌµå ½Ã½ºÅÛ »óÀÇ ¸ðµ©°ú ril µ¥¸ó - rild - ¿¡ °ü·ÃµÈ °ÍÀ» º¸¿©ÁÝ´Ï´Ù.

ÀÌ ·Î°Å¸¦ È°¼ºÈ­ÇÒ¶§, ½Ã½ºÅÛ ¼º´ÉÀº ½Ã½ºÅÛ »ó¿¡¼­ ¾à°£ ´À·ÁÁý´Ï´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇϱâ À§Çؼ­ CONFIG_ANDROID_LOGGER¸¦ È°¼ºÈ­Çϼ¼¿ä.

3.1.7. ¾Èµå·ÎÀ̵å ÆÄ¿ö(Android power)


¾Èµå·ÎÀ̵å ÆÄ¿ö´Â µð¹ÙÀ̽º »óÀÇ ¹èÅ͸® °ü¸®°ú Àü¿ø °ü¸®¿¡ °ü·ÃµÈ ÆÄÀÏ ½Ã½ºÅÛ »óÀÇ inotify ±â´É°ú °°Àº ¼­ºê½Ã½ºÅÛÀ» À§ÇÑ °ÍÀÔ´Ï´Ù. ±× °ÍÀº ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀÇ init ¹ÙÀ̳ʸ®¸¦ ÅëÇØ ¾Èµå·ÎÀ̵带 ½ÃÀÛÇϱâ À§Çؼ­ ÇÊ¿äÇÕ´Ï´Ù. ±×·¯³ª runtime ¹ÙÀ̳ʸ®´Â ¾Èµå·ÎÀ̵åÀÇ ¼öµ¿ ½ÃÀÛ »ó¿¡¼­ ¾Èµå·ÎÀ̵å ÆÄ¿ö¿¡ µû¸£´Â ¾î¶² ÆÄÀÏ - /sys/android_power/acruire_partial_wake_lock - À» ã°í ½ÃÀÛ¿¡ ½ÇÆÐÇÕ´Ï´Ù. »ç¿ëÇϱâ À§Çؼ­´Â CONFIG_ANDROID_POWER ¿É¼ÇÀ» È°¼ºÈ­½ÃÅ°¼¼¿ä.

3.1.8. Panic Timeout


°³¹ß º¸µå »óÀÇ ¾Èµå·ÎÀÌµå ½ÃÀÛÀ» À§Çؼ­ ÇÊ¿ä¾ø½À´Ï´Ù. CONFIG_PANIC_TIMEOUT ¸¦ ¿øÇÏ´Â °ªÀ¸·Î ¼³Á¤Çϼ¼¿ä.

3.2. ¾Èµå·ÎÀÌµå ·çÆ® ÆÄÀÏ ½Ã½ºÅÛ


¾Èµå·ÎÀÌµå ¿¡¹Ä·¹ÀÌÅÍ´Â tools/lib/imagesµð·ºÅ丮 »ó¿¡ 3°³ÀÇ ±âº» À̹ÌÁö¸¦ °¡Áý´Ï´Ù.

  • ramdisk.img
  • system.img
  • userdata.img

ramdisk.img Àº gzipÀ¸·Î ¾ÐÃàµÈ cpio ÆÄÀÏÀÔ´Ï´Ù. ·¥µð½ºÅ© À̹ÌÁö´Â ¸Å¿ì ÀÛ°í, ¼³Á¤ ÆÄÀÏ°ú init°ú recovery °°Àº ½ÇÇàÆÄÀÏÀ» Æ÷ÇÔÇÕ´Ï´Ù. init ÆÄÀÏÀº Á¤½Ä System V initÀº ¾Æ´Õ´Ï´Ù. ±× °ÍÀº ¾Èµå·ÎÀ̵带 À§ÇØ ¸¸µé¾îÁ³°í, ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀ» ½ÃÀÛÇϱâ À§ÇÑ Æ¯º°ÇÑ °ÍÀ» ¼öÇàÇÕ´Ï´Ù.

system.img ¿Í userdata.img ´Â VMS Alpha ½ÇÇàÆÄÀÏÀÔ´Ï´Ù. system.img¿Í userdata.img ´Â ·çÆ® ÆÄÀÏ ½Ã½ºÅÛ »óÀÇ /system °ú /data µð·ºÅ丮ÀÇ ³»¿ëÀ» °¡Áý´Ï´Ù. ±×µéÀº NAND µð¹ÙÀ̽º »ó¿¡ yaffs2 ÆÄÀÏ ½Ã½ºÅÛÀ¸·Î ¸ÊÇεǾî ÀÖ½À´Ï´Ù. /dev/block/mtdblock0 ´Â /system ÀÌ°í, /dev/block/mtdblock1 Àº /data ÀÔ´Ï´Ù.

/system µð·ºÅ丮´Â ¶óÀ̺귯¸®¿Í ±âº» ½Ã½ºÅÛ ÆÐÅ°Áö(*.apk)¸¦ °¡Áö°í ÀÖ½À´Ï´Ù. /data µð·ºÅ丮´Â ŸÀÓÁ¸, ij½¬, ApiDemos.apk ÆÐÅ°Áö¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

ÁÖ ¼­ºñ½º´Â zygote(/system/bin/app_process), runtime(/system/bin/runtime), ±×¸®°í dbus(/system/bin/dbus-daemon) ÀÔ´Ï´Ù. ¿©·¯ºÐÀº ¾Èµå·ÎÀÌµå ·¥µð½ºÅ© »óÀÇ /etc/init.rc ÆÄÀÏÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

...
zygote {
    exec /system/bin/app_process
    args {
        0 -Xzygote
        1 /system/bin
        2 --zygote
    }
    autostart 1
}
runtime {
    exec /system/bin/runtime
    autostart 1
}
...
dbus {
    exec /system/bin/dbus-daemon
    args.0 --system
    args.1 --nofork
    autostart 1
}
...

3.3. ¾Èµå·ÎÀ̵å ÆÐÅ°ÁöÀÇ ¶óÀ̼¾½º


tools/lib/images/NOTICE ´Â ÆÐÅ°Áö ¸®½ºÆ®¿Í °¢ ¶óÀ̺귯¸®ÀÇ ¶óÀ̼¾½º¸¦ Æ÷ÇÔÇÏ°í ÀÖ½À´Ï´Ù. ¶óÀ̼¾½º Ç¥´Â 2008 Korea Android Summit¿¡¼­ ÀÓ±Ù½Ä ¾¾ÀÇ ¹ßÇ¥·ÎºÎÅÍ °Ô½ÃµÇ¾ú½À´Ï´Ù.

Open Source License
Linux Kernel GPL
NetBSD C Library BSD
DBUS GPL2
OpenBinder (core) GPL2
YAFFS2 GPL
SQLite GPL2
Webkit BSD (including LGPL)
WebCore LGPL
SDL LGPL
SGL Google(Skia)
OpenGL SGI OpenGL (BSD/MPL)


4. ARM EABI¸¦ Áö¿øÇÏ´Â ÅøüÀÎ


ÅøüÀÎÀº ½Ã½ºÅÛ °³¹ß¿¡ »ç¿ëµÇ¾îÁö´Â ÅøµéÀ» ¸»ÇÕ´Ï´Ù. C/C++ ÄÄÆÄÀÏ·¯, ¸µÄ¿, ¶óÀ̺귯¸®, binutils¿Í ±âŸ ´Ù¸¥ °ÍµéÀ» Æ÷ÇÔÇÕ´Ï´Ù. ¾Èµå·ÎÀ̵å Ä¿³Î°ú ½Ã½ºÅÛÀº EABI Áö¿øÀ» ÇÊ¿ä·Î ÇÕ´Ï´Ù. ±×·¡¼­ ±âÁ¸ ÅøüÀÎÀº ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀ» ¸¸µå´Âµ¥ ȣȯµÇÁö ¾Ê½À´Ï´Ù.

4.1. ÅøüÀÎ ºôµåÇϱâ


´õ ½±°Ô »îÀ» »ì±â À§Çؼ­, Dan Kegel¿¡ ÀÇÇÑ crosstool-0.43 ½ºÅ©¸³Æ®(http://www.kegel.com/crosstool/ )¸¦ »ç¿ëÇß½À´Ï´Ù. ºÒÇàÈ÷µµ ±× °ÍÀº eabi ÅøüÀÎÀ» ºôµåÇϱâ À§ÇÑ Áö¿øÀ» ÇÏÁö ¾Ê½À´Ï´Ù. ±×·¡¼­ Khem RajÀÇ a glibc 2.5+ nptl build for arm softfloat eabi patch (http://sources.redhat.com/ml/crossgcc/2006-12/msg00076.html )¸¦ Àû¿ëÇß½À´Ï´Ù.
$./arm-softfloat-eabi.sh

³×Æ®¿öÅ©°¡ ¿¬°áµÇ¾î ÀÖ´Ù¸é, ½ºÅ©¸³Æ®°¡ gcc 4.1.1 °ú glibc 2.5À» »ç¿ëÇؼ­ ÅøüÀÎÀ» ´Ù¿î·ÎµåÇÏ°í ºôµåÇØ ÁÙ °Ì´Ï´Ù.

4.2. ´Ù¸¥ ÅøüÀÎ


Codesourcery ÅøüÀÎÀ» »ç¿ëÇÏÁö ¾Ê¾Ò½À´Ï´Ù¸¸, ±×µéÀº ±× °ÍÀÌ ¾Èµå·ÎÀÌµå ½Ã½ºÅÛ ºôµå¸¦ À§Çؼ­ Àß µ¿ÀÛÇÒ °ÍÀ̶ó°í ¸»ÇÏ°í ÀÖ½À´Ï´Ù.


5. Ä¿³Î


½ÇÁ¦ Çϵå¿þ¾î »ó¿¡ ¾Èµå·ÎÀ̵带 Æ÷ÆÃÇÏ´Â °ÍÀº Benno (http://benno.id.au )¿¡ ÀÇÇؼ­ ½ÃÀ۵Ǿú½À´Ï´Ù. ¿©·¯ºÐÀº ±×ÀÇ ºí·Î±×¿¡¼­ À¯¿ëÇÑ Á¤º¸¸¦ º¼ ¼ö ÀÖ½À´Ï´Ù. ±×ÀÇ ºí·Î±×´Â pre-compiled static binaries¸¦ ¸µÅ©ÇÕ´Ï´Ù. ±×°ÍÀº ¾Èµå·ÎÀÌµå ½Ã½ºÅÛ µð¹ö±ë¿¡ ¸Å¿ì À¯¿ëÇÕ´Ï´Ù. ¿©·¯ºÐ ¿ª½Ã, static build busybox¿Í strace ¹ÙÀ̳ʸ®¸¦ ºôµåÇÒ ¼ö ÀÖÁö¸¸, °®´Ù ¾²´Â °Ô ´õ ÁÁÀ» °Ì´Ï´Ù.

¿©·¯ºÐÀº ¾Èµå·ÎÀ̵å Ä¿³Î°ú ¹Ù´Ò¶ó Ä¿³Î 2.6.23 ¹öÀü »çÀÌÀÇ Â÷À̸¦ Æ÷ÇÔÇÑ ÆÐÄ¡ ÆÄÀÏÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ±× °ÍÀº ±×°Íµé »çÀÌÀÇ ¸ðµç Â÷À̸¦ °¡Áý´Ï´Ù. ±×·¡¼­ ¿©·¯ºÐÀº ±×°ÍµéÀÇ ÀϺθ¦ ÃßÃâÇÒ ÇÊ¿ä°¡ ÀÖ°í, ¿©·¯ºÐÀÇ ½Ã½ºÅÛ ¾ÆÅ°ÅØó¸¦ À§ÇÑ ¿©·¯ºÐ °íÀ¯ÀÇ ÆÐÄ¡¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

¿¹¸¦ µé¸é, ¾Èµå·ÎÀ̵å Ä¿³ÎÀº ±× °íÀ¯ÀÇ yaffs ÆÄÀÏ ½Ã½ºÅÛ ÆÐÄ¡¸¦ °¡Áý´Ï´Ù. ¿©·¯ºÐÀÇ ¾ÆÅ°ÅØó»ó¿¡¼­ ¿©·¯ºÐ °íÀ¯ÀÇ yaffs ³ª jffs2 °°Àº ¾î¶² ´Ù¸¥ ÆÄÀÏ ½Ã½ºÅÛÀ» °¡Áø´Ù¸é, yaffs ÆÐÄ¡ÀÇ ÀϺθ¦ Á¦°ÅÇØ¾ß ÇÕ´Ï´Ù. ¾Èµå·ÎÀ̵å Ä¿³ÎÀÌ ¿¡¹Ä·¹ÀÌÆ®ÇÏ´Â qemu »óÀÇ ARM ¾ÆÅ°ÅØóÀÇ goldfish ¾ÆÅ°ÅØó´Â ¿©·¯ºÐÀÇ ¾ÆÅ°ÅØóÀÇ ÀϺΰ¡ µÉ ÇÊ¿ä°¡ ¾ø½À´Ï´Ù. Á¦°Å µÉ ¼ö ÀÖ½À´Ï´Ù.

¾Èµå·ÎÀ̵å Ä¿³ÎÀº ARMv5 ¸í·ÉÀ» ¿¡¹Ä·¹ÀÌÆ®ÇÕ´Ï´Ù. ±×·¡¼­ ARM926EJ-S (ARMv5TEJ)´Â ÀÛ¾÷Çϱ⠸ſì ÁÁÀ» °Ì´Ï´Ù.

5.1. Ä¿³Î ÆÐÄ¡


Benno ´Â openmokoÀÇ NEO1973 µð¹ÙÀ̽º·Î ÀÛ¾÷Çß½À´Ï´Ù. ±×·¡¼­ ±×´Â ±× °ÍÀ» À§ÇÑ ÆÐÄ¡ ÆÄÀÏÀ» ¸¸µé¾ú½À´Ï´Ù. http://benno.id.au/blog/2007/11/21/android-neo1973 ¿¡¼­ ¿øº» ÆÐÄ¡ ÆÄÀÏÀ» ¾ò°í, android.diff¸¦ »ç¿ëÇß½À´Ï´Ù. ±× °ÍÀº goldfish, qemu, yaffs ±×¸®°í ¾Èµå·ÎÀ̵忡 ƯÁ¤ÀûÀÎ ºÎºÐ¿¡ °üÇÑ ÀüºÎ¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

¿©·¯ºÐÀº Á÷Á¢ ÆÐÄ¡ ÆÄÀÏÀ» ÆíÁýÇÏ°í Á¦°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. goldfish¿Í qemu¿¡ ƯÁ¤ÀûÀÎ ºÎºÐÀ» Á¦¿ÜÇÑ binder, ¾Èµå·ÎÀ̵å ÆÄ¿ö, ¾Èµå·ÎÀÌµå ·Î°Å, low memory ų·¯¸¦ Æ÷ÇÔÇÏ´Â ÆÐÄ¡¸¦ ¸¸µç ÈÄ¿¡ ¹Ù´Ò¶ó ¸®´ª½º Ä¿³Î 2.6.23À» ¾ò°í, ±× °É·Î ÆÐÄ¡Çϼ¼¿ä.

¿©·¯ºÐÀÌ 2.6.24.1 ¹öÀü ¸®´ª½º Ä¿³ÎÀ» »ç¿ëÇÑ´Ù¸é ¾Èµå·ÎÀ̵å ÆÄ¿ö¿¡ °ü·ÃµÈ ºÎºÐÀÌ µ¿ÀÛÀ» À§Çؼ­ ºñÈ°¼ºÈ­ µÇ°Å³ª ÀûÀýÈ÷ °íÃÄÁ®¾ß ÇÕ´Ï´Ù.

5.2. .config


  • ÇʼöÀûÀÎ ºÎºÐ
...
CONFIG_PANIC_TIMEOUT=0
CONFIG_AEABI=y
CONFIG_OABI_COMPAT=y
CONFIG_BINDER=y
CONFIG_LOW_MEMORY_KILLER=y
...

  • ÇÊ¿ä¿¡ µû¸¥ ºÎºÐ
...
# CONFIG_ANDROID_GADGET is not set
# CONFIG_ANDROID_RAM_CONSOLE is not set
# CONFIG_ANDROID_POWER is not set
# CONFIG_ANDROID_LOGGER is not set
...

6. ·çÆ® ÆÄÀÏ ½Ã½ºÅÛ


·çÆ® ÆÄÀÏ ½Ã½ºÅÛÀº ·¥ »óÀÇ ±âº» ·¥µð½ºÅ© À̹ÌÁö, NAND dev0 (/dev/block/mtdblock0) ±×¸®°í, NAND dev1 (/dev/block/mtdblock1)ÀÇ ÀÚ·á À̹ÌÁö, ¼¼°¡Áö ºÎºÐÀ¸·Î Á¦À۵Ǿî ÀÖ½À´Ï´Ù. MTD µð¹ÙÀ̽º´Â yaffs2 ÆÄÀÏ ½Ã½ºÅÛÀ» °¡Áö°í °¢°¢Àº ¾Èµå·ÎÀÌµå ¿¡¹Ä·¹ÀÌÅÍ »ó¿¡¼­ 64MiB ¿ë·®À» °¡Áý´Ï´Ù.

ÃßÃâµÈ system °ú data µð·ºÅ丮´Â ½ÇÁ¦ Á¸ÀçÇÏ´Â NAND µð¹ÙÀ̽º »ó¿¡ º¹»çµÇ¾ú°í, ±×µéÀº ½ÇÁ¦ Çϵå¿þ¾î¿¡¼­ µ¿ÀÛ½ÃÅ°±â À§Çؼ­ --bind ¿É¼ÇÀ¸·Î ¸¶¿îÆ®µÇ¾îÁ³½À´Ï´Ù.

6.1. ¿¡¹Ä·¹ÀÌÅÍ¿¡¼­ ·¥µð½ºÅ© À̹ÌÁö ¾ò±â


1. tools/lib/images/ramdisk.img¿¡¼­ ramdisk À̹ÌÁö¸¦ unpack
$ gzip -cd ramdisk.img > ramdisk
$ cpio -iv -F ramdisk

cpio ´Â ÇöÀç ÀÛ¾÷ÁßÀÎ µð·ºÅ丮»ó¿¡ ÆÄÀÏ°ú µð·ºÅ丮¸¦ Ǭ´Ù.

2. ·¥µð½ºÅ©ÀÇ ³»¿ë ¸ñ·Ï

data
dev
etc
etc/default.prop
etc/firmware
etc/firmware/brf6150.bin
etc/firmware/brf6300.bin
etc/hcid.conf
etc/hosts
etc/init.gprs-pppd
etc/init.rc
etc/init.ril
etc/init.testmenu
etc/ppp
etc/ppp/chap-secrets
etc/ppp/ip-down
etc/ppp/ip-up
etc/qemu-init.sh
etc/system.conf
etc/system.d
etc/system.d/bluez-hcid.conf
etc/usbd.conf
init
proc
sbin
sbin/recovery
sys
system
tmp
var
var/run

6.2. ¿¡¹Ä·¹ÀÌÅÍ¿¡¼­ data¿Í system µð·ºÅ丮 ¾ò±â



data¿Í system µð·ºÅ丮¸¦ ¾ò±â À§Çؼ­ ¿©·¯ºÐÀº busybox ¹ÙÀ̳ʸ®¸¦ static ÄÄÆÄÀÏÇÏ¿©¾ß ÇÕ´Ï´Ù. ÄÄÆÄÀÏµÈ ¹ÙÀ̳ʸ®´Â http://benno.id.au/blog/2007/11/14/android-busybox ¿¡¼­ ¾ò°Å³ª, ¿©·¯ºÐ °íÀ¯ÀÇ ¹ÙÀ̳ʸ®¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

1. ¾Èµå·ÎÀÌµå ¿¡¹Ä·¹ÀÌÅ͸¦ ½ÇÇà½ÃÅ°¼¼¿ä.

2. ¿¡¹Ä·¹ÀÌÅÍ ¾È¿¡ static ÄÄÆÄÀÏµÈ busybox¸¦ ³ÖÀ¸¼¼¿ä.
# adb push busybox .

3. ¾Èµå·ÎÀÌµå ½©À» ½ÇÇà½ÃÅ°¼¼¿ä.
# adb shell

4. busybox·Î tarballÀ» ¸¸µå¼¼¿ä.
# chmod +x /busybox
# busybox tar -c /data.tar /data
# busybox tar -c /system.tar /system
# exit

5. ¿¡¹Ä·¹ÀÌÅÍ¿¡¼­ tarballÀ» ÃßÃâÇϼ¼¿ä.
# adb pull /data.tar .
# adb pull /system.tar .

ÃßÃâ ¸í·ÉÀº Á¾Á¾ ½ÇÆÐÇÕ´Ï´Ù. ¼º°øÀûÀ¸·Î µÉ ¶§±îÁö °è¼Ó ½ÇÇàÇϼ¼¿ä.

6.3. Á¸ÀçÇÏ´Â ·¥µð½ºÅ© À̹ÌÁö·Î ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀ» ÅëÇÕÇϱâ


¿©·¯ºÐÀÇ ¾ÆÅ°ÅØóÀÇ ·¥µð½ºÅ©´Â ¿©·¯ºÐÀÇ ÀÛ¾÷À» Á¶±Ý ´õ ½±°Ô ¸¸µì´Ï´Ù. system°ú data µð·ºÅ丮¸¦ Á¦¿ÜÇÑ ¾Èµå·ÎÀÌµå ·¥µð½ºÅ©ÀÇ ³»¿ëÀ» ¿©·¯ºÐ °íÀ¯ÀÇ ·¥µð½ºÅ©·Î º¹»çÇϼ¼¿ä. ±×¸®°í ±×³É system°ú data µð·ºÅ丮ÀÇ ¸¶¿îÆ® ÁöÁ¡À» ¸¸µå¼¼¿ä. ¸¶¿îÆ® ÁöÁ¡Àº ³ªÁß¿¡ bind ¿É¼ÇÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ¾Èµå·ÎÀÌµå ·¥µð½ºÅ© À̹ÌÁöÀÇ init ¹ÙÀ̳ʸ®´Â ½Ã½ºÅÛÀ» ½ÃÀÛÇϱâ À§ÇÑ Áß¿ä ¹ÙÀ̳ʸ®ÀÌ°í, ±×°ÍÀº /etc/init.rc ÆÄÀÏ »ó¿¡¼­ ¼³Á¤ ÆÄÀÏÀ» ÀнÀ´Ï´Ù.

/etc/init.rc¸¦ ÆíÁýÇÏ°í qemu ºÎºÐÀ» ÁÖ¼®À¸·Î ¸¸µå¼¼¿ä.
...
startup {
        ...
#       qemu-init {
#           exec /etc/qemu-init.sh
#       }
}
...

run.sh ½ºÅ©¸³Æ®¸¦ ¸¸µå¼¼¿ä. /dev/block/mtdblock5´Â ½ÇÁ¦ NAND µð¹ÙÀ̽ºÀÇ mtd ÆÄƼ¼ÇÀÌ°í, ±× °ÍÀº /mnt »ó¿¡ ¸¶¿îÆ®µÇ¾î Áý´Ï´Ù. data¿Í system µð·ºÅ丮´Â ÀÌ¹Ì mtdblock5 »ó¿¡ º¹»çµÇ¾îÁ® ÀÖ½À´Ï´Ù. ±×·¡¼­ ±× ½ºÅ©¸³Æ®´Â ¾Æ·¡¿Í °°ÀÌ / »óÀÇ °¢ µð·ºÅ丮ÀÇ ¹ÙÀÎµå ¸¶¿îÆÃ(bind mounting)À» º¸ÀÔ´Ï´Ù. ¿©·¯ºÐÀÇ º¸µå ¼³Á¤¿¡ µû¶ó ½ºÅ©¸³Æ®¸¦ °íÄ¡¼¼¿ä.
#!/bin/sh
mount -t yaffs /dev/block/mtdblock5 /mnt
mount --bind /mnt/data   /data
mount --bind /mnt/system /system

# data folder is owned by system user on emulator. Fix 777 to other.
chmod 777 /data
#chmod 777 /system

export PATH=/system/sbin:/system/bin:/sbin/usr/local/bin
export LD_LIBRARY_PATH=/system/lib

export ANDROID_BOOTLOGO=1
export ANDROID_ROOT=/system
export ANDROID_ASSETS=/system/app
export EXTERNAL_STORAGE=/sdcard
export ANDROID_DATA=/data
export DRM_CONTENT=/data/drm/content

/init &

ÅÍÄ¡½ºÅ©¸°À» À§ÇÑ ÇÊ¿ä¿¡ µû¸¥ ¼³Á¤ - TSLib.
...
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts

export LD_PRELOAD=/lib/libts.so:/lib/ts/pthres.so
...

6.4. System °ú data µð·ºÅ丮


system °ú data µð·ºÅ丮ÀÇ ³»¿ëÀº ÀÌ¹Ì mtdblock5¿¡ ÀÌ¹Ì º¹»çµÇ¾îÁ® ÀÖ½À´Ï´Ù. ¿©·¯ºÐÀº ¿©·¯ºÐ °íÀ¯ÀÇ ¹æ¹ýÀ¸·Î º¹»çÇÏ¼Å¾ß ÇÕ´Ï´Ù. ±×°ÍÀ» »ç¿ëÇϱâ À§Çؼ­ Àú´Â ·çÆ® µð·ºÅ丮»ó¿¡ ¹ÙÀÎµå ¸¶¿îÆÃ(bind mounting)À» ¼±ÅÃÇß½À´Ï´Ù. ¹ÙÀÎµå ¸¶¿îÆÃÀº ÀÌ¹Ì Á¸ÀçÇÏ´Â µð·ºÅ丮¸¦ »õ·Î¿î ¸¶¿îÆ® Æ÷ÀÎÆ®·Î ¸¶¿îÆ®ÇÏ´Â ±â¼úÀÔ´Ï´Ù.

6.5. ½ÇÇà°ú µð¹ö±×


ÀÌÁ¦ Ä¿³Î°ú ·¥µð½ºÅ©¿Í ÀÚ·á µð·ºÅ丮 - data¿Í system -ÀÌ ÁغñµÇ¾ú½À´Ï´Ù. »¡°£ »çÀÏ·± ´«À» º¼ ½Ã°£ÀÔ´Ï´Ù. ¿©·¯ºÐÀÇ ÅëÇÕµÈ ½Ã½ºÅÛÀ» ºÎÆÃÇÏ°í ³ª¼­ run.sh¸¦ ·çÆ® µð·ºÅ丮¿¡¼­ ½ÇÇàÇϼ¼¿ä.
# cd /
# . /android/run.sh
yaffs: dev is 32505861 name is "mtdblock5"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.5, "mtdblock5"
yaffs: auto selecting yaffs2
# init: HOW ARE YOU GENTLEMEN
init: reading config file
init: device init
init: mtd partition -1,
init: mtd partition 0, "l1boot"
init: mtd partition 1, "u-boot"
init: mtd partition 2, "params"
init: mtd partition 3, "kernel"
init: mtd partition 4, "ramdisk"
init: mtd partition 5, "rootfs"
sh: can't access tty; job control turned off
# binder_open(c394bcc8 c3c731a0) (pid 1577) got c3e48000
binder_open(c394bcc8 c3cd8dc0) (pid 1616) got c319f000
binder_open(c394bcc8 c3cd8ac0) (pid 1673) got c3d10000
binder_open(c394bcc8 c3cd8940) (pid 1680) got c0e19000
binder_open(c394bcc8 c3cd88c0) (pid 1691) got c2fa0000
binder_open(c394bcc8 c3d174a0) (pid 1592) got c25b8000
binder_release(c394bcc8 c3cd88c0) (pid 1691) pd c2fa0000
#

  • /dev »ó¿¡ eac µð¹ÙÀ̽º ÆÄÀÏÀ» ¸¸µéÁö ¸¶¼¼¿ä. ±× °ÍÀº qemu»óÀÇ ¿Àµð¿À¸¦ À§ÇÑ °ÍÀÔ´Ï´Ù. ¸¸¾à ÀÖ´Ù¸é ½ÃÀÛ ÀýÂ÷(start up sequence)´Â »ç¿îµå µð¹ÙÀ̽º¿¡ ¾î¶² µ¥ÀÌÅ͸¦ ¾²´Â °ÍÀ» ³¡¸¶Ä¡±â À§Çؼ­ ¿µ¿øÈ÷ ±â´Ù¸± °ÍÀÔ´Ï´Ù.
  • ¼öµ¿ ½ÃÀÛ(manual startup) ´ë½Å¿¡ ¾Èµå·ÎÀ̵å init ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇϼ¼¿ä. ¼öµ¿ ½ÃÀÛÀº ¾Èµå·ÎÀ̵å ÆÐÄ¡°¡ ÇÊ¿äÇÕ´Ï´Ù. ±× °æ¿ì ½ÃÀÛ ÀýÂ÷´Â /sys/android_power/acquire_partial_wake_lock¿¡ Á¢±ÙÇÏ°í ±â´Ù¸± °ÍÀÔ´Ï´Ù.

¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀ» µð¹ö±ëÇϱâ À§Çؼ­ http://benno.id.au/blog/2007/11/18/android-runtime-strace ÀÇ static ÄÄÆÄÀÏµÈ strace ¹ÙÀ̳ʸ®¸¦ »ç¿ëÇÏ°í, ¾Èµå·ÎÀ̵带 ¼öµ¿À¸·Î ½ÇÇàÇϼ¼¿ä.

#!/bin/sh
# set environment variables above example
...
/system/bin/app_process -Xzygote /system/bin --zygote &
/system/bin/dbus-daemon --system &
/system/bin/runtime

´ÙÀ½ ¿¹Á¦´Â ¼öµ¿ ½ÃÀÛ ÀýÂ÷¸¦ º¸¿©ÁÝ´Ï´Ù. /system/bin/runtime ¹ÙÀ̳ʸ® »ó¿¡¼­ strace¸¦ »ç¿ëÇϼ¼¿ä.

./strace -ff -F -tt -s 200 -o /tmp/strace runtime

6.6. ½ºÅ©¸°¼¦


recvfrom(4, "add@/devices/virtual/misc/networ"..., 1024, 0, NULL, NULL) = 144
mknod("/dev/network_latency", S_IFCHR|0600, makedev(10, 58)) = 0
chown32("/dev/network_latency", 0, 0)   = 0
recvfrom(4, 0xbee2b72a, 1024, 0, 0, 0)  = -1 EAGAIN (invain)
getdents64(8, /* 5 entries */, 4200)    = 136
getdents64(8, /* 0 entries */, 4200)    = 0
close(8)                                = 0
SYS_305(0x7, 0x27f3b, 0x24000, 0, 0x28e98) = 8
SYS_305(0x8, 0x1b6ec, 0x20001, 0, 0x28e98) = 9
write(9, "add\n", 4)                    = 4
close(9)                                = 0
recvfrom(4, "add@/devices/virtual/misc/networ"..., 1024, 0, NULL, NULL) = 150
mknod("/dev/network_throughput", S_IFCHR|0600, makedev(10, 57)) = 0
chown32("/dev/network_throughput", 0, 0) = 0
recvfrom(4, 0xbee2b72a, 1024, 0, 0, 0)  = -1 EAGAIN (Resource temporarily unavailable)
getdents64(8, /* 5 entries */, 4200)    = 136
getdents64(8, /* 0 entries */, 4200)    = 0
close(8)                                = 0
getdents64(7, /* 0 entries */, 4200)    = 0
close(7)                                = 0
SYS_305(0x6, 0x26f13, 0x24000, 0, 0x27e18) = 7
SYS_305(0x7, 0x1b6ec, 0x20001, 0, 0x27e18) = -1 ENOENT (No such file or directory)
getdents64(7, /* 3 entries */, 4200)    = 80
SYS_305(0x7, 0x27e6b, 0x24000, 0, 0xffffffff) = 8
SYS_305(0x8, 0x1b6ec, 0x20001, 0, 0x28e98) = 9
write(9, "add\n", 4)                    = 4
close(9)                                = 0
recvfrom(4, "add@/devices/virtual/sound/timer"..., 1024, 0, NULL, NULL) = 128
mknod("/dev/timer", S_IFCHR|0600, makedev(116, 33)) = 0
chown32("/dev/timer", 0, 0)             = 0
recvfrom(4, 0xbee2b72a, 1024, 0, 0, 0)  = -1 EAGAIN (Resource temporarily unavailable)
getdents64(8, /* 5 entries */, 4200)    = 136
getdents64(8, /* 0 entries */, 4200)    = 0
close(8)                                = 0
getdents64(7, /* 0 entries */, 4200)    = 0
close(7)                                = 0
getdents64(6, /* 0 entries */, 4200)    = 0
close(6)                                = 0
getdents64(5, /* 0 entries */, 4200)    = 0
close(5)                                = 0

7. ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß


¾Èµå·ÎÀÌµå ¾ÖÇø®ÄÉÀ̼ÇÀº XML ·¹À̾ƿô°ú ÀÚ¹Ù ¹®¹ýÀ» »ç¿ëÇÕ´Ï´Ù¸¸, ÀÚ¹Ù´Â ¾Æ´Õ´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×µéÀº ±×µé °íÀ¯ÀÇ °¡»ó ¸Ó½Å - dalvik - °ú dex ÆÄÀÏ Çü½ÄÀ» À§ÇÑ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ±×¸®°í Home.apk, Phone.apk, ApiDemos.apk µî °ú °°ÀÌ apk·Î À̸§ºÙ¿©Áø ÆÐÅ°Áö¸¦ »ç¿ëÇÕ´Ï´Ù.

apk ÆÄÀÏÀº ZIP ¾ÐÃàÆÄÀÏÀÌ°í ³× °¡Áö ºÎºÐÀ» °¡Áý´Ï´Ù.

  • AndroidManifest.xml
  • classes.dex
  • resources.arsc
  • res µð·ºÅ丮

Dex ÆÄÀÏ Çü½ÄÀº http://www.retrodev.com/android/dexformat.html ¿¡ ¼³¸íµÇ¾îÁ® ÀÖ½À´Ï´Ù. ±×¸®°í ±× ÆÄÀϵéÀÇ ³»¿ë°ú µð·ºÅ丮´Â ¾ðÁ¨°¡ ±¸±ÛÀÌ ¼³¸íÇÒ °Ì´Ï´Ù. ÇöÀç´Â ¼³¸íµÇÁö ¾Ê¾Ò½À´Ï´Ù. ¿ì¸®´Â ´ÜÁö ±×·¸°Ô ÃßÃøÇÒ »ÓÀÔ´Ï´Ù.

¾Èµå·ÎÀ̵å SDK´Â *.apk ÆÄÀÏÀ» »ý¼ºÇÒ °ÍÀÔ´Ï´Ù.

7.1. ÀÌŬ¸³½º(Eclipse) ÅëÇÕ°³¹ßȯ°æ(IDE) ¼³Ä¡Çϱâ


http://code.google.com/android/intro/installing.html ÀÇ ¼³Ä¡ ÀýÂ÷¸¦ µû¸£¼¼¿ä.

1. http://www.eclipse.org/downloads/ ÀÇ (JDT¿Í WST Ç÷¯±×ÀÎÀÌ Æ÷ÇÔµÈ)Eclipse IDE for Java developer


3. Apache Ant¸¦ Æ÷ÇÔÇÏ´Â eclipse pluginÀÎ ADT (Android Development Tools)

7.2. »ùÇà ¾ÖÇø®ÄÉÀ̼ÇÀ» ºôµåÇÏ°í ½ÇÇàÇϱâ


1. »ùÇà ÇÁ·ÎÁ§Æ®¸¦ ¿­°í ºôµå

2. ¿¡¹Ä·¹ÀÌÅÍ »ó¿¡¼­ »ùÇà ¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇà

7.3. ½ºÅ©¸°¼¦


8. ¿¡Çʷα×


¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀº µ¥ºñ¾È, ·¹µåÇÞ, ¼ö¼¼³ª ±âŸ µî°ú °°Àº ¸ð¹ÙÀÏ È¯°æÀ» À§ÇÑ »õ·Î¿î Á¾·ùÀÇ ¸®´ª½º ±â¹ÝÀÇ ¹èÆ÷ÆÇÀÌ µÉ °ÍÀ¸·Î º¸ÀÔ´Ï´Ù. ±×µéÀº ¿ÀǼҽº ¼¼»óÀÇ ¸®´ª½º Ä¿³Î°ú ¸¹Àº ´Ù¸¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ »ÓÀÔ´Ï´Ù. ±×µéÀº ÇöÀç 3D °¡¼ÓÈ­¸¦ OpenGL-ES ¶óÀ̺귯¸®¿¡ ±â¹ÝÇÑ ¼ÒÇÁÆ®¿þ¾î¸¦ Á¦°øÇÕ´Ï´Ù. ±×·¯³ª ±×µéÀº ±×¸¦ À§ÇÑ Çϵå¿þ¾î °¡¼ÓÀÇ ±âº» ÇÁ·Î¼¼¼­ »ó¿¡¼­ °³¹ßÇÏ°í ÀÖ½À´Ï´Ù. ±× Çϵå¿þ¾î °¡¼ÓÀº ÃßÈÄÀÇ ºü¸¥ UI ·»´õ¸µ È¿°ú¸¦ À§ÇØ ÇʼöÀûÀÔ´Ï´Ù.

SDK »óÀÇ ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀº ½ÇÁ¦ Çϵå¿þ¾î »ó¿¡ Æ÷ÆÃÇÏ´Â °ÍÀº ¿Ïº®ÇÏÁö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇϸé, ¶óÀ̺귯¸®¿Í Ŭ·¡½º¿¡ °ü·ÃµÈ ¾î¶² µð¹ÙÀ̽º - ¿¹¸¦ µé¸é, Ä«¸Þ¶ó -´Â ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò°í, »ç¿ëÀÚ¿¡°Ô °ø°³µÇÁö ¾Ê¾Ò½À´Ï´Ù. ±× °ÍÀº ¾ÆÁ÷ °³¹ß ´Ü°è¿¡ ÀÖ´Â °ÍÀ¸·Î º¸ÀÔ´Ï´Ù. ±×·¡¼­ ±¸±ÛÀÇ Àüü Æ÷Æà ŶÀ» ±â´Ù¸®´Â °ÍÀÌ ´õ ³ªÀ» °Í °°½À´Ï´Ù.

±× Àü¿¡, ¿ì¸®´Â ¾Èµå·ÎÀÌµå ½Ã½ºÅÛÀÇ »ç¾÷ ¸ðµ¨À» »ìÆìºÁ¾ß¸¸ ÇÕ´Ï´Ù. ±× °ÍÀº ¾à°£ ºü¸¥ CPU ¼º´ÉÀ» ÇÊ¿ä·Î Çϱ⠶§¹®¿¡ ¿î¼Û ÆǸŻç´Â ½Ñ ±âº» ÇÁ·Î¼¼¼­(RF ºÎºÐ)¿Í ¸ÖƼ¹Ìµð¾î ÄÚÇÁ·Î¼¼¼­(co-processor)°¡ ÇÊ¿äÇÒ °Ì´Ï´Ù. ¸ÖƼ¹Ìµð¾î ±â´ÉÀ» Æ÷ÇÔÇÏ´Â ±âº» ÇÁ·Î¼¼¼­´Â ¸Å¿ì ºñ½Î±â ¶§¹®ÀÔ´Ï´Ù.



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-09-03 13:31:14
Processing time 0.0018 sec