SlideShare a Scribd company logo
āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ
āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē
āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ‚āļ”āļĒ āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī
āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāļĨāļ‡āļ—āļļāļ™ āđāļĨāļ° āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ—āļĒ
EMBEDDED ANDROID
DEVELOPMENT
āļŠāļđāđˆ āđ€ āļŠāđ‰ āļ™ āļ— āļē āļ‡ āļ™āļą āļ āļžāļą āļ’ āļ™ āļē
EMBEDDED ANDROID DEVELOPMENT
āļˆāļąāļ”āļ—āļģāđ‚āļ”āļĒ āļœāļĻ. āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ
āļ•āļīāļ”āļ•āđˆāļ­ :
169 āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē
āļ–āļ™āļ™āļĨāļ‡āļŦāļēāļ”āļšāļēāļ‡āđāļŠāļ™ āļ•āļģāļšāļĨāđāļŠāļ™āļŠāļļāļ‚ āļ­āļģāđ€āļ āļ­āđ€āļĄāļ·āļ­āļ‡āļŠāļĨāļšāļļāļĢāļĩ āļˆāļąāļ‡āļŦāļ§āļąāļ”āļŠāļĨāļšāļļāļĢāļĩ 20131
āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 0-3810-2222 āļ•āđˆāļ­ 3380-82 āļ•āđˆāļ­ 203 āđ‚āļ—āļĢāļŠāļēāļĢ 0-3874-5806 āļ­āļĩāđ€āļĄāļĨāđŒ wiroon@eng.buu.ac.th
āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļēāļ‡āļšāļĢāļĢāļ“āļēāļ™āļļāļāļĢāļĄāļ‚āļ­āļ‡āļŠāļģāļ™āļąāļāļŦāļ­āļŠāļĄāļļāļ”āđāļŦāđˆāļ‡āļŠāļēāļ•āļī :
āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ. 
Embedded Android Development.-- : āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ, 2557. 
397 āļŦāļ™āđ‰āļē. 
1. āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§Â 2. āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 3. āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
I. āļŠāļ·āđˆāļ­āđ€āļĢāļ·āđˆāļ­āļ‡.
ISBN (e-book) : 978-616-361-117-8
āļˆāļąāļ”āļˆāļģāļŦāļ™āđˆāļēāļĒāđ‚āļ”āļĒ :
āļ­āļēāļ„āļēāļĢāļ—āļĩāļ‹āļĩāđ„āļ­āđ€āļ­āļŸ āļ—āļēāļ§āđ€āļ§āļ­āļĢāđŒ āļŠāļąāđ‰āļ™ 19 āđ€āļĨāļ‚āļ—āļĩāđˆ 1858/87-90 āļ–āļ™āļ™āļšāļēāļ‡āļ™āļē-āļ•āļĢāļēāļ” āđāļ‚āļ§āļ‡āļšāļēāļ‡āļ™āļē
āđ€āļ‚āļ•āļšāļēāļ‡āļ™āļē āļāļĢāļļāļ‡āđ€āļ—āļžāļŊ 10260 āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 0-2739-8000
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ eBook āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļ•āļēāļĄāļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āļ„āļĢāļĩāđ€āļ­āļ—āļĩāļŸāļ„āļ­āļĄāļĄāļ­āļ™āļŠāđŒ
# # # # # # # # āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļē-āđ„āļĄāđˆāļ”āļąāļ”āđāļ›āļĨāļ‡-āđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļē (āđ€āļœāļĒāđāļžāļĢāđˆāļŸāļĢāļĩ) 3.0 āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ
āļ„āļģāļ™āļīāļĒāļĄ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Embedded Systems) āļ—āļĩāđˆāđ€āļĢāļēāļžāļšāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļĄāļąāļ
āļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āļ—āļĩāđˆāđ€āļ™āđ‰āļ™āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ‡āđˆāļēāļĒāđ† āļ‹āļķāđˆāļ‡
āļ›āļąāļāļŦāļēāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ•āļēāļĄāļĄāļēāļ„āļ·āļ­āļœāļđāđ‰āļŠāļ™āđƒāļˆāļŦāļĢāļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļēāļāļˆāļ°āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ—āļģāļĢāļ°āļšāļšāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđ„āļ”āđ‰ (āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰
āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļˆāļĢāļīāļ‡) āļŦāļĢāļ·āļ­āļāļēāļĢāļ—āļģ User Interface āļāđ‡āļ—āļģāđ„āļ”āđ‰āļĒāļēāļāļĄāļēāļāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļĄāļēāļāđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļĢāļīāđˆāļĄāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āļĒāļ­āļ”āļˆāļēāļāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ€āļžāļ·āđˆāļ­
āļŠāđˆāļ§āļĒāļĨāļ”āđ€āļ§āļĨāļēāļāļēāļĢāļ—āļģāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĨāļ‡ āđ€āļŠāđˆāļ™ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ‹āļ·āđ‰āļ­āļŠāļīāđ‰āļ™āļŠāđˆāļ§āļ™āļĄāļēāļ›āļĢāļ°āļāļ­āļšāđ€āļ­āļ‡āđāļ•āđˆāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ”āļĄāļēāđƒāļŠāđ‰āđ€āļĨāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ
āļŸāļąāļ‡āļŠāļąāđˆāļ™āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ•āđˆāļēāļ‡āđ† āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāļ„āļīāļ”āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāđƒāļŦāļĄāđˆāđ†āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™
āļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļŠāđˆāļ™ Smart Phone āļŦāļĢāļ·āļ­ Tablet āļĄāļĩāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļĄāļĩāļ‚āļĩāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļđāļ‡āļĢāļ§āļĄāļ–āļķāļ‡āļĄāļĩāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ•āđˆāļēāļ‡āđ†āļ„āļĢāļšāļ–āđ‰āļ§āļ™ āļˆāļķāļ‡āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāđƒāļŦāđ‰āđ€āļāļīāļ”
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļ”āļĩāđ†āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļĄāļēāļĒ āļŦāļĢāļ·āļ­āļ–āļđāļāļ™āļģāđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāđˆāļ§āļĄāļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰
āļ­āļĒāđˆāļēāļ‡āļ”āļĩ
Smart Phone āļŦāļĢāļ·āļ­ Tablet āļ—āļĩāđˆāļŠāļąāļ”āļŠāđˆāļ§āļ™āļāļēāļĢāļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡āļ•āļĨāļēāļ”āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™
āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļĄāļĩāļŠāļąāļ”āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļĄāļēāļ“ 56% āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ iOS āļ‹āļķāđˆāļ‡āļĄāļĩāļŠāļąāļ”āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļĄāļēāļ“ 22% āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢ
āđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđƒāļŦāđ‰āđ€āļāđˆāļ‡āđāļĨāļ°āļŠāļģāļ™āļēāļāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļĄāļēāļ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ â€œEmbedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē" āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ āļ­.āļ§āļīāļĢāļļāļŽāļŦāđŒ
āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ āļ™āļĩāđ‰āļ™āļąāļšāļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄāđ‚āļ”āļ”āđ€āļ”āđˆāļ™āļĄāļēāļāļ—āļąāđ‰āļ‡āđƒāļ™āđāļ‡āđˆāļ§āļīāļŠāļēāļāļēāļĢ āļ›āļĢāļ°āļ§āļąāļ•āļīāļĻāļēāļŠāļ•āļĢāđŒ āđāļĨāļ°āļāļēāļĢāļ™āļģāđ„āļ›āļ›āļāļīāļšāļąāļ•āļīāļˆāļĢāļīāļ‡ āļŠāļģāļŦāļĢāļąāļš
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĄāļĩāļĢāļēāļāđ€āļ‡āđ‰āļēāļāļēāļĢāļžāļąāļ’āļ™āļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĄāļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļĒāļđāļ™āļīāļāļ‹āđŒ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļāđ‡āļšāļĢāļĢāļĒāļēāļĒāļ—āļĩāđˆāļĄāļēāļ—āļĩāđˆāđ„āļ›āđƒāļŦāđ‰āļœāļđāđ‰āļŠāļ™āđƒāļˆāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļ‹āļēāļšāļ‹āļķāđ‰āļ‡ āļāļąāļšāļ›āļĢāļ°āļ§āļąāļ•āļīāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļē
āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāđˆāļ§āļĒāļāļĢāļ°āļ•āļļāđ‰āļ™āļ„āļ§āļēāļĄāļ­āļĒāļēāļāđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ”āļĩ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĄāļļāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāđ€āļ”āļīāļ™āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡āđ„āļ”āđ‰āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļžāļĩāđˆāđ€āļĨāļĩāđ‰āļĒāļ‡āļ—āļĩāđˆāļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
āļ‹āļķāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļĄāļēāļ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļ›āļĢāļĩāļĒāļšāđ€āļŦāļĄāļ·āļ­āļ™āļ™āļāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāđ€āļĢāļīāđˆāļĄāļŦāļąāļ”āļšāļīāļ™āļ‹āļķāđˆāļ‡āļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§ āļ™āļāļ—āļļāļāļ•āļąāļ§āļĄāļĩāļ§āļīāļāļāļēāļ“āļ—āļĩāđˆāļˆāļ°āļšāļīāļ™āđ€āļ­āļ‡āđ„āļ”āđ‰
āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ‚āļ­āđƒāļŦāđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļšāļīāļ™
āļœāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļ­āļšāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āļœāļđāđ‰āļ—āļĩāđˆāļŠāļ™āđƒāļˆ āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļīāđˆāļĄāļšāļīāļ™āđƒāļ™āđ‚āļĨāļāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ­āļīāļŠāļĢāļ°āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāđ†āđ„āļ”āđ‰āļ„āļĢāļąāļš
āļ”āļĢ. āļžāļąāļ™āļ˜āđŒāļĻāļąāļāļ”āļīāđŒ āļĻāļīāļĢāļīāļĢāļąāļŠāļ•āļžāļ‡āļĐāđŒ
āļœāļđāđ‰āļ­āļģāļ™āļ§āļĒāļāļēāļĢāļĻāļđāļ™āļĒāđŒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NECTEC)
FOREWORD
I am honoured to be writing the forward for Ajarn Wiroon Sriborrirux’s new book. I
have admired Ajarn Wiroon for a long time as one of the leaders and mentors in the
embedded systems community in Thailand. He is well known and widely respected in
terms of his generousity in sharing his deep technical knowledge, as a teacher, a profes-
sional consultant, an advisor to startup companies and as a colleague. It is very tting
for him to be writing this book as a way to continue to share his knowledge with our
community in order to keep advancing Thailand forward in the technology eld.
The topic of this book, “Embedded Android Development”, is incredibly timely,
given the newest developments in terms of the Internet of Things (IOT), cyberphysical
trend and the move to a “post-PC era”, or what we can call the “embedded systems
era” or “device era”.
Stage 1 of the “embedded systems era” (2000-2015) was about connectivity. We
saw the rise of Ubiquitous Computing or Universal Communicator led by mobile phone
and smart phones. By putting a very powerful personal computing and communication
device into the hands of a major part of the world’s population, this stage built up an
important infrastructure for the IOT.
From 2010-2020, we are seeing Stage 2 of this era, with IOT being the keyword of
this decade. We will see a rising need to make things “smart”. The challenge is not just
in the technology, but rather in creating innovation or value creation that utilises infor-
mation or knowledge gathered from connected devices. CISCO predicted that the value
created by the use of IOT is expected to reach $14 trillion by 2020 which is only a few
years from now. This means tremendous opportunity for the development community.
Within this context, Embedded Android has become very popular in all types of
devices requiring user interface such as measurement instruments, kiosk, access control,
payment, health monitor, wearable devices, and cars. We are now currently only at the
beginning of IOT innovation race, and I believe that we’ll be seeing a lot of exciting in-
novations utilising Embedded Android in the next few years.
I am condent that this book should be very useful for key courses such as Unix
Systems Programming or Embedded Systems Development. This book should also serve
as a very good reference for students working on senior project related to advance em-
bedded systems and device development. These days, students learn a lot of theory
but have little practical skills, which makes it difcult for them to meet workforce re-
quirements. It is refreshing to see a book with a practical knowledge focus that en-
hances development skills. It lls a key gap in this eld, and particularly in Thailand.
Assistant Professor Apinetr Unakul
President of Thai Embedded Systems Association (TESA)
āļ„āļģāļ™āļģ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Embedded Android Development āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ€āļ‡āļīāļ™āļ—āļļāļ™āļˆāļēāļāļĻāļđāļ™āļĒāđŒ
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NECTEC) āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđāļĨāļ°
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (āļŠāļ§āļ—āļŠ.) āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāļĨāļ‡āļ—āļļāļ™ (BOI) āđāļĨāļ°āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđ„āļ—āļĒ (TESA) āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļŠāļĢāļīāļĄāļĻāļąāļāļĒāļ āļēāļžāļ§āļīāļŠāļēāļŠāļĩāļž Embedded System
āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļ—āļąāđ‰āļ‡āļ—āļąāļāļĐāļ°āļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŦāļĨāļąāļāļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ
āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļŦāđ‰āļ™āđˆāļēāļŠāļ™āđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ”āļķāļ‡āļ”āļđāļ”āļ™āļąāļāļĻāļķāļāļĐāļēāđƒāļŦāđ‰āļĻāļķāļāļĐāļēāļ•āđˆāļ­āđƒāļ™āļŠāļēāļ‚āļē Embed-
ded System āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ™āļģāđ„āļ›āđ€āļœāļĒāđāļžāļĢāđˆāļĒāļąāļ‡āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļ—āļąāđˆāļ§āļ›āļĢāļ°āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ›āļĢāļ°āļāļ­āļšāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļŦāļĢāļ·āļ­
āļāļēāļĢāļāļķāļāļ­āļšāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāđ€āļ‚āļĩāļĒāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļˆāļēāļāđƒāļˆāļ—āļĩāđˆāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āđāļĨāļ°āļĻāļĢāļąāļ—āļ˜āļēāđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāđāļĨāļ°āļāļĢāļ°āļ•āļļāđ‰āļ™āđƒāļŦāđ‰
āđ€āļāļīāļ”āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ āļēāļĒāđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒ āđ‚āļ”āļĒāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāļ™āļģāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāļŠāļąāđˆāļ‡āļŠāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ§āļ‡āļāļēāļĢāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ°
āđ€āļ§āļĨāļēāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 18 āļ›āļĩ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļšāļĢāļ§āļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļ§āļēāļĄāļĢāļđāđ‰āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŦāļēāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļĒāļēāļāđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđ€āļĢāļĩāļĒāļšāđ€āļĢāļĩāļĒāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄ
āļāļąāļšāļ™āļīāļŠāļīāļ•āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļ™āđƒāļ™āļ§āļīāļŠāļēāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļđāļ™āļīāļāļ‹āđŒ/āļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ§āļīāļŠāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļ§āļīāļŠāļēāļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļīāļŠāļīāļ•āļ™āļąāļāļĻāļķāļāļĐāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļēāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄ
āđ„āļŸāļŸāđ‰āļēāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļēāļ„āļ§āļšāļ„āļļāļĄ āļ§āļīāļ—āļĒāļēāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļŠāļēāļ‚āļēāļ—āļĩāđˆāđƒāļāļĨāđ‰āđ€āļ„āļĩāļĒāļ‡
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āļ—āļĩāđˆāļŠāļ™āđƒāļˆāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļĢāļ§āļšāļĢāļ§āļĄāļĻāļēāļŠāļ•āļĢāđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāđƒāļ™āļ­āļ™āļēāļ„āļ•āđ„āļ”āđ‰ āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļ
āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļđāļžāļ·āđ‰āļ™āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆ
āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ‚āđ‰āļēāđƒāļˆāļĢāļ°āļšāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆ
āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++/JAVA/Python āđāļĨāļ°āļāļēāļĢ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđƒāļ™āļšāļ—āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ€āļ›āđ‡āļ™āļāļēāļĢāļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļĢāļ“āļĩāļĻāļķāļāļĐāļēāđāļĨāļ°āđāļ™āļ§āļ„āļīāļ”āļŠāļģāļ„āļąāļāđƒāļ™
āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāđ€āļĢāļīāđˆāļĄ
āļ•āđ‰āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļ­āļ™āļēāļ„āļ•
āļāļīāļ•āļ•āļīāļāļĢāļĢāļĄāļ›āļĢāļ°āļāļēāļĻ
āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Embedded Android Development āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļŠāļĄāļšāļđāļĢāļ“āđŒāđ„āļĄāđˆāđ„āļ”āđ‰āļ–āđ‰āļēāļ‚āļēāļ”āļāļēāļĢāļŠāđˆāļ§āļĒāđ€āļ•āļĢāļĩāļĒāļĄāļ‚āđ‰āļ­āļĄāļđāļĨ
āļ›āļĢāļ°āļāļ­āļšāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļšāļ—āļˆāļēāļāļĨāļđāļāļĻāļīāļĐāļĒāđŒāļ—āļĩāđˆāļĢāļąāļāđāļĨāļ°āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ›āļĢāļ°āļˆāļģāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨ
āļāļąāļ‡āļ•āļąāļ§āļ‚āļ­āļ‡āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļē āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ™āļēāļĒāļŠāļĢāđ„āļāļĢ āđ„āļāļĢāļ›āļļāļĒ āļ™āļēāļĒāļ˜āļīāļ•āļīāļžāļ‡āļĐāđŒ āļŠāļ­āļ™āļˆāļąāļ™āļ—āļĢāđŒ āļ™āļēāļĒāļ āļēāļ™āļļāļ§āļąāļ’āļ™āđŒ āļžāļĢāļŦāļĄāļĻāļīāļĢāļī āļ™āļēāļĒāļ§āļīāļ˜-
āļ§āļąāļŠ āļšāļļāļāđāļĒāđ‰āļĄ āļ™āļēāļĒāļ§āļĩāļĢāļ°āđ€āļ”āļŠ āļ‚āļļāļĄāļ—āļ­āļ‡ āļ™āļēāļĒāļ§āļŠāļąāļ™āļ•āđŒ āļ§āļīāļĒāļ°āļĢāļąāļ™āļ”āļĢāđŒ āļ™āļēāļĒāļ›āļĢāļīāļ§āļąāļ’āļ™āđŒ āđ€āļĨāļĩāđˆāļĒāļĄāļŠāļģāļĢāļēāļ āļ™āļēāļĒāļ™āļīāļžāļ™āļ˜āđŒ āļŠāļĄāļŦāļĄāļēāļĒ
āļ™āļēāļĒāļˆāđ€āļĢ āļ›āļīāļĒāļ‰āļąāļ•āļĢāļžāļ™āļĄ āļ™āļēāļĒāļ™āļąāļāļžāļ‡āļĐāđŒ āđāļŠāļ‡āļŠāļ‡āđˆāļēāļĻāļĢāļĩ āđāļĨāļ°āļ™āļēāļĒāļāļīāļ•āļ•āļīāļĻāļąāļāļ”āļīāđŒ āļžāļĢāļĄāļĻāļĢāļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āļ™āļĢāđˆāļ§āļĄāļ‡āļēāļ™āļ—āļĩāđˆāļ„āļ­āļĒāđ€āļ›āđ‡āļ™
āļāļģāļĨāļąāļ‡āđƒāļˆ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ”āļĢ.āļ āļēāļ“āļļāļ§āļąāļ’āļ™āđŒ āļ”āđˆāļēāļ™āļāļĨāļēāļ‡ āļĢāļĻ.āļ”āļĢ.āļ“āļāļĢ āļ­āļīāļ™āļ—āļĢāđŒāļžāļĒāļļāļ‡ āđāļĨāļ° āļ”āļĢ.āļ­āļ āļīāļĢāļąāļ āļĨāļīāđˆāļĄāļĄāļ“āļĩ
āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļ—āļĩāđˆāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢ
āđ€āļ›āļīāļ”āļŠāļēāļ‚āļēāļ§āļīāļŠāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļŦāļĨāļąāļāļŠāļđāļ•āļĢ Embedded
Systems Engineering (English Program) āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļ­āļ™āđāļĨāļ°āļ—āļģāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļē
āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļ™āļēāļĒāļāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ—āļĒ āļœāļđāđ‰
āļŠāđˆāļ§āļĒāļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāļ­āļ āļīāđ€āļ™āļ•āļĢ āļ­āļđāļ™āļēāļāļđāļĨ āđāļĨāļ° āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļŠāļĄāļēāļ„āļĄāļŊ āļžāļĩāđˆāļ‚āļ™āļīāļĐāļāļē āļ›āļĢāļ°āļŠāļēāļĢāļŠāļļāļ‚ āļ—āļĩāđˆāđ„āļ”āđ‰āđƒāļŦāđ‰āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩ
āđ‚āļ­āļāļēāļŠāđ€āļ‚āđ‰āļēāļĄāļēāļĢāđˆāļ§āļĄāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļāļīāļˆāļāļĢāļĢāļĄāļ”āļĩāđ†āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļž.āļĻ. 2548 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē
āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āđ‰āļ§āļĒāļāļģāļĨāļąāļ‡āđƒāļˆāļ—āļĩāđˆāđ€āļ›āļĩāđˆāļĒāļĄāļĨāđ‰āļ™āļˆāļēāļāļ„āļĢāļ­āļšāļ„āļĢāļąāļ§āļ—āļĩāđˆāļĢāļąāļāļ‚āļ­āļ‡āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ€āļ­āļ‡ (āļ™āļēāļ‡āļ“āļąāļāļ“āļīāļŠāļē āļŦāļ™āļđāļ„āļ‡ āđāļĨāļ° āļ”.āļ.
āļ›āļ§āļĢāļ™āļąāļ™āļ—āļ™āđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļ—āļĩāđˆāļ„āļ­āļĒāđ€āļ›āđ‡āļ™āļāļģāļĨāļąāļ‡āđƒāļˆāļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāđ€āļ”āļ·āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰
āļ‚āļ­āļšāļžāļĢāļ°āļ„āļļāļ“āļšāļīāļ”āļē (āļ™āļēāļĒāļŠāļēāļĄāļēāļĢāļ– āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļĄāļēāļĢāļ”āļē (āļ™āļēāļ‡āđāļ”āļ‡ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļ—āļĩāđˆāđƒāļŦāđ‰āļŠāļĩāļ§āļīāļ•āļ—āļĩāđˆāļĄāļĩāļ„āđˆāļēāļ™āļĩāđ‰āđāļāđˆāļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩ
āđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļœāļĨāļ‡āļēāļ™ āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļ„āļ™āļŠāļģāļŦāļĢāļąāļšāļ§āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āļŠāļąāļāļ§āļąāļ™āļŦāļ™āļķāđˆāļ‡āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļˆāļ°āđ„āļ”āđ‰āđ€āļŦāđ‡āļ™
āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ—āļĩāđˆāđāļ—āđ‰āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰
āļŠāļēāļĢāļšāļąāļ
āļšāļ—āļ—āļĩāđˆ 1 āļžāļ·āđ‰āļ™āļāļēāļ™ Unix/Linux āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 13
āļ›āļĢāļ°āļ§āļąāļ•āļīāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix/Linux 13
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Licenses 18
āļ›āļĢāļąāļāļŠāļē āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 19
āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ 20
āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš 28
āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ 32
āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 33
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš 33
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļšāļš 36
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ 37
āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ 38
āļāļēāļĢāļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļšāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc 43
āļ„āļģāļŠāļąāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ 45
āļ„āļģāļŠāļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļŠāļļāļ” Regular Expressions 48
āļ„āļģāļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ 60
āļšāļ—āļ—āļĩāđˆ 2 āļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 67
Linux Kernel 68
Linux Versioning 69
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļĨāļ°āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡ Linux Kernel 3.2 70
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Custom Kernel 73
5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel 74
āļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel 3.x āļŠāļģāļŦāļĢāļąāļš Ubuntu āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆ 81
āļāļēāļĢāļžāļąāļ’āļ™āļē Linux Kernel Module 84
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Linux Module 88
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļš character device 92
āļāļēāļĢāđ€āļžāļīāđˆāļĄ Linux Module āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡ Linux Source Tree 97
āļšāļ—āļ—āļĩāđˆ 3 Embedded Linux Development 100
āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļēāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 100
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 104
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 104
āļāđˆāļ­āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 106
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux 109
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš Embedded Linux 109
āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ° āļšāļ­āļĢāđŒāļ” Target 112
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross Toolchains 116
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Cross Toolchains 117
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāļ āļēāļĒāđƒāļ™ Cross Toolchains 118
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļšāļ™ Embedded Linux 120
āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host 121
Toolchain Options āļ—āļĩāđˆāļŠāļģāļ„āļąāļ 123
Bootloaders 124
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ Kernel Image āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 126
Linux File Systems 127
Virtual Filesystems 127
āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ 134
Embedded Linux File System 137
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 139
Memory Technology Devices (MTD) 140
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux 142
BusyBox āļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ 147
āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ 152
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C āļšāļ™ QEMU 155
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļš BusyBox āļ āļēāļĒāđƒāļ™ Root Filesystem āļšāļ™ QEMU 157
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ”āđ‰āļ§āļĒāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Buildroot āļšāļ™ QEMU 161
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļšāļ™ QEMU 168
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Friendly ARM āļšāļ™ QEMU 171
āļšāļ—āļ—āļĩāđˆ 4 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āđāļĨāļ° Qt āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 178
āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 178
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Makefile 179
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ 181
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ 184
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ 185
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ 198
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ 210
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQLite 218
āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ 220
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C++ āļ”āđ‰āļ§āļĒ Qt 227
āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Qt āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 227
āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Signal āđāļĨāļ° Slot 232
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ 236
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Multi-threading 240
āļšāļ—āļ—āļĩāđˆ 5 āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 244
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 244
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 247
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android 250
āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android 252
āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host 252
Android Open Source Project (AOSP) 254
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠ AOSP 254
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™ AOSP 256
Android Kernel 258
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 259
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļ™ Android Emulator 265
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđƒāļŠāđ‰ Android Debug Bridge (ADB) 267
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš Emulator 271
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš Android Emulator (Goldfish) 271
āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel Module āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 276
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āļāļąāļ‡āļĨāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 280
āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™ Android Emulator 288
āļšāļ—āļ—āļĩāđˆ 6 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāļšāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē302
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Android Studio IDE 303
āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android Studio IDE 304
āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 309
āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ Eclipse IDE āļĄāļēāļŠāļđāđˆ Android Studio 311
Apache Ant āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 312
Android Activity 313
User Interface 320
Android Adapter 329
Android Intent 332
Broadcast Receiver 333
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android Native Development Kit 337
āļžāļ·āđ‰āļ™āļāļēāļ™ Android NDK 337
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK 340
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Hello World āļ”āđ‰āļ§āļĒ Android NDK 342
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē JAVA Native Interface (JNI) 348
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JNI Methods 352
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK Multi-Threading 359
āļšāļ—āļ—āļĩāđˆ 7 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 366
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi 366
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Android āđāļĨāļ° Arduino 382
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Android āļāļąāļš Arduino āļœāđˆāļēāļ™ ADK 386
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļāļēāļĢāđāļŠāļ”āļ‡āļŠāļąāļāļāļēāļ“āđ„āļŸāļŸāđ‰āļēāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­ (EMG) 389
āļšāļ—āļŠāļĢāļļāļ›āđāļĨāļ°āļāđ‰āļēāļ§āļ•āđˆāļ­āđ„āļ›... 395
āļ›āļĢāļ°āļ§āļąāļ•āļīāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ 396
āļšāļ—āļ—āļĩāđˆ 1 āļžāļ·āđ‰āļ™āļāļēāļ™ UNIX/LINUX āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āļ›āļĢāļ°āļ§āļąāļ•āļīāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix/Linux
āđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 55 āļ›āļĩ āđ€āļĄāļ·āđˆāļ­āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāđ„āļ›āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāđˆāļ­āļ™āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļēāļāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļˆāļ°
āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđƒāļŦāļĄāđˆāļŠāļ·āļīāđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāļ‹āļĩ (C Language) āđ€āļ›āđ‡āļ™āļ āļēāļĐāļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āļĄāļē āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŦāļĄāļđāđˆāļ™āļąāļāđ€āļ‚āļĩāļĒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1960 āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāđāļšāļšāđāļšāđˆāļ‡āđ€āļ§āļĨāļē (timesharing) āđ‚āļ”āļĒ Dartmouth College āđāļĨāļ° Massachusetts Institute of
Technology (M.I.T.) āļ‹āļķāđˆāļ‡āļĄāļĩāļˆāļļāļ”āđ€āļ”āđˆāļ™āļ„āļ·āļ­ āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļēāļĒāļ„āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ­āļēāļĻāļąāļĒāļāļēāļĢāđāļšāđˆāļ‡
āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āđƒāļŦāđ‰āđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ§āļĩāļĒāļ™āļāļąāļ™āđ„āļ› āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļšāļŠāļīāļ„ (BASIC
Language) āđāļ•āđˆāļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāđāļ„āđˆāļŠāđˆāļ§āļ‡āļĢāļ°āļĒāļ°āļŦāļ™āļķāđˆāļ‡ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āļĩāļ
āļ•āļąāļ§āļŠāļ·āđˆāļ­ CTSS (MIT's Compatible Time-Sharing System) āļˆāļēāļ M.I.T. āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļ
āļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒ āļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļāļĨāļļāđˆāļĄāļ™āļąāļāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ
āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™ āļ—āļēāļ‡ M.I.T. āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ— GE (General Electric) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļĢāļīāļĐāļąāļ—āļœāļđāđ‰
āļœāļĨāļīāļ•āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ„āļ”āđ‰āļĢāļ§āļĄāļāļĨāļļāđˆāļĄāļāļąāļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđāļšāđˆāļ‡āđ€āļ§āļĨāļēāļ•āļąāļ§āđƒāļŦāļĄāđˆ āđƒāļŦāđ‰āļĄāļĩ
āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļĄāļēāļāļ‚āļķāđ‰āļ™āđāļĨāļ°āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē MULTICS (MULTiplexed Information
and Computing Service)
āđāļĄāđ‰āļ§āđˆāļēāļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MULTICS āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļĢāđ‰āļ­āļĒāļ„āļ™ āđāļ•āđˆāđ‚āļ„āļĢāļ‡āļāļēāļĢāļāđ‡āļĒāļąāļ‡āđ€āļāļīāļ”
āļ›āļąāļāļŦāļēāļ‚āļķāđ‰āļ™āļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ•āļąāļ§āļ āļēāļĐāļē PL/I āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢ
āļžāļąāļ’āļ™āļēāđāļĨāļ°āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĨāđˆāļēāļŠāđ‰āļēāļāļ§āđˆāļēāļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āļĄāļēāļāđāļĨāļ°āļĄāļĩāļ‚āđ‰āļ­āļšāļāļžāļĢāđˆāļ­āļ‡āļĄāļēāļāļĄāļēāļĒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ›āļąāļˆāļˆāļąāļĒāļ­āļ·āđˆāļ™
āļ—āļĩāđˆāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āđ€āļ­āļ‡āļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāļžāļĢāđ‰āļ­āļĄ āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļˆāļķāļ‡āđ„āļ”āđ‰āļ–āļ­āļ™āļ•āļąāļ§āļ­āļ­āļāļˆāļēāļāđ‚āļ„āļĢāļ‡āļāļēāļĢāļŦāļĨāļąāļ‡āļˆāļēāļāļŠāļīāđ‰āļ™
āļŠāļļāļ”āđ‚āļ„āļĢāļ‡āļāļēāļĢāļĢāļ°āļĒāļ°āđāļĢāļ
āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­ Ken Thompson āļˆāļķāļ‡āđ€āļĢāļīāđˆāļĄāļŦāļēāđāļ™āļ§āļ—āļēāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļ§āļīāļˆāļąāļĒāļ•āđˆāļ­āđ„āļ› āđ‚āļ”āļĒāļĒāļąāļ‡āļ„āļ‡
āļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MULTICS āļĄāļēāļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļĒāđˆāļ­āļŠāđˆāļ§āļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāđāļ­āļŠ
āđ€āļ‹āļĄāļšāļĨāļĩāđ‰ (Assembly Language) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļļāđˆāļ™
PDP-7 āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āđāļĨāļ°āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđƒāļŦāļĄāđˆāđ‚āļ”āļĒ
āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ‚āļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļŠāļ·āđˆāļ­ Brian Kernighan āļ§āđˆāļē UNICS (Uniplexed Information
and Computing Service) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāđ‰āļ­āđ€āļĨāļĩāļĒāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢ MULTICS āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­
āđ€āļ›āđ‡āļ™ UNIX āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”
āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļĄāļĩāļ™āļąāļāļ§āļīāļˆāļąāļĒāļ„āļ™āļ­āļ·āđˆāļ™āđ†āđƒāļ™āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđ€āļĢāļīāđˆāļĄāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļˆāļ°āļ‚āļ­āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ‚āļ­āļ‡ Ken Thompson āļĄāļēāļāļ‚āļķāđ‰āļ™ āđāļĨāļ°āļ„āļ™āđāļĢāļāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļāđ‡āļ„āļ·āļ­ Dennis Ritchie
āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļļāđˆāļ™ PDP-11 āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļĩāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļđāļ‡āļāļ§āđˆāļē
13
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™ PDP-7 āđ€āļ”āļīāļĄ āļ•āđˆāļ­āļĄāļēāļ™āļąāļāļ§āļīāļˆāļąāļĒāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļāđ‡āđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢ
āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļˆāļ™āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™
PDP-11/45 āđāļĨāļ° PDP-11/70 āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļ•āļĨāļēāļ”āļŠāļđāļ‡āđƒāļ™āļŠāđˆāļ§āļ‡
āļ—āļĻāļ§āļĢāļĢāļĐāļ—āļĩāđˆ 1970 āđ€āļžāļĢāļēāļ°āđ„āļ”āđ‰āđ€āļžāļīāđˆāļĄāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļ‚āļ™āļēāļ”
āđƒāļŦāļāđˆ āđāļĨāļ°āļĄāļĩāļāļĨāđ„āļāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ—āļģāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļēāļĒāļ„āļ™āđƒāļ™āđ€āļ§āļĨāļē
āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰āļžāļĢāđ‰āļ­āļĄāļāļąāļ™
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļĒāļąāļ‡āđ„āļ”āđ‰āļ§āļēāļ‡āđāļœāļ™āļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āļˆāļ°āļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ—āļģāđƒāļŦāđ‰āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļē
āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āļĄāļēāļāļžāļ­āļŠāļĄāļ„āļ§āļĢ āļˆāļķāļ‡āđ€āļ›āđ‡āļ™āđ€āļŦāļ•āļļāļœāļĨāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĐāļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđƒāļ™āļ­āļ™āļēāļ„āļ• āđ‚āļ”āļĒāđƒāļ™āļĢāļ°āļĒāļ°āđāļĢāļāļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āļ—āļēāļ‡ Ken Thompson āđ„āļ”āđ‰āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļ āļēāļĐāļēāļšāļĩ (B Language) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ•āđˆāļ­
āļĄāļēāļˆāļēāļāļ āļēāļĐāļē BCPL (Basic Conbined Programming Lanaguge) āļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ M.I.T. āļ”āļąāļ‡āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢ
āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄ
14
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 1.1 Ken Thompson āđāļĨāļ° Dennis Ritchie
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļ„āđˆāļē 5 Factorials āđ‚āļ”āļĒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē BCPL
āđāļĨāļ°āļ āļēāļĐāļēāļšāļĩ
āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē BCPL:
GET "LIBHDR"
LET START() = VALOF $(
FOR I = 1 TO 5 DO
WRITEF("%N! = %I4*N", I, FACT(I))
RESULTIS 0
)$
AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļšāļĩāļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆ Ken Thompson āđ€āļ›āđ‡āļ™āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™
/* The following function will print a non-negative number, n, to
the base b, where 2<=b<=10, This routine uses the fact that
in the ASCII character set, the digits 0 to 9 have sequential
code values. */
printn(n,b) {
extrn putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
āđāļ•āđˆāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ•āļąāļ§āļ āļēāļĐāļēāļšāļĩāđ€āļ­āļ‡āļ™āļąāđ‰āļ™ āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ āļēāļĒāđƒāļ™āļĒāļąāļ‡āļĄāļĩ
āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ­āļĒāļđāđˆāļžāļ­āļŠāļĄāļ„āļ§āļĢ āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāļšāļĩāļĒāļąāļ‡āđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄ
āļŠāļģāđ€āļĢāđ‡āļˆāđ€āļ—āđˆāļēāļ—āļĩāđˆāļ„āļ§āļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡ Dennis Ritchie āļˆāļķāļ‡āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđāļĨāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ āļēāļĐāļēāļšāļĩāđƒāļŦāđ‰āļĄāļĩāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°
āļŠāļĄāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđāļĨāļ°āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē
āļ āļēāļĐāļēāļ‹āļĩ (C Language) āļ•āđˆāļ­āļĄāļēāļ—āļēāļ‡ Thompson āđāļĨāļ° Ritchie āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX
āļˆāļēāļāļ āļēāļĐāļēāļ‹āļĩāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ—āļģāđƒāļŦāđ‰āļ āļēāļĐāļēāļ‹āļĩāļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŦāļĄāļđāđˆāļ™āļąāļāđ€āļ‚āļĩāļĒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāđˆāļēāļ‡āļĄāļēāļāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ•āđˆāļēāļ‡āđ†āđāļĨāļ°
āļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđˆāļēāļĄāļē
āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ. 1974 Ritchie āđāļĨāļ° Thompson āđ„āļ”āđ‰āļ•āļĩāļžāļīāļĄāļžāđŒāļœāļĨ
āļ‡āļēāļ™āļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰ āļˆāļ™āđ€āļ›āđ‡āļ™āļœāļĨāđƒāļŦāđ‰āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ„āļ”āđ‰āļĢāļąāļšāļĢāļēāļ‡āļ§āļąāļĨ ACM Turing
Award āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1984
15
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļēāļāļœāļĨāļ‡āļēāļ™āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ— AT&T āļœāļđāđ‰āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđāļĨāļ°āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ–āļ·āļ­āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢ UNIX āđ„āļ”āđ‰āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļ•āđˆāļēāļ‡āđ† āđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđ€āļŠāļĩāļĒāļ„āđˆāļēāļ˜āļĢāļĢāļĄāđ€āļ™āļĩāļĒāļĄāđ€āļžāļĩāļĒāļ‡āđ€āļĨāđ‡āļ
āļ™āđ‰āļ­āļĒ āđ€āļžāļ·āđˆāļ­āļŦāļ§āļąāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ PDP-11 āļ‹āļķāđˆāļ‡āļĒāļąāļ‡
āļ—āļģāļ‡āļēāļ™āđ„āļĄāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ”āļĩāļžāļ­āđāļĨāļ°āļĒāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™āļĒāļēāļāļ­āļĒāļđāđˆ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢ UNIX āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āđ€āļāļīāļ”āļ•āļąāļ§āđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ BSD UNIX
(Berkeley Software Distribution UNIX) āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ University of California (UC Berkeley)
āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡ āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđāļĨāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒāđƒāļ™āļŠāļ–āļēāļšāļąāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļ•āđˆāļ­āļĄāļē
āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļāļĢāļ°āļ—āļĢāļ§āļ‡āļāļĨāļēāđ‚āļŦāļĄāļ‚āļ­āļ‡āļŠāļŦāļĢāļąāļāļŊ (Defense Advanced Research Projects Agency - DARPA)
āļāđ‡āđ„āļ”āđ‰āđƒāļŦāđ‰āļ—āļļāļ™āļāļąāļšāļ—āļēāļ‡ UC Berkeley āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ•āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ Version 4 BSD
āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ DARPA āļ—āļĩāđˆāđƒāļŠāđ‰āļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ·āđˆāļ­āļ§āđˆāļē TCP/IP āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ.
1993 āļ—āļēāļ‡ UC Berkley āļāđ‡āđ„āļ”āđ‰āļ­āļ­āļāļ•āļąāļ§ BSD āļĢāļļāđˆāļ™ 4.4 āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ X.25 āđāļ•āđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āđˆāļē
āđ€āļŠāļĩāļĒāļ”āļēāļĒāļ—āļĩāđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” UC Berkeley āļāđ‡āđ„āļ”āđ‰āļŦāļĒāļļāļ”āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđƒāļ™āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļē
āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™āļžāļąāļ’āļ™āļēāļāļēāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļ‚āļķāđ‰āļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļēāļ„āļē
āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļāđ‡āđ€āļĢāļīāđˆāļĄāļ–āļđāļāļĨāļ‡ āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ—āļĩāđˆāđ€āļ„āļĒāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļē
āđƒāļŠāđ‰āļšāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨ (Personal Computer) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē “XENIX” āđāļĄāđ‰āđƒāļ™āļĒāļļāļ„āđāļĢāļāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
XENIX āļĒāļąāļ‡āļĄāļĩāđ€āļžāļĩāļĒāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāđāļŠāļ”āļ‡āđāļ•āđˆāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āļŦāļ™āļąāļ‡āļŠāļ·āļ­ (Text Mode) āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļŠāđˆāļ§āļ‡āļāļĨāļēāļ‡āļ—āļĻāļ§āļĢāļĢāļĐ 1980
āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļē X-Window āļ‚āļķāđ‰āļ™āļĄāļēāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ UNIX āļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩ GUI (Graphic User Interface) āđ€āļāļīāļ”
āļ‚āļķāđ‰āļ™
āļšāļĢāļīāļĐāļąāļ— AT&T āļĒāļąāļ‡āļ„āļ‡āļœāļĨāļąāļāļ”āļąāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļĢāļļāđˆāļ™ System V Release
4 (SVR4) āļ—āļēāļ‡ AT&T āđ„āļ”āđ‰āļžāļĒāļēāļĒāļēāļĄāļĢāļ§āļĄāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđāļĨāļ°āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ† āļ‚āļ­āļ‡ BSD UNIX āđāļĨāļ° XENIX
16
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 1.3 āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix āđƒāļ™āļ§āļēāļĢāļŠāļēāļĢ The Bell System Technical Journal
copies of the 1978 and 1984 special Unix issues of the Bell System Technical Journal (Link)
āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āđ‰āļ§āļĒāļāļąāļ™ āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™ SVR4 āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ„āļĢāļąāđ‰āļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļāļĨāļļāđˆāļĄāļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ§āļīāļ•āļāļāļąāļ‡āļ§āļĨāļ§āđˆāļēāļˆāļ°āđ€āļāļīāļ”āļāļēāļĢāļœāļđāļāļ‚āļēāļ”āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
UNIX āļˆāļēāļāļšāļĢāļīāļĐāļąāļ— AT&T āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļķāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄāļ•āļąāļ§āļāļąāļ™āļˆāļąāļ”āļ•āļąāđ‰āļ‡āļ­āļ‡āļ„āđŒāļāļĢ Open Software Foundation
(OSF) āļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļĢāđˆāļ§āļĄāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļš UNIX āđƒāļ™āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļē
āļ™āļ­āļāļˆāļēāļ UC Berkeley āđāļĨāđ‰āļ§ āļāđ‡āļĒāļąāļ‡āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļĢāļēāļĒāļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļ”āđ‰āļēāļ™
āļ˜āļļāļĢāļāļīāļˆ āđ€āļŠāđˆāļ™ āļšāļĢāļīāļĐāļąāļ—āļ‹āļąāļ™āđ„āļĄāđ‚āļ„āļĢāļ‹āļīāļŠāđ€āļ•āđ‡āļĄ (SunOS āđāļĨāļ° Solaris) āļšāļĢāļīāļĐāļąāļ— DEC (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Ultrix āļˆāļ™āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™
OSF/1) āļšāļĢāļīāļĐāļąāļ—āđ„āļĄāđ‚āļ„āļĢāļ‹āļ­āļŸāļ•āđŒ (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ XENIX) āļšāļĢāļīāļĐāļąāļ—āđ„āļ­āļšāļĩāđ€āļ­āđ‡āļĄ (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ AIX) āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĒāļķāļ”āđāļ™āļ§āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ­āļ‡ BSD āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļāđ‡ System V āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ™āļąāđ‰āļ™ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļāļēāļĢāļ„āđ‰āļēāļˆāļ”āļ—āļ°āđ€āļšāļĩāļĒāļ™ (Registered Trademark) āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­ The Open Group āļ‹āļķāđˆāļ‡
āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđāļĨāļ°āļĢāļąāļšāļĢāļ­āļ‡āļĄāļēāļ•āļĢāļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ„āļ§āđ‰ 2 āđāļšāļšāļ„āļ·āļ­
â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļ•āļĢāļāļēāļ™ UNIX āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āļĄāļēāļ•āļĢāļāļēāļ™āļ‚āļ­āļ‡ The Open Group āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļē
āđ€āļŠāđˆāļ™ Digital UNIX, SCO UNIX, IBM's OpenEdition MVS
â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ„āļĨāđ‰āļēāļĒ UNIX (UNIX Compatible) āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđāļ•āđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļ”āļ—āļ°āđ€āļšāļĩāļĒāļ™āļĢāļąāļšāļĢāļ­āļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™ Sun Solaris, IBM AIX, Linux
āđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU (GNU Project) āđ„āļ”āđ‰āļ–āļđāļāļĢāļīāđ€āļĢāļīāđˆāļĄāļˆāļēāļāļ™āļąāļāļ§āļīāļˆāļąāļĒāļˆāļēāļ M.I.T āļŠāļ·āđˆāļ­ Richard Stallman āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ„āļĄāđˆāđ„āļ”āđ‰āļŸāļĢāļĩāļ­āļĩāļāļ•āđˆāļ­āđ„āļ›āđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļ„āļ·āļ­āļāļēāļĢāļžāļĒāļēāļĒāļēāļĄāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
āļŠāļĢāđ‰āļēāļ‡ C compiler (gcc), make (GNU make), Emacs, C library (glibc), āđāļĨāļ° coreutils (āđ€āļŠāđˆāļ™āļ„āļģāļŠāļąāđˆāļ‡
ls, cp āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļļāļāļ„āļ™āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ‚āļēāļ”āļ•āļąāļ§
āđāļāļ™āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel) āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļĩ āļ„.āļĻ. 1991 āļ™āļąāļāļĻāļķāļāļĐāļē
17
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 1.4 TimeLine āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī UNIX/LINUX
āļŠāļēāļ‚āļēāļ§āļīāļ—āļĒāļēāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ Helsinki āļ›āļĢāļ°āđ€āļ—āļĻāļŸāļīāļ™āđāļĨāļ™āļ”āđŒāļŠāļ·āđˆāļ­ Linus Torvalds āđ„āļ”āđ‰āļĄāļĩāđāļ™āļ§āļ„āļīāļ”
āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ”āđāļĨāļ°āļŸāļĢāļĩ āđ‚āļ”āļĒāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļĨāđ‰āļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­
āļˆāļēāļāđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ C library, gcc, binutils, leutils, make, emacs āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel āđ‚āļ”āļĒāļžāļĒāļēāļĒāļēāļĄāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™ POSIX āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Minix āđāļĨāļ°āļ—āļēāļ‡
Linus Torvalds āļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āđ€āļœāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļđāđˆāļŠāļēāļ˜āļēāļĢāļ“āļ° āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļąāđˆāļ§
āđ‚āļĨāļāļŠāđˆāļ§āļĒāļāļąāļ™āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļāđ‰āđ„āļ‚ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ­āļ­āļāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 1.0 (āļ„.āļĻ. 1994) āđāļĨāļ° āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 2.2 (āļ„.āļĻ. 1999) āļ•āļēāļĄ
āļĨāļģāļ”āļąāļš āļˆāļ™āđ„āļ”āđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļĨāļĩāļ™āļļāļāļ‹āđŒ (Linux) āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ LICENSES
āļˆāļēāļāļāļēāļĢāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU āđ‚āļ”āļĒ Richard Stallman āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™
āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļĄāļĩāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒ āđāļ•āđˆāļāđ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ āļēāļĒāđƒāļ•āđ‰āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡āļ•āļēāļĄāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļœāļđāđ‰
āļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ•āļēāļĄāļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
LICENSE āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚
GNU General Public
License (GPL)
āļŦāļēāļāļĄāļĩāļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ āļŦāļĢāļ·āļ­ āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļķāđ‰āļ™āļĄāļē
āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļ„āļĨāļēāļŠ āļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™
āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ GPL license āļ•āļīāļ”āđ„āļ›āļ”āđ‰āļ§āļĒ āļ‹āļķāđˆāļ‡āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•
GPL āļĄāļĩāļĨāļąāļāļĐāļ“āļ°Â â€œāđ€āļŠāļĢāļĩ” āļ”āļąāļ‡āļ™āļĩāđ‰
- āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ„āļĄāđˆāļ§āđˆāļēāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļˆāļļāļ”āļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđƒāļ”
- āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļĻāļķāļāļĐāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ‚āļ„āđ‰āļ”
- āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļˆāļģāļŦāļ™āđˆāļēāļĒāđ‚āļ›āļĢāđāļāļĢāļĄ
-āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļĨāļ°āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›āđƒāļŠāđ‰āđāļĨāļ°āļžāļąāļ’āļ™āļēāļ•āđˆāļ­
āđ‚āļ”āļĒāļĄāļĩāđ€āļžāļĩāļĒāļ‡āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ§āđˆāļēāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļģāđ„āļ›āļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰
āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āđ€āļ”āļĩāļĒāļ§āļāļąāļ™Â 
GNU Lesser General
Public License (LGPL)
āļŦāļēāļāļĄāļĩāļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ āļŦāļĢāļ·āļ­ āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļķāđ‰āļ™āļĄāļē
āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļ„āļĨāļēāļŠ āļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™
āļ™āļąāđ‰āļ™āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ•āļīāļ” LGPL (Lesser GPL) āđ„āļ›āļ”āđ‰āļ§āļĒ āđāļ•āđˆāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”
āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļļāļ”āđ€āļ”āļīāļĄāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ•āđ‰āļ­āļ‡āļĄāļĩ LGPL āļ•āļīāļ”āđ„āļ›āļ”āđ‰āļ§āļĒ āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™
āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āļ‚āļēāļĒāđ„āļ”āđ‰āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāđ„āļ”āđ‰āļ™āļģ
āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđƒāļ”āļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāđ‰āļēāļ‡
18
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
LICENSE āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚
Apache License
āđƒāļŦāđ‰āđāļŠāļ”āļ‡āđƒāļ™āđ€āļ­āļāļŠāļēāļĢāļ§āđˆāļēāđ„āļ”āđ‰āđƒāļŠāđ‰āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļŦāļĢāļ·āļ­ āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ—āļĩāđˆāđ€āļ›āđ‡āļ™
Apache License āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđ€āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļ
āđƒāļŠāđ‰ license āđāļšāļšāđ„āļŦāļ™āļāđ‡āđ„āļ”āđ‰
BSD Licenses
āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ›āļīāļ”āđ€āļœāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļĄāļĩ
āđ€āļžāļĩāļĒāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āđ€āļ”āļīāļĄāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđāļŠāļ”āļ‡
Creative Commons
Licenses
āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āļœāļĨāļ‡āļēāļ™ āđ‚āļ”āļĒāļ­āļēāļˆāđ€āļ›āđ‡āļ™āļœāļĨāļ‡āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™
āļĢāļđāļ›āļ āļēāļž āļŦāļĢāļ·āļ­āļāļēāļĢāļ­āļ­āļāđāļšāļš āđ‚āļ”āļĒāđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļœāļĨāļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ„āļ”āđ‰āļ§āđˆāļēāļœāļĨ
āļ‡āļēāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļˆāļ°āđƒāļŦāđ‰āļĄāļĩ license āđ€āļ›āđ‡āļ™āđāļšāļšāđ„āļŦāļ™ āđ€āļŠāđˆāļ™ āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļē , āđāļŠāļ”āļ‡
āļ—āļĩāđˆāļĄāļēāđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļē , āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļēāđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļēāđ„āļĄāđˆāļ”āļąāļ”āđāļ›āļĨāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ›āļĢāļąāļŠāļāļē āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđƒāļ™āļ­āļ”āļĩāļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļŦāļĨāļēāļĒāļ„āļ™āļ„āļīāļ”āļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđāļĨāļ°āļĒāļēāļāļ•āđˆāļ­āļāļēāļĢ
āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āđ€āļžāļĢāļēāļ°āļ­āļēāļˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđ€āļŠāļīāļ‡āļĨāļķāļāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĨāļ°āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļžāļ­
āļŠāļĄāļ„āļ§āļĢ āđ€āļŠāđˆāļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļāļēāļĢāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŦāļĢāļ·āļ­
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢ
āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļĨāđ‰āļ§āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļ§āļēāļĄāļĢāļđāđ‰āđāļĨāļ°āļ—āļąāļāļĐāļ°āļŦāļĨāļēāļĒāļ”āđ‰āļēāļ™āļ›āļĢāļ°āļāļ­āļšāļāļąāļ™āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļĄāļĩāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļ­āļĒāļđāđˆ
āļ§āļ‡āļˆāļģāļāļąāļ” āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĻāļđāļ™āļĒāđŒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĄāđˆāļ‚āđˆāļēāļĒ āļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļēāļ‡āļ”āđ‰āļēāļ™
āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđ‚āļ—āļĢāļ„āļĄāļ™āļēāļ„āļĄ āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ āļŦāļĢāļ·āļ­āļŦāļ™āđˆāļ§āļĒāļ§āļīāļˆāļąāļĒāļ āļēāļ„āļĢāļąāļ/āļ āļēāļ„āđ€āļ­āļāļŠāļ™
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŦāļĨāļēāļĒāļ„āļ™āļāđ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ›āļāļīāđ€āļŠāļ˜āđ„āļ”āđ‰āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX/LINUX āđ€āļĢāļīāđˆāļĄ
āđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āđƒāļ™āļŠāļĩāļ§āļīāļ•āļ›āļĢāļ°āļˆāļģāļ§āļąāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ­āļĩāđ€āļĄāļĨāđŒāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ āđ€āļ§āđŠāļ›
āđāļ­āļžāļžāļīāđ€āļ„āļŠāļąāđˆāļ™āļ—āļĩāđˆāđ‚āļ”āđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļēāļ‡āđ† (facebook, google, twitter) āļĨāđ‰āļ§āļ™āđāļĨāđ‰āļ§āđāļ•āđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
UNIX/LINUX āđ€āļāļ·āļ­āļšāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļē āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ™āļīāļ”āļžāļēāļžāļ āļāđ‡āļ–āļđāļāļŠāļąāđˆāļ‡
āļāļēāļĢāļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āļąāļ™āļ—āļĢāļ‡āļžāļĨāļąāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļ§āļšāļ„āļļāļĄāļ”āļđāđāļĨ
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļœāđˆāļēāļ™ GUI (Graphic User Interface) āđāļĨāļ°āļ—āļģ
āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ›āļĒāļąāļ‡āļĻāļđāļ™āļĒāđŒāļāļĨāļēāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļĢāļ°āļ”āļąāļšāđƒāļ”āļŦāļĢāļ·āļ­āļ™āļīāļŠāļīāļ•
āļ™āļąāļāļĻāļķāļāļĐāļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļ™āđƒāļ™āļŠāļēāļĒāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ§āļīāļĻāļāļ§āļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ§āļīāļĻāļ§āļāļĢāļĢāļĄ
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄ āļ—āļąāđ‰āļ‡āļŦāļĨāļēāļĒ āļˆāļķāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļ
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
19
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āđˆāļēāļ‡āđ† āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđ€āļ­āļ‡āđƒāļ™
āļ­āļ™āļēāļ„āļ• āđƒāļ™āļŠāļēāļĒāļ­āļēāļŠāļĩāļžāļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāđƒāļŦāļĄāđˆ
āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļāļēāļĢāđāļžāļ—āļĒāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĩāļ§āļ āļēāļž āļ™āļąāļāļ˜āļļāļĢāļāļīāļˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļšāļĢāļīāļāļēāļĢāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ™āļąāļāļ˜āļļāļĢāļāļīāļˆ
āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļŠāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļāđ‰āļēāļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­ āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļģāļ„āļ§āļēāļĄ
āđ€āļ‚āđ‰āļēāđƒāļˆāļ›āļĢāļąāļāļŠāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§āļĨāļ‡āļĄāļ·āļ­āļ›āļāļīāļšāļąāļ•āļī āļ”āđ‰āļ§āļĒāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļ‡āđˆāļēāļĒāđ†
āđ„āļ›āļŠāļđāđˆāļĒāļēāļāđāļĨāļ°āļ—āļģāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļœāļĨāļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļķāļāļāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ™āļģāđ„āļ›āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ—āļĩāđˆāļĒāļīāđˆāļ‡āđƒāļŦāļāđˆāđāļĨāļ°āđ€āļ•āđ‡āļĄāđ„āļ›āļ”āđ‰āļ§āļĒ
āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļĄāļēāļāļĄāļēāļĒ āļˆāļ°āļžāļšāđ€āļˆāļ­āļāļąāļšāđāļŦāļĨāđˆāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ­āļąāļ™āļĄāļŦāļēāļĻāļēāļĨāļ—āļĩāđˆāļˆāļ°āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāđ†āđƒāļŦāđ‰āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡
āđ€āļŦāļĨāļ·āļ­āđ€āļŠāļ·āđˆāļ­ āļ‹āļķāđˆāļ‡āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ āļēāļĒāđƒāļ™āļšāļ—āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļšāļĢāļ§āļĄāđāļĨāļ°āļŠāļĢāļļāļ›āļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđ€āļĒāļēāļ§āđŒāļˆāļ™āļ–āļķāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡ āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļąāļ§āļ‚āđ‰āļ­
āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
- āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ (Shell) āđāļĨāļ° Standard I/O Stream
- āļ•āļąāļ§āđāļ›āļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš (Environment Variable)
- āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ
- āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
- āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļšāļĢāļīāļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡
āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļāļ·āļ­āļšāļ—āļļāļāļŠāļīāđˆāļ‡āļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ„āļ·āļ­āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ (Almost Every-
thing is File) āđ„āļ”āđ‰āđāļāđˆ
â€Ēāđ„āļŸāļĨāđŒāļ›āļāļ•āļīāļ—āļąāđˆāļ§āđ„āļ› (Regular les) āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒāđ€āļ­āļāļŠāļēāļĢ āđ„āļŸāļĨāđŒāļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ
â€Ēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (Directories) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāļĢāļēāļĒāļāļēāļĢāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†
â€Ēāđ„āļŸāļĨāđŒāđ€āļŠāļ·āđˆāļ­āļĄāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ (Symbolic links) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒāļ­āļ·āđˆāļ™
â€Ēāđ„āļŸāļĨāđŒāļ­āļļāļ›āļāļĢāļ“āđŒ (Devices and Peripherals) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš
â€Ēāđ„āļŸāļĨāđŒāļ—āđˆāļ­āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Pipe) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ„āđˆāļēāļœāļĨāļĨāļąāļžāļ˜āđŒ (output) āļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡ āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ™āļģāđ€āļ‚āđ‰āļē (input) āļ‚āļ­āļ‡āļ­āļĩāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡
â€Ēāđ„āļŸāļĨāđŒāļ—āđˆāļ­āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• (Socket) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļŦāļĢāļ·āļ­āļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ”āđ‰
āđ€āļŠāļĨāļĨāđŒ (Shell)
shell āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ (Command Line) āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāđ‰āļ§āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡
(Command Line Interpreter - CLI) āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āđ‚āļ”āļĒāļ‚āļšāļ§āļ™āļāļēāļĢāļ āļēāļĒāđƒāļ™āļ•āļąāļ§ shell āļˆāļ°āļ‹āđˆāļ­āļ™āļĢāļēāļĒ
āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļąāļ™āļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ­āļēāđ„āļ§āđ‰ āđ‚āļ”āļĒāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āđ„āļĄāđˆāļĢāļđāđ‰āļ§āđˆāļēāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ›āđāļĨāđ‰āļ§āļ āļēāļĒāđƒāļ™āļˆāļ°
20
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāđˆāļ™āđ„āļĢāļšāđ‰āļēāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļŦāļĢāļ·āļ­āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡
āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļ­āļĒāļđāđˆ āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļĩāļĒāļ‡āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ free/df āļ•āļąāļ§ shell āļāđ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢāđƒāļ™
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđƒāļŦāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•āļąāļ§āđ€āļ­āļ‡āļ§āđˆāļēāļ‚āļ“āļ°āļ™āļĩāđ‰āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆāđāļĨāđ‰āļ§āđāļĨāļ°āđ€āļŦāļĨāļ·āļ­
āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĩāļāđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļ‹āļķāđˆāļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāļ”āļąāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē
āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ‹āļķāđˆāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āđāļāļ™āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĢāļ°āļšāļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ‚āļ”āļĒāļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļšāļ—āļ–āļąāļ”āđ†āđ„āļ›
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ shell āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļš
āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ„āļ”āđ‰āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļŠāļ„āļĢāļīāļ›āļ—āđŒ (Script) āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒ
āđ„āļ”āđ‰ āļ—āļģāđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ
āļ—āļąāļāļĐāļ°āļ­āļĒāļđāđˆāļĢāļ°āļ”āļąāļšāļŦāļ™āļķāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāļŦāļĢāļ·āļ­āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļēāđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒ (Shell script) āļ™āļąāđ‰āļ™ āđāļĨāļ°āļ™āļ­āļāļˆāļēāļ
āļ™āļąāđ‰āļ™āļĨāļđāļāđ€āļĨāđˆāļ™āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļĄāļēāļāļ™āđ‰āļ­āļĒāđ€āļžāļĩāļĒāļ‡āđƒāļ”āļāđ‡āļĒāļąāļ‡āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĒāļĩāđˆāļŦāđ‰āļ­āļŦāļĢāļ·āļ­āļĢāļļāđˆāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ shell āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒ āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™
shell āļ—āļĩāđˆāļĄāļĩāļ­āļīāļ—āļ˜āļīāļžāļĨāđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­ Bourne shell (āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ Bourne Again
shell) āđāļĨāļ° C shell
āļŦāļ™āđ‰āļēāļˆāļ­āļĢāļąāļšāļ„āđāļēāļŠāļąāđˆāļ‡
Shell
āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ„āđāļēāļŠāļąāđˆāļ‡
āļĢāļąāļ™āļ„āđāļēāļŠāļąāđˆāļ‡āļ­āđˆāļēāļ™āļ„āđāļēāļŠāļąāđˆāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 1.5 āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Shell
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ™āļīāļ”āļ‚āļ­āļ‡ shell āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡
shell āļ”āđ‰āļ§āļĒ --version
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
21
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ–āļķāļ‡āļĢāļēāļĒāļāļēāļĢāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļāļąāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ bash -c help
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled.
job_spec [&] history [-c] [-d offset] [n] or hist>
(( expression )) if COMMANDS; then COMMANDS; [ elif C>
. filename [arguments] jobs [-lnprs] [jobspec ...] or jobs >
: kill [-s sigspec | -n signum | -sigs>
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-n count] [-O origin] [-s c>
bind [-lpvsPVS] [-m keymap] [-f filen> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]...)> read [-ers] [-a array] [-d delim] [->
cd [-L|-P] [dir] readarray [-n count] [-O origin] [-s>
command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] or>
compgen [-abcdefgjksuv] [-o option] > return [n]
complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in WORDS ... ;] do COMM>
compopt [-o|+o option] [-DE] [name ..> set [--abefhkmnptuvxBCHP] [-o option>
continue [n] shift [n]
coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...]
declare [-aAfFilrtux] [-p] [name[=val> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ...] test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [na> times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]
exec [-cl] [-a name] [command [argume> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or ex> typeset [-aAfFilrtux] [-p] name[=val>
false ulimit [-SHacdefilmnpqrstuvx] [limit>
fc [-e ename] [-lnr] [first] [last] o> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMAND> unset [-f] [-v] [name ...]
for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or name > variables - Names and meanings of so>
getopts optstring name [arg] wait [id]
hash [-lr] [-p pathname] [-dt] [name > while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }
āļŠāļēāļĄāļēāļĢāļ–āļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āđ‚āļ”āļĒāļžāļīāļĄāļžāđŒ help <āļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡> āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
$ help times
times: times
Display process times.
Prints the accumulated user and system times for the shell and all of its
child processes.
Exit Status:
Always succeeds.
22
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Echo
Echo āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ”āđ†āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ–āļđāļāļ›āļĢāļēāļāļāļšāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ echo Welcome to Embedded System
Welcome to Embedded System!
$ echo Welcome to Embedded System
Welcome to Embedded System!
$ echo 'Welcome to Embedded System'
Welcome to Embedded System!
āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āđ„āļĄāđˆāļŠāļ™āđƒāļˆāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļ§āđˆāļēāļˆāļ°āļĄāļĩāļāļĩāđˆāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļˆāļ°āļ–āļđāļāļ•āļąāļ”āļŠāđˆāļ­āļ‡
āļ§āđˆāļēāļ‡āđ€āļŦāļĨāļ·āļ­āđ€āļžāļĩāļĒāļ‡ 1 āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ€āļŠāļĄāļ­ āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ•āļēāļĄāļĢāļ°āļĒāļ°āļŦāđˆāļēāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ āļ­āļąāļāļ›āļĢāļ°āļāļēāļĻ (‘ -Apostrophe) āļŦāļĢāļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ„āļģāļžāļđāļ” (“ - Quotation Mark) āļ„āļĢāļ­āļš
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ™āļąāđ‰āļ™ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļ™ Bash shell āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰ white space (āđ‚āļ”āļĒāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ space bar) āđƒāļ™āļāļēāļĢāđāļĒāļ
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļ­āļāđ€āļ›āđ‡āļ™ token āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ āđāļ•āđˆāļ–āđ‰āļēāļĄāļĩāļāļēāļĢāđƒāļŠāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ„āļĢāļ­āļš
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļŠāđˆāļ™ â€˜Burapha University’ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ token āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§
āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ (Option) āļŦāļĨāļēāļĒāđāļšāļš (āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒ
āļžāļīāļĄāļžāđŒ man echo) āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -n āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”
āđƒāļŦāļĄāđˆ (New Line)
$ echo -n "My name is Android"
My name is Android$
āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđƒāļŦāļĄāđˆāļ•āļēāļĄāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ n (new line) āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -e āļŦāļĨāļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡ echo
$ echo -e "My name is nAndroid"
My name is
Android
āļ™āļ­āļāļˆāļēāļāļ­āļąāļāļ‚āļĢāļ° n āđāļĨāđ‰āļ§āļĒāļąāļ‡āļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 1.1 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ
ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
a Alert (bell)
b Backspace
23
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
c āļŦāļĒāļļāļ”āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđƒāļŦāļĄāđˆ (āļĨāļąāļāļĐāļ“āļ°āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ -n)
f Form feed
n New line
r Carriage return
t Horizontal tab
āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Bash shell āļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āđ€āļ‰āļžāļēāļ°āļĄāļēāļāļĄāļēāļĒāļ—āļĩāđˆāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļīāļ™āļžāļļāļ—āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ āđ€āļŠāđˆāļ™ '|', '&', ';', '(', ')', '<', '>' āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ
āđāļŠāļ”āļ‡āļ­āļąāļāļ‚āļĢāļ°āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđƒāļŦāđ‰āļ›āļĢāļēāļāļāļ­āļĒāļđāđˆāđƒāļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļīāļĄāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ  āļ™āļģāļŦāļ™āđ‰āļēāļ­āļąāļāļ‚āļĢāļ°āđ€āļŠāļĄāļ­ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļąāļāļ›āļĢāļ°āļāļēāļĻāļ„āļĢāļ­āļšāļ—āļąāđ‰āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āļœāļŠāļĄāļ­āļĒāļđāđˆāļāđ‡āđ„āļ”āđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ  āļ™āļģāļŦāļ™āđ‰āļēāļ­āļąāļāļ‚āļĢāļ°āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ
$ echo I love Linux & Android
[1] 30136
I love Linux
Android: command not found
[1]+ Done echo I love Linux
[1]+ Done echo I love Linux
$ echo I love Linux & Android
I love Linux & Android
$ echo 'I love Linux & Android'
I love Linux & Android
Command Sequences
āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ›āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄ (Control Opera-
tors) āđ„āļ”āđ‰āđāļāđˆ ‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘|’, ‘(‘, ‘)’ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩ
āļĄāļēāļāļāļ§āđˆāļē 1 āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āļˆāļ°āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ â€˜;’ āļ­āļąāļ’āļ āļēāļ„ (semicolon) shell āļˆāļ°āļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļ”āļģāđ€āļ™āļīāļ™
āļāļēāļĢāļ—āļĩāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ§āđˆāļēāļŠāļģāđ€āļĢāđ‡āļˆāļŦāļĢāļ·āļ­āļĨāđ‰āļĄ
āđ€āļŦāļĨāļ§āļ™āļąāđ‰āļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļ„āļ·āļ­āļ–āđ‰āļēāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ€āļĨāļ‚āļĻāļđāļ™āļĒāđŒāļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āļģāđ€āļ™āļīāļ™
āļāļēāļĢāļŠāļģāđ€āļĢāđ‡āļˆ āđāļ•āđˆāļ–āđ‰āļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚āļ­āļ·āđˆāļ™āđ†āļˆāļ°āļ–āļ·āļ­āļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™āļ—āļģāļ‡āļēāļ™āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļ­āļ­āļāļĄāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ AND ‘&&’ āđāļĨāļ° OR ‘||’ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
$ ls
android ccache Downloads kernel output.txt Templates workspace
aosp Desktop error.log Music Pictures test.txt
24
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
bin Documents git one.txt Public Videos
$ ls test.txt && echo "OK... File exists"
test.txt
OK... File exists
$ ls mail.txt && echo "OK... File exists"
ls: cannot access mail.txt: No such file or directory
āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ„āļŸāļĨāđŒ test.txt āļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ€āļ›āđ‡āļ™āļĻāļđāļ™āļĒāđŒ
āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ›āļˆāļķāļ‡āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āđ„āļ”āđ‰ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ„āļŸāļĨāđŒ mail.txt āđ„āļĄāđˆāđ„āļ”āđ‰āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļŠāļ”āļ‡āļ–āļķāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĨāđ‰āļĄāđ€āļŦāļĨāļ§
āļ—āļģāđƒāļŦāđ‰āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāļ§āļ–āļąāļ”āđ„āļ› āđāļ•āđˆāļŦāļēāļāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€˜||’ āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āļĄāļēāļˆāļ°āļ–āļđāļāļ—āļģāļ‡āļēāļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāļĄāļĩ
āļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ„āļĄāđˆāđ€āļ—āđˆāļēāļāļąāļšāļĻāļđāļ™āļĒāđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ls test.txt || echo "OK... File exists"
test.txt
$ ls mail.txt || echo "No File exists"
ls: cannot access mail.txt: No such file or directory
ON File exists
āđāļ•āđˆāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ && āđāļĨāļ° || āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđ€āļŦāļĄāļ·āļ­āļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ if
(āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚) ..(āļˆāļĢāļīāļ‡).. else ..(āđ€āļ—āđ‡āļˆ).. āļŦāļĢāļ·āļ­ if (āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚) ? ..(āļˆāļĢāļīāļ‡).. : ..(āđ€āļ—āđ‡āļˆ).. āđƒāļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđˆāļ§āđ„āļ› āļˆāļ°āļĄāļĩāļĢāļđāļ›
āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
$ ls test.txt && echo "OK...File exists" || echo "Oh Bad... File not
found"
test.txt
OK...File exists
$ ls mail.txt && echo "OK...File exists" || echo "Oh Bad... File not
found"
ls: cannot access mail.txt: No such file or directory
Oh Bad... File not found
Standard I/O
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Shell āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļˆāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāļ„āļ·āļ­ āļ§āļīāļ˜āļĩāļāļēāļĢ
āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļīāđˆāļ‡āđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ­āļ‡āļ āļēāļĒāđƒāļ™āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ (Terminal) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē I/
O āļ‹āļķāđˆāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ I/O āļĄāļēāļ•āļĢāļēāļāļēāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ 3 āļŠāļ™āļīāļ”
āđ„āļ”āđ‰āđāļāđˆ
25
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”
āļŦāļ™āđ‰āļēāļˆāļ­
āđ‚āļ›āļĢāđāļāļĢāļĄ
Terminal
#0 stdin
#1 stdout
#2 stderr
āļĢāļđāļ›āļ—āļĩāđˆ 1.6 Standard I/O
āļ•āļēāļĢāļēāļ‡ 1.2 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ Standard I/O
STREAM āļĄāļēāļ•āļĢāļēāļāļēāļ™ FD āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
stdin (Standard Input Stream) 0
āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļāļēāļĢ
āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ„āļģāļŠāļąāđˆāļ‡āļˆāļēāļāļāļēāļĢāļāļ”āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”
stdout (Standard Output) 1
āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļĨāļĨāļąāļžāļ˜āđŒāļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āļšāļ™āļˆāļ­āļ āļēāļž
stderr (Standard Error) 2
āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨāļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āļ­āļ­āļāļˆāļēāļāļŦāļ™āđ‰āļēāļˆāļ­āļ āļēāļž
Redirections
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāļāļĨāđ„āļāļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡
āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ—āļīāļĻāļ—āļēāļ‡āļŦāļ™āļķāđˆāļ‡āđ„āļ›āļĒāļąāļ‡āļ­āļĩāļāļ—āļīāļĻāļ—āļēāļ‡āļŦāļ™āļķāđˆāļ‡āļŦāļĢāļ·āļ­āļ­āļ˜āļīāļšāļēāļĒāļ‡āđˆāļēāļĒāđ†āļ„āļ·āļ­āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āļ­āļ­āļāļ•āļąāļ§
standard stream āļ•āļąāļ§āđƒāļ” āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ<” āđāļ—āļ™ stdin (Standard Input) āđāļĨāļ° â€œ>” āđāļ—āļ™
stdout (Standard Output) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ redirection āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 5 āđāļšāļšāļ•āļēāļĄāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™
āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ•āļēāļĢāļēāļ‡ 1.3 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ redirection
āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
< āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ
<< token āđƒāļŠāđ‰āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļˆāļ­ token
> āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļ—āļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆ
26
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
>> āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ”āļīāļĄ
n>&m āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ‚āļ­āļ‡ File Descriptor (FD) āđ€āļ”āļīāļĄ n āđ„āļ›āļ—āļĩāđˆāđƒāļŦāļĄāđˆ m
āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļīāļ™āļžāļļāļ—āļˆāļēāļāđ„āļŸāļĨāđŒ /etc/passwd āđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep āđāļĨāļ°āļāļēāļĢāļŠāđˆāļ‡āļ­āļīāļ™āļžāļļāļ—āļˆāļēāļ
āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ sort āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ grep -i student < /etc/passwd
student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash
$ sort << END
> 55233424 Wiroon Sriborrirux
> 55237346 Nayot Kurukitkoson
> 55236477 Panuwat Dankhang
> END
55233424 Wiroon Sriborrirux
55236477 Panuwat Dankhang
55237346 Nayot Kurukitkoson
$ sort -k2 << END
> 55233424 Wiroon Sriborrirux
> 55237346 Nayot Kurukitkoson
> 55236477 Panuwat Dankhang
> END
55237346 Nayot Kurukitkoson
55236477 Panuwat Dankhang
55233424 Wiroon Sriborrirux
āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ>” āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒ /tmp/results āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āļ­āļ­āļ
āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ grep -i student /etc/passwd > /tmp/results
$ ls /tmp/
CRX_75DAF8CB7768 orbit-student ssh-pqdoFN1336 vmware-root-2
hsperfdata_student pulse-Xti8iSZ9STOh VMwareDnD vmware-student
keyring-27UIsq results vmware-root
$ cat /tmp/results
student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āļˆāļ°āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ” (Error message)
āļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āļ–āđ‰āļēāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
$ cat one.txt two.txt 2>&1
This is the data inside
cat: two.txt: No such file or directory
27
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļēāļĄāļēāļĢāļ–āļāļĢāļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļŦāđ‰āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ error.log āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ2>”
$ cat one.txt two.txt 2> error.log
This is the data inside
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ” āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļŠāđˆāļ‡āđ„āļ›āđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ /dev/null
$ cat one.txt two.txt 2> /dev/null
This is the data inside
āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ€āļžāļīāđˆāļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ error.log āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ2>>”
$ cat one.txt two.txt three.txt 2>> error.log
This is the data inside
$ cat error.log
cat: two.txt: No such file or directory
cat: two.txt: No such file or directory
cat: three.txt: No such file or directory
āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ (Environment variables) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡āļ—āļĩāđˆ shell āļŦāļĢāļ·āļ­ āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āļ­āļēāļ—āļī
āđ€āļŠāđˆāļ™ āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ shell āļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ›āļĢāļ°āļˆāļģāļ•āļąāļ§āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (Home Di-
rectory) āđāļĨāļ°āļĒāļąāļ‡āļĄāļĩāļ•āļąāļ§āđāļ›āļĢāļ•āđˆāļēāļ‡āđ† āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒāļ—āļĩāđˆ shell āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ shell āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™ bash shell āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ„āļŸāļĨāđŒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ­āļĒāļđāđˆ 2 āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđāļāđˆ āđ„āļŸāļĨāđŒ .prole āđāļĨāļ°āđ„āļŸāļĨāđŒ .bashrc
$ cat .profile <---- āđƒāļ™āļāļĢāļ“āļĩ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 13.04 āļ‚āļķāđ‰āļ™āđ„āļ›
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export USE_CCACHE=0
export CCACHE_DIR=~/ccache
export JAVA_HOME=/usr/lib/jvm/jdk
export ANT_HOME=~/android/ant
export ANDROID_SDK_HOME=~/android/sdk
export ANDROID_NDK_HOME=~/android/ndk
export AOSP_HOME=~/aosp
export
PATH=$HOME/bin:$JAVA_HOME/bin:$ANT_HOME/bin:$ANDROID_SDK_HOME/tools:$ANDROID_
SDK_HOME/platform-tools:$ANDROID_NDK_HOME:$PATH
$ cat .bashrc
# .bashrc
# User specific aliases and functions
HISTSIZE=1000
28
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
HISTFILESIZE=2000
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš Login āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāļ‹āļķāđˆāļ‡āļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļē tty (Teletype-
writer) āđ€āļĄāļ·āđˆāļ­āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāđ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļāļĢāļ­āļāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ (username) āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™ (password) āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢ
āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ shell āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš (system environ-
ments) āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļŠāļĢāđ‰āļēāļ‡ tty āđƒāļŦāļĄāđˆāđƒāļŦāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰
āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļŦāļĨāļąāļāđƒāļ™ /etc/
prole āļŦāļĢāļ·āļ­ /etc/bashrc
āđ‚āļ›āļĢāđāļāļĢāļĄ agetty āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļē login āļšāļ™ tty
āđ‚āļ›āļĢāđāļāļĢāļĄ agetty āđ€āļĢāļĩāļĒāļāļ„āđāļēāļŠāļąāđˆāļ‡ /bin/login
āđ‚āļ›āļĢāđāļāļĢāļĄ login āđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™āļšāļ™ shell
āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™
~/.bashrc
āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ login āļ—āļĩāđˆāļāđāļēāļŦāļ™āļ”āļ­āļĒāļđāđˆāđƒāļ™
āđ„āļŸāļĨāđŒ /etc/motd
Terminal
Login Shell
āļœāļđāđ‰āđƒāļŠāđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļœāđˆāļēāļ™āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĢāļ°āļšāļšāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļžāļšāđ€āļˆāļ­āļšāđˆāļ­āļĒāđ„āļ”āđ‰āđāļāđˆ
29
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļēāļĢāļēāļ‡ 1.4 āđāļŠāļ”āļ‡āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™
āļŠāļ·āđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
USER āđ€āļĢāļĩāļĒāļāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš
UID āđ€āļĢāļĩāļĒāļāļĢāļŦāļąāļŠāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš
HOME āđ€āļĢāļĩāļĒāļ Home Directory
PWD āđ€āļĢāļĩāļĒāļ Directory āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™
SHELL āđ€āļĢāļĩāļĒāļāļŠāļ·āđˆāļ­ shell āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™
$ āđ€āļĢāļĩāļĒāļ process id āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™
PPID āđ€āļĢāļĩāļĒāļ process id āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ·āļšāļ—āļ­āļ”āļĄāļē
? The exit code of the last command
āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ echo āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš
$ echo $SHELL
/bin/bash
$ echo -e " My Home directory is $HOMEn My username is $USERn My
current directory is $PWD"
My Home directory is /home/student
My username is student
My current directory is /home/student
$ echo $PPID
1927
$ ps -aux | grep 1927
student 1927 0.0 0.5 192052 11236 ? Sl 08:15 0:33 gnome-terminal
env āđāļĨāļ° export
āļ„āļģāļŠāļąāđˆāļ‡ export āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āđ€āļ­āļ‡ āđ‚āļ”āļĒāļāļēāļĢāļĢāļ°āļšāļļāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™
āđ„āļŸāļĨāđŒ .bashrc āļŦāļĢāļ·āļ­āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āđƒāļ™ terminal āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ export my_project_codes=/home/student/embedded/sourcecode/
$ echo $my_project_codes
/home/student/embedded/sourcecode/
āļŦāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ env āļŦāļĢāļ·āļ­ export -p āļ”āļąāļ‡āļ™āļĩāđ‰
$ env
ORBIT_SOCKETDIR=/tmp/orbit-student
SSH_AGENT_PID=1383
TERM=xterm
30
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
SHELL=/bin/bash
...
USER=student
PATH=/home/student/bin:/usr/lib/jvm/jdk/bin:/home/student/android/ant/bin:/home/stud
ent/android/sdk/tools:/home/student/android/sdk/platform-tools:/home/student/android
/ndk:/home/student/bin:/home/student/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/u
sr/bin:/sbin:/bin:/usr/games
ANDROID_SDK_HOME=/home/student/android/sdk
PWD=/home/student
JAVA_HOME=/usr/lib/jvm/jdk
GDM_KEYBOARD_LAYOUT=us
LANG=en_US.utf8
GDM_LANG=en_US.utf8
MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path
GDMSESSION=gnome
SHLVL=1
HOME=/home/student
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=student
DISPLAY=:0.0
AOSP_HOME=/home/student/aosp
LESSCLOSE=/usr/bin/lesspipe %s %s
COLORTERM=gnome-terminal
XAUTHORITY=/var/run/gdm/auth-for-student-9wtySF/database
_=/usr/bin/env
$ export -p
declare -x ANDROID_NDK_HOME="/home/student/android/ndk"
declare -x ANDROID_SDK_HOME="/home/student/android/sdk"
declare -x ANT_HOME="/home/student/android/ant"
...
declare -x USER="student"
declare -x USERNAME="student"
declare -x USE_CCACHE="0"
declare -x WINDOWID="14722574"
declare -x XAUTHORITY="/var/run/gdm/auth-for-student-9wtySF/database"
declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-gnome:/etc/xdg"
declare -x XDG_DATA_DIRS="/usr/share/gnome:/usr/local/share/:/usr/share/"
Exec
exec āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđāļ—āļ™āļ—āļĩāđˆ shell āđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ exec āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ bash shell āļ‚āļķāđ‰āļ™āļĄāļēāļ­āļĩāļāļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ
(PID 30779) āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ bash shell āļŦāļĨāļąāļāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ (PID 19907) āļˆāļēāļāļ™āļąāđ‰āļ™āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļ
āđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāđˆāļąāļ‡ exec sh āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ•āļąāļ§ sh shell āļ‚āļķāđ‰āļ™āļĄāļēāđāļ—āļ™āļ—āļĩāđˆ bash shell āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ„āļ”āđ‰āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚
āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ (PID 19907) āļ–āđ‰āļēāļŦāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļ­āļāļˆāļēāļ shell āļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡
āļ‚āļķāđ‰āļ™āļĄāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ exit āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļˆāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (PID 30779) āļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē
$ ps
PID TTY TIME CMD
19907 pts/1 00:00:00 bash <---- āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ
30777 pts/1 00:00:00 ps
$ bash
31
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ ps
PID TTY TIME CMD
19907 pts/1 00:00:00 bash
30779 pts/1 00:00:00 bash <---- āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ
30796 pts/1 00:00:00 ps
$ exec sh
$ ps
PID TTY TIME CMD
19907 pts/1 00:00:00 bash
30779 pts/1 00:00:00 sh
30800 pts/1 00:00:00 ps
$ exit
$ ps
PID TTY TIME CMD
19907 pts/1 00:00:00 bash
30802 pts/1 00:00:00 ps
āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ
āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ āļēāļĒāđƒāļ™ shell āđ€āļ­āļ‡āļ™āļąāđ‰āļ™āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļŦāļĨāļąāļāđ†āđ€āļžāļĩāļĒāļ‡āđ„āļĄāđˆāļāļĩāđˆāļ„āļģāļŠāļąāđˆāļ‡āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡
āļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĢāļĢāļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāļ™āļ­āļ shell
(External Command) āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāļ™āļ­āļ shell āļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš
āđ„āļŸāļĨāđŒ (root lesystem) āđ€āļŠāđˆāļ™ /usr/bin āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĢāļđāđ‰
āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ shell āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš (Environment Variables) āļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē $PATH
āđ‚āļ”āļĒāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™ shell āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđāļĢāļāļˆāļ™āļ–āļķāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļļāļ”āļ—āđ‰āļēāļĒ
(āđ‚āļ”āļĒāļĄāļĩ ‘:’ āļ„āļąāđˆāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ) āļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ PATH āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰
āļ™āļąāđ‰āļ™āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ” āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ which āļ”āļąāļ‡āļ™āļĩāđ‰
$ which ls cat date ifconfig uname whoami ps find grep echo set
/bin/ls
/bin/cat
/bin/date
/sbin/ifconfig
/bin/uname
/usr/bin/whoami
/bin/ps
/usr/bin/find
/bin/grep
/bin/echo
āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āļŦāļĢāļ·āļ­ āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļ
āļāļēāļĢāļ—āļģ alias (āļāļēāļĢāļ—āļģāļ™āļēāļĄāđāļāļ‡āđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļģāļĒāļēāļ āļŦāļĢāļ·āļ­āļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļĢāļēāļˆāļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āļŦāļĢāļ·āļ­
32
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļŠāļąāđ‰āļ™āđ† āđ€āļŠāđˆāļ™ alias ls=`ls -al --color=auto`) āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ type āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰
āļ”āļąāļ‡āļ™āļĩāđ‰
$ type ls cat date ifconfig uname whoami ps find grep echo set
ls is aliased to `ls -al --color=auto'
cat is hashed (/bin/cat)
date is /bin/date
ifconfig is /sbin/ifconfig
uname is /bin/uname
whoami is /usr/bin/whoami
ps is hashed (/bin/ps)
find is /usr/bin/find
grep is aliased to `grep --color=auto'
echo is a shell builtin
set is a shell builtin
āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ PATH āļˆāļ°āļĨāļ‡āļ—āđ‰āļēāļĒāļ”āđ‰āļ§āļĒ bin āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļāļēāļĢāļ§āļēāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļš
āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđƒāļŦāđ‰āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /bin āđāļĨāļ° /usr/bin
āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš
āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļ—āļĢāļąāļžāļĒāļēāļāļĢāļˆāļģāļāļąāļ” āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™
āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–
āļ›āļĢāļ°āđ€āļĄāļīāļ™āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ–āļđāļāđƒāļŠāđ‰āļĄāļēāļāđ€āļāļīāļ™āđ„āļ›āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļš
āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļžāļŠāļđāļ‡āļŠāļļāļ”
top
āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāđ†āļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āļˆāļąāļ āđ€āļžāļĢāļēāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡
āļŠāļ–āļēāļ™āļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļāļēāļĢ
āļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢ āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš virtual lesystem (VFS) āđ„āļŸāļĨāđŒ /proc/loadavg āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡
33
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ„āļģāļŠāļąāđˆāļ‡ top
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāļģāļ„āļąāļ āđ„āļ”āđ‰āđāļāđˆ
Uptime
āļŦāļĄāļēāļĒāļ–āļķāļ‡ āđ€āļ§āļĨāļēāļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļĢāļ§āļĄāļ—āļĩāđˆāļĢāļ°āļšāļšāļ–āļđāļāđ€āļ›āļīāļ” āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš
load average
āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļāļąāļšāļ„āļ§āļēāļĄ
āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ‚āļ”āļĒāđāļŠāļ”āļ‡āļ­āļ­āļāļĄāļē 3 āļ„āđˆāļē āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ„āđˆāļē 0.10 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 1 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē,
āļ„āđˆāļē 0.11 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 5 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē āđāļĨāļ° āļ„āđˆāļē 0.04 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 15 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ uptime āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļ„āđˆāļēāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° (uptime āđāļĨāļ° load
average) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ uptime
01:24:59 up 17:18, 4 users, load average: 0.08, 0.08, 0.02
$ watch -n 1 uptime <--- āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ uptime āļ—āļļāļāđ† 1 āļ§āļīāļ™āļēāļ—āļĩ
Every 1.0s: uptime Tue Aug 20 01:26:37 2013
01:26:37 up 17:19, 4 users, load average: 0.01, 0.05, 0.01
34
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāļēāļĢāļ•āļĩāļ„āļ§āļēāļĄāļ„āđˆāļē load average āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāļ™āļ§āļ™āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļˆāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒāļ—āļĩāđˆāđāļ—āđ‰
āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āļ„āđˆāļēāļ™āļĩāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ„āļ”āđ‰āđ„āļĄāđˆāđƒāļŠāđˆāļˆāļģāļ™āļ§āļ™āđ€āļ›āļ­āļĢāđŒāđ€āļ‹āđ‡āļ™āļ•āđŒ āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđ€āļĨāļ‚āļāđ‡āđ€āļāļīāļ™ 1.0 āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ āļēāļž
āļ™āļąāļāļžāļąāļ’āļ™āļēāļĨāļ­āļ‡āļ—āļģāļāļēāļĢāļˆāļīāļ™āļ•āļ™āļēāļāļēāļĢāļ•āļēāļĄāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āđāļšāļšāļ„āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§ (single-core
CPU) āđ€āļ›āļĢāļĩāļĒāļšāđ„āļ”āđ‰āļāļąāļšāļ–āļ™āļ™āđ€āļ”āļīāļ™āļĢāļ–āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ (one-way lane) āļšāļ™āļŠāļ°āļžāļēāļ™āļ‚āđ‰āļēāļĄāđāļĄāđˆāļ™āđ‰āļģ āđāļĨāļ°āļŠāļĄāļĄāļ•āļīāđƒāļŦāđ‰āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļ•āļģāļĢāļ§āļˆāļˆāļĢāļēāļˆāļĢāļ„āļ­āļĒāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļ”āļīāļ™āļĢāļ–āļšāļ™āļŠāļ°āļžāļēāļ™āđāļŦāđˆāļ‡āļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđƒāļ™āļšāļēāļ‡āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°
āļ§āļąāļ™āļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āļ—āļĩāđˆāļ§āļīāđˆāļ‡āļ‚āļķāđ‰āļ™āļŠāļ°āļžāļēāļ™āļ­āļēāļˆāļˆāļ°āļĄāļēāļāļ™āđ‰āļ­āļĒāđ„āļĄāđˆāđ€āļ—āđˆāļēāļāļąāļ™āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāđ€āļĢāđˆāļ‡āļ”āđˆāļ§āļ™ (rush hour) āļ”āļąāļ‡āļ™āļąāđ‰āļ™
āļ•āļģāļĢāļ§āļˆāļˆāļĢāļēāļˆāļĢāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļŠāļ āļēāļžāļāļēāļĢāļˆāļĢāļēāļˆāļĢāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ•āļąāļ§āđ€āļĨāļ‚ (numbering sys-
tem) āđ€āļŠāđˆāļ™
â€Ē0.00 āļŦāļĄāļēāļĒāļ–āļķāļ‡ āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļˆāļĢāļēāļˆāļĢāļšāļ™āļ–āļ™āļ™
â€Ē0.50 āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļāļēāļĢāļˆāļĢāļēāļˆāļĢāļ„āļĨāđˆāļ­āļ‡āļ•āļąāļ§
â€Ē1.00 āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāļˆāļĢāļēāļˆāļĢāļŦāļ™āļēāđāļ™āđˆāļ™āđāļ•āđˆāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ•āļąāļ§āđ„āļ”āđ‰
â€Ēāļ–āđ‰āļē 2.00 āļ­āļēāļˆāļŦāļĄāļēāļĒāļ–āļķāļ‡ āļĢāļ–āđ€āļ•āđ‡āļĄāļ•āļĨāļ­āļ”āļ–āļ™āļ™āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĄāļĩāļˆāļģāļ™āļ§āļ™āļĢāļ–āļ—āļĩāđˆāļ›āļĢāļīāļĄāļēāļ“āđ€āļ—āđˆāļēāļāļąāļ™āļĢāļ­āļ­āļĒāļđāđˆāļ•āđ‰āļ™
āļŠāļ°āļžāļēāļ™
â€Ēāļ–āđ‰āļē 3.00 āļ­āļēāļˆāļŦāļĄāļēāļĒāļ–āļķāļ‡ āļĢāļ–āđ€āļ•āđ‡āļĄāļ•āļĨāļ­āļ”āļ–āļ™āļ™āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĄāļĩāļˆāļģāļ™āļ§āļ™āļĢāļ–āļ—āļĩāđˆāļ›āļĢāļīāļĄāļēāļ“ 2 āđ€āļ—āđˆāļē āļĢāļ­āļ­āļĒāļđāđˆāļ•āđ‰āļ™
āļŠāļ°āļžāļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āļšāļ™āļ–āļ™āļ™āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĢāļ–āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĢāļ­āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ•āđ‰āļ™āļŠāļ°āļžāļēāļ™
load āđ€āļ—āđˆāļēāļāļąāļš 1.00
load āđ€āļ—āđˆāļēāļāļąāļš 0.50
load āđ€āļ—āđˆāļēāļāļąāļš 1.50
āļĢāļđāļ›āļ—āļĩāđˆ 1.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ āļēāļžāļˆāļĢāļēāļˆāļĢāļāļąāļš Load
āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļ–āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāļ‚āđ‰āļēāļĄāļŠāļ°āļžāļēāļ™ āļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
āļāļĨāļēāļ‡āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰ (slice of CPU time) āļŦāļĢāļ·āļ­āļāļēāļĢāļĢāļ­āļ„āļīāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āđ‚āļ”āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļˆāļ°āļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ–āļķāļ‡āļ„āļ§āļēāļĄāļĒāļēāļ§āļ‚āļ­āļ‡āļ„āļīāļ§ (run-queue length) āļ‹āļķāđˆāļ‡āļĄāļēāļˆāļēāļāļœāļĨāļĢāļ§āļĄāļ‚āļ­āļ‡āļˆāļģāļ™āļ§āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ
āļšāļ§āļāļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļĢāļ­āļ„āļīāļ§ āļ‹āļķāđˆāļ‡āļ„āđˆāļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļļāļ”āļĄāļ„āļ•āļīāļ—āļĩāđˆāļ”āļĩāļŠāļļāļ”āļ„āļ·āļ­ 1.00 āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡āļŠāļ°āļžāļēāļ™āļŠāļēāļĄāļēāļĢāļ–
āļĢāļąāļšāļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āđ„āļ”āđ‰āđ€āļ•āđ‡āļĄāļ—āļĩāđˆ āđāļĨāļ°āļĒāļąāļ‡āļ„āļ‡āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ•āļąāļ§āđ„āļ”āđ‰āļ”āļĩ āđ€āļ›āļĢāļĩāļĒāļšāđ„āļ”āđ‰āļāļąāļš āļˆāļģāļ™āļ§āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļĢāļ­āļ­āļĒāļđāđˆāđ€āļ•āđ‡āļĄāļ„āļīāļ§āļžāļ­āļ”āļĩ āđāļĨāļ°āļŦāļ™āđˆāļ§āļĒ
āļ›āļĢāļ°āļĄāļ§āļ“āļœāļĨāļāļĨāļēāļ‡āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļˆāļ°āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļ™āļĩāđ‰āļ§āđˆāļē āļ„āđˆāļē “Utilization”
35
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļŠāļ āļēāļžāļ āļēāļĢāļ°āđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒ (load average) āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļŦāļĨāļąāļ
āļāļēāļĢāļ—āļąāđˆāļ§āđ„āļ› (Rule of Thumb) āđāļĨāđ‰āļ§ āļ„āļ§āļĢāđ„āļĄāđˆāđ€āļāļīāļ™ 0.70 āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļĩāļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ āļēāļĢāļ°āđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒāđƒāļ™
āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļāļīāļ™ 0.70 āļ—āļĩāđˆāđ€āļāļīāļ”āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļĄāļēāļŠāļąāļāļĢāļ°āļĒāļ°āļ™āļķāļ‡ āđ€āļžāļĢāļēāļ°āļ­āļēāļˆāļˆāļ°āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļŦāļāđˆāļ•āļēāļĄāļĄāļēāđ„āļ”āđ‰
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļšāļš
free, pmap
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory) āđ€āļ›āđ‡āļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŠāļģāļ„āļąāļāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩ
āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĄāļēāļāļ™āđ‰āļ­āļĒāđ€āļžāļĩāļĒāļ‡āđƒāļ”āļˆāļķāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļŠāļđāļ‡ āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux
āļ™āļąāđ‰āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ free āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš
virtual lesystem (VFS) āđ„āļŸāļĨāđŒ /proc/meminfo āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ‚āļ”āļĒ
āļāļēāļĢāđƒāļŠāđˆāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āđ‚āļ”āļĒāļ—āļĩāđˆ -k āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļīāđ‚āļĨāđ„āļšāļ•āđŒ , -m āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāđ€āļĄāļāļē
āđ„āļšāļ•āđŒ, -g āđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļīāļāļēāđ„āļšāļ•āđŒ
$ free -m -t
total used free shared buffers cached
Mem: 2001 1649 351 0 193 1145
-/+ buffers/cache: 311 1690
Swap: 16381 93 16288
Total: 18383 1743 16640
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļˆāļąāļšāļˆāļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļąāļšāđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđ‚āļ›āļĢ
āđ€āļ‹āļŠ āļāđ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļđāđ‰āļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢāđ€āļĄāļ·āđˆāļ­āļ–āļđāļ
āđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ pmap āļˆāļķāļ‡āļ–āļđāļāļ™āļģāļĄāļēāļŠāđˆāļ§āļĒāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđ„āļ”āđ‰āļ”āļĩ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ hello.c āđ‚āļ”āļĒāļĄāļĩāđ‚āļ„āđ‰āļ”āļ āļēāļĐāļēāļ‹āļĩāļ”āļąāļ‡āļ™āļĩāđ‰
$ cat hello.c
#include <stdio.h>
int main()
{
printf("Hello World!n");
while (1)
{
}
return 0;
}
$ gcc -o hello hello.c
$ ./hello &
[1] 11958
36
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Hello World!
$ pmap 11958
11958: ./hello
0000000000400000 4K r-x-- /home/student/hello
0000000000600000 4K r---- /home/student/hello
0000000000601000 4K rw--- /home/student/hello
00007f34087ca000 1512K r-x-- /lib/libc-2.11.1.so
00007f3408944000 2044K ----- /lib/libc-2.11.1.so
00007f3408b43000 16K r---- /lib/libc-2.11.1.so
00007f3408b47000 4K rw--- /lib/libc-2.11.1.so
00007f3408b48000 20K rw--- [ anon ]
00007f3408b4d000 128K r-x-- /lib/ld-2.11.1.so
00007f3408d52000 12K rw--- [ anon ]
00007f3408d69000 12K rw--- [ anon ]
00007f3408d6c000 4K r---- /lib/ld-2.11.1.so
00007f3408d6d000 4K rw--- /lib/ld-2.11.1.so
00007f3408d6e000 4K rw--- [ anon ]
00007fff77ad1000 84K rw--- [ stack ]
00007fff77bff000 4K r-x-- [ anon ]
ffffffffff600000 4K r-x-- [ anon ]
total 3864K
āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ
df, du
āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļĄāļĩāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āđāļ•āđˆāļˆāļ°āđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āđāļŸāļĨāļŠāđāļ—āļ™ āđ€āļŠāđˆāļ™ NAND
Flash, USB Storage āļŦāļĢāļ·āļ­ MMC/SD Card āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ™āđ‰āļ­āļĒāļĄāļēāļāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ
āļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđ€āļāđ‰āļēāļ•āļĢāļ§āļˆāļŠāļ­āļšāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰
āļ‡āļēāļ™āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļœāļĨāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļˆāļģāļ™āļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ›
āđāļĨāđ‰āļ§āđƒāļ™āļĢāļ°āļšāļš āđāļĨāļ°āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ āđ„āļ”āđ‰āđāļāđˆāļ„āļģāļŠāļąāđˆāļ‡ df (disk free) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 99G 62G 37G 63% /
none 997M 276K 997M 1% /dev
none 1001M 92K 1001M 1% /dev/shm
none 1001M 88K 1001M 1% /var/run
none 1001M 0 1001M 0% /var/lock
none 1001M 0 1001M 0% /lib/init/rw
āļ„āļģāļŠāļąāđˆāļ‡ du (disk usage) āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ™āļēāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļŠāļĩāđ‰āļ­āļĒāļđāđˆ (mount
point) āļĢāļ§āļĄāļ–āļķāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ†āļĨāļ‡āđ„āļ›āļˆāļēāļāļ•āļģāđāļŦāļ™āđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ du āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒ
37
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ df āļ™āļąāđˆāļ™āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡ du āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ•āļīāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -h āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļ›āļĨāļ‡
āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ—āļĩāđˆāļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
$ du -h busybox-1.21.0/
44K busybox-1.21.0/libpwdgrp
108K busybox-1.21.0/findutils
536K busybox-1.21.0/miscutils
24K busybox-1.21.0/coreutils/libcoreutils
684K busybox-1.21.0/coreutils
.
.
.
116K busybox-1.21.0/archival/libarchive/unxz
484K busybox-1.21.0/archival/libarchive
824K busybox-1.21.0/archival
16M busybox-1.21.0/
āļ™āļ­āļāļˆāļēāļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -h āđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ­āļĩāļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ„āļ·āļ­ -s āļ‹āļķāđˆāļ‡āļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĢāļ§āļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ•āđˆāļēāļ‡āđ† āđ€āļ‚āđ‰āļēāļĄāļē
āļ­āļĒāļđāđˆāđƒāļ™āļšāļĢāļĢāļ—āļąāļ”āđ€āļ”āļĩāļĒāļ§ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ du -sh busybox-1.21.0/
16M busybox-1.21.0/
āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ
āđƒāļ™āļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ āļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļĨāļģāļ”āļąāļšāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļˆāļēāļāđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļļāļ
āļ•āļąāļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ›āļĢāļ°āļˆāļģāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡ āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļāļģāļŦāļ™āļ”āļĄāļēāđƒāļŦāđ‰āļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ­āļ‡ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē PID
(process id) āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāđāļĨāļ°āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļ
āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ”āđ‰āļ§āļĒāļ•āļąāļ§āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ­āļ‡ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĒāļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāđ„āļ”āđ‰āđāļāđˆ
â€ĒāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ‚āļ”āļĒāļĢāļ§āļĄāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ jobs
â€Ēāđ€āļĨāļ·āļ­āļāļ”āļđāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāļ°āļ„āđˆāļēāļ•āđˆāļēāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ
â€ĒāļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ (signals) āđāļšāļšāļ•āđˆāļēāļ‡āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ
jobs, ps
āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ‚āļ”āļĒāļĢāļ§āļĄāļ™āļąāđ‰āļ™ āļŦāļĨāļąāļāļĄāļĩāļ­āļĒāļđāđˆ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ„āļ·āļ­ jobs āđāļĨāļ° ps
(process snapshot) āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡ jobs āļ™āļąāđ‰āļ™āļˆāļ°āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āļ‡āļēāļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāļ‚āļķāđ‰āļ™āļĄāļēāļ•āļēāļĄāļĨāļģāļ”āļąāļš āđāļĨāļ°āļĄāļĩ
āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ (PID) āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļˆāļ°āļšāļ­āļāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļšāđ‰āļēāļ‡
āđ€āļŠāđˆāļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™ (running) āļ–āļđāļāļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (stopped) āļ–āļđāļāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (killed) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
38
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Stopped emulator & (wd: ~/aosp)
[3]+ 12794 Killed gcalctool
āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ ps āļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ–āđ‰āļēāļĢāļąāļšāļĢāļēāļĒāļāļēāļĢ PID āļĄāļēāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡
jobs āļ—āļĩāđˆāļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -p (āļāļēāļĢāļĨāļģāļ”āļąāļš process group leader) āļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢ
āđ€āļ‹āļŠāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ jobs -p
11958
12458
12818
$ ps $(jobs -p)
PID TTY STAT TIME COMMAND
11958 pts/0 R 63:41 ./hello
12458 pts/0 Sl 2:25 /home/student/android/sdk/tools/emulator64-x86
12818 pts/0 S 0:00 gcalctool
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ–āļķāļ‡āļŠāļ–āļēāļ™āļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡
āļĄāļĩāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -ef āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ ps āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™ āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug19 ? 00:00:01 /sbin/init
root 2 0 0 Aug19 ? 00:00:00 [kthreadd]
root 3 2 0 Aug19 ? 00:00:01 [migration/0]
root 4 2 0 Aug19 ? 00:00:08 [ksoftirqd/0]
root 5 2 0 Aug19 ? 00:00:00 [watchdog/0]
root 6 2 0 Aug19 ? 00:00:01 [migration/1]
root 7 2 0 Aug19 ? 00:00:08 [ksoftirqd/1]
root 8 2 0 Aug19 ? 00:00:00 [watchdog/1]
root 10 2 0 Aug19 ? 00:00:01 [events/1]
root 11 2 0 Aug19 ? 00:00:00 [cpuset]
root 12 2 0 Aug19 ? 00:00:00 [khelper]
root 13 2 0 Aug19 ? 00:00:00 [netns]
root 14 2 0 Aug19 ? 00:00:00 [async/mgr]
root 18 2 0 Aug19 ? 00:00:00 [bdi-default]
root 19 2 0 Aug19 ? 00:00:00 [kintegrityd/0]
root 20 2 0 Aug19 ? 00:00:00 [kintegrityd/1]
root 21 2 0 Aug19 ? 00:00:01 [kblockd/0]
root 306 2 0 Aug19 ? 00:00:05 [jbd2/sda1-8]
root 1268 1 0 Aug19 tty3 00:00:00 /sbin/getty -8 38400 tty3
root 1272 1 0 Aug19 tty6 00:00:00 /sbin/getty -8 38400 tty6
root 1275 1 0 Aug19 ? 00:00:07 /usr/sbin/irqbalance
student 11825 11824 0 05:21 ? 00:00:00 gnome-pty-helper
student 11826 11824 0 05:21 pts/0 00:00:00 bash
student 11958 11826 99 05:22 pts/0 01:24:29 ./hello
student 12458 11826 5 05:42 pts/0 00:03:43 /home/student/android/sdk/tools/
student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server
student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool
39
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
root 12856 2 0 06:32 ? 00:00:00 [flush-8:0]
student 12929 11826 0 06:47 pts/0 00:00:00 ps -ef
āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĢāļēāļšāđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāđ‚āļ›āļĢāđ€āļ‹āļŠāđ„āļŦāļ™āļšāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ„āļ™āđƒāļ” (UID) āļĄāļĩ
āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ°āđ„āļĢ (PID) āđāļĨāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ” (PPID) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡
āļ­āļ˜āļīāļšāļēāļĒāđƒāļ™āļ•āļēāļĢāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 1.5 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ps
āļ„āļ­āļĨāļąāļĄāļ™āđŒ āļ„āļ§āļēāļĄāļŦāļĄāļēāļĒ
UID āđāļŠāļ”āļ‡ user āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ
PID āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process ID)
PPID āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļĨāļąāļāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ·āļšāļ—āļ­āļ”āļĄāļē (Parent Process ID)
C āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ CPU
STIME āđāļŠāļ”āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
TTY āđāļŠāļ”āļ‡āļĢāļŦāļąāļŠāđ€āļ—āļ­āļĄāļīāļ™āļ­āļĨāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ
TIME āđ€āļ§āļĨāļēāđ‚āļ”āļĒāļĢāļ§āļĄāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™ CPU
CMD āļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ‚āļķāđ‰āļ™āļĄāļē
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™ bash shell āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āđ€āļŠāđˆāļ™ -f (full), -j
(jobs), -l (long), --forest, --sort āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ps
PID TTY TIME CMD
11826 pts/0 00:00:00 bash
11958 pts/0 01:19:16 hello
12458 pts/0 00:03:31 emulator64-x86
12515 pts/0 00:00:00 adb
12818 pts/0 00:00:00 gcalctool
12905 pts/0 00:00:00 ps
$ ps -f
UID PID PPID C STIME TTY TIME CMD
student 11826 11824 0 05:21 pts/0 00:00:00 bash
student 11958 11826 99 05:22 pts/0 01:19:17 ./hello
student 12458 11826 5 05:42 pts/0 00:03:31 /home/student/android/sdk/
tools/
student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server
student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool
student 12906 11826 0 06:42 pts/0 00:00:00 ps -f
$ ps -j --forest
PID PGID SID TTY TIME CMD
40
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
11826 11826 11826 pts/0 00:00:00 bash
11958 11958 11826 pts/0 01:19:31 _ hello
12458 12458 11826 pts/0 00:03:31 _ emulator64-x86
12818 12818 11826 pts/0 00:00:00 _ gcalctool
12908 12908 11826 pts/0 00:00:00 _ ps
12515 12514 11826 pts/0 00:00:00 adb
$ ps -aj --sort sid,comm
PID PGID SID TTY TIME CMD
12515 12514 11826 pts/0 00:00:00 adb
12458 12458 11826 pts/0 00:04:26 emulator64-x86
12818 12818 11826 pts/0 00:00:00 gcalctool
11958 11958 11826 pts/0 01:42:27 hello
13020 13020 11826 pts/0 00:00:00 ps
āļāļēāļĢāļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process Killing) āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ
āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡ (low-level system message) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē āļŠāļąāļāļāļēāļ“ (Signal) āđ‚āļ”āļĒāļŠāļąāļāļāļēāļ“āļˆāļ°
āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āļ‚āļąāļ”āļˆāļąāļ‡āļŦāļ§āļ°āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļžāļ·āđˆāļ­āļšāļ­āļāļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ™āļąāđ‰āļ™ āļ‹āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļīāļāļēāļĢ
āļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ­āļĒāļđāđˆāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 64 āļŠāļ™āļīāļ” āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ kill -l āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGCONT 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļšāđˆāļ­āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
41
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 1 (SIGHUP) āļ„āļ·āļ­ Hang Up Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāđ„āļ›āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ
terminal āļ–āļđāļāļ›āļīāļ”āļĨāļ‡āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāļ āļēāļĒāđƒāļ•āđ‰ terminal āļ–āļđāļāļ›āļīāļ”āļĨāļ‡āļ•āļēāļĄāļ”āđ‰āļ§āļĒ
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 3 (SIGQUIT) āļ„āļ·āļ­ Quit Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļĄāļĩ
āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰ āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ›āļīāļ”āļ•āļąāļ§āļĨāļ‡
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 6 (SIGABRT) āļ„āļ·āļ­ Abort Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆ
āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āđ€āļ­āļ‡āļĨāļ‡
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 9 (SIGKILL) āļ„āļ·āļ­ Kill Signal āļĨāļąāļāļĐāļ“āļ°āļŠāļ­āļ‡ signal āļ›āļĢāļ°āđ€āļ āļ—āļ™āļĩāđ‰āļˆāļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļšāļāļēāļĢāļ”āļķāļ‡
āļŠāļēāļĒāđ„āļŸāļ­āļ­āļāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ›āļīāļ”āļ•āļąāļ§āļĨāļ‡āļ—āļąāļ™āļ—āļĩāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļ—āļģāļ‡āļēāļ™āļ­āļ°āđ„āļĢ
āļ­āļĒāļđāđˆāļāđ‡āļ•āļēāļĄ
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 18 (SIGCONT) āļ„āļ·āļ­ Continue Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļāļĨāļąāļšāļĄāļē
āļ—āļģāļ‡āļēāļ™āļ›āļāļ•āļīāđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļāļĨāļąāļšāļĄāļēāļ—āļģāļ‡āļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļē (foreground)
â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 20 (SIGTSTP) āļ„āļ·āļ­ āļāļēāļĢāļŠāđˆāļ‡ Stop Signal āļ”āđ‰āļ§āļĒ Keyboard (Ctrl+Z) āđ€āļ›āđ‡āļ™
āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ–āļđāļāļ—āļģāđƒāļŦāđ‰āđ„āļ›āļ—āļģāļ‡āļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ (background) āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ
Ctrl+Z āļšāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļœāđˆāļēāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”
āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļšāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
Ctrl-C
āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ INT (SIGINT) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļĒāļļāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļąāļ™āļ—āļĩ
Ctrl-Z
āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ TSTP (SIGTSTP) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļŦāđ‰āļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§
Ctrl-
āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ ABRT (SIGABRT) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļŦāđ‰āļĒāļļāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ—āļąāļ™āļ—āļĩ
āđ€āļŦāļĄāļ·āļ­āļ™ Ctrl-C āđāļ•āđˆāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļēāļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Running gcalctool &
$ kill -s SIGTSTP 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Stopped gcalctool
$ kill -s SIGCONT 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
42
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
[3]+ 12818 Running gcalctool &
$ kill -s SIGKILL 12818
$ jobs -l
[1] 11958 Running ./hello &
[2]- 12458 Running emulator & (wd: ~/aosp)
[3]+ 12818 Killed gcalctool
$ kill -s SIGTERM 11958
$ jobs -l
[1] 11958 Terminated ./hello
[2]- 12458 Running emulator & (wd: ~/aosp)
āļāļēāļĢāļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļšāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /PROC
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Windows) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļŠāļĄāļ·āļ­āļ™ (virtual lesystem) āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļ™
āļĢāļ°āļ”āļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđāļĨāļ°āļŠāļ–āļēāļ™āļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ‚āļ”āļĒāļ„āđˆāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ls /proc āļˆāļ°āļžāļšāļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļˆāļģāļ™āļ§āļ™āļĄāļēāļ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚ āļ‹āļķāđˆāļ‡
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ„āļ·āļ­āļŠāļ–āļēāļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđāļĨāļ°āļ–āļđāļāļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹
āļŠāļ™āļąāđˆāļ™āđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđāļĨāđ‰āļ§āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āļĒāļąāļ‡āļĄāļĩāđ„āļŸāļĨāđŒāļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāđāļ—āļ™āļŪāļēāļĢāđŒāđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļš āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 1.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc
āđ„āļŸāļĨāđŒ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
/proc/modules dynamically loaded modules
/proc/devices registered character and block major numbers
/proc/iomem on-system physical RAM and bus device addresses
/proc/ioports on-system I/O port addresses (especially for x86 systems)
/proc/interrupts registered interrupt request numbers
/proc/softirqs registered soft IRQs
/proc/kallsyms running kernel symbols, including from loaded modules
/proc/partitions currently connected block devices and their partitions
/proc/lesystems currently active lesystem drivers
/proc/swaps currently active swaps
/proc/cpuinfo information about the CPU(s) on the system
/proc/meminfo information about the memory on the system, viz., RAM, swap
43
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļˆāļēāļāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc/
$ cat /proc/partitions
major minor #blocks name
8 0 104857600 sda
8 1 104855552 sda1
8 16 16777216 sdb
8 17 16775168 sdb1
$ cat /proc/interrupts
CPU0 CPU1
0: 286 0 IO-APIC-edge timer
1: 14606 732 IO-APIC-edge i8042
3: 1 0 IO-APIC-edge
4: 32225 881 IO-APIC-edge
6: 3 0 IO-APIC-edge floppy
...
TRM: 0 0 Thermal event interrupts
THR: 0 0 Threshold APIC interrupts
MCE: 0 0 Machine check exceptions
MCP: 259 259 Machine check polls
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping : 9
cpu MHz : 2293.993
cache size : 6144 KB
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
...
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
stepping : 9
cpu MHz : 2293.993
cache size : 6144 KB
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm con-
stant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes xsave
avx hypervisor lahf_lm ida arat tpr_shadow vnmi ept vpid
bogomips : 4587.98
clflush size : 64
cache_alignment : 64
44
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
address sizes : 40 bits physical, 48 bits virtual
power management:
āļ„āļģāļŠāļąāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ
Cat, less, od, āđāļĨāļ° split
āļ„āļģāļŠāļąāđˆāļ‡ cat āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđƒāļ™āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļāđ‡
āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļŦāļĨāļēāļĒāđ„āļŸāļĨāđŒāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļĩ
āļ„āļ§āļēāļĄāļĒāļēāļ§āļĄāļēāļ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš log āļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ–āđ‰āļēāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ log āļĒāđˆāļ­āļĄāđ„āļĄāđˆāđ€āļ›āđ‡āļ™āļœāļĨāļ”āļĩāļāļąāļš
āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ­āļ‡āđ€āļžāļĢāļēāļ°āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ­āļāļĄāļēāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđ€āļāļīāļ™āļāļ§āđˆāļēāļˆāļ°āļˆāļąāļšāđƒāļˆāļ„āļ§āļēāļĄāļ—āļąāļ™āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļķāļ‡āđ€āļ›āđ‡āļ™
āļ„āļģāļŠāļąāđˆāļ‡āļĒāļ­āļ”āļ™āļīāļĒāļĄāļ­āļĩāļāļ„āļģāļŠāļąāđˆāļ‡āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ™āļīāļĒāļĄāļ™āļģāļĄāļēāđƒāļŠāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļąāļ™āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāđāļŠāļ”āļ‡
āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļķāđ‰āļ™āļĨāļ‡āđ„āļ”āđ‰āļŦāļĢāļ·āļ­āđāļĄāđ‰āļāļĢāļ°āļ—āļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ„āļģāđ„āļ”āđ‰āļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļš
āļāļēāļĢāđƒāļŠāđ‰ text editor āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ less āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļĨāļđāļāļĻāļĢāļ‚āļķāđ‰āļ™āļĨāļ‡āļŦāļĢāļ·āļ­āļāļēāļĢāđƒāļŠāđ‰āļ›āļļāđˆāļĄ
PageUp PageDown āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄ āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ™āļąāđ‰āļ™āļˆāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ /
āđāļĨāđ‰āļ§āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđāļŠāļ”āļ‡āļ„āļģāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ­āļ­āļ
āļĄāļē āļ–āđ‰āļēāļŦāļēāļāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ–āļąāļ”āđ„āļ› āļ„āļģāļŠāļąāđˆāļ‡ less āđ„āļ”āđ‰āđ‰āļ­āļ­āļāđāļšāļšāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļāļ”āđāļ›āđ‰āļ™āļžāļīāļĄāļžāđŒ n āđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āđˆāļ­āļ™āđ„āļ›
āļĒāļąāļ‡āļ„āļģāļ–āļąāļ”āđ„āļ›
āļ™āļ­āļāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļĨāđ‰āļ§āļ™āļąāđ‰āļ™āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ less āļĒāļąāļ‡
āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ—āļĩāđˆāļšāļĢāļĢāļ—āļąāļ”āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ„āļ”āđ‰ āđ‚āļ”āļĒāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ F āđ€āļŠāđˆāļ™āļāļĢāļ“āļĩāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ log āļ—āļĩāđˆāļˆāļ°
āļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļēāļĄāļēāļ•āļĨāļ­āļ”āđ€āļ§āļĨāļē less āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆ āđāļĄāđ‰āđ„āļŸāļĨāđŒ
log āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđ€āļ›āđ‡āļ™ .gz āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ less āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cat Departments.txt <---- āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§
1 Electrical
2 Computer
3 Telecommunication
$ cat >Universities.txt <---- āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆ āđāļĨāļ°āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļŸāļĨāđŒāļ—āļąāļ™āļ—āļĩ
Burapha University
Prince of Songkhla University
Thammasat University
āļāļ” Ctrl+D <---- āļāļ”āļ›āļļāđˆāļĄ Ctrl+D āđ€āļžāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ
$ cat Departments.txt Universities.txt > All.txt
$ cat All.txt
1 Electrical
2 Computer
3 Telecommunication
Burapha University
Prince of Songkhla University
Thammasat University
45
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ less /var/log/syslog
āļĢāļđāļ›āļ—āļĩāđˆ 1.10 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ /var/log/syslog āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ less
āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđ€āļ™āđ‰āļ™āļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (text le) āļ—āļąāđˆāļ§āđ„āļ› āđāļĨāđ‰āļ§āđāļŠāļ”āļ‡āļœāļĨāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ›āļāļ•āļī
āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĄāļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ­āļ·āđˆāļ™ āđ€āļŠāđˆāļ™ āđāļ›āļĨāļ‡
āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” āļāļēāļ™āļŠāļīāļš āļŦāļĢāļ·āļ­ āļāļēāļ™āļŠāļīāļšāļŦāļ āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļāļąāļ™āļ—āļąāđˆāļ§āđ„āļ›āļ„āļ·āļ­ od (Octal Dump) āļ‹āļķāđˆāļ‡āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ
-A āļ—āļĩāđˆāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļĢāļēāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ (Radix) āđāļĨāļ° -t āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āļ•āđˆāļēāļ‡āđ†
āđ€āļŠāđˆāļ™ āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļš āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļšāļŦāļ āļŦāļĢāļ·āļ­ āļĢāļŦāļąāļŠāđāļ­āļŠāļāļĩāđ‰ āļ”āđ‰āļ§āļĒ āļ„āđˆāļē o, d, x, c āļ•āļēāļĄāļĨāļģāļ”āļąāļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ od Departments.txt
0000000 020061 066105 061545 071164 061551 066141 031012 041440
0000020 066557 072560 062564 005162 020063 062524 062554 067543
0000040 066555 067165 061551 072141 067551 005156
0000054
$ od -t x Departments.txt
0000000 6c452031 72746365 6c616369 4320320a
0000020 75706d6f 0a726574 65542033 6f63656c
0000040 6e756d6d 74616369 0a6e6f69
0000054
$ od -A d -t c Departments.txt
0000000 1 E l e c t r i c a l n 2 C
0000016 o m p u t e r n 3 T e l e c o
0000032 m m u n i c a t i o n n
0000044
46
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ­āļēāļˆāļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ—āļĩāđˆāļĄāļĩāđ„āļŸāļĨāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāđāļĒāļ
āļ­āļ­āļ (split) āļĄāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļīāđ‰āļ™āđ€āļĨāđ‡āļāđ†āļ—āļĩāđˆāļŠāļ°āļ”āļ§āļāļ•āđˆāļ­āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļ›āļ—āļĩāļĨāļ°āļāđ‰āļ­āļ™ āļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆ
āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ­āļĩāđ€āļĄāļĨāđŒāđƒāļ™āļ‚āļ™āļēāļ”āļ—āļĩāđˆāļžāļ­āđ€āļŦāļĄāļēāļ°āļ•āđˆāļ­āļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āļŠāđˆāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ„āļŸāļĨāđŒ
āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāļīāđ‰āļ™āđ„āļ”āđ‰āļ„āļ·āļ­ āļ„āļģāļŠāļąāđˆāļ‡ split āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļĨāļ·āļ­āļāđāļĒāļāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļīāđ‰āļ™āđ€āļĨāđ‡āļāđ†āļ•āļēāļĄāļ‚āļ™āļēāļ”āđ„āļšāļ—āđŒ (Byte) āļŦāļĢāļ·āļ­
āļšāļĢāļĢāļ—āļąāļ” (line) āļ—āļĩāđˆāļŦāļąāđˆāļ™āļˆāļēāļāļ•āļąāļ§āđ„āļŸāļĨāđŒāļ•āđ‰āļ™āļ‰āļšāļąāļš āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāđ„āļŸāļĨāđŒāļĒāđˆāļ­āļĒāļ—āļĩāđˆāļ–āļđāļāđāļšāđˆāļ‡āļ­āļ­āļāļĄāļē āļāļĨāļąāļšāļĄāļēāļĢāļ§āļĄāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ
āđ€āļŦāļĄāļ·āļ­āļ™āļ•āļąāļ™āļ‰āļšāļąāļšāļ”āļąāļ‡āđ€āļ”āļīāļĄ āļāđ‡āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ split -l 1 Departments.txt <---- āđāļšāđˆāļ‡āļ­āļ­āļāļ—āļĩāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”
$ ls x*
xaa xab xac
$ cat xaa xab xac <---- āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļžāļĢāđ‰āļ­āļĄāļāļąāļ™
1 Electrical
2 Computer
3 Telecommunication
$ cat xaa xab xac > Departments_copies.txt <---- āļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļĩāļĒāļ§
$ cat Departments_copies.txt
1 Electrical
2 Computer
3 Telecommunication
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ md5sum āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļ‚āļ™āļēāļ”āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļŦāļĢāļ·āļ­
āđ„āļĄāđˆ
$ md5sum Departments.txt
c4eef8b561262f39d7ae748566100fe5 Departments.txt
$ md5sum Departments_copies.txt
c4eef8b561262f39d7ae748566100fe5 Departments_copies.txt
Wc, head, and tail
āļ„āļģāļŠāļąāđˆāļ‡ wc (Word Count) āļˆāļ°āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ§āđˆāļēāļĄāļĩāļ‚āļ™āļēāļ”
āđƒāļŦāļāđˆāđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļĄāļĩāļšāļĢāļĢāļ—āļąāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļģāļ™āļ§āļ™āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļˆāļģāļ™āļ§āļ™āļ„āļģāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°
āļŠāļĄāđƒāļ™āļāļēāļĢāļ”āļđāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđāļ•āđˆāļˆāļ°āđ€āļ™āđ‰āļ™āļ”āļđāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļŠāđˆāļ§āļ™āļŦāļąāļ§āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ head āđāļĨāļ°āļŠāđˆāļ§āļ™āļ—āđ‰āļēāļĒ
āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ tail āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ option -n <āļšāļĢāļĢāļ—āļąāļ”> āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļˆāļģāļ™āļ§āļ™āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡
āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ wc -l /var/log/dmesg
1386 /var/log/dmesg
$ head -n 5 /var/log/dmesg
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 2.6.32-42-server (buildd@batsu) (gcc version 4.4.3
(Ubuntu 4.4.3-4ubuntu5.1) ) #96-Ubuntu SMP Wed Aug 15 19:52:20 UTC 2012 (Ubuntu
2.6.32-42.96-server 2.6.32.59+drm33.24)
47
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-2.6.32-42-server
root=UUID=4fb97098-124c-489b-a0d1-3eb8846d2f67 ro quiet
[ 0.000000] KERNEL supported cpus:
$ tail -n 5 /var/log/dmesg
[ 18.896413] acpiphp_glue: Slot 262 already registered by another hotplug driver
[ 18.896434] acpiphp_glue: Slot 263 already registered by another hotplug driver
[ 19.031705] ENS1371 0000:02:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[ 19.602812] vmmemctl: started kernel thread pid=907
[ 19.602826] VMware memory control driver initialized
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‰āļēāļ”āļđāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ§āđˆāļēāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļē
āļĄāļēāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -f āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ tail āđ€āļžāļ·āđˆāļ­āđ€āļāđ‰āļēāļ”āļđāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ”āļąāļ‡āļĢāļđāļ›
āļĢāļđāļ›āļ—āļĩāđˆ 1.11 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ tail
āļ„āļģāļŠāļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļŠāļļāļ” REGULAR EXPRESSIONS
nd, grep
āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļ„āļ·āļ­āļ„āļģ
āļŠāļąāđˆāļ‡ ïŽnd āđ€āļžāļĢāļēāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđāļ•āđˆāļĨāļ°āļŠāļ™āļīāļ”āļ”āļąāļ‡āļ•āļēāļĢāļēāļ‡āđāļŠāļ”āļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ (parameter)
āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļĢāļ°āļšāļļāļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē
āļ•āļēāļĢāļēāļ‡ 1.7 āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļšāļ­āļāļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ
āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ
f āđ„āļŸāļĨāđŒāļ—āļąāđˆāļ§āđ„āļ›
d āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
b block
c character
48
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ
p pipe
l Symbolic link
s Socket
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāđƒāļŦāđ‰āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āđ„āļŸāļĨāđŒāļ—āļąāđˆāļ§āđ„āļ› (f) āļŦāļĢāļ·āļ­ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (d) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -type āđ€āļžāļ·āđˆāļ­
āļĢāļ°āļšāļļāļ›āļĢāļ°āđ€āļ āļ—āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ls -l
total 28
-rw-r--r-- 1 student student 53 2013-08-21 05:16 error.log
-rwxr-xr-x 1 student student 8497 2013-08-21 06:05 hello
-rw-r--r-- 1 student student 92 2013-08-21 06:05 hello.c
drwxr-xr-x 2 student student 4096 2013-09-17 18:03 out
-rw-r--r-- 1 student student 57 2013-08-21 05:16 result.txt
$ find . -type f
./error.log
./result.txt
./.my_hidden_file
./hello
./hello.c
$ find . -type d
.
./.my_hidden_directory
./out
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļŦāļĢāļ·āļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ‹āđˆāļ­āļ™āļ­āļĒāļđāđˆ
$ find . -type f -name ".*"
./.my_hidden_file
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļš case sensitive (āļŠāļ™āđƒāļˆāļ•āļąāļ§āļžāļīāļĄāļžāđŒāđ€āļĨāđ‡āļ-
āļžāļīāļĄāļžāđŒāđƒāļŦāļāđˆ) āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļāļĨāđ‰āđ€āļ„āļĩāļĒāļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ‚āļ”āļĒāđ„āļĄāđˆāļŠāļ™āđƒāļˆāļāļĢāļ“āļĩ case sensitive āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđ‚āļ”āļĒ
āļāļēāļĢāđƒāļŠāđ‰ -iname āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ find -iname "MyProgram.c"
./myprogram.c
./unix/myprogram.c
./programming/MyProgram.c
./MyProgram.c
49
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļĢāļ°āļšāļļāļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļĨāļķāļāļ‚āļ­āļ‡āļŠāļąāđ‰āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ -mindepth [level] āđāļĨāļ°
-maxdepth [level] āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ root (level 1) āđāļĨāļ°āļĨāļķāļāļĨāļ‡āđ„āļ›āļ­āļĩāļ 2 āļŠāļąāđ‰āļ™
(level 2 - level 3) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ find / -maxdepth 3 -name shadow
/etc/bash_completion.d/shadow
/etc/shadow
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ§āđˆāļēāđƒāļŦāđ‰āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāđ€āļ‰āļžāļēāļ°āļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļĨāļķāļāļ—āļĩāđˆ 2 āļ–āļķāļ‡ 4 (level 2 - level 4)
$ find / -mindepth 2 -maxdepth 4 -name shadow
/etc/bash_completion.d/shadow
āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ ïŽnd āđāļ•āđˆāļĨāļ°āļ„āļĢāļąāđ‰āļ‡ āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļžāļīāđ€āļĻāļĐāļŦāļĨāļąāļ‡āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -exec āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļˆāļ­āđ„āļŸāļĨāđŒāļ•āļēāļĄ
āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļŠāđ‡āļ„āļ„āđˆāļē checksum āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļˆāļ­āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ md5sum
$ find -iname "MyProgram.c" -exec md5sum {} ;
ed832d42670ee3af4041e4a50f851755 ./myprogram.c
ed832d42670ee3af4041e4a50f851755 ./unix/myprogram.c
7562d93e8b9a19dc80959d4eb7e2c7ca ./programming/MyProgram.c
ae96bf65a87976abba3fdc57f47a55a2 ./MyProgram.c
āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļēāļĄāļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™ (le permission) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -perm āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡
$ find . -perm -g=r -type f -exec ls -l {} ;
-rw-r--r-- 1 student student 53 2013-08-21 05:16 ./error.log
----r----- 1 student student 57 2013-08-21 05:16 ./result.txt
-rw-r--r-- 1 student student 0 2013-09-17 18:04 ./.my_hidden_file
-rwxr-xr-x 1 student student 8497 2013-08-21 06:05 ./hello
-rw-r--r-- 1 student student 92 2013-08-21 06:05 ./hello.c
$ find . -perm g=r -type f -exec ls -l {} ;
----r----- 1 student student 57 2013-08-21 05:16 ./result.txt
āļŦāļĢāļ·āļ­āļĢāļ°āļšāļļāđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” (Octal)
$ find . -perm 040 -type f -exec ls -l {} ;
----r----- 1 student student 57 2013-08-21 05:16 ./result.txt
āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļžāļ·āđ‰āļ™āļ—āļĩāđˆ
āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļĩāļ‚āļ™āļēāļ”āļˆāļģāļāļąāļ” āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ™āļģāļ„āļģāļŠāļąāđˆāļ‡ ïŽnd āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ•āļēāļĄāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļķāļ‡
āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
50
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļ
$ find . -type f -exec ls -s {} ; | sort -n -r | head -5
80 ./testing/ktest/ktest.pl
64 ./perf/util/trace-event-parse.c
64 ./perf/util/symbol.c
60 ./lguest/lguest.c
56 ./perf/util/header.c
āļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļŠāļļāļ” 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļ āđāļ•āđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļĻāļđāļ™āļĒāđŒāđ„āļšāļ•āđŒ (Empty le)
$ find . -not -empty -type f -exec ls -s {} ; | sort -n | head -5
4 ./firewire/list.h
4 ./firewire/Makefile
4 ./firewire/nosy-dump.h
4 ./include/tools/be_byteshift.h
4 ./include/tools/le_byteshift.h
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ (byte) āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -size [byte] āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ find . -size +200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļĄāļēāļāļāļ§āđˆāļē 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ
$ find . -size -200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ
$ find . -size 200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ” 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ‰āļžāļēāļ°āļ”āđ‰āļ§āļĒ alias āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ‚āļ™āļēāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļžāļ·āđˆāļ­āļĨāļš
āļ—āļīāđ‰āļ‡ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ alias rm50m="find / -type f -name *.tar -size +50M -exec rm -i {} ;"
$ alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} ;"
$ alias rm3g="find / -type f -name *.tar -size +3G -exec rm -i {} ;"
$ alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} ;"
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđ‚āļ”āļĒāļ”āļđāļˆāļēāļāđ€āļ§āļĨāļēāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (Access time) āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡
āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™ (Modication time) āļŦāļĢāļ·āļ­ āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ­āđ‚āļŦāļ™āļ”/āļŠāļ–āļēāļ™āļ° (Change time) āļŠāļēāļĄāļēāļĢāļ–
āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ•āļēāļĢāļēāļ‡ 1.8 āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ïŽnd
āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
---Access Time ---
amin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡
atime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡
--- Modication Time ---
mmin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™
51
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
mtime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āļ āļēāļĒāđƒāļ™
--- Change Time ---
cmin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļŦāļĢāļ·āļ­āļ„āđˆāļēāđ„āļ­āđ‚āļŦāļ™āļ”
ctime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāļŠāļ–āļēāļ™āļ°āļŦāļĢāļ·āļ­āļ„āđˆāļēāđ„āļ­āđ‚āļŦāļ™āļ”
$ cd unix/
$ vim hello.c <------ āđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ hello.c
$ chmod 755 result.txt <------ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ result.txt
āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ unix āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ–āļđāļāđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āđ€āļĄāļ·āđˆāļ­ 10 āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē
$ find ~/unix/ -mmin -10
/home/student/unix/
/home/student/unix/hello.c
āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ unix āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļīāļ—āļ˜āļīāđŒāđ„āļŸāļĨāđŒāđ€āļĄāļ·āđˆāļ­ 10 āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē
$ find ~/unix/ -cmin -10
/home/student/unix/
/home/student/unix/result.txt
/home/student/unix/hello.c
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āļœāļĨāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļ‹āđˆāļ­āļ™ (hidden le) āđƒāļ™āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -regex
āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ find ~/unix/ -amin -10 ( ! -regex ".*/..*" )
/home/student/unix/
/home/student/unix/hello.c
āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđāļĒāļāđ€āļ›āđ‡āļ™ 2 āļŠāđˆāļ§āļ™āļ„āļ·āļ­ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒ āđāļĨāļ°
āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ find / ( -perm -4000 -fprintf ~/unix/suid.txt '%#m %u %pn' ) , (
-size +100M -fprintf ~/unix/big.txt '%-10s %pn' )
$ cat big.txt
510743705 /home/student/aosp/out/host/linux-x86/bin/clang
357304855 /home/student/aosp/out/host/linux-x86/bin/llvm-rs-cc
52
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
138665118
/home/student/aosp/out/host/linux-x86/obj/STATIC_LIBRARIES/libclangSema_inter
mediates/libclangSema.a
138104274
/home/student/aosp/out/host/linux-x86/obj/STATIC_LIBRARIES/libclangStaticAnal
yzerCheckers_intermediates/libclangStaticAnalyzerCheckers.a
160314665 /home/student/aosp/out/host/linux-x86/obj/lib/libbcc.so
...
$ cat suid.txt
04755 root /bin/ping6
04755 root /bin/su
04755 root /bin/fusermount
04755 root /bin/umount
04755 root /bin/mount
04755 root /bin/ping
04755 root /usr/bin/chfn
06755 daemon /usr/bin/at
04755 root /usr/bin/lppasswd
04755 root /usr/bin/sudoedit
04755 root /usr/bin/arping
04755 root /usr/bin/gpasswd
...
grep
āļ„āļģāļŠāļąāđˆāļ‡ grep (Generalized Regular Expression Parser) āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆ
āļĢāļ°āļ”āļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđ‚āļ•āđŠāļ°āļˆāļ™āđ„āļ›āļ–āļķāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ‚āļ­āļ‡
āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļ„āļ·āļ­āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
$ grep ".*passwd" suid.txt
04755 root /usr/bin/lppasswd
04755 root /usr/bin/gpasswd
04755 root /usr/bin/passwd
04755 student
/home/student/Downloads/poky-dylan-9.0.0/build/tmp/work/i586-poky-linux/shado
w/4.1.4.3-r13/package/usr/bin/passwd.shadow
...
āļ•āļēāļĢāļēāļ‡ 1.9 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep
āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
? āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 1 āļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°
* āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 0 āļŦāļĢāļ·āļ­ āļĄāļēāļāļāļ§āđˆāļēāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°
+ āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 1 āļŦāļĢāļ·āļ­ āļĄāļēāļāļāļ§āđˆāļēāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°
^ āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āļ‚āļķāđ‰āļ™āļ•āđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”
53
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
$ āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āļ—āđ‰āļēāļĒāļšāļĢāļĢāļ—āļąāļ”
[ ] āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āļ­āļąāļ‚āļĢāļ°āđƒāļ”āļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ [ ]
{n} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™ n āļ„āļĢāļąāđ‰āļ‡
{n,} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆ n āļ„āļĢāļąāđ‰āļ‡ āļŦāļĢāļ·āļ­āļĄāļēāļāļāļ§āđˆāļē
{n,m} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆ n āļ„āļĢāļąāđ‰āļ‡āļˆāļ™āļ–āļķāļ‡ m āļ„āļĢāļąāđ‰āđ‰āļ‡
char āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ° char
-E ‘pattern1 .* pattern2’ āļ„āđ‰āļ™āļŦāļē pattern1 āđāļĨāļ° pattern2
-E ‘pattern1 | pattern2’ āļ„āđ‰āļ™āļŦāļē pattern1 āļŦāļĢāļ·āļ­ pattern2
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ grep āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāļ„āļģāļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ls -al
$ ls -al
total 61
drwxr-xr-x 4 student student 4096 2013-09-20 05:09 .
drwxr-xr-x 37 student student 4096 2013-09-11 20:53 ..
-rw-r--r-- 1 student student 5160 2013-09-18 00:04 big.txt
-rw-r--r-- 1 student student 53 2013-08-21 05:16 error.log
-rwxr-xr-x 1 student student 8497 2013-08-21 06:05 hello
-rw-r--r-- 1 student student 93 2013-09-17 19:16 hello.c
drwxr-xr-x 2 student student 4096 2013-09-17 18:04 .my_hidden_directory
-rw-r--r-- 1 student student 0 2013-09-17 18:04 .my_hidden_file
-rw-r--r-- 1 student student 0 2013-09-20 05:09 mytest.txt
-rw-r--r-- 1 student student 72 2013-09-20 05:09 number
-rw-r--r-- 1 student student 0 2013-09-20 04:48 test1.txt
-rw-r--r-- 1 student student 0 2013-09-20 04:48 test.txt
$ ls -al | grep test?.txt
-rw-r--r-- 1 student student 0 2013-09-20 04:48 test1.txt
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ+” āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ grep āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ egrep
(Extended Grep) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ls -al | egrep test+.txt
-rw-r--r-- 1 student student 0 2013-09-20 05:09 mytest.txt
-rw-r--r-- 1 student student 0 2013-09-20 04:48 test.txt
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āđ€āļĨāļ‚āļ•āļēāļĄāļˆāļģāļ™āļ§āļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ [ ] āđāļĨāļ° {n} āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cat numbers
ID 3710166
Telephone No. 0891234122
54
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
City Code 20131
Phone No. 038191772
$ grep "[0-9]{5}$" numbers
City Code 20131
āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ—āļĩāđˆāļĄāļĩāļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 7 āļŦāļĨāļąāļāļ‚āļķāđ‰āļ™āđ„āļ›āļˆāļ°āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ {m, } āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ grep "[0-9]{7,}$" numbers
ID 3710166
Telephone No. 0891234122
Phone No. 038191772
āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ log āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ -E ‘pat-
tern1 | pattern2’ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ log āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ cat data.log
1 Station01 Temp_Sensor 35.4
2 Station02 Flow_Sensor 12.4
3 Station03 Light_Sensor 55
4 Station04 Motion_Sensor ON
5 Station05 Current_Sensor 1.42
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ grep āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļ”āđ‰ 4 āļĢāļđāļ›āđāļšāļš āđ„āļ”āđ‰āđāļāđˆ
(āđāļšāļšāļ—āļĩāđˆ 1) $ grep -i 'station01|station03' data.log
1 Station01 Temp_Sensor 35.4
3 Station03 Light_Sensor 55
(āđāļšāļšāļ—āļĩāđˆ 2) $ grep -i -E 'station01|station03' data.log
1 Station01 Temp_Sensor 35.4
3 Station03 Light_Sensor 55
(āđāļšāļšāļ—āļĩāđˆ 3) $ grep -i -e station01 -e station03 data.log
1 Station01 Temp_Sensor 35.4
3 Station03 Light_Sensor 55
(āđāļšāļšāļ—āļĩāđˆ 4) $ egrep -i 'station01|station03' data.log
1 Station01 Temp_Sensor 35.4
3 Station03 Light_Sensor 55
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡āļ•āđ‰āļ™āļšāļĢāļĢāļ—āļąāļ” āļˆāļ°āđƒāļŠāđ‰ “^” āļ™āļģāļŦāļ™āđ‰āļēāļ„āļģāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŦāļĢāļ·āļ­āļ„āļģāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡
āļ›āļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ” āļˆāļ°āđƒāļŠāđ‰ “$” āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ grep "^Sep 11" messages.1
Sep 11 21:16:58 EE-Burapha rsyslogd: [origin software="rsyslogd" swVersion="4.2.0"
x-pid="691" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Sep 11 21:44:29 EE-Burapha kernel: [ 3077.192891] e1000: eth0 NIC Link is Down
Sep 11 21:45:17 EE-Burapha kernel: [ 3125.462088] e1000: eth0 NIC Link is Up 1000
Mbps Full Duplex, Flow Control: None
55
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down
Sep 11 21:47:04 EE-Burapha kernel: [ 3227.275574] e1000: eth0 NIC Link is Up 1000
Mbps Full Duplex, Flow Control: None
...
$ grep "Link is Down$" messages.1
Sep 11 21:44:29 EE-Burapha kernel: [ 3077.192891] e1000: eth0 NIC Link is Down
Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down
Sep 11 21:47:07 EE-Burapha kernel: [ 3230.682704] e1000: eth0 NIC Link is Down
Sep 11 21:53:34 EE-Burapha kernel: [ 3310.165309] e1000: eth0 NIC Link is Down
Sep 11 21:54:02 EE-Burapha kernel: [ 3338.102673] e1000: eth0 NIC Link is Down
...
āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ—āļĩāđˆāļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ  āļ™āļģāļŦāļ™āđ‰āļēāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐāđ€āļŠāļĄāļ­ āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ grep "255.255.255.255" syslog.1
Sep 18 11:36:12 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 3
Sep 18 11:36:13 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
Sep 18 19:54:11 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 3
Sep 18 19:54:12 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
Sep 20 04:50:05 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 5
Sep 20 04:50:06 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
āļ•āļēāļĢāļēāļ‡ 1.10 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep
OPERATOR DESCRIPTION
[:digit:] āđ€āļ‰āļžāļēāļ°āļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 0 āļ–āļķāļ‡ 9
[:alnum:] āļ—āļąāđ‰āļ‡āļ•āļąāļ§āļ­āļąāļāļĐāļĢ A āļ–āļķāļ‡ Z āļŦāļĢāļ·āļ­ a āļ–āļķāļ‡ z āđāļĨāļ°āļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 0 āļ–āļķāļ‡ 9
[:alpha:] āļ•āļąāļ§āļ­āļąāļāļĐāļĢ A āļ–āļķāļ‡ Z āļŦāļĢāļ·āļ­ a āļ–āļķāļ‡ z
[:blank:] āđ€āļ‰āļžāļēāļ°āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ (Space) āđāļĨāļ°āđāļ—āđŠāļ› (TAB) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
āļˆāļēāļāļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āđƒāļ™āđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļāļ‚āļķāđ‰āļ™ āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
$ grep "anacron[[[:digit:]]+]" /var/log/syslog.1
Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.daily' terminated
Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.weekly' started
Sep 18 08:50:17 EE-Burapha anacron[27530]: Updated timestamp for job
`cron.weekly' to 2013-09-18
Sep 18 08:50:18 EE-Burapha anacron[27155]: Job `cron.weekly' terminated
...
56
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļĢāļ§āļĄāļ„āļģāļŠāļąāđˆāļ‡āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āļ”āđ‰āļ§āļĒāļŠāļąāļāļāļĨāļąāļāļĐāļ“āđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Pipe (|) āđ‚āļ”āļĒāđ€āļ­āļēāļ—āđŒāļžāļļāļ•āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ•
āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļŠāļđāđˆāļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ”āļąāļ‡āļ™āļĩāđ‰
$ ls <āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ> | grep <āļ„āļģāļ„āđ‰āļ™āļŦāļē>
$ ls -al | grep "^d"
drwxr-xr-x 4 student student 4096 2013-09-21 02:21 .
drwxr-xr-x 37 student student 4096 2013-09-11 20:53 ..
drwxr-xr-x 2 student student 4096 2013-09-17 18:04 .hidden_directory
drwxr-xr-x 2 student student 4096 2013-09-17 18:03 out
awk
Awk āļĒāđˆāļ­āļĄāļēāļˆāļēāļāļ•āļąāļ§āļ­āļąāļāļĐāļĢāđāļĢāļāļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļ„āļ™āđ„āļ”āđ‰āđāļāđˆ Aho, Weinberger, āđāļĨāļ° Kernighan
āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ™āļīāļ”āļŦāļ™āļķāđˆāļ‡āļ‹āļķāđˆāļ‡āļĄāļĩāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļ›āđ‡āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ (structured
data) āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļĢāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰ āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡ awk āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
â€Ē awk āļˆāļ°āļĄāļ­āļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩ āđ€āļĢāļ„āļ­āļĢāđŒāļ” (record) āđāļĨāļ° āļŸāļīāļĨāļ”āđŒ (eld)
â€Ē awk āļˆāļ°āļĄāļĩāļ•āļąāļ§āđāļ›āļĢ (variables) āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ (conditional statement) āđāļĨāļ°āļŠāļļāļ”āļ„āļģ
āļŠāļąāđˆāļ‡āļ—āļģ
āļ‹āđ‰āļģ (loop statement) āđ€āļŦāļĄāļ·āļ­āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđˆāļ§āđ„āļ›
â€Ē awk āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļĨāļ‚āļ„āļ“āļīāļ• (arithmetic) āđāļĨāļ°āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (string)
â€Ē awk āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļĢāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰
āļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™
awk '/search pattern1/ {Actions}
/search pattern2/ {Actions}' file
āđ‚āļ”āļĒāļ—āļĩāđˆ search pattern āļāđ‡āļ„āļ·āļ­āļŠāļļāļ” regular expression āļŠāđˆāļ§āļ™ Actions āļāđ‡āļ„āļ·āļ­āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāļīāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cat data.log
1 Station01 Temp_Sensor 35.4
2 Station02 Flow_Sensor 12.4
3 Station03 Light_Sensor 55
4 Station04 Motion_Sensor ON
5 Station05 Current_Sensor 1.42
$ awk '/Station01/
> /Station02/' data.log
1 Station01 Temp_Sensor 35.4
2 Station02 Flow_Sensor 12.4
57
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
awk āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ€āļĢāļ„āļ„āļ­āļĢāđŒāļ”āđƒāļ™āđāļ•āđˆāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļ„āļąāđˆāļ™āļ”āđ‰āļ§āļĒāļ­āļąāļāļ‚āļĢāļ°āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļŸāļīāļĨāļ”āđŒāļĒāđˆāļ­āļĒāđ†āđāļĨāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰
āđƒāļ™āļ•āļąāļ§āđāļ›āļĢ $n āđ‚āļ”āļĒāļ—āļĩāđˆ n āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™āđ€āļĨāļ‚āļŸāļīāļĨāļ”āđŒ āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆ $0 āļˆāļ°āđāļ—āļ™āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āļšāļĢāļĢāļ—āļąāļ”āļ™āļąāđ‰āļ™āđ†
āļŠāđˆāļ§āļ™ $1 āļˆāļ™āļ–āļķāļ‡ $n āļ™āļąāđ‰āļ™āļˆāļ°āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ–āļđāļāđāļĒāļāļ”āđ‰āļ§āļĒāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđāļ•āđˆāļĨāļ°āļ„āļ­āļĨāļąāļĄāļ™āđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ awk '{print $2,$4;}' data.log
Station01 35.4
Station02 12.4
Station03 55
Station04 ON
Station05 1.42
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ $NF āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ„āđˆāļēāļŸāļīāļĨāļ”āđŒāļ•āļąāļ§āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ awk '{print $2,$NF;}' data.log
Station01 35.4
Station02 12.4
Station03 55
Station04 ON
Station05 1.42
āļ„āļģāļŠāļąāđˆāļ‡ awk āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļŠāļģāļ„āļąāļāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļĢāļ°āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļ­āļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ (Initialization) āļāđˆāļ­āļ™āļ—āļĩāđˆāđˆāļˆāļ°
āđ€āļĢāļīāđˆāļĄāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļ•āđˆāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āđāļĨāļ°āļˆāļ°āļāļĢāļ°āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļ­āļ™āļŠāļīāđ‰āļ™āļŠāļļāļ” (Final) āļŦāļĨāļąāļ‡āļˆāļēāļāļšāļĢāļĢāļ—āļąāļ”
āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ BEGIN āđāļĨāļ° END āļ”āļąāļ‡āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
BEGIN { Actions }
{Action} # Action for every lines in a file
END { Actions }
# is for comments in Awk
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ awk āđāļšāļšāđ€āļ•āđ‡āļĄāļĢāļđāļ›
$ awk 'BEGIN {print "Station NametSensor TypetttValue";}
> {print $2,"t",$3,"ttt",$NF;}
> END{print "Report Generatedn--------------";
> }' data.log
Station Name! Sensor Type!! ! Value
Station01 ! ! Temp_Sensor ! ! ! 35.4
Station02 ! ! Flow_Sensor ! ! ! 12.4
Station03 ! ! Light_Sensor ! ! ! 55
Station04 ! ! Motion_Sensor ! ! ! ON
Station05 ! ! Voltage_Sensor ! ! ! 1.42
Report Generated
--------------
58
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ„āļģāļŠāļąāđˆāļ‡āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒ
datalog.script āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāđˆāļ™
$ cat datalog.script
BEGIN {
! print "Station NametSensor TypetttValue";
}
{
! print $2,"t",$3,"ttt",$NF;
}
END {
! print "Report Generatedn--------------";
}
$ awk -f datalog.script data.log
Station Name! Sensor Type!! ! Value
Station01 ! ! Temp_Sensor ! ! ! 35.4
Station02 ! ! Flow_Sensor ! ! ! 12.4
Station03 ! ! Light_Sensor ! ! ! 55
Station04 ! ! Motion_Sensor ! ! ! ON
Station05 ! ! Voltage_Sensor ! ! ! 1.42
Report Generated
--------------
āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļāļēāļĢāļ”āļđāļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ†āļ™āļąāđ‰āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļēāļˆāļˆāļ°āļĄāļĩ
āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āđƒāļŦāđ‰āļĄāļĩāļšāļĢāļīāļāļēāļĢ Web Server āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļĄāļēāļ”āļđāļŠāļ–āļēāļ™āļ°āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđŠ
āļ›āļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāđāļ—āđŠāļ HTML
(HTML Tag) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ awk āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ”āļēāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cat datalog_html.script
BEGIN{
title="Sensor Station";
print "<html>n<title>"title"</title><body bgcolor="#ffffff">n<table bor-
der=1><th colspan=2 align=centre>Station Details</th>";
}
{
station_name=$2;
sensor=$3;
value=$NF;
print "<tr><td>"station_name"</td><td>"sensor"</td><td>"value"</td></tr>";
}
END {
print "</table></body>n</html>";
}
āļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ script āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē (datalog_html.script) āđāļĨāļ°āđ€āļāđ‡āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāđāļ—āđ‡āļ
HTML āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ sensor.html āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ awk -f datalog_html.script data.log > sensor.html
59
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ cat sensor.html
<html>
<title>Sensor Station</title><body bgcolor="#ffffff">
<table border=1><th colspan=2 align=centre>Station Details</th>
<tr><td>Station01</td><td>Temp_Sensor</td><td>35.4</td></tr>
<tr><td>Station02</td><td>Flow_Sensor</td><td>12.4</td></tr>
<tr><td>Station03</td><td>Light_Sensor</td><td>55</td></tr>
<tr><td>Station04</td><td>Motion_Sensor</td><td>ON</td></tr>
<tr><td>Station05</td><td>Voltage_Sensor</td><td>1.42</td></tr>
</table></body>
</html>
āļ—āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ sensor.html āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāđ€āļžāļ·āđˆāļ­āļ”āļđāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™
āļĢāļđāļ›āļ—āļĩāđˆ 1.12 āđāļŠāļ”āļ‡āļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļš HTML
āļ„āļģāļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
iptables
iptables āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļ„āļąāļāļ­āļĩāļāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­
āļ‚āđˆāļēāļĒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒ (rewall) āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ­āļ­āļāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™ āļœāļđāđ‰
āļ”āļđāđāļĨāļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļĢāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡
iptables āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ
āļ āļēāļĒāđƒāļ™ iptables āļ™āļąāđ‰āļ™āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ•āļēāļĢāļēāļ‡ (tables) āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ•āļēāļĢāļēāļ‡āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļēāļĒ
āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē chain (āļ—āļĩāđˆ iptables āđ€āļ•āļĢāļĩāļĒāļĄāļĄāļēāđƒāļŦāđ‰āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡) āđāļĨāļ°āļ āļēāļĒāđƒāļ™āđāļ•āđˆāļĨāļ° chain
āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ­āļ­āļāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē rule āļ”āļąāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
60
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Rule 1
Rule 2
Rule 3
Chain 1
Rule 1
Rule 2
Rule 3
Chain 2
Rule 1
Rule 2
Rule 3
Chain 1
Rule 1
Rule 2
Rule 3
Chain 2
Table 1 Table 2
āļĢāļđāļ›āļ—āļĩāđˆ 1.13 āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļāļāļ‚āļ­āļ‡ iptables
iptables āļˆāļ°āļ–āļđāļāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļēāļĢāļēāļ‡āđƒāļŦāđ‰āđāļĨāđ‰āļ§ 4 āļ•āļēāļĢāļēāļ‡ (4 built-in tables) āđ„āļ”āđ‰āđāļāđˆ
1. Filter Table
2. NAT Table
3. Mangle Table
4. Raw Table
āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡ iptables āļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļ 3 āļŠāđˆāļ§āļ™āđ„āļ”āđ‰āđāļāđˆ
â€Ē INPUT  āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļŠāļđāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
â€Ē OUTPUT āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļ­āļāļˆāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
â€Ē FORWARD āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļŠāđˆāļ‡āļ•āđˆāļ­āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāđƒāļ™āļŠāļđāđˆāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāļ™āļ­āļ āļ‹āļķāđˆāļ‡āļāļēāļĢāļšāļĨāđ‡āļ­āļ
āļžāļ­āļĢāđŒāļ•āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ
Routing
Decision Forward
Input Output
Incoming Outgoing
Local Process
āļĢāļđāļ›āļ—āļĩāđˆ 1.14 āđ‚āļŸāļĨāļ§āđŒāļŠāļēāļĢāđŒāļ•āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
61
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡āļ āļēāļĒāđƒāļ™ iptables
$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
āđ‚āļ”āļĒāļ—āļĩāđˆ
â€Ē ACCEPT āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļĒāļ­āļĄāđƒāļŦāđ‰āđāļžāđ‡āļāđ€āļāđ‡āļ• (packet) āļœāđˆāļēāļ™āđ„āļ›āļĒāļąāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡āđ„āļ”āđ‰
â€Ē DROP āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļ—āļīāđ‰āļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļąāļ™āļ—āļĩ āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđāļˆāđ‰āļ‡āļœāļđāđ‰āļŠāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļŠāđˆāļ‡āđ„āļĄāđˆāļŠāļģāđ€āļĢāđ‡āļˆ
â€Ē REJECT āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļ—āļīāđ‰āļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļąāļ™āļ—āļĩ āđāļĨāļ°āļœāļđāđ‰āļŠāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāđˆāļēāļ™ ICMP āļ•āļ­āļšāļāļĨāļąāļšāļ–āļķāļ‡
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļŠāđˆāļ‡
āđ„āļĄāđˆāļŠāļģāđ€āļĢāđ‡āļˆ
â€Ē QUEUE āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđāļžāđ‡āļāđ€āļāđ‡āļ• āđ„āļ›āļĒāļąāļ‡āļŠāđˆāļ§āļ™āļĢāļ°āļšāļšāļšāļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (userspace)
â€Ē RETURN āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ chain āđāļĨāđ‰āļ§āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡ Chain āđ€āļ”āļīāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē
āļ™āļĩāđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ iptables āđ‚āļ”āļĒāļŦāļĨāļąāļāļāļēāļĢāļŠāļģāļ„āļąāļāļ„āļ·āļ­ āļ„āļ§āļĢāļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđˆāļ­āļ™āđāļĨāđ‰āļ§āļˆāļķāļ‡
āļ„āđˆāļ­āļĒāđ€āļĨāļ·āļ­āļāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļĩāļĨāļ°āļžāļ­āļĢāđŒāļ•āļˆāļ°āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļŠāļļāļ”
$ IPTABLES -P FORWARD DROP      #CLOSE PORT ALL
$ IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
$ IPTABLES -A FORWARD -p tcp --dport 53 -j ACCEPT    #DNS
$ IPTABLES -A FORWARD -p udp --dport 53 -j ACCEPT #DNS
$ IPTABLES -A FORWARD -p udp --dport 67 -j ACCEPT #DHCP
$ IPTABLES -A FORWARD -p udp --dport 69 -j ACCEPT #TFTP
$ IPTABLES -A FORWARD -p udp --dport 111 -j ACCEPT  #NFS
$ IPTABLES -A FORWARD -p udp --dport 2049 -j ACCEPT  #NFS
$ IPTABLES -A FORWARD -p udp --dport 32700 -j ACCEPT #NFS
$ IPTABLES -A FORWARD -p tcp --dport 80 -j ACCEPT #HTTP
$ IPTABLES -A FORWARD -p tcp --dport 8080 -j ACCEPT  #HTTP
$ IPTABLES -A FORWARD -p tcp --dport 443 -j ACCEPT  #HTTPS
$ IPTABLES -A FORWARD -p tcp --dport 8443 -j ACCEPT  #HTTPS
$ IPTABLES -A FORWARD -p tcp --dport 20 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p udp --dport 20 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p tcp --dport 21 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p udp --dport 21 -j ACCEPT #FTP
$ IPTABLES -A FORWARD -p tcp --dport 22 -j ACCEPT #SSH
$ IPTABLES -A FORWARD -p tcp --dport 23 -j ACCEPT #TELNET
62
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ­āļĢāđŒāļ•āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļ›āļīāļ”āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ bootload-
er,āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ° āđ€āļĢāļĩāļĒāļ root lesystem āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 4 āļ–āļķāļ‡ 5 āļžāļ­āļĢāđŒāļ• āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 1.11 āļĢāļēāļĒāļāļēāļĢ services āļ—āļĩāđˆāļ–āļđāļāđ€āļ›āļīāļ”āđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
SERVICE PORT NAME PORT NO. TCP/IP PROTOCOL
DHCP bootps 67 UDP
TFTP tftp 69 UDP
NFS
sunrpc 111 UDP
NFS nfs 2049 UDPNFS
mountd 32700 āļŦāļĢāļ·āļ­ 32772 UDP
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒ āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļĢāļ°āļšāļšāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
$ sudo /etc/init.d/iptables off
TCP UDP
IP
Ethernet, Token-Right, FDDI, X.25, Wireless,ATM,SNA...
HTTP Kerb Xwin SMTP Telnet FTP DNS TFTP RPC
NFS
NCS SNMP
PING
Trace
Route
ICMP
ARP RARP
MIME
āļĢāļđāļ›āļ—āļĩāđˆ 1.15 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ TCP/IP
TFTP
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Trivial File Transfer Protocol (TFTP) āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡
āļĢāļ°āļšāļš āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļĢāļđāđ‰āļˆāļąāļ FTP āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰
āļŠāļēāļĄāļēāļĢāļ–āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ­āļąāļžāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāđ„āļ”āđ‰ āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļš TFTP āļ™āļąāđ‰āļ™
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļ™āđ‰āļ­āļĒāļāļ§āđˆāļē FTP āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ•āļąāļ§āļ•āļ™ (authentication) āđāļĨāļ°
āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ UDP āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ TFTP āļāđ‡āļĒāļąāļ‡āļ–āļđāļāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđƒāļ™āļāļēāļĢ
āļŠāđˆāļ‡āđ„āļŸāļĨāđŒ conguration āļ•āđˆāļēāļ‡āđ†āļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ TFTP āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ host āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ image āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ
āļ‚āđˆāļēāļĒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ› āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install xinetd tftp-hpa tftpd-hpa
63
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļ•āđˆāļ–āđ‰āļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 11.10 āļĨāļ‡āļĄāļē āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install xinetd tftp tftpd
$ sudo mkdir /tftpboot
āļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ tftpboot āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ
/etc/xinetd.conf āđāļĨāļ°āđāļāđ‰āđ„āļ‚āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ TFTP_DIRECTORY āļ—āļĩāđˆāļ–āļđāļāļĢāļ°āļšāļļāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒ /etc/
default/tftpd-hpa (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ›)
$ sudo vim /etc/xinetd.conf
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
}
$ sudo vim /etc/default/tftpd-hpa (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ›)
TFTP_USERNAME="tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
TFTP_DIRECTORY="/home/training/tftpboot"
āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļšāļĢāļīāļāļēāļĢ xinetd āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ sudo /etc/init.d/xinetd restart
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ•āđ‰āļ™āļ‰āļšāļąāļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /tftpboot/ āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
$ sudo echo ‘This is a data’ > /tftpboot/myfile
āļœāļđāđ‰āđƒāļŠāđ‰āđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāđ‚āļ”āļĒāļāļēāļĢāļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡ TFTP server āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ tftp <Host IP> <----- āļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ TFTP server
tftp> get myfile
Received 16 bytes in 0.1 seconds
tftp> quit 
64
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
DHCP
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļŦāļĨāļēāļĒāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāđ‰āļ­āļ‡āļ‚āļ­āļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Address āđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āļĄāļąāļ™āđ€āļ­āļ‡
āļŦāļĢāļ·āļ­āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļˆāļ°āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļˆāđˆāļēāļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Address āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ
DHCP āđƒāļŦāđ‰āļāļąāļšāļĨāļđāļāļ‚āđˆāļēāļĒāļŦāļĢāļ·āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (target board) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°
āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ DHCP server āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ­āļ‡ āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install isc-dhcp-server
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ /etc/dhcp/dhcpd.conf āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļ›āđ‡āļ™ DHCP Server āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄ
āļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
$ sudo vim /etc/dhcp/dhcpd.conf
subnet 192.168.0.0 netmask 255.255.255.0 {
host targetboard {
fixed-address 192.168.0.2;
! server-name "192.168.0.1";
option router "192.168.0.1";
hardware ethernet 12:34:56:78:9a:bc;
option root-path "/rootfs";
filename uImage;
}
}
āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ dhcpd.conf āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ DHCP server āļˆāļ°āļˆāđˆāļēāļĒ IP Address āđƒāļŦāđ‰āļāļąāļšāļšāļ­āļĢāđŒāļ”
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩ MAC address āđ€āļ›āđ‡āļ™ 12:34:56:78:9a:bc āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāļ„āđˆāļē MAC address āļšāļ™
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļŦāđ‰āļ•āļĢāļ‡āļ•āļēāļĄāļ„āđˆāļē MAC Address āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ DHCP Server āļĢāļđāđ‰āļˆāļąāļāđƒāļŦāđ‰āļ•āļĢāļ‡āļāļąāļ™
NFS
nfs āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļžāļ·āđˆāļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆ
āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļŦāđˆāļēāļ‡āļ­āļ­āļāđ„āļ›āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļŠāļĄāļ·āļ­āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ­āļ‡ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāđ‰āļ§āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ nfs āļĄāļĩāļœāļĨāļ—āļģāđƒāļŦāđ‰āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŦāļĢāļ·āļ­āļāļēāļĢ
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļĨāđˆāļ­āļ‡āļ•āļąāļ§āđāļĨāļ°āļŠāļ°āļ”āļ§āļāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™āđāļĨāļ°āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ‚āļ™āļēāļ”
āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāđ„āļŸāļĨāđŒ root le system (RFS) āđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ”āđ€āļĢāļ­
āļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ NFS
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļŠāļĢāđ‡āļˆ āđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāļ‡
āđ€āļ‚āđ‰āļēāđ„āļ› root le system āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāļāđ‡āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđƒāļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđ€āļŠāđˆāļ™ Flash Memory āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
65
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ­āļĢāđŒāļ”
Target
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
Host
DHCP
TFTP
NFS mount
NFS rootFS
āļ•āļąāđ‰āļ‡āļ„āđˆāļē IP
Kernel image
āļĢāļ°āļšāļšāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļšāļ­āļĢāđŒāļ” Target
Makele NFS Server
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļ
āđāļŠāļĢāđŒ
NFS Cient
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļ
āđāļŠāļĢāđŒ
āļĢāļđāļ›āļ—āļĩāđˆ 1.16 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ mount āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ NFS
āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ‚āđ‰āļēāļāļąāļš Network File System āļ™āļąāđ‰āļ™
āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ nfs-kernel-server āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ /etc/exports āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install rpcbind nfs-kernel-server
$ sudo mkdir /rootfs
$ sudo vim /etc/exports
/rootfs 192.168.0.2(rw,sync,no_subtree_check,no_root_squash)
/rootfs localhost(rw,sync,no_subtree_check,no_root_squash)
āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ service āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ sudo service xinetd restart
$ sudo service tftpd-hpa restart
$ sudo service isc-dhcp-server restart
$ sudo service rpcbind-boot stop
$ sudo service nfs-kernel-server stop
$ sudo service rpcbind-boot start
$ sudo service nfs-kernel-server start
āđ„āļŸāļĨāđŒ /etc/exports āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ”āđƒāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļāļ‚āđˆāļēāļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ„āļ”āđ‰ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ mount –t nfs nfs_server_Address:/rootfs/ /mnt/rfs
*āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ shell script āļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ tftp & nfs āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ
http://goo.gl/XuB1EZ
66
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 2 āļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel) āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ 3 āļ›āļĢāļ°āđ€āļ āļ— āđ„āļ”āđ‰āđāļāđˆ
â€ĒMonolithic kernel āđ€āļŠāđˆāļ™ Linux Kernel, MS-DOS, Microsoft Windows 9x Series
â€ĒMicro kernel āđ€āļŠāđˆāļ™ AIX, AmigaOS, Android OS, Haiku, L4 microkernel family āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€ĒHybrid kernel āđ€āļŠāđˆāļ™ BeOS kernel, NetWare kernel, ReactOS kernel, NT kernel Windows
NT kernel (Windows 2000/Windows XP/Windows 2003/Windows Vista), 8.XNU kernel
(āđƒāļŠāđ‰āđƒāļ™ Mac OS X) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ—āļĢāļēāļšāļāļąāļ™āļ”āļĩāļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” monolithic kernel āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡
āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŦāļĨāļąāļāđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Kernel āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
User
mode
Application
Kernel
mode
System
Operating sytem
VFS, System call
IPC, File System
Scheduler, Virtual Memory
Device Drivers, Dispatcher...
Hardware
āļĢāļđāļ›āļ—āļĩāđˆ 2.1 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Monolithic Kernel
āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ Micro Kernel āļ—āļĩāđˆāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļąāļ‡āļ„āļ‡āļ—āļģāđƒāļ™ Kernel āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡
āđ‚āļ›āļĢāđ€āļ‹āļŠ (inter-process communication) āļāļēāļĢāļˆāļąāļ”āļĨāļģāļ”āļąāļšāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāļ™āļžāļļāļ•/āđ€āļ­āļēāļ—āđŒāļžāļļāļ• (basic
input/output scheduling) āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (memory management) āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āļ·āđˆāļ™āđ†āļˆāļ°
āļ—āļģāļ āļēāļĒāļ™āļ­āļ Kernel āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ drivers, network stack, le systems
67
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Kernel
mode
User
mode
Application
Application IPC
Hardware
UNIX
Server
Device
Driver
File
Server
IPC, Virtual Memory, Scheduling
Kernel
mode Kernel
mode
User
mode
āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Micro Kernel
Linux Kernel
āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°
āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđ‚āļ”āļĒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļāļēāļĢāđŒāļ”āđāļŠāļ”āļ‡āļœāļĨ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāļ™āļžāļļāļ•āđāļĨāļ°
āđ€āļ­āļēāļ—āđŒāļžāļļāļ• āđ€āļĄāļēāļŠāđŒ āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ‹āļ­āļŸāđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļĨāļ°
āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™ Kernel āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļ„āļ·āļ­ Kernel Module āđāļĨāļ°
Device Driver āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ
āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āđˆāļ­āđ„āļ› āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđƒāļŠāđ‰
āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļš
C Library
āđ‚āļ›āļĢāđāļāļĢāļĄ A
āđ‚āļ›āļĢāđāļāļĢāļĄ Bāđ„āļĨāļšāļĢāļēāļĢāļĩ A
Linux Kernel
Hardware
āđ€āļĢāļĩāļĒāļ Kernel module āđāļˆāđ‰āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āđāļĨāļ°
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†
āļˆāļąāļ”āļāļēāļĢāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđāļˆāđ‰āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ
āļĢāļđāļ›āļ—āļĩāđˆ 2.3 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ
68
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļļāļ”āđ€āļ”āđˆāļ™āļŠāļģāļ„āļąāļāļ­āļĩāļāļˆāļļāļ”āļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ•āļąāđ‰āļ‡āđāļ•āđˆāđƒāļ™āļ­āļ”āļĩāļ•āļˆāļ™āļ–āļķāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™
āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļŠāļ·āđˆāļ­āđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /arch āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰ 2 āđāļšāļšāļ„āļ·āļ­āđāļšāļš
32 āļšāļīāļ• āđ€āļŠāđˆāļ™ arm, avr32, blackn, m68k, microblaze, mips, score, sparc, um, x86, powerpc
āđāļĨāļ°āļāļĨāļļāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļšāļš 64 āļšāļīāļ• āđ€āļŠāđˆāļ™ alpha, arm64, ia64, sparc64, tile, x86_64, powerpc
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
arch/<arch>/Kconfig, arch/<arch>/README āļŦ āļĢ āļ· āļ­ āđƒ āļ™ āđ„ āļ” āđ€ āļĢ āļ āļ— āļ­ āļĢ āļĩ
Documentation/<arch>/ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĒāļąāļ‡āļ–āļđāļāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™ āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰
āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢ
āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ†āđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļˆāļēāļāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ—āļĩāđˆāļ”āļđāđāļĨāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļˆāļēāļ
āļ—āļąāđˆāļ§āđ‚āļĨāļāđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđƒāļ„āļĢāđāļ­āļšāļ‹āđˆāļ­āļ™āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ„āļĄāđˆāļžāļķāļ‡āļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāđ„āļĄāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļŦāđ‰āļāļąāļšāļĢāļ°āļšāļšāđ‚āļ”āļĒāļĢāļ§āļĄ
āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āļšāļēāļ‡āļ•āļąāļ§āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰
āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļēāļ‡āļ•āļąāļ§āļ—āļĩāđˆ
āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰
LINUX VERSIONING
āđ‚āļ”āļĒāļ›āļāļ•āļīāļ—āļļāļ 2-3 āļ›āļĩ āļˆāļ°āļĄāļĩāļāļēāļĢāļ­āļ­āļāļĢāļļāđˆāļ™āđ€āļŠāļ–āļĩāļĒāļĢ (stable) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļ„āļđāđˆ āđ€āļŠāđˆāļ™ 1.0.x, 2.0.x,
2.2.x, 2.4.x, 2.6.x, 3.0.x āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āđƒāļŦāļĄāđˆāđ†āđ€āļ‚āđ‰āļēāđ„āļ›āđāļĨāļ°āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ‚āļ„āđ‰āļ”āļŠāļļāļ”
āđƒāļŦāļāđˆ āļāđ‡āļˆāļ°āļ­āļ­āļāđ€āļĨāļ‚āļĢāļļāđˆāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļ„āļĩāđˆ āđ€āļŠāđˆāļ™ 2.1.x, 2.3.x, 2.5.x āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđƒāļ™
āļĢāļ°āļ”āļąāļšāđ€āļĨāđ‡āļāļĨāļ‡āļĄāļē (Minor release) āļˆāļ°āđƒāļŠāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļĨāļ‚āļĢāļļāđˆāļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļŠāļēāļĄ āđ€āļŠāđˆāļ™ 2.5.12, 2.6.39
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
2.4.22.4.12.4.0 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8
2.5.0 2.5.1 2.5.2 2.5.3 2.6.0 2.6.1
Stable
Development Stable
āļĢāļđāļ›āļ—āļĩāđˆ 2.4 āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļ­āļāđ€āļĨāļ‚āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ‚āļ­āļ‡ Linux Kernel
āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2003 āļ–āļķāļ‡ āļ„.āļĻ. 2011 āļĢāļļāđˆāļ™ 2.6.x āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļĒāļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĒāļēāļ§āļ™āļēāļ™āļĄāļēāļāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āļ­āļēāļˆāđ€āļ™āļ·āđˆāļ­āļ‡
āļĄāļēāļˆāļēāļāļŠāđˆāļ§āļ‡āļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļĒāļļāļ„āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™
69
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļ­āļžāđˆāļ§āļ‡āļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļļāļ™āđāļĢāļ‡āđāļĨāļ°āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āļĒāļļāļ„āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļ™āļīāļ”āļžāļāļžāļē āđ€āļŠāđˆāļ™
Laptop, Netbook, Mobile Internet Device, Smart Phone, Tablet
āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 3.0 āļāđ‡āđ€āļĢāļīāđˆāļĄāļ›āļĢāļ°āļāļēāļĻāđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢāđƒāļ™āđ€āļ”āļ·āļ­āļ™ āļāļĢāļāļāļēāļ„āļĄ āļ›āļĩāļ„.āļĻ. 2011 āļ‹āļķāđˆāļ‡
āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āļĒāļąāļšāļ•āļąāļ§āđ€āļĨāļ‚āļˆāļēāļ 2.6 āđ„āļ›āļŠāļđāđˆ 3.0 āļ—āļĩāđˆāļĒāļēāļ§āļ™āļēāļ™āđāļ•āđˆāļāļĨāļąāļšāđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļāđ‰āđ„āļ‚āđƒāļ™āļĢāļ°āļ”āļąāļšāđ‚āļ„āđ‰āļ”āļĄāļēāļāđāļ•āđˆ
āļ­āļĒāđˆāļēāļ‡āđƒāļ” āļ‚āļ™āļēāļ”āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.x āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđ‚āļ”āļĒāļĢāļ§āļĄāļ­āļĒāļđāđˆāļ›āļĢāļ°āļĄāļēāļ“ 434 MB āļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āđ„āļŸāļĨāđŒāļ–āļķāļ‡
39,400 āļāļ§āđˆāļēāđ„āļŸāļĨāđŒ (āļĄāļēāļāļāļ§āđˆāļē 14,800,000 āļšāļĢāļĢāļ—āļąāļ”) āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ—āļģāļāļēāļĢāļšāļĩāļšāļ­āļąāļ”āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ”
āļ„āļ§āļĢāļˆāļ°āđ€āļ›āđ‡āļ™āļ™āļēāļĄāļŠāļāļļāļĨ .xz (āļĨāļ”āļĨāļ‡āđ„āļ›āđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“ 85.7%)
āļāļĢāļ“āļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ”āļ”āđ‰āļ§āļĒāļ‚āļ™āļēāļ”āđ€āļžāļĩāļĒāļ‡ 1.3 MB
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļĨāļ°āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.2
arch/<arch>
char
mm
drivers
fs
block
net
include
mtd/ide net pci serial usb ...
linux asm-<arch>
init kernel ipc lib scripts tools
crypto rmware security sound ...
linux
āļĢāļđāļ›āļ—āļĩāđˆ 2.5 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ
70
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 2.6 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ
āļĢāļđāļ›āļ—āļĩāđˆ 2.7 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āļ™āļēāļ”āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 2.2 āļ–āļķāļ‡ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.3
drivers/
54%
arch/
21%
fs/
7%
sound/
5%
net/
4%
include/
4%
firmware/
1%
kernel/
1%
other
3%
71
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļēāļĢāļēāļ‡ 2.1 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ Kernel code
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
arch/<architecture> Architecture specic code
arch/<architecture>/include/asm Architecture and machine dependent headers
arch/<architecture>/mach-
<machine>
Machine/board specic code
block Block layer code
COPYING Linux copyright conditions (GNU GPL)
CREDITS Linux main contributors
crypto/ Cryptographic libraries
Documentation/ Kernel Documentation. Don’t miss!
drivers/ All device drivers expect sound ones (usb, pci..)
fs/ Filesystems (fs/ext3/, etc.)
include/ Kernel headers
include/linux Linux kernel core headers
init/ Linux initialization (including main.c)
ipc/ Code used for process communication
Kbuild Part of the kernel build system
Kernel/ Linux kernel core (very small!)
lib/ Misc library routines
MAINTAINERS Maintain of each kernel part. Very Useful!
Makele Top Linux Makele (Set arch and version)
mm/ Memory Management code
net/ Network support codes (not drivers)
README Overview and Build Instructions
REPORTING-BUGS Bug report instruction
samples/ Sample codes (markers, kprobes, kobjects)
scripts/ Scripts for internal or external uses
security/ Security Model Implementation (SELinux...)
sound/ Sound support codes and drivers
usr/ Code to generate an initramfs cpio archive.
72
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Custom Kernel
āđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĢāļ·āļ­āļ­āļąāļžāđ€āļ”āļ—āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāđˆāļ­āļ™
āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ uname āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ uname -a
Linux EE-Burapha 2.6.32-42-server #96-Ubuntu SMP Wed Aug 15 19:52:20
UTC 2012 x86_64 GNU/Linux
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™:
â€ĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ„āļ·āļ­ Linux āđƒāļŠāđ‰ Ubuntu Linux distro
â€ĒāļĢāļļāđˆāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ„āļ·āļ­ 2.6.32
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86_64 (64 āļšāļīāļ•)
â€ĒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­ āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāđāļĨāļ°āđ€āļ§āļĨāļēāļ—āļĩāđˆ Kernel āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļēāļĄāļĨāļģāļ”āļąāļš
āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĒāļĩāđˆāļŦāđ‰āļ­ Ubuntu, Fedora āļŦāļĢāļ·āļ­ FreeBSD āļœāļđāđ‰āđƒāļŠāđ‰āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™
āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ­āļ°āđ„āļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆ
āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ—āļŦāļĢāļ·āļ­āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ–āļđāļāđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āļ­āļąāļžāđ€āļāļĢāļ” āļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļĄāļĩ
āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 2.8 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Update Manager
73
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ‹āļ­āļĢāđŒāļŠāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ
āđ€āļžāļ·āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļ”āļąāļ‡āļ™āļĩāđ‰
â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡ āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļ āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļš
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Linux Module āļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡
â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄ device driver āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āļąāļ§āđƒāļŦāļĄāđˆ āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ
â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļŦāļĢāļ·āļ­ āļ”āļĩāļšāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ­āļĒāđˆāļēāļ‡āļĨāļ°āđ€āļ­āļĩāļĒāļ”
5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ LINUX KERNEL
āļāđˆāļ­āļ™āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļœāļđāđ‰
āđ€āļ‚āļĩāļĒāļ™āļˆāļ°āļ‚āļ­āļ­āļ˜āļīāļšāļēāļĒ 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļˆāļ°
āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡āļšāļ—āļ–āļąāļ”āđ†āđ„āļ›āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļˆāļ°āļ™āļģāđ„āļ›āļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 - āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđ€āļŠāļ–āļĩāļĒāļĢāļ•āļąāļ§āļĨāđˆāļēāļŠāļļāļ” (Latest Stable Linux Kernel)
āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāļĄāđˆāđ†āļ—āļĩāđˆāļ–āļđāļāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ–āļđāļāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āļ”āļĩāļ‚āļķāđ‰āļ™ āđ„āļ”āđ‰
āļˆāļēāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļŦāļĨāļąāļ http://www.kernel.org āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo su
# cd /usr/src/
# wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.3.tar.xz
# tar -xvJf linux-3.9.3.tar.xz
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 - āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Conguration)
āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ‰āļĄāļēāļāļāļ§āđˆāļē 3,000 āļĢāļēāļĒāļāļēāļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļĄāļēāļāļĄāļēāļĒāđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļ”āļąāļšāđƒāļŦāđ‰āđ„āļ”āđ‰āļāļ§āđ‰āļēāļ‡āļ—āļĩāđˆāļŠāļļāļ”āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļš
āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļąāđ‰āļ‡āđƒāļ™āļ­āļ”āļĩāļ•āđāļĨāļ°āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āđ€āļŠāđˆāļ™āļāļąāļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļ­āļ‡āļāđ‡āļŠāļēāļĄāļēāļĢāļ–
āļžāļąāļ’āļ™āļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāđ†āļ‚āļ­āļ‡āļ•āļ™āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”
āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āđ„āļĨāļšāļĢāļēāļĢāļĩ libncurses āđāļĨāļ°
libncurses-devel āļĨāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ•āļ™āđƒāļŠāđ‰āļ­āļĒāļđāđˆāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđ€āļŠāļĩāļĒāļāđˆāļ­āļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ sudo
apt-get install libncurses libncurses-devel āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆ
āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ€āļĄāļ™āļđ āđāļĨāđ‰āļ§āļˆāļķāļ‡āļšāļąāļ™āļ—āļķāļāļ„āđˆāļē congure āļ•āđˆāļēāļ‡āđ†āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē “.cong”
āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āđˆāļ­āđ„āļ›
74
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĄāļĩāļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāđāļšāļšāđ€āļŠāđˆāļ™āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make cong, make menucong, make xcong āđāļĨāļ°
make oldcong āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ›āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđˆāļ­
āđ„āļ›āļ™āļĩāđ‰
â€Ē make config āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļĢāļļāđˆāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļĢāļļāđˆāļ™āđāļĢāļāđ† āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāļāļēāļĢ
āļ•āļąāđ‰āļ‡āļ„āđˆāļē option āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļ­āļšāļ„āļģāļ–āļēāļĄāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđƒāļ™āļĨāļąāļāļĐāļ“āļ° (y/n)
â€Ē make menuconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāđƒāļŦāđ‰āđƒāļŠāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 1.3 āđāļĨāļ°āļĢāļļāđˆāļ™ 2.0 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āļ‹āļķāđˆāļ‡
āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ„āļĨāđ‰āļēāļĒāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļš Text mode āđāļĨāļ°āļĄāļĩ
āļāļēāļĢāļˆāļąāļ”āļāļĨāļļāđˆāļĄāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļ­āļāđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ€āļ āļ—āđ†
75
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€Ē make xconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāđƒāļŦāđ‰āđƒāļŠāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 1.3 āđāļĨāļ°āļĢāļļāđˆāļ™ 2.0 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ›āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
āļ„āļģāļŠāļąāđˆāļ‡ make menucong āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ€āļĄāļ™āļđāđƒāļ™āļĢāļđāļ›āđāļšāļš Graphic
mode āļšāļ™ x-window āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡ qt āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĢāļ°āļšāļšāđ€āļŠāļĩāļĒāļāđˆāļ­āļ™
â€Ē make oldconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāđ„āļŸāļĨāđŒ .cong āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļŦāļĢāļ·āļ­āļ™āļģāļĄāļēāļˆāļēāļāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļāļēāļĢ
āļ•āļąāđ‰āļ‡āļ„āđˆāļē default āļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļĩāđˆāļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ System-on-
Chip (SoC) āļˆāļēāļāļŦāļĨāļēāļĒāđ†āļ„āđˆāļēāļĒāļ—āļĩāđˆāļ–āļđāļāļšāļĢāļĢāļˆāļļāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ <linux>/arch/x86/configs/
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 āļĢāļļāđˆāļ™ i386 āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Intel āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make
i386_defconfig
āļŠāļēāļĄāļēāļĢāļ–āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ defcong āļ—āļĩāđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .cong āļ•āđ‰āļ™āđāļšāļšāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
# find ./arch -name "*_defconfig" -type f
./arch/x86/configs/x86_64_defconfig
./arch/x86/configs/i386_defconfig
./arch/x86/configs/goldfish_defconfig
./arch/xtensa/configs/iss_defconfig
./arch/xtensa/configs/s6105_defconfig
./arch/xtensa/configs/common_defconfig
./arch/cris/configs/etrax-100lx_defconfig
...
# cd linux-3.9.3
# make menuconfig
āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ â€œ.cong” āļ­āļ­āļāļĄāļēāļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ§āđˆāļē
āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ”āļšāđ‰āļēāļ‡ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ†
76
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
 	
  	
  	
  	
  	
  	
  	
  	
  	
  
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 - āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel
āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđāļšāļšāļŦāļĨāļēāļĒāđāļāļ™ āļ—āļĩāđˆāļ™āļīāļĒāļĄ
āđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Multi-core CPU āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđāļĨāļ°
āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ•āļēāļĄāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -j āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āđāļāļ™
āļ„āļđāļ“āļŠāļ­āļ‡ (cores x 2) āđ€āļŠāđˆāļ™ make -j8 āđ‚āļ”āļĒāļ—āļĩāđˆāļ•āļąāļ§āđ€āļĨāļ‚ 8 āļŦāļĄāļēāļĒāļ–āļķāļ‡āļˆāļģāļ™āļ§āļ™āđāļāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡
āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļąāđ‰āļ™ (4-core) āļ„āļđāļ“āļŠāļ­āļ‡ āļ‹āļķāđˆāļ‡āļĄāļĩ 3 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļĒāđˆāļ­āļĒāļ”āļąāļ‡āļ™āļĩāđ‰
# make -j8
āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Kernel Image āđ€āļ­āļēāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļđāļ•āđ€āļ‚āđ‰āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļĄāļēāđ€āļ›āđ‡āļ™ bzImage
(āļŠāļģāļŦāļĢāļąāļš x86) āļŦāļĢāļ·āļ­ zImage (āļŠāļģāļŦāļĢāļąāļš ARM) āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/<āļŠāļ·āđˆāļ­āļŠāļ–āļēāļ›āļąāļ•āļāļĢāļĢāļĄ>/
boot/*Image
# make modules
77
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Kernel modules āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ‚āļŦāļĨāļ” device drivers āļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āđ‚āļĄāļ”āļđāļĨāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļ•āđˆāļēāļ‡āđ† āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ .ko
# make modules_install
āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Kernel modules āļ—āļĩāđˆāļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ­āļ­āļāļĄāļē (.ko) āđ€āļžāļ·āđˆāļ­āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
/lib/modules/3.9.3/
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 - āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ
āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļĨāļĩ
āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot
āļŦāļĨāļąāļ‡āļˆāļēāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
# make install
āļĢāļēāļĒāļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
/boot āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰
arch/arm/kernel/head.o
arch/arm/kernel/init-atask.o
init
usr/built-in.o
arch/arm/kernel
arch/arm/mm
arch/arm/common
arch/arm/mach-ixp4xx
arch/arm/nwfpe
kernel
mm
fs
ipc
security
lib/lib.a
arch/arm/lib
lib
drivers
net
vmlinux
78
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€Ē vmlinuz-3.9.3 (actual kernel)
â€Ē System.map-3.9.3 (symbols exported
by the kernel)
â€Ē initrd.img-3.9.3 (initrd image is
temporary RFS used during boot
process)
â€Ē config-3.9.3 (kernel configuration
file)
â€Ē vmlinuz-3.9.3 (actual kernel)
āļĢāļđāļ›āļ—āļĩāđˆ 2.9 āļĢāļđāļ›āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ vmlinux
āļ•āļēāļĢāļēāļ‡ 2.2 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ vmlinux
COMPONENT DESCRIPTION
arch/arm/kernel/head.o Kernel architecture-specific startup code.
init_task.o Initial thread and task structs required by
kernel.
init/built-in.o Main kernel-initialization code.
usr/built-in.o Built-in initramfs image.
arch/arm/kernel/built-in.o Architecture-specific kernel code.
arch/arm/mm/built-in.o Architecture-specific memory-management
code.
arch/arm/common/built-in.o Architecture-specific generic code. Varies by
architecture.
arch/arm/mach-ixp4xx/built-
in.o
Machine-specific code, usually initialization.
arch/arm/nwfpe/built-in.o Architecture-specific floating point-
emulation code.
kernel/built-in.o Common components of the kernel itself.
mm/built-in.o Common components of memory-
management code.
ipc/built-in.o Interprocess communications, such as SysV
IPC.
security/built-in.o Linux security components.
lib/lib.a Archive of miscellaneous helper functions.
arch/arm/lib/lib.a Architecture-specific common facilities. Var-
ies by architecture.
lib/built-in.o Common kernel helper functions.
drivers/built-in.o All the built-in drivers not loadable modules.
sound/built-in.o Sound drivers.
net/built-in.o Linux networking.
.tmp_kallsyms2.o Symbol table.
79
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5 - āļāļēāļĢāļšāļđāļ—āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļđāđˆāļ•āļąāļ§āđƒāļŦāļĄāđˆ
āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāļĨāļ‡āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļĄāļ™āļđāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ
grub.cfg āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļšāđāļĨāđ‰āļ§ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļāđ‡āđ€āļžāļĩāļĒāļ‡āļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĩāļ
āļ„āļĢāļąāđ‰āļ‡āđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
# reboot āļŦāļĢāļ·āļ­ shutdown -r now
āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āļ•āļąāļ§āđƒāļŦāļĄāđˆāđ„āļ”āđ‰āđ‚āļ”āļĒāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡
$ uname -r
3.9.3
āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ:
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āļĨāļšāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļ­āļ
â€Ē make clean āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē (./congure) āđāļĨāļ°āļ–āļđāļ
āļ„āļ­āļĄāđ„āļžāļĨāđŒ (make) āđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāđ€āļāļ·āļ­āļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
â€Ē make mrproper āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļĢāļ§āļĄ
āļ—āļąāđ‰āļ‡āļĨāļšāđ„āļŸāļĨāđŒ .cong
â€Ē make distclean āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē (./congure)
āđāļĨāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒ (make) āđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
80
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.X āļŠāļģāļŦāļĢāļąāļš UBUNTU āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆ
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Linux distro āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ubuntu āđ‚āļ”āļĒāļ›āļāļ•āļīāđāļĨāđ‰āļ§āļ•āļąāļ§ Ubuntu āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļļāđˆāļ™ 10.x
āļ‚āļķāđ‰āļ™āđ„āļ›āļˆāļ°āđƒāļŠāđ‰āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 2.6.32 āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ
āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™ 3.9.3, 3.8, 3.7, 3.4.6, 3.3, 3.2, 3.1 āļŦāļĢāļ·āļ­ 3.0.x āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļĢāļļāđˆāļ™ 3.0 āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Kernel āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļ—āļĩāđˆāļ”āļĩāļžāļ­āđ€āļžāļĢāļēāļ°āļ–āđ‰āļēāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļēāļˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰
āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļ­āļĩāļ āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļĢāļīāđˆāļĄāļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļĄāļēāļāļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļ™āļķāļ‡āđāļĨāđ‰āļ§āļāđ‡āļ„āđˆāļ­āļĒ
āļ—āļģāļāļēāļĢ patch āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āļŠāļđāļ‡āļ‚āļķāđ‰āļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™ 3.0.0 āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ āđāļĨāļ°
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ ubuntu 12.04)
$ sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev
asciidoc binutils-dev linux-source qt3-dev-tools libqt3-mt-dev
libncurses5 libncurses5-dev fakeroot build-essential crash kexec-tools
makedumpfile kernel-wedge kernel-package
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļēāļ kernel.org āđāļĨāđ‰āļ§āđāļ•āļāđ„āļŸāļĨāđŒāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /usr/src/
$ sudo su
# cd /usr/src/
# wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.tar.xz
# tar -xvJf linux-3.0.0.tar.xz
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļĄāļĩāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļĒāļđāđˆ
āļžāļ­āļŠāļĄāļ„āļ§āļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļŸāļĨāđŒ .cong āđ€āļ”āļīāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļēāđƒāļŠāđ‰āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ
# cp -vi /boot/config-`uname -r` .config
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāđ„āļŸāļĨāđŒ .cong āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļīāļĄ
āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Linux Kernel Modules āđ€āļ”āļīāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļļāđˆāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ”āđ‰āļ§āļĒ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
# make oldconfig āđƒāļŦāđ‰āļāļ” Enter āđ„āļ›āđ€āļĢāļ·āđˆāļ­āļĒāđ†āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āđˆāļē defaults āļ‚āļ­āļ‡ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ
# make localmodconfig
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ‚āļ­āļ‡ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ (3.0.0) āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
81
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
# make menuconfig āļŦāļĢāļ·āļ­ make xconfig
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ•āļąāļ§āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđāļĒāļāđāļĒāļ°āļ­āļ­āļāđ„āļ”āđ‰āļˆāļēāļāļ•āļąāļ§āļŦāļĨāļąāļāļ—āļĩāđˆāļĄāļĩāđƒāļ™āļĢāļ°āļšāļšāđ€āļ”āļīāļĄ āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļ local
version āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļˆāļēāļāđ€āļĨāļ‚āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđ€āļŠāđˆāļ™ āļ„āļģāļ§āđˆāļē “-burapha” āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ€āļĄāļ™āļđ General Setup
āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ â€œLocal version” āđ€āļžāļ·āđˆāļ­āđƒāļŠāđˆāļŠāļ·āđˆāļ­āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļ â€œAutomatically append version
info”
āđāļĨāļ°āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ le system āđ€āļ›āđ‡āļ™ ext4 āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ “File systems”
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļ§āļĄāļ–āļķāļ‡ Kernel Modules āļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļĨāļ·āļ­āļāđ„āļ§āđ‰āļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
# make -j4
82
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
# make modules_install <----- āļ•āļīāļ”āļ•āļąāđ‰āļ‡ modules āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/
# update-initramfs -u -k 3.0.0-burapha
# make install <----- āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļŸāļĨāđŒāļŦāļĨāļąāļāļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot/
āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļĩāđ‰
â€Ēvmlinuz-3.0.0-burapha
â€ĒSystem.map-3.0.0-burapha
â€Ēinitrd.img-3.0.0-burapha
â€Ēconfig-3.0.0-burapha
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļĢāļĩāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ—āđ„āļŸāļĨāđŒ grub.cfg āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot/grub/ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.0.0-burapha
Found initrd image: /boot/initrd.img-3.0.0-burapha
Found linux image: /boot/vmlinuz-3.0.0-burapha.old
Found initrd image: /boot/initrd.img-3.0.0-burapha
Found linux image: /boot/vmlinuz-2.6.32-42-server
Found initrd image: /boot/initrd.img-2.6.32-42-server
Found memtest86+ image: /boot/memtest86+.bin
done
āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļąāļžāđ€āļāļĢāļ”āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ uname -r
3.0.0-burapha
$ uname -a
Linux EE-Burapha 3.0.0-burapha #2 SMP Sun Aug 4 03:32:15 PDT 2013 x86_64 GNU/
Linux
83
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļē Linux Kernel Module
āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” monolithic kernel āļāļēāļĢāļ—āļģāļ‡āļēāļ™
āļ āļēāļĒāđƒāļ™ Kernel āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Linux kernel
modules (LKMs) āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ™āļģāđ€āļ‚āđ‰āļē-āļ­āļ­āļāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ‚āļ”āļĒāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡
āđ„āļŸāļĨāđŒ LKM (āļŠāļģāļŦāļĢāļąāļš kernel 2.6) āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE - Burapha University");
MODULE_DESCRIPTION("hello world test driver");
static int __init module_start(void)
{
printk(KERN_INFO "Hello world ! module is loadedn");
return 0;
}
static void __exit module_unload(void)
{
printk(KERN_INFO "Goodbye world ! module is removedn");
}
module_init(module_start);
module_exit(module_unload);
Module
macros
Module
Constructor/
Destructor
Exit
macros
āļĢāļđāļ›āļ—āļĩāđˆ 2.10 āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ Linux Kernel Module
LKM āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ”āļđāđāļĨāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļ
āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ›āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļš āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™
āļ”āđ‰āļēāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory Management) āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Inter-
processing Communication - IPC) āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļĨāļģāļ”āļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠ (Scheduling) āđ‚āļ”āļĒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ°
āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ LKM āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āļŦāļĢāļ·āļ­ mod-
probe
84
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Linux KernelModule
register_capability()module_init()
Kernel
functions
module_exit() unregister_capability()
capabilities[]
Module
functions
Function call
Function pointer
Data pointer
insmod
rmmod
āļĢāļđāļ›āļ—āļĩāđˆ 2.11 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ Kernel āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļ‚āļšāļ§āļ™āļāļēāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ LKM āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 2.6.x āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™
āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ‚āļŦāļĨāļ” LKM āļˆāļēāļāļĢāļ°āļ”āļąāļšāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod (insert
module) āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ module_init() āļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ (register) āļāļąāļšāļ•āļąāļ§āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāđˆāļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™
āļŠāļ·āđˆāļ­āļ§āđˆāļē register_capability() āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļ•āļąāļ§āļŠāļĩāđ‰ (pointer) āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āļ•āļąāļ§āđāļ›āļĢāļ­āļēāđ€āļĢāļĒāđŒāļŠāļ·āđˆāļ­ â€œcapabili-
ties” āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļāļģāļŦāļ™āļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļē
āļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ capabilities āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™ Kernel āļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļ—āļēāļ‡ system
calls āđ„āļ”āđ‰āļ•āđˆāļ­āđ„āļ›āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ rmmod (remove module) āļˆāļēāļāļĢāļ°āļ”āļąāļšāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰
(user-space) āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ module_exit() āļāđ‡āļˆāļ°āļŠāļąāđˆāļ‡āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāđ‰āļ§āļ–āļ­āļ™āļ•āļąāļ§ LKM āļ™āļąāđ‰āļ™āļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāļ§āļēāļ‡āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user-
space) āđāļĨāļ°āļ āļēāļĒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (kernel-space)
User-spaceKernel-space
rmmodinsmod
init_module delete_module
sys_init_module sys_delete_module
. . . . . .
Utilities
System Calls
Kernel
Functions
āļĢāļđāļ›āļ—āļĩāđˆ 2.12 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļš Linux Kernel Module
85
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ (driver) āļ­āļēāļˆāļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĢāļ§āļĄāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ§āļāļĄāļąāļ™āļāđ‡āļˆāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāļšāļđāļ—āļ—āļąāļ™āļ—āļĩ (Boot Processes)
āđ€āļĢāļēāļˆāļ°āđ€āļĢāļĩāļĒāļāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ§āđˆāļē Static Module āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļšāļēāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđāļšāļš
LKM āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ–āļđāļāļ™āļģāļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļĄāļ·āđˆāļ­āđƒāļ”āļāđ‡āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ§āđˆāļē Dy-
namic Module
Application
le_open = write("/dev/foo", buffer, count);
data
buffer
Character device driver
dev_write {
copy_data_buffer_from_app();
}
fops
chrdevs
File
descriptor
syscall
Table
major:251
minor:5
major:251
minor:5
User-space
Kernel-space
āļĢāļđāļ›āļ—āļĩāđˆ 2.13 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (write op-
eration) āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ write() āļāđ‡āļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ (INT instruction) āļ—āļĩāđˆ
āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (write operation) āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ•āļēāļĢāļēāļ‡ system call (syscall[ ] table)
āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ ïŽeldes āļˆāļ°āļšāļĢāļĢāļˆāļļāļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļļāļ›āļāļĢāļ“āđŒāļŦāļĨāļąāļ (major device number) āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ write āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļĨāļĩ
āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļˆāļ°āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ buffer āļˆāļēāļāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļĢāļ°āļ”āļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āļĄāļēāļĒāļąāļ‡āļŠāđˆāļ§āļ™
āļ‚āļ­āļ‡āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (kernel-space) āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļšāļąāļ™āļ—āļķāļāļĨāļ‡āđƒāļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļ­āđ„āļ›
āđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļˆāļ°āđ€āļ›āđ‡āļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Dynamic Kernel
module āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āđāļĨāļ°āļˆāļ°āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒ LKM āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļ
āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/$(uname -r) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™ āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™
āļĨāđˆāļēāļ‡
$ ls /lib/modules/$(uname -r)
build modules.dep modules.pcimap
kernel modules.dep.bin modules.seriomap
modules.alias modules.ieee1394map modules.symbols
modules.alias.bin modules.inputmap modules.symbols.bin
86
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
modules.builtin modules.isapnpmap modules.usbmap
modules.builtin.bin modules.ofmap source
modules.ccwmap modules.order
āļŠāđˆāļ§āļ™āđ„āļŸāļĨāđŒāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/$(uname -r)/
kernel/drivers/ āļĨāļ‡āđ„āļ›āļ­āļĩāļāļŠāļąāđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™ āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡
$ ls /lib/modules/$(uname -r)/kernel/drivers/
acpi edac infiniband mmc rtc video
ata firewire input mtd scsi virtio
atm firmware isdn net serial w1
auxdisplay gpio leds parport spi watchdog
block gpu md pci ssb xen
bluetooth hid media pcmcia staging
char hwmon memstick platform telephony
crypto i2c message power uio
dca idle mfd pps usb
dma ieee1394 misc regulator uwb
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ modprobe āđāļĨāļ° modinfo āđƒāļ™āļāļēāļĢāļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļāļąāļš kernel module
$ sudo su
# modinfo lp.ko
filename: lp.ko
license: GPL
alias: char-major-6-*
srcversion: 84EA21D13BD2C67171AC994
depends: parport
vermagic: 3.0.0-burapha SMP mod_unload modversions
parm: parport:array of charp
parm: reset:bool
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ„āļģāļŠāļąāđˆāļ‡ lsmod āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ LKM āļ—āļĩāđˆ
āļāļģāļĨāļąāļ‡āļ–āļđāļāđ‚āļŦāļĨāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ“ āļ‚āļ“āļ°āļ™āļĩāđ‰
$ lsmod
Module Size Used by
binfmt_misc 7568 1
acpiphp 17958 0
snd_ens1371 22663 2
gameport 9869 1 snd_ens1371
snd_ac97_codec 125146 1 snd_ens1371
btusb 13027 0
ac97_bus 1450 1 snd_ac97_codec
snd_pcm_oss 39673 0
snd_mixer_oss 15604 1 snd_pcm_oss
snd_pcm 87151 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss
snd_seq_dummy 1750 0
snd_seq_device 6594 5
snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq
87
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
bluetooth 94536 1 btusb
snd 70476 14
snd_ens1371,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_seq_oss,snd_
rawmidi,snd_seq,snd_timer,snd_seq_device
intel_agp 11978 1
ppdev 6504 0
lp 9893 0
parport_pc 29880 1
serio_raw 4720 0
intel_gtt 16812 1 intel_agp
i2c_piix4 8879 0
soundcore 7860 1 snd
snd_page_alloc 8500 1 snd_pcm
joydev 10705 0
shpchp 28186 0
parport 37333 3 ppdev,lp,parport_pc
usbhid 39022 0
hid 87524 1 usbhid
floppy 63772 0
e1000 103861 0
vmw_pvscsi 15397 0
mptspi 16441 2
mptscsih 34985 1 mptspi
mptbase 93915 2 mptspi,mptscsih
vmxnet3 39295 0
āļ„āļģāļŠāļąāđˆāļ‡ modprobe (āļŦāļĢāļ·āļ­ insmod) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļŦāļĨāļ” LKM āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļĨāļ° modprobe -r
(āļŦāļĢāļ·āļ­ rmmod) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ–āļ­āļ™ LKM āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ•āļēāļĄāļĨāļģāļ”āļąāļš
$ modprobe ppdev āļŦāļĢāļ·āļ­ insmod ppdev.ko
$ modprobe -r ppdev āļŦāļĢāļ·āļ­ rmmod ppdev.ko
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ LINUX MODULE
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Linux Module āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄ
āļĢāļ°āļšāļšāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļ•āļąāļ§āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āļīāļ”āļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļ•āļąāļ§ Ubuntu āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ‚āļ›āļĢāđāļāļĢāļĄ
āļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļĨāļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļąāļ”
āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĨāļĩ
āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āđˆāļ‡āđ„āļŸāļĨāđŒāđ€āļŪāļ”āđ€āļ”āļ­āļĢāđŒ (linux header) āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļāđˆāļ­āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ API
(Application Programming Interface) āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ—āļģāļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ„āđ‰āļ™āļŦāļēāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ•āļĢāļ‡āļāļąāļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Ubuntu āļ—āļĩāđˆāđƒāļŠāđ‰
$ apt-cache search linux-source*
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.32 - Linux kernel source for version 2.6.32 with Ubuntu
patches
$ apt-cache search linux-headers-$(uname -r)
88
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
linux-headers-2.6.32-42-server - Linux kernel headers for version 2.6.32 on
x86_64
āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install linux-headers-$(uname -r) linux-source-2.6.37
$ cd /usr/src/
$ ls
linux-headers-2.6.32-42-server.tar.bz2 linux-source-2.6.32.tar.bz2
$ tar -xjvf linux-headers-2.6.32-42-server.tar.bz2 linux-
source-2.6.32.tar.bz2
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Kernel Module “Hello world”
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ kernel module āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ hello-driver.c āđāļĨāđ‰āļ§
āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/kernel_module/
$ mkdir ~/kernel_module
$ vim hello-driver.c
/*
* hello-driver.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
static int __init module_start(void)
{
printk(KERN_INFO "Hello world ! module is loadedn");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
static void __exit module_unload(void)
{
printk(KERN_INFO "Goodbye world ! module is removedn");
}
module_init(module_start);
module_exit(module_unload);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE - Burapha University"); /* Who wrote this module? */
MODULE_DESCRIPTION("hello world test driver"); /* What does this module do */
89
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello-driver.c
$ vim Makefile
obj-­‐m	
  	
  =	
  hello-­‐driver.o
all:	
  
	
   make	
  -­‐C	
  /lib/modules/$(shell	
  uname	
  -­‐r)/build	
  M=$(PWD)	
  modules	
  
clean:	
  
	
   make	
  -­‐C	
  /lib/modules/$(shell	
  uname	
  -­‐r)/build	
  M=$(PWD)	
  clean
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make āđƒāļ™āļāļēāļ™āļ°āļŠāļīāļ—āļ˜āļīāđŒ root āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨ
$sudo su
# make
make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module
modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server'
CC [M] /home/student/kernel_module/hello-driver.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/student/kernel_module/hello-driver.mod.o
LD [M] /home/student/kernel_module/hello-driver.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server'
# ls
hello-driver.c hello-driver.mod.c hello-driver.o modules.order
hello-driver.ko hello-driver.mod.o Makefile Module.symvers
āļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āļ•āļąāļ§āđ‚āļĄāļ”āļđāļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ dmesg
(debug kernel message) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
# insmod hello-driver.ko
# dmesg | tail -n1
[68587.257467] Hello world ! module is loaded
āļ–āļ­āļ™āđ‚āļĄāļ”āļđāļĨāļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ rrmod
# rmmod hello-driver.ko
# dmesg | tail -n1
[68621.602044] Goodbye world ! module is removed
90
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡ Linux kernel module
āļˆāļēāļāļĢāļđāļ›āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļšāđˆāļ‡āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 5 āļŠāđˆāļ§āļ™ āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļāļˆāļ°āļ­āļĒāļđāđˆāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™
init āđāļĨāļ° exit āđāļĨāļ°āļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđ‡āļ•āđˆāļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ–āļ­āļ™ LKM āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE - Burapha University");
MODULE_DESCRIPTION("hello world test driver");
void my_procedure(void)
{
printk(KERN_INFO "Here is procedure...n");
}
static int __init module_start(void)
{
printk(KERN_INFO "Hello world ! module is loadedn");
my_procedure();
return 0;
}
static void __exit module_unload(void)
{
printk(KERN_INFO "Goodbye world ! module is removedn");
}
module_init(module_start);
module_exit(module_unload);
Module
macros
Module
Constructor/
Destructor
Exit
macros
C
Headers
Procedure
module
āļĢāļđāļ›āļ—āļĩāđˆ 2.14 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļšāļšāđ€āļ•āđ‡āļĄāļ‚āļ­āļ‡ Linux Kernel Module
āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļŠāđˆāļ§āļ™āļšāļ™āļŠāļļāļ”āļ„āļ·āļ­āļŠāđˆāļ§āļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ (C Headers) āđ‚āļ”āļĒāļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĨāļąāļāđ†āļ­āļĒāđˆāļēāļ‡
āļ™āđ‰āļ­āļĒāļŠāļ­āļ‡āļ•āļąāļ§āļ„āļ·āļ­ linux/module.h	
   āđāļĨāļ° linux/kernel.h	
   āļŠāđˆāļ§āļ™āļ–āļąāļ”āļĄāļēāļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļĒāđˆāļ­āļĒ
(Procedure Program) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļĒāđˆāļ­āļĒāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļ āđāļĨāļ°āļŠāđˆāļ§āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ„āļ·āļ­āļŠāđˆāļ§āļ™
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨ (modules description) āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļ˜āļīāļšāļēāļĒāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļ
āđāļŠāļ”āļ‡āļ­āļ­āļāļĄāļēāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ modinfo āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE	
  -­‐	
  Burapha	
  University");	
  	
  	
  /*	
  Who	
  wrote	
  this	
  module?	
  */
MODULE_DESCRIPTION("hello	
  world	
  test	
  driver");	
  /*	
  What	
  does	
  this	
  module	
  do	
  */
$ modinfo hello-driver.ko
filename: hello-driver.ko
description: hello world test driver
author: EE - Burapha University
license: GPL
srcversion: E36F5E4D3F232F0A1C18AEF
depends:
vermagic: 2.6.32-42-server SMP mod_unload modversions
91
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļš CHARACTER DEVICE
āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļˆāļ°āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļēāļĄāļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°
āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāđˆāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒ (device) āļ­āļ­āļ
āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ— āđ„āļ”āđ‰āđāļāđˆ
1. Character device āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āđ‰āļ­āļĄāļļāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄ (stream) āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ—āļĩāļĨāļ°āđ€āļžāļĩāļĒāļ‡ 1 āđ‚āļ›āļĢ
āđ€āļ‹āļŠāđ€āļŠāļĄāļ·āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļ›āļāļ•āļīāļ—āļąāđˆāļ§āđ„āļ›
2. Block device āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āđāļšāļšāļāļąāļ­āļ™ (block) āđƒāļŠāđ‰āļāļĢāļ“āļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢ
āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļĒāđ‰āļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļŠāđˆāļ™ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
Application
Virtual Filesystem
Hardware
Device Driver
User-space
Kernel-space
/dev/ttyUSB0
Device le
major:116
minor:7
major:116
minor:7
...
...
Read/Write
āļĢāļđāļ›āļ—āļĩāđˆ 2.15 āđāļŠāļ”āļ‡āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ„āđˆāļē major āđāļĨāļ° minor
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒ /dev/ttyUSB0 āļ—āļĩāđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆ
āļāļąāļšāļžāļ­āļĢāđŒāļ• USB āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ­āļ™āļļāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡
āļŦāļĄāļēāļĒāđ€āļĨāļ‚ (major āđāļĨāļ° minor) āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ›āļĢāļ°āđ€āļ āļ—āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŦāļĨāļąāļāđāļĨāļ°āļ•āļąāļ§āļĒāđˆāļ­āļĒāļĨāļ‡āđ„āļ›āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°
āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ chardev.c āļˆāļ°āđāļŠāļ”āļ‡āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđ„āļŸāļĨāđŒ device āļŠāļ·āđˆāļ­ /dev/
chardev āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē
/*
* chardev.c: Creates a read-only char device that says how many times
* you've read from the dev file
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* for put_user */
92
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
/*
* Prototypes - this would normally go in a .h file
*/
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
#define SUCCESS 0
#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */
#define BUF_LEN 80 /* Max length of the message from the device */
/*
* Global variables are declared as static, so are global within the file.
*/
static int Major; /* Major number assigned to our device driver */
static int Device_Open = 0; /* Is device open?
* Used to prevent multiple access to device */
static char msg[BUF_LEN]; /* The msg the device will give when asked */
static char *msg_Ptr;
static char msg_data[BUF_LEN] ="NONE n" ; /*initial msg for write mode */
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
/*
* This function is called when the module is loaded
*/
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk(KERN_ALERT "Registering char device failed with %dn", Major);
return Major;
}
printk(KERN_INFO "I was assigned major number %d. To talk ton", Major);
printk(KERN_INFO "the driver, create a dev file withn");
printk(KERN_INFO "'mknod /dev/%s c %d 0'.n", DEVICE_NAME, Major);
printk(KERN_INFO "Try various minor numbers. Try to cat and echo ton");
printk(KERN_INFO "the device file.n");
printk(KERN_INFO "Remove the device file and module when done.n");
return SUCCESS;
93
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
}
/*
* This function is called when the module is unloaded
*/
void cleanup_module(void)
{
/*
* Unregister the device
*/
unregister_chrdev(Major, DEVICE_NAME);
printk(KERN_ALERT "Error in unregister_chrdev:n");
}
/*
* Methods
*/
/*
* Called when a process tries to open the device file, like
* "cat /dev/mycharfile"
*/
static int device_open(struct inode *inode, struct file *file)
{
static int counter = 0;
if (Device_Open)
return -EBUSY;
Device_Open++;
sprintf(msg, "I already told you %d times . Data in device is %s n", coun-
ter++,msg_data);
msg_Ptr = msg;
try_module_get(THIS_MODULE);
return SUCCESS;
}
/*
* Called when a process closes the device file.
*/
static int device_release(struct inode *inode, struct file *file)
{
Device_Open--; /* We're now ready for our next caller */
/*
* Decrement the usage count, or else once you opened the file, you'll
* never get get rid of the module.
*/
module_put(THIS_MODULE);
return 0;
}
94
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
/*
* Called when a process, which already opened the dev file, attempts to
* read from it.
*/
static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */
char *buffer, /* buffer to fill with data */
size_t length, /* length of the buffer */
loff_t * offset)
{
/*
* Number of bytes actually written to the buffer
*/
int bytes_read = 0;
/*
* If we're at the end of the message,
* return 0 signifying end of file
*/
if (*msg_Ptr == 0)
return 0;
/*
* Actually put the data into the buffer
*/
while (length && *msg_Ptr) {
/*
* The buffer is in the user data segment, not the kernel
* segment so "*" assignment won't work. We have to use
* put_user which copies data from the kernel data segment to
* the user data segment.
*/
put_user(*(msg_Ptr++), buffer++);
length--;
bytes_read++;
}
/*
* Most read functions return the number of bytes put into the buffer
*/
return bytes_read;
}
/*
* Called when a process writes to dev file: echo "hi" > /dev/hello
*/
static ssize_t device_write(struct file *filp, const char *buff, size_t length,
loff_t * off){
int bytes_write ;
for (bytes_write = 0; bytes_write < length && bytes_write < BUF_LEN;
bytes_write++){
get_user(msg_data[bytes_write], buff + bytes_write);
}
95
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
return bytes_write ;
}
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ chardev.c
# cat Makefile
obj-m = chardev.o
all:
! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ„āļ”āđ‰āđ„āļŸāļĨāđŒ chardev.ko āļ­āļ­āļāļĄāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
# make
make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module
modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server'
CC [M] /home/student/kernel_module/chardev.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/student/kernel_module/chardev.mod.o
LD [M] /home/student/kernel_module/chardev.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server'
# ls
chardev.c chardev.mod.o hello-driver.ko hello-driver.o
modules.order
chardev.ko chardev.o hello-driver.mod.c Makefile
Module.symvers
chardev.mod.c hello-driver.c hello-driver.mod.o Makefile_hello
āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āđāļĨāļ°āļ„āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
dmesg āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
# insmod chardev.ko
# dmesg| tail -n6
[70707.121856] I was assigned major number 250. To talk to
[70707.121858] the driver, create a dev file with
[70707.121860] 'mknod /dev/chardev c 250 0'.
[70707.121861] Try various minor numbers. Try to cat and echo to
[70707.121862] the device file.
[70707.121863] Remove the device file and module when done.
96
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ•āļīāļ”āļ•āđˆāļ­āđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāļ•āļąāļ§āļ™āļĩāđ‰āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđāļ—āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļīāļĄ (/dev/chardev)
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ chardev.ko āđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļĨāļšāļ­āļ­āļāđ„āļ›āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ”āđ‰āļ§āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ­āļļāļ›āļāļĢāļ“āđŒ
āļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ /dev/my_chardev āđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđƒāļŦāđ‰āđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚ major āđāļĨāļ° minor āđ€āļ”āļīāļĄ (major:250 āđāļĨāļ°
minor:0) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
# mknod /dev/my_chardev c 250 0
# ls -al /dev/my_chardev
crw-r--r-- 1 root root 250, 0 2013-09-23 22:22 /dev/my_chardev
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļ /dev/my_chardev
# cat /dev/my_chardev
I already told you 0 times . Data in device is NONE
āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāļđāđˆāđƒāļ™ device āđ€āļĨāļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļĨāļ­āļ‡āļ—āļ”āļŠāļ­āļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒ /
dev/my_chardev āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
# echo "Hi...My device" > /dev/my_chardev
# cat /dev/my_chardev
I already told you 2 times . Data in device is Hi...My device
āļāļēāļĢāđ€āļžāļīāđˆāļĄ LINUX MODULE āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡ LINUX SOURCE TREE
āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļŦāļĢāļ·āļ­ LKM āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ§āļĄāđ‚āļ„āđ‰āļ”
āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļ•āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŦāļĨāļąāļāđ€āļ”āļĩāļĒāļ§āļāļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āļ­āļ·āđˆāļ™āđ†
āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ make menucong āđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āļŠāļ°āļ”āļ§āļ
āļ‚āļķāđ‰āļ™
āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāđ‚āļ›āļĢāđāļāļĢāļĄ LKM āļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāļ™āļĩāđ‰āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ drivers/misc āļ‚āļ­āļ‡
āļ‹āļ­āļĢāđŒāļŠāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ‚āļ­āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ hello-driver.c
$ cp ~/kernel_module/hello-driver.c /usr/src/linux-source-$(uname -r)
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ› āđƒāļŦāđ‰āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ drivers/misc/Kcong āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ€āļĄāļ™āļđāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ™āļĩāđ‰
config HELLO_WORLD_MODULE
    tristate "hello world module"
    depends on X86 <----- āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđ‚āļĄāļ”āļđāļĨāļ•āļąāļ§āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļžāļīāđˆāļĄ āđ€āļŠāđˆāļ™ ARM
    default m if X86 <----- āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ m āļŦāļĢāļ·āļ­ y āđ„āļ”āđ‰ āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰
    help
97
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
      hello world module.
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ drivers/misc/Makele āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ LKM āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ
obj-­‐$(CONFIG_HELLO_WORLD_MODULE)+=	
  hello-­‐driver.o
āđāļĨāļ°āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ€āļĄāļ™āļđāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
make menucong āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ€āļĄāļ™āļđ Device Drivers āđ€āļĨāļ·āļ­āļāđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
98
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļĄāļ”āļđāļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļĄāļ”āļđāļĨāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ root le system āļ•āļąāļ§āđƒāļŦāļĄāđˆ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ make modules
$ make modules_install INSTALL_MOD_PATH=$ROOTFS
99
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 3 EMBEDDED LINUX DEVELOPMENT
āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļēāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļĒāļļāļ„āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1930 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ
āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ—āļĩāļĨāļ°āļ‡āļēāļ™ (single task) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āđ€āļ§āļĨāļēāļœāđˆāļēāļ™āđ„āļ›āļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢāļ‚āļ­āļ‡
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āļŠāļīāļŸāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāļ āļēāļĒāđƒāļ™āđ€āļĨāđ‡āļāļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ.
1940 āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļēāļ„āļ§āļšāļ„āļļāļĄāļ‚āļĩāļ›āļ™āļēāļ§āļļāļ˜āļ™āļģāļ§āļīāļ–āļĩ (Missile) āļŠāļģāļŦāļĢāļąāļšāļāļ­āļ‡āļ—āļąāļžāļ—āļŦāļēāļĢ āļ‹āļķāđˆāļ‡
āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļąāļ™āļŠāļĄāļąāļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļĒāļļāļ„āļ™āļąāđ‰āļ™āļāđ‡āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ "Apollo Guidance Computer" āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡
āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Charles Stark Draper āļ“ āđāļĨāđ‡āļ› MIT Instrumentation āđāļ•āđˆāđ‚āļ›āļĢāđ€āļˆāļ„āļ•āļąāļ§āļ™āļĩāđ‰āļĒāļąāļ‡āļ–āļđāļāļĄāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄ
āđ€āļŠāļĩāđˆāļĒāļ‡āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ•āđ‰āļ­āļ‡āļ™āļģāļ§āļ‡āļˆāļĢāļ—āļĩāđˆāđ€āļ„āļĒāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĄāļēāļāļĄāļēāļĒāđˆāļ­āđƒāļŦāđ‰āđ€āļĨāđ‡āļāļĨāļ‡āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ™āđ‰āļģāļŦāļ™āļąāļāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļšāļēāļĨāļ‡
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āļāļąāļ‡āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰ āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļœāļĨāļ‡āļēāļ™āļŠāļīāđ‰āļ™āđāļĢāļāļˆāļēāļāđāļĨāđŠāļ› MIT āļāđ‡āļ–āļđāļ
āļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļˆāļ™āļŠāļģāđ€āļĢāđ‡āļˆāđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē Autonetics D-17 guidance computer āđāļĨāļ°āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ›
āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ—āļŦāļēāļĢāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­ Minute missile
āļ•āļąāđ‰āļ‡āđāļ•āđˆāļŠāđˆāļ§āļ‡āļ›āļĩ āļ„.āļĻ. 1961 āļˆāļ™āļ–āļķāļ‡āļ›āļĩ āļ„.āļĻ. 1966 āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļ‚āļ­āļ‡āļ§āļ‡āļˆāļĢāļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļąāļ§
āļ—āļĢāļēāļ™āļ‹āļīāļŠāđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāļ°āđƒāļŠāđ‰āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ āļēāļĒāļ™āļ­āļāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļĄāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāļ™āļģāļŠāļīāļŸāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāđƒāļŦāļĄāđˆ
āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ—āļ™āļ—āļĩāđˆāļ•āļąāļ§āļ—āļĢāļēāļ™āļ‹āļīāļŠāđ€āļ•āļ­āļĢāđŒāđ€āļ”āļīāļĄāļˆāļ™āļ—āļģāđƒāļŦāđ‰āđ„āļ”āđ‰āļ§āļ‡āļˆāļĢāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļĨāļ‡āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļˆāļ™
āļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē Minuteman II
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđāļĨāļ°āļĢāļēāļ„āļēāļ—āļĩāđˆāļĨāļ”āļĨāļ‡āđāļ•āđˆāļĒāļąāļ‡
āļ„āļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļ‚āļķāđ‰āļ™ āļĄāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1971 āļāđ‡āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĒāļļāļ„āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāļĒāļļāļ„āđāļĢāļāļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄ
āļ•āļąāļ§āļ”āđ‰āļ§āļĒāļāļēāļĢāđ€āļ›āļīāļ”āļ•āļąāļ§āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Intel 4004 āļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļ‚āļķāđ‰āļ™āļĄāļēāļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ
āļĨāļēāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļīāļ”āđ€āļĨāļ‚ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ„āļ‡āđƒāļŠāđ‰āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ āļēāļĒāļ™āļ­āļāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ•āđˆāļēāļ‡āļ­āļĒāļđāđˆ āļˆāļ™āļĄāļēāļ–āļķāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ.
1980 āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļœāļ™āļ§āļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļąāļšāļ•āļąāļ§āļŠāļīāļ›āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāļ‹āļķāđˆāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆ
āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļ•āļąāļ§āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ•āļąāļ§āđāļĢāļāļ‚āļ­āļ‡āđ‚āļĨāļāļ„āļ·āļ­
Intel 8048 āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ. 1980 āļāđ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļŦāļ™āļķāđˆāļ‡ āđ€āļĄāļ·āđˆāļ­
Intel āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§ Intel 8051 āļ—āļĩāđˆāļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (software develop-
ments tools) āļˆāļ™āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāļāļēāļĢāļœāļđāđ‰āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ—āļąāđ‰āļ‡āđƒāļ™āļĢāļ°āļ”āļąāļšāļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ
āļšāļĢāļīāļĐāļąāļ—āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļĢāļēāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āđ„āļ›āđƒāļ™āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ
āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ (PROMs) āđāļ•āđˆāļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāđ€āļžāļīāđˆāļĄāļĄāļēāļ­āļĩāļāļ‚āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĨāļš
āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āđāļĨāđ‰āļ§āļšāļąāļ™āļ—āļķāļāđ„āļ”āđ‰āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ EPROM āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāļšāļ”āđ‰āļ§āļĒāđāļŠāļ‡āļĒāļđāļ§āļĩ (UV) āđāļĨāļ°āļ•āđˆāļ­āļĄāļē
āļ āļēāļĒāļŦāļĨāļąāļ‡āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ™āļīāļ”āļāļĨāđˆāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ‡ UV āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ EPROM āđ‚āļ”āļĒ
āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ›āļĢāļ°āļĄāļēāļ“ 5-10 āļ™āļēāļ—āļĩāļˆāļ™āļāļĢāļ°āļ—āļąāđ‰āļ‡āļ›āļĩ āļ„.āļĻ. 1993 āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļˆāļēāļ EPROM āļĄāļēāđ€āļ›āđ‡āļ™ EEPROM āļ—āļĩāđˆ
100
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļēāļĄāļēāļĢāļ–āļĨāļšāļŦāļĢāļ·āļ­āđāļāđ‰āđ„āļ‚āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ­āļēāļ­āļ­āļāļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļŦāļĄāļ·āļ­āļ™ EPROM āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ
EEPROM āļˆāļ°āļ•āđ‰āļ­āļ‡āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡ āļ‹āļķāđˆāļ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ­āļĒāļđāđˆāļ—āļĩāđˆāļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡
āļāļēāļĢāļĨāļšāļŦāļĢāļ·āļ­āđāļāđ‰āđ„āļ‚ āļ•āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1992 āļ—āļąāđ‰āļ‡ 12 āļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļˆāļąāļ”āļ•āļąāđ‰āļ‡
āļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 Consortium āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āđāļ™āļ§āļ—āļēāļ‡āđƒāļ™āļāļēāļĢāļ™āļģāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļĄāļē
āļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ€āļĄāļ™āļšāļ­āļĢāđŒāļ”āđāļĨāļ°āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡
āļāļĨāđˆāļ­āļ‡āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļāļĢāļ°āļ—āļąāļ”āļĢāļąāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ§āļēāļ‡āļ‹āđ‰āļ­āļ™āļāļąāļ™āđ€āļ›āđ‡āļ™āļŠāļąāđ‰āļ™āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ‚āļ™āļēāļ”āļāļ§āđ‰āļēāļ‡āļĒāļēāļ§āđ€āļžāļĩāļĒāļ‡ 4 āļ™āļīāđ‰āļ§ āđāļĨāļ°āļĄāļĩ
āļ„āļ§āļēāļĄāļŦāļ™āļēāđ€āļžāļĩāļĒāļ‡ 1 āļ™āļīāđ‰āļ§ āļ”āđ‰āļ§āļĒāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āļ‚āļ­āļ‡āļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 āļ—āļģāđƒāļŦāđ‰āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāļˆāļēāļāļ āļēāļ„āļĢāļąāļāđāļĨāļ°
āļ āļēāļ„āđ€āļ­āļāļŠāļ™āļ­āļĒāđˆāļēāļ‡āļ„āļēāļ”āđ„āļĄāđˆāļ–āļķāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļĨāļļāđˆāļĄāļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ—āļŦāļēāļĢāđāļĨāļ°āļāļēāļĢāđāļžāļ—āļĒāđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāđāļĢāļāļ—āļĩāđˆāđ„āļ”āđ‰āļ™āļģ
āđāļ™āļ§āļ„āļīāļ”āđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡
āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡ āđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡āļ•āļąāļ§
āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļĒāđƒāļ™āđ€āļ­āļ‡āļāđ‡āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āļˆāļķāļ‡āđ€āļĢāļīāđˆāļĄāļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļŠāļ·āđˆāļ­āļĄāļąāļĨāļ•āļīāļĄāļīāđ€āļ”āļĩāļĒāđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄ
āļ•āđ‰āļ™āļˆāļēāļāļāļēāļĢāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļ•āļđāđ‰ PC/104-based Kiosk āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļĢāļ āļˆāļ™āļ–āļķāļ‡āļ§āļąāļ™āļ™āļĩāđ‰āđ„āļ”āđ‰āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļĄāļēāļāļāļ§āđˆāļē 100 āđāļŦāđˆāļ‡āļ—āļĩāđˆ
āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 Embedded Consortium āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ethernet card, FireWire, hard drives, RAM drives, video cards, audio cards,
general I/O, ash cards, modems, GPS, cellular telephone, wireless Internet āđāļĨāļ°āļ­āļĩāļ
āļĄāļēāļāļĄāļēāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļ›āļąāļˆāļˆāļąāļĒāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļāļĢāļ°āļ•āļļāđ‰āļ™āļāļĨāļļāđˆāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āļŠāļ™āđƒāļˆāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ·āļ­
āļāļēāļĢāļ­āļ­āļāļ™āļīāļ•āļĒāļŠāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āđ€āļĢāļīāđˆāļĄāļ­āļ­āļāļŠāļđāđˆāļŠāļēāļĒāļ•āļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1988 āđƒāļ™āļŠāļ·āđˆāļ­
āļ§āđˆāļē “Embedded Systems Programming” āđāļĨāļ°āđ€āļžāļīāđˆāļ‡āļĄāļēāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ â€œEmbedded Systems De-
sign” āđ€āļĄāļ·āđˆāļ­āļ›āļĩ āļ„.āļĻ. 2005 āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļ›āļąāļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 3.1 āļ™āļīāļ•āļĒāļŠāļēāļĢ Embedded System Design
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāļļāļ›āļ™āļīāļĒāļēāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ§āđˆāļē āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™
āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđ€āļ‰āļžāļēāļ°āļ”āđ‰āļēāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļąāđˆāļ§āđ„āļ› āđ€āļžāļĢāļēāļ°āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļ
āļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡
āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļ”āđ‰āđāļāđˆ
    - āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āđƒāļ”āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļķāđˆāļ‡ āđ‚āļ”āļĒāļˆāļ°āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰
    - āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ„āļĢāļąāđ‰āļ‡āļĨāļ°āļ‡āļēāļ™ (Single Task)
101
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
    - āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļ•āđˆāđ„āļ”āđ‰āļ—āļĩāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļˆāļ™āļŠāļģāđ€āļĢāđ‡āļˆāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
    - āļĢāļēāļ„āļēāļ–āļđāļ
    - āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ
    - āļĄāļĩāļˆāļļāļ”āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ™āđ‰āļ­āļĒ āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ
    - āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļžāļĩāļĒāļ‡āļžāļ­āđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§
    - āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ•āđˆāļģ
    - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļąāđˆāļ‡āļ‡āļēāļ™āļˆāļēāļāļ āļēāļĒāļ™āļ­āļ
    - āļŠāļēāļĄāļēāļĢāļ–āļ„āļģāļ™āļ§āļ“āđ„āļ”āđ‰āđāļĄāđˆāļ™āļĒāļģāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāđāļšāļš real-time
āļ‹āļķāđˆāļ‡āđƒāļ™āļ‡āļēāļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ™āļąāļāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āļˆāļ°āđƒāļŠāđ‰āđ€āļžāļĩāļĒāļ‡āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđ€āļ”āļĩāđˆāļĒāļ§āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ„āļ§āļšāļ„āļļāļĄāļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāļ™āļīāļ”āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļē ROM (Read-only
Memory) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (Operating System) āļāļąāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļžāļ·āđˆāļ­āļ„āļ­āļĒāļˆāļąāļ”āļāļēāļĢāļ‡āļēāļ™āđāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļĨāļļāđˆāļĄāļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđāļĨāļ°āļĄāļĩ
āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 30 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļĢāļđāđ‰āļāļąāļ™āļ”āļĩāļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļ‹āļĩāđāļĨāļ°āđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āļšāļēāļ‡āļŠāđˆāļ§āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļ™āļģāđ„āļ›
āđƒāļŠāđ‰āđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰āļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āļ„āļ§āļēāļĄāđ„āļ”āđ‰āđ€āļ›āļĢāļĩāļĒāļšāļ‚āļ­āļ‡āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āđƒāļ™
āļ•āļĨāļēāļ”āļāđ‡āđ„āļĄāđˆāļ—āļģāļ˜āļĢāļĢāļĄāļ”āļēāđ€āļžāļĢāļēāļ°āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2005 āļˆāļģāļ™āļ§āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļˆāļēāļāđ€āļ”āļīāļĄāđ€āļāļ·āļ­āļš
āļŠāļēāļĄāđ€āļ—āđˆāļēāļ•āļąāļ§āđ‚āļ”āļĒāļ—āļļāļāđ†āļ§āļąāļ™āļˆāļ°āļĄāļĩāđ‚āļ„āđ‰āļ”āđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒ 10,000 āļšāļĢāļĢāļ—āļąāļ” āđāļĨāļ°āļ—āļļāļāđ†āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļˆāļ°āļĄāļĩāļ›āļĢāļ°āļĄāļēāļ“ 5.45
patch les āļ—āļĩāđˆāļ–āļđāļāļ­āļąāļžāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (āļ­āđ‰āļēāļ‡āļ­āļīāļ‡: Linux Foundation Analysis) āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļœāļđāđ‰āļœāļĨāļīāļ•
āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļēāļĒāđƒāļŦāļāđˆāđ†āđāļĨāļ°āļœāļđāđ‰āļˆāļģāļŦāļ™āđˆāļēāļĒāļ‹āļ­āļŸāđāļ§āļĢāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™ (ISV: Independent Software
Vendors) āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļāđ‡āļĒāļąāļ‡āļŦāļąāļ™āļĄāļēāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡ āđāļĨāļ°āļ—āļĩāđˆāļŠāļģāļ„āļąāļ GNU GPL
(General Public License) āļĒāļąāļ‡āđƒāļŦāđ‰āļŠāļīāļ—āļ˜āļīāđŒāđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ­āļīāļŠāļĢāļ°āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāđāļāđ‰āđ„āļ‚āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ„āļąāļ”
āļĨāļ­āļāđāļˆāļāļˆāđˆāļēāļĒāđƒāļŦāđ‰āļœāļđāđ‰āļ­āļ·āđˆāļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĄāđˆāļĄāļĩāļˆāļģāļ™āļ§āļ™āļˆāļģāļāļąāļ”āļ­āļĩāļāļ”āđ‰āļ§āļĒ
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļĄāļĩāļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđƒāļ™āļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āļ•āđˆāļ­āļ›āļĩāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āļŠāļģāļ„āļąāļāđƒāļ™
āļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2002 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē āđ‚āļ”āļĒāđƒāļ™āļŠāđˆāļ§āļ‡āđāļĢāļ
āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2001 āļ–āļķāļ‡ āļ„.āļĻ. 2002 āļœāļĨāļāļēāļĢāļŠāļģāļĢāļ§āļˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™ smart gadgets āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ (15.5%) āļ‹āļķāđˆāļ‡āđ€āļ­āļēāļŠāļ™āļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ WinCE/WinCE.Net (6%) āđāļĨāļ° XPe (5%)
āļˆāļēāļāļ„āđˆāļēāļĒ Microsoft āđāļĨāļ° VxWorks (10.3%) āļˆāļēāļāļ„āđˆāļēāļĒ Wind River āđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2003
āļ–āļķāļ‡ āļ„.āļĻ.2005 āļœāļĨāļāļēāļĢāļŠāļģāļĢāļ§āļˆāļžāļšāļ§āđˆāļēāļˆāļģāļ™āļ§āļ™āļœāļđāđ‰āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ āļēāļĒāđƒāļ™āļšāļĢāļīāļĐāļąāļ—āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ
āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 49-52% āđāļĨāļ°āļŦāļĨāļąāļ‡āļˆāļēāļāļ›āļĩ āļ„.āļĻ. 2006 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡
āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āļ‚āļ­āļ‡āļŠāļīāļžāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđ€āļŠāđˆāļ™ ARM,
x86, PowerPC, MIPS, Coldre, DSP āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļŠāđˆāļ™ OpenZaurus,
102
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
ÅngstrÃķm distribution, Familiar Linux, webOS from Palm, Inc., Maemo based on Debian
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ„āļļāđ‰āļ™āļŦāļđāļāļąāļ™āļ”āļĩāđƒāļ™āļ§āļ‡āļāļēāļĢāļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ—āļĒ āļ—āļĩāđˆāļāļąāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ PDA, Pocket PC, Smart Phone, Netbook āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ AirOS
(Ubiquiti Network), CatOS/Cisco IOS/IOS-XR (Cisco Systems), DD-WRT (NewMedia-NET),
JunOS (Juniper Networks), OpenWRT (LinkSys), Palm OS (Palm Inc.), Symbian OS (Nokia),
Windows CE/Mobile (Microsoft), iPhone (Apple), OpenZaurus (Sharp), Maemo (Nokia),
Qtopia/Qt Embedded (TrollTech), Openmoko (based on ÅngstrÃķm), Mobilinux (Monta-
vista), Android (Google), Moblin (Intel), Ubuntu Mobile āđāļĨāļ° Meego (Maemo+Moblin)
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāļœāļđāđ‰āļˆāļąāļ”āļˆāļģāļŦāļ™āđˆāļēāļĒāļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ‚āļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđāļāđˆ Monta-
Vista, Koan, Sysgo, Denx, Metrowerks, FSMLabs, LynuxWorks, Wind River, āđāļĨāļ° TimeSys
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāđƒāļ™āļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ
āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĨāļąāļāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡
āļāļĨāļļāđˆāļĄāļ•āļĨāļēāļ”āļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰
â€Ē āļāļĨāļļāđˆāļĄāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļĒāļēāļ™āļĒāļ™āļ•āđŒ (Automotive) āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ āļēāļĒāđƒāļ™āļĒāļēāļ™āļžāļēāļŦāļ™āļ° (ECU-
Electronic Control Unit) āļĢāļ°āļšāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ āļēāļĒāđƒāļ™
â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļĢāļ§āļĄāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top-Box āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āļĢāļ°āļšāļš
āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•
â€Ē āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ (Industrial Automation) āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ‚āļšāļ§āļ™āļāļēāļĢāļœāļĨāļīāļ•āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļŦāļļāđˆāļ™āļĒāļ™āļ•āđŒāđƒāļ™āļŠāļēāļĒāļāļēāļĢāļœāļĨāļīāļ• āļĢāļ§āļĄāđ„āļ›āļ–āļķāļ‡āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāđ„āļŸāļŸāđ‰āļēāļāļģāļĨāļąāļ‡āļŠāļđāļ‡ (HVAC System)
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļžāļ—āļĒāđŒ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāđ€āļāđ‰āļēāļ•āļīāļ”āļ•āļēāļĄāļ­āļēāļāļēāļĢāļœāļđāđ‰āļ›āđˆāļ§āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļĢāļ°āļšāļšāļšāļģāļšāļąāļ”āļ­āļēāļāļēāļĢāļ›āđˆāļ§āļĒ āļĢāļ°āļšāļšāļ•āļĢāļ§āļˆ
āļŠāļ­āļšāđāļĨāļ°āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļœāļĨ āļĢāļ°āļšāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļœāđˆāļēāļ•āļąāļ” āđāļĨāļ°āļĢāļ°āļšāļšāļ•āļĢāļ§āļˆāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ”āđ‰āļ§āļĒāđ€āļŠāļĩāļĒāļ‡āđāļĨāļ°āļ āļēāļž āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆ āđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļ™āļīāļ”āļžāļāļžāļē
â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļēāļ‡āļ—āļŦāļēāļĢāđāļĨāļ°āļ­āļ§āļāļēāļĻ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ™āļģāļĢāđˆāļ­āļ‡āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļšāļīāļ™ āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļ”āļēāļ§āđ€āļ—āļĩāļĒāļĄ
â€Ē āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļ™āļąāļāļ‡āļēāļ™ āđ„āļ”āđ‰āđāļāđˆ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ–āđˆāļēāļĒāđ€āļ­āļāļŠāļēāļĢ āđāļŸāļāļ‹āđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļžāļīāļĄāļžāđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļŠāļāļ™ āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ VoIP āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļŠāļēāļĒāđāļĨāļ°āđ„āļĢāđ‰āļŠāļēāļĒ āđ„āļ”āđ‰āđāļāđˆ āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļš LAN, MAN āđāļĨāļ° WAN
āļˆāļēāļāļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļđāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ›āļĒāļąāļ‡āļ•āļĨāļēāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āļĄāļēāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļāļīāļ”āļˆāļēāļāļ›āļąāļˆāļˆāļąāļĒ
āļŠāļģāļ„āļąāļāđ„āļ”āđ‰āđāļāđˆ
â€Ē āļāļēāļĢāđ€āļžāļīāđˆāļĄāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāđāļ§āļĢāđŒāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļŠāļđāļ‡āļ‚āļķāđ‰āļ™
āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ™āļąāļāļžāļąāļ’āļ™āļēāļ‹āļ­āļŸāđāļ§āļĢāđŒ
103
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€Ē āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđ€āļ”āļīāļĄāļ›āļĢāļ°āļĄāļēāļ“āļŠāļ­āļ‡āļžāļąāļ™āļĨāđ‰āļēāļ™āļ•āļąāļ§āđāļĨāļ°āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļˆāļ°āđ€āļžāļīāđˆāļĄāđ„āļ”āđ‰āļ–āļķāļ‡
āļŠāļ­āļ‡āđāļŠāļ™āļĨāđ‰āļēāļ™āļ•āļąāļ§āļ āļēāļĒāđƒāļ™āļ›āļĩ āļ„.āļĻ. 2013
â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāđāļĨāļ°āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩāļˆāļēāļāļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™ Sony, Motorola, Philips, Panasonic, Google, Samsung āđāļĨāļ° Siemens āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āļ āļēāļĐāļēāļ‹āļĩāļĒāļąāļ‡āļ„āļ‡āļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (Device Programming)
āļ•āļēāļĄāļĄāļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē Assembly, C++ āđāļĨāļ° embedded C++
āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļĄāļēāļˆāļēāļ: http://www.ecti-thailand.org/emagazine/views/66
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļĢāļđāļ›āļ—āļĩāđˆ 3.2 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ Photo from: http://free-electrons.com
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļ­āļ­āļāļĄāļēāđƒāļ™āļ•āļĨāļēāļ”āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ āļēāļĒāđƒāļ™
āđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ°āļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /arch  āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ„āļĄāđˆāļ•āđˆāļģāļāļ§āđˆāļē 30
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, AVR32, Intel x86, Intel x86_64, MIPS, Motorola 68000
(M68K) , PowerPC, āđāļĨāļ° Super-H āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ°āļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ›āļ—āļĩāđˆ
āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
104
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 and x86-64 āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļē
āļ­āļļāļ›āļāļĢāļ“āđŒāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ (Mobile Internet Device) āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ (Set-top-Box, DVD
Player) āļŦāļĢāļ·āļ­ āļ­āļļāļ›āļāļĢāļ“āđŒāļ„āļ§āļšāļ„āļļāļĄāđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļāļēāļĢāļœāļĨāļīāļ• āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ PowerPC āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļĄāļēāļāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ‚āļ—āļĢāļ„āļĄāļ™āļēāļ„āļĄ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (real-time)
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ MIPS āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ SuperH āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— Hitachi (1990s) āđƒāļ™āļŠāļĄāļąāļĒāļāđˆāļ­āļ™āļˆāļ°āļžāļšāđ€āļŦāđ‡āļ™āļšāđˆāļ­āļĒāđƒāļ™
āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āđ€āļŠāđˆāļ™ āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top-box āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ— Renesus
āļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļ™āļģāļ—āļēāļ‡ āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļžāļīāļĄāļžāđŒ āđāļĨāļ°āļāļĨāđ‰āļ­āļ‡āļ–āđˆāļēāļĒāļĢāļđāļ›
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Blackn āļ–āļđāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļ—āļģāļ•āļĨāļēāļ”āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— Analog Devices āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļ™āđ‰āļ™āđ„āļ›āđƒāļ™āļ‡āļēāļ™
āļ”āđ‰āļēāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļŠāļąāļāļāļēāļ“āļ”āļīāļˆāļīāļ•āļ­āļĨ (Signal Processing) āļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ—āļģāđƒāļŦāđ‰āļ•āļąāļ§ Blackn CPU āđ€āļ­āļ‡āļĄāļĩāļĢāļēāļ„āļēāļ–āļđāļ
â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Motorola 68000 āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĩ 1980s - 1990s āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨ āđ€āļŠāđˆāļ™ Apple Macintosh, Commodore Amiga, Atari ST āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļđāđˆāđāļ‚āđˆāļ‡
āļŠāļģāļ„āļąāļāļāļąāļšāļšāļĢāļīāļĐāļąāļ— Intel
āļ•āļēāļĢāļēāļ‡ 3.1 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
O P T I O N X 8 6 A R M P P C M I P S S H M 6 8 K
Parallel Port support X X X
IEEE 1394 support X X X X
IrDA support X X X X
USB support X X X X
Bluetooth support X X X
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ āļēāļĒāđƒāļ•āđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
āļ‚āļ™āļēāļ”āđ€āļžāļĩāļĒāļ‡ 8 MB āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļ”āđ‰āļ”āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļŠāđ‰āļēāļĄāļēāļāđ€āļāļīāļ™
āđ„āļ›āļāđ‡āļ„āļ§āļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 32 MB āļŠāđˆāļ§āļ™āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (Storage)
āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļŠāļļāļ”āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ‚āļ™āļēāļ” 4 MB āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļŦāļĢāļ·āļ­āļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™ āļāđ‡āļ­āļēāļˆāļˆāļ°
āđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ—āđāļŸāļĨāļŠ (Flash storage) āđ€āļŠāđˆāļ™ NAND/NOR Flash āļŦāļĢāļ·āļ­ āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ—
āļšāļĨāđ‡āļ­āļ„ (Block storage) āđ€āļŠāđˆāļ™ SD/MMC card āđāļĨāļ° eMMC āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
105
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡
āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰
āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļšāļąāļŠāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ€āļ­āļ‡āđ€āļŠāđˆāļ™ I2C, SPI, CAN, 1-wire,
SDIO, UART āđāļĨāļ° USB āļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āđ€āļŠāđˆāļ™ Ethernet, Wi, Bluetooth, āđāļĨāļ° CAN āļĢāļ§āļĄāļ–āļķāļ‡
āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (TCP/IP) āļāđ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļžāļĢāđ‰āļ­āļĄāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ­āļ‡
āļāđˆāļ­āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ­āļ­āļāļĄāļēāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āļŦāļĨāļēāļĒāļĒāļĩāđˆāļŦāđ‰āļ­ āļ—āļąāđ‰āļ‡āđƒāļ™āļĢāļēāļ„āļēāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āļœāļđāđ‰āđƒāļŠāđ‰
āļ—āļąāđˆāļ§āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āļŦāļēāļ‹āļ·āđ‰āļ­āđ„āļ”āđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ BeagleBoard, PandaBoard, BeagleBone, ODROID, Raspberry
Pi, Freescale i.MX53, AM335x Sitara, Friendly ARM āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU)
āļˆāļēāļāļœāļđāđ‰āļœāļĨāļīāļ•āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ Texas Instrument, Samsung, Qualcomm, Nvidia āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđāļĨāđ‰āļ§āļˆāļ°āđƒāļŠāđ‰
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™
āļĢāļđāļ›āļ—āļĩāđˆ 3.3 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļšāļ­āļĢāđŒāļ”āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ‹āļķāđˆāļ‡āļāļ§āđˆāļēāļˆāļ°āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļŦāļēāļŠāļīāļŸāļ•āđˆāļēāļ‡āđ†āļĄāļēāđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļāļ­āļšāđ€āļ›āđ‡āļ™
āļšāļ­āļĢāđŒāļ”āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ•āđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–
āļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆ
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM
āļŠāļļāļ” Instruction set,
āļāđāļēāļŦāļ™āļ”āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MMU, āļ­āļīāļ™
āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ
āđ€āļ™āđ‰āļ™āļāļēāļĢāļāđāļēāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°
(specication)
ARM Core
āļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™
āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļāļąāļš
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļāđāļēāļŦāļ™āļ”āđ„āļ§āđ‰
āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ netlist āļŦāļĢāļ·āļ­ āđ‚āļ„āđ‰āļ”
Verilog āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ‹āļ·āđ‰āļ­āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ
System-on-Chip
āļāļēāļĢāļĢāļ§āļĄāļ­āļļāļ›āļāļĢāļ“āđŒ/āļŠāļīāļžāļ•āđˆāļēāļ‡āđ†āđ€āļ‚āđ‰āļēāđ„āļ› āđ€āļžāļ·āđˆāļ­
āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ āļēāļĒāđƒāļ™ ARM Core āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ†
āļ‚āļēāļĒāļ­āļ­āļāļĄāļēāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļŠāļīāļžāļĢāļļāđˆāļ™āļ—āļĩāđˆ
āļšāļĢāļīāļĐāļąāļ—āļˆāļąāļ”āļˆāđāļēāļŦāļ™āđˆāļēāļĒ (SoC Brand)
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļšāļ­āļĢāđŒāļ”āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļ§āļĄ SoC
āđāļĨāļ°āļžāļ­āļĢāđŒāļ•āļŠāđāļēāļŦāļĢāļąāļšāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒ
āļ āļēāļĒāļ™āļ­āļ
āļ‚āļēāļĒāļ­āļ­āļāļĄāļēāđƒāļ™āļĢāļđāļ›āđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡
āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđāļēāđ€āļĢāđ‡āļˆāļĢāļđāļ›
āļĢāļđāļ›āļ—āļĩāđˆ 3.4 āđāļŠāļ”āļ‡āļĨāļģāļ”āļąāļšāļ•āļąāđ‰āļ‡āđāļ•āđˆāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ
106
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŦāļąāļ§āđƒāļˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļ•āļąāļ§ System-on-Chip (SoC) āļ‹āļĩāļžāļĩāļĒāļđāļ‹āļķāđˆāļ‡āļĄāļĩ ARM Core āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™
āļ—āļĩāđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ”āđ‰āļ§āļĒāļŠāļīāļžāđ€āļ‹āđ‡āļ—āļ•āđˆāļēāļ‡āđ† (Chipset) āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ•āļąāļ§āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđ„āļ”āđ‰āļŦāļĨāļēāļ
āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ethernet, AUX, USB, SATA, LCD, HDMI āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢ
āļ•āļąāđ‰āļ‡āđāļ•āđˆāđˆāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ™āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™ System-on-Chip āļ—āļĩāđˆāļšāļĢāļīāļĐāļąāļ—āđāļĨāļ°āđ€āļŦāļĨāđˆāļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļē
āļ­āļ­āļāđāļšāļšāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”
ARMv6
ARMv7
ARM1176JZF-S
ARM Cortex-A8
ARM Cortex-A15
Marvell PJ48
BCM2835
TI AM335x
Samsung
Exynos 5
Marvell
Armada XP
Raspberry Pi
BeagleBone
Arndale
PlatHome
OpenBlocks AX3-4
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM ARM Core System-on-Chip āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļĢāļđāļ›āļ—āļĩāđˆ 3.5 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ SoC āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™ SoC
āļšāļĢāļīāļĐāļąāļ— ARM āđ„āļĄāđˆāđ„āļ”āđ‰āļ—āļģāļ•āļąāļ§āđ€āļ­āļ‡āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļœāļĨāļīāļ•āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒ āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļāļģāļŦāļ™āļ”āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđ€āļŠāđˆāļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ Instruction Set, āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
(MMU) āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļŠāļąāļāļāļēāļ“āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ•āđˆāļēāļ‡āđ† (Interrupts) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļēāļĒāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ (Li-
cense fee) āļāļēāļĢāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļāđˆāļšāļĢāļīāļĐāļąāļ—āļĢāđˆāļ§āļĄāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆ (Business Partner) āļ—āļĩāđˆāļˆāļ°āļĢāđˆāļ§āļĄāļ­āļ­āļāđāļšāļšāļāļąāļšāļ—āļēāļ‡
āļšāļĢāļīāļĐāļąāļ— ARM āļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™ ARM Core āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™ āđāļĨāļ°āļˆāļ°āļ—āļģāļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Chipset āļ āļēāļĒāđƒāļ™
107
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āđˆāļēāļ‡āđ† āļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™ System-on-Chip āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ TI OMAP, TI AM335x, Samsung Exy-
nos, Rockchip, FreeScale i.Mx53 āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ—āļĢāđˆāļ§āļĄāļ˜āļļāļĢāļāļīāļˆāļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāđˆāļēāļĒāļ„āđˆāļē Royalty fee āđƒāļŦāđ‰āļāļąāļšāļšāļĢāļīāļĐāļąāļ—
ARM āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ™āļģāđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļŠāļīāļ™āļ„āđ‰āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļŠāļīāļ™āļ„āđ‰āļē
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­ (Smart Phone), āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ• (Tablet), āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļŦāļĢāļ·āļ­
āļĢāļ°āļšāļšāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāļ āļēāļĒāđƒāļ™āļĒāļēāļ™āļžāļēāļŦāļ™āļ° āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđ‚āļĄāđ€āļ”āļĨāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— ARM
āđāļĨāļ°āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļ§āļīāļˆāļąāļĒāļžāļąāļ’āļ™āļēāļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļēāđ€āļ›āđ‡āļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļ™āļ•āļĨāļēāļ”āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”
20+ āļ›āļĩ
āļŠāļĢāđ‰āļēāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđāļēāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†
āđāļĨāļ°āļ”āđāļēāđ€āļ™āļīāļ™āļ˜āļļāļĢāļāļīāļˆ
3-4 āļ›āļĩ
āļšāļĢāļīāļĐāļąāļ—āļŦāļļāđ‰āļ™āļŠāđˆāļ§āļ™āļ™āđāļēāđ„āļ›āļžāļąāļ’āļ™āļēāđ€āļ›āđ‡āļ™ SoC
2-3 āļ›āļĩ
āļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļē ARM Core
āđ€āļ‡āļīāļ™āļĨāļ‡āļ—āļļāļ™
āļĢāļđāļ›āđāļšāļšāļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡ ARM
āļˆāđˆāļēāļĒāļ„āđˆāļēāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ
(Royalty Fee)
āļˆāđˆāļēāļĒāļ„āđˆāļēāđƒāļšāļ­āļ™āļļāļāļēāļ•
(Upfront License Fee)
SoC
āļĢāļđāļ›āļ—āļĩāđˆ 3.6 āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡ ARM
108
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ–āļđāļāļāļąāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļš
āļāļąāļ‡āļ•āļąāļ§ (Embedding Linux) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰
āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āļīāļ˜āļĩāļāļēāļĢāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ—āļąāļšāļĻāļąāļžāļ—āđŒāļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐ
āļ§āđˆāļēāļāļēāļĢ â€œPorting” āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļāđ‡āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļ—āļĩāđˆāļ‚āļēāļĒāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āđāļĨāļ°āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāļāļĨāļļāđˆāļĄāļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāļ—āļģāļ˜āļļāļĢāļāļīāļˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđāļšāļšāļ­āļ‡āļ„āđŒāļĢāļ§āļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™
āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļžāļīāđ€āļĻāļĐ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļāļēāļĢ
āļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ† (Cross-development tools) āđāļĨāļ° āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™
āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (Real time extensions) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļĄāļĩāļŠāļļāļ”
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ„āļĢāļšāļ–āđ‰āļ§āļ™āđ€āļžāļĩāļĒāļ‡āļžāļ­āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš EMBEDDED LINUX
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āļœāļđāđ‰āļŠāļ™āđƒāļˆāļ”āđ‰āļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ”āļąāļ‡āđāļŠāļ”āļ‡
āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ•āļēāļĢāļēāļ‡ 3.2 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļš āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
BSP (Board Support Package)
āļ āļēāļĒāđƒāļ™āļšāļĢāļĢāļˆāļļāļ•āļąāļ§ bootloader āđāļĨāļ° Kernel āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāđāļĨāļ°āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļĢāļļāđˆāļ™
āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰
Cross Toolchains āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļ›āļĨāļ‡āļĢāļŦāļąāļŠāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ‚āđ‰āļēāļĄāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ„āļ”āđ‰
Third-party components
āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļīāđ€āļĻāļĐāļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļ āļēāļĒāļ™āļ­āļ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļĄāļĩ
āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™ GPLv3, Apache, MIT āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
109
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļš āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
Hardware āđāļĨāļ° Accessories
- āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ„āļ·āļ­ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļŠāļģāļŦāļĢāļąāļšāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”
target
- āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Target āļ„āļ·āļ­ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļŠāđˆāļ™ Beagleboard, Versatile
Express, Pandaboard, ODROID, FriendlyARM āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
- āļŠāļēāļĒ Cable āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ LAN Cable, Serial Cable, USB-to-Serial
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
- MMC/SD Card
āļŠāļģāļŦāļĢāļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 4 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļāļ„āļ·āļ­
āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩ bootloader āļ—āļĩāđˆāļĄāļĩāļāļēāļĢ
āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡ Kernel Image, root le
system āđāļĨāļ°āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”
āļŠāļēāļĄāļēāļĢāļ–āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰
āļŠāļĄāļšāļđāļĢāļ“āđŒāđāļšāļš āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļšāļ­āļĢāđŒāļ”āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļš Ethernet LAN
āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļœāđˆāļēāļ™ telnet āļŦāļĢāļ·āļ­ ssh āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰ āđāļ•āđˆ
āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāđƒāļŠāđ‰ serial con-
sole āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļĢāļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āļāļĢāļ“āļĩāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļ­
LAN āđ„āļ”āđ‰
āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Linux kernel: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ–āļķāļ‡āđāļĄāđ‰āļˆāļ°āļĄāļĩ
āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āđāļ•āđˆāļāđ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļ­āļĄāđ„āļžāļĨāđŒ
Kernel āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™ āđ€āļŠāđˆāļ™
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ—āļĩāđˆāļˆāļģāļāļąāļ” āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‡āļēāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ—āļģāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļāđˆāļ­āļ™āļˆāļ° Porting
āđ€āļ‚āđ‰āļēāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Root File System: āļ āļēāļĒāđƒāļ™ root
le system āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ
āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ†āđ„āļ”āđ‰ āļ–āđ‰āļēāļ›āļĢāļēāļĻāļˆāļēāļ root le system
āđāļĨāđ‰āļ§āļˆāļ°āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ “Kernel
panic” āđāļĨāļ°āļŦāļĒāļļāļ”āļ—āļģāļ‡āļēāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” āļ‹āļķāđˆāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ§āļēāļ‡
root le system āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 2 āđāļšāļšāļ„āļ·āļ­āđ€āļāđ‡āļšāđ„āļ§āđ‰
āđƒāļ™ Flash Storage āđ€āļŠāđˆāļ™ MMC, SDCard āđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™
āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ NFS
āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļšāļ­āļĢāđŒāļ”
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āļ”āđ‰āļ§āļĒāļ•āļąāļ§
āđ€āļ­āļ‡āđ„āļ”āđ‰ āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°
āđ€āļ›āđ‡āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢ
āļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Cross Toolchain āļŦāļĢāļ·āļ­āļāļēāļĢ
āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡
āļ•āļąāļ§āļ”āđ‰āļ§āļĒ gdb āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āļˆāļ°āđ„āļĄāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļĄāļēāļāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
110
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
System call interface
āđ‚āļ›āļĢāđāļāļĢāļĄ #1 āđ‚āļ›āļĢāđāļāļĢāļĄ #2 āđ‚āļ›āļĢāđāļāļĢāļĄ #3 āđ‚āļ›āļĢāđāļāļĢāļĄ #N
C library
āļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒ
āļ„āļ§āļēāļĄāļˆāđāļē
āļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ›āļāļĢāļ“āđŒ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ† āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļšāļš
āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āļŠāļ™āļīāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
Block
device drivers
Network
device drivers
Character
device drivers
CPU/MMU
support code
CPU
support code
User-space
Kernel-space
Hardware
āļĢāļđāļ›āļ—āļĩāđˆ 3.7 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
1. Hardware Layer - āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āļ™āļēāļ” 32 āļšāļīāļ•
āļ‚āļķāđ‰āļ™āđ„āļ› āļŦāļ™āđˆāļ§āļĒāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (MMU - Memory Management Unit) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ™āļēāļ”
āđ€āļĨāđ‡āļ (RAM) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ (ROM) āļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ—āđāļŸāļĨāļŠ āđ€āļŠāđˆāļ™
MMC/SD Card āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
2. Linux Kernel Layer (Kernel-space) - āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļˆāļąāļ”āļ„āļīāļ§āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđˆāļēāļ‡āđ† āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļ„āļąāļ (System Calls) āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ† āđ„āļ”āđ‰āđāļāđˆ
â€ĒLow-level interfaces:
- āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ” APIs (Application Programming Interface) āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ
āđāļšāļšāļ—āļĩāđˆāđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ
- āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ”āļđāđāļĨāđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđ€āļŠāđˆāļ™ āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļŠāļ·āđˆāļ­āļŠāļēāļĢ āđāļĨāļ° I/O Devices āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē High-level abstractions:
- āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ„āļ”āđ‰ āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđāļšāļš
multi-tasking āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ IPC, Threading, Socket, Signalling āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
- āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ•āđˆāļ­āđ„āļ”āđ‰āđ€āļāļ·āļ­āļšāļ—āļļāļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
â€Ē Filesystems:
- āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš ïŽlesystems āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 40 āļŠāļ™āļīāļ”
111
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
- āļˆāļ°āļĄāļĩ Virtual Filesystem layer āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ lesystems āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ‡āđˆāļēāļĒ
āđāļĨāļ°āļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđƒāļŦāļĄāđˆ
â€Ē Networking protocols
- āļĢāļ­āļ‡āļĢāļąāļšāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļ™āļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 50 āļŠāļ™āļīāļ”
- āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Socket APIs āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļāļģāļŦāļ™āļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āđāļ•āđˆāļĨāļ°āđāļšāļšāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ™āļąāđ‰āļ™āđ†
3. Libraries (User-space) - āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡ user space āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĄāļēāļāļāļ§āđˆāļēāļ—āļĩāđˆāļĄāļĩ
āļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ
āļ”āļīāļˆāļīāļ•āļ­āļĨ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ/āļ–āļ­āļ”āļĢāļŦāļąāļŠ āđāļĨāļ° āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ
āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļēāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ°
āđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē glibc (āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļĒāđˆāļ­āļĒāļ„āļ·āļ­ uClibc āđāļĨāļ° eglibc)
āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāđāļĨāļ°āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST āđāļĨāļ° āļšāļ­āļĢāđŒāļ” TARGET
āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™
āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ 2 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āđāļāđˆ
1.āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ â€œHost” (āļ‹āļķāđˆāļ‡āļāđ‡āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™
āļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›)
2.āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļšāļ­āļĢāđŒāļ” â€œTarget”
āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 3 āđāļšāļšāļ„āļ·āļ­
â€ĒāļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ RS-232 (RS-232 Serial Cable) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļšāļđāļ—āļ‚āļ­āļ‡
āļšāļ­āļĢāđŒāļ” āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ€āļĢāļīāđˆāļĄāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āđˆāļēāđƒāļ™āļĢāļ°āļ”āļąāļš low level āļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ Kernel āđāļĨāļ°āļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ root
le system āđ€āļĢāļĩāļĒāļāļŦāļ™āđ‰āļēāļˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļ™āļĩāđ‰āļ§āđˆāļē “Console”
â€ĒāļŠāļēāļĒ LAN (Ethernet LAN Cable) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ§āļēāļ‡ Kernel Image āđāļĨāļ° Root le
system āđ„āļ§āđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ bootp, tftp āļŦāļĢāļ·āļ­ NFS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđƒāļ™
āļāļĢāļ“āļĩāļ—āļĩāđˆāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ (Embedded Linux) āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđ„āļ”āđ‰āđāļĨāđ‰āļ§ āļ–āđ‰āļēāđ„āļĄāđˆ
āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­ Console āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđāļšāļšāļĢāļ°āļĒāļ°āđ„āļāļĨ (Remote Login) āļœāđˆāļēāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄ telnet āļŦāļĢāļ·āļ­ ssh āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™
â€ĒāļŠāļēāļĒ JTAG (JTAG Cable) āđƒāļŠāđ‰āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ„āđˆāļēāļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ
āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
112
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
Ethernet Hub
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target)
āļŠāļēāļĒ RS-232
āļŠāļēāļĒ LAN
ARM, PowerPC, MIPS
(Linux OS)
x86, x86_64
(Desktp OS)
āļŠāļēāļĒ LAN
āļĢāļđāļ›āļ—āļĩāđˆ 3.8 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āđˆāļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target
āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļˆāļ°āļĄāļĩ
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ (āđ€āļŠāđˆāļ™ Ubuntu, Red Hat, Fedora, SuSE āļŦāļĢāļ·āļ­ Debian āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­
āļŦāļĢāļ·āļ­āđ‚āļ›āļĢ āđāļāļĢāļĄāļ­āļąāļ•āļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ (āđ€āļŠāđˆāļ™ Serial Console Software, Cross Toolchain, Network shar-
ing Software) āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™āļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ (RS-
232 Cable) āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŦāļĢāļ·āļ­āđ‚āļ™āđ‡āļ•āļšāļļāđŠāļ„āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ„āļĄāđˆāļĄāļĩāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāđƒāļŦāđ‰
āļ­āļĩāļāđāļĨāđ‰āļ§ āđāļ•āđˆāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļžāļ­āļĢāđŒāļ• USB āļĄāļēāđƒāļŦāđ‰āđāļ—āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļŦāļēāļŠāļēāļĒ USB-to-Serial āļĄāļē
āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļāļąāļšāļšāļ­āļĢāđŒāļ” Target āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāđƒāļ™āđ€āļ‚āđ‰āļēāļāļąāļš
āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ Ethernet Hub āļŦāļĢāļ·āļ­ Switch Hub
āļāđˆāļ­āļ™āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āđ€āļŦāđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļŦāļ™āđ‰āļē Serial Console āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
Host āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ Serial Console āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Minicom, Picocom,
Gtkterm, Putty, Cutecom āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ (Serial Port) āļŦāļĢāļ·āļ­āļžāļ­āļĢāđŒāļ• USB āđ‚āļ”āļĒāļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ€āļ›āđ‡āļ™ /dev/ttySx āļŦāļĢāļ·āļ­ /dev/ttyUSBx āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ mini-
com āđāļĨāļ° Gtkterm āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ minicom -b 115200 /dev/ttyS0 āļŦāļĢāļ·āļ­
$ minicom -b 115200 /dev/ttyUSB0
113
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Gtkterm āđ€āļžāļ·āđˆāļ­āđ€āļ›āļīāļ” Serial Console āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
114
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
115
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross Toolchains
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ„āļ§āđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē
“Native Toolchain” āļ‹āļķāđˆāļ‡āļ•āļąāļ§ native toolchain āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļŦāļąāļŠāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŦāđ‰
āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļšāļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āđ† (āđ€āļŠāđˆāļ™ x86 Platform) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢ
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™ āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ native toolchain āļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāđ„āļ”āđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ‚āļ™āļēāļ”āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļŠāđ‰āļēāļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨāđāļĨāļ°āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļŦāđ‰āļ­āļĒāļđāđˆ
āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļ›āļĨāļ‡āļĢāļŦāļąāļŠāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‚āđ‰āļēāļĄāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ„āļ”āđ‰āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļ
āļ§āđˆāļē “Cross-compiling Toolchain” āļŦāļĢāļ·āļ­ â€œCross Toolchains” āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļē
cross-compiling toolchain āļˆāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
āļ™āļąāđ‰āļ™āđ† (āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM) āļ•āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āļāđˆāļ­āļ™āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ export ARCH=ARM
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ make
āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
Native toolchain
Cross-compiling
toolchain
ARM binaryx86 binary
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86)
āļšāļ­āļĢāđŒāļ” Target (ARM)āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86)
āļĢāļđāļ›āļ—āļĩāđˆ 3.9 āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļąāđ‰āļ‡ 2 āđāļšāļš
116
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ CROSS TOOLCHAINS
āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ cross toochains āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ‡āļēāļ™āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāļ•āļąāļ§
āđ‚āļ”āļĒāļ­āļēāļˆāđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļāļĨāļļāđˆāļĄāđƒāļŦāļāđˆāđ† āđ„āļ”āđ‰āđāļāđˆ
1. Toolchains āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›
â€ĒCodeSourcery (http://www.codesourcery.com/)
CodeSourcery āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļąāļš Sourcery G++ āđāļĨāļ° Eclipse IDE āļ—āļĩāđˆ
āļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļāļąāļš GNU Toolchain (gcc, gdb āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, Coldre, MIPS,
SuperH āđāļĨāļ° PowerPC
â€ĒLinaro (http://linaro.org/)
Linaro āđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļāļĢāļ—āļĩāđˆāđ„āļĄāđˆāđāļŠāļ§āļ‡āļŦāļēāļāļģāđ„āļĢ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļĄāļ•āļąāļ§āļāļąāļ™āļ‚āļ­āļ‡āđ€āļŦāļĨāđˆāļēāļ§āļīāļĻāļ§āļāļĢāļĄāļ·āļ­āļ”āļĩ āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļāļąāļ™āļŠāļĢāđ‰āļēāļ‡
āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ open source āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļēāļ‡ Linaro āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļˆāđ‰āļēāļ‡āļ„āļ™
āļ—āļĩāđˆāļžāļąāļ’āļ™āļē CodeSourcery āđ€āļžāļ·āđˆāļ­āđ€āļ™āđ‰āļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđƒāļŦāđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”
â€ĒDENX ELDK (http://www.denx.de/)
DENX Embedded Linux Development Kit (ELDK) āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (real-time) āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, PowerPC āđāļĨāļ° MIPS āļŠāļļāļ”
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ GPL āđāļĨāļ° Free Software Licenses āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ Cross
Development Tools (Compiler, Assembler, Linker āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™), Native Tools (Shell, commands
āđāļĨāļ° libraries), U-Boot, Linux kernel āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ, Xenomai
(RTOS Emulation framework) āđāļĨāļ° SELF (Simple Embedded Linux Framework)
â€ĒScratchbox (http://www.scratchbox.org/)
Scratchbox āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē Maemo (Nokia 770, N800, N810 Internet Tab-
lets āđāļĨāļ° Nokia N900) āļ‹āļķāđˆāļ‡āđ€āļ™āđ‰āļ™āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđāļĨāļ° x86
2. Toolchain āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ­āļ‡
â€ĒBuildroot (http://buildroot.uclibc.org/)
Buildroot āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ—āļĩāđˆāļ™āļīāļĒāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°
āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡ RFS image (Root File System Image) āļ—āļĩāđˆ
āļžāļĢāđ‰āļ­āļĄāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđāļŸāļĨāļŠ (ash) āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ open
117
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
source āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ RFS Image āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ•āļąāļ§ buildroot āļ™āļĩāđ‰āļˆāļ°āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļžāļĩāļĒāļ‡ uClibc āđāļ•āđˆāđ„āļĄāđˆ
āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ glibc
â€ĒCrosstool-NG (http://crosstool-ng.org/)
Crosstool-NG āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ„āļĄāđˆāđāļžāđ‰āļ•āļąāļ§ buildroot āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāđƒāļ™āļāļēāļĢ
āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāđˆāļēāļ™ make menucong āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļ•āļąāļ§ buildroot āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡ uClibc
āđāļĨāļ° glibc āđāļĨāļ°āļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļŠāđˆāļ™ gdb, strace, dmalloc
â€ĒBitbake
Bitbake āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļļāļ”āđāļžāļāđ€āļāđ‡āļ• āļ‹āļķāđˆāļ‡āļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢ OpenEm-
bedded āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ” Ã…ngstrÃķm āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļ: http://www.wikipedia.com
āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāļ āļēāļĒāđƒāļ™ CROSS TOOLCHAINS
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ cross toolchains āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļąāļ§
āļ‹āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (āđ€āļŠāđˆāļ™ BusyBox, Openssh, Di-
rectFB āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āđˆāļēāļ‡āđ† āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
â€ĒBinutils - āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļ­āļēāđ„āļ§āđ‰āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāđ„āļšāļ™āļēāļĢāļĩāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°
āļāļąāļšāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ†āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ as (Assembler), ld (Linker), ar,
ranlib (āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļšāļš static), objdump, readelf, size, nm, strings, strip āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€ĒGCC Compiler - āļŠāļļāļ” GNU C Compiler āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāļļāļ”āļ—āļĩāđˆāđāļˆāļāļŸāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ āļēāļĐāļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ C, C++, Ada, Fortran, Java, Objective-C, Objective-C++ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰
āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđ€āļŠāđˆāļ™ ARM, AVR, Blackn, CRIS, FRV, M32,
MIPS, MN10300, PowerPC, SH, v850, i386, x86_64, IA64, Xtensa āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€ĒC/C++ Libraries - āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ•āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļ‹āļķāđˆāļ‡āļ—āļģ
āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ C Libraries āļĄāļĩāļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāđāļšāļšāđ€āļŠāđˆāļ™ glibc, uClibc, eglibc, dietlibc, newlib āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€ĒGDB Debugger - GDB āđ€āļĢāļīāđˆāļĄāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļ™āļēāļĒāļĢāļīāļŠāļēāļĢāđŒāļ” āļŠāļ•āļ­āļĨāđāļĄāļ™ āđ€āļĄāļ·āđˆāļ­ āļž.āļĻ. 2529 āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡
āļ‚āļ­āļ‡āļĢāļ°āļšāļš GNU āļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāđ€āļ‚āļēāļžāļąāļ’āļ™āļē GNU Emacs āļˆāļ™āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāđƒāļ™āļĢāļ°āļ”āļąāļšāļ—āļĩāđˆāļ™āđˆāļēāļžāļ­āđƒāļˆ āļ‹āļķāđˆāļ‡āđāļ™āļ§
āļ„āļ§āļēāļĄāļ„āļīāļ”āļ‚āļ­āļ‡ GDB āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļĄāļēāļˆāļēāļ Dbx āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļĩāļšāļąāđŠāļāđ€āļāļ­āļĢāđŒāļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix
BSD āđāļĨāļ°āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ GDB āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļ”āļđāđāļĨāđ‚āļ”āļĒ GDB Steering Committee āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļ—āļĩāđˆāļ–āļđāļ
āļ•āļąāđ‰āļ‡āđ‚āļ”āļĒāļĄāļđāļĨāļ™āļīāļ˜āļīāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđ€āļŠāļĢāļĩ (FSF) āđ‚āļ”āļĒ GDB āļˆāļ°āļ—āļģāļ‡āļēāļ™āđƒāļ™āđāļšāļšāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ (command line)
118
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­ Console āđāļ•āđˆāļ–āđ‰āļēāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļĢāļēāļŸāļŸāļīāļ (GUI) āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰
āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļ§āđˆāļē DDD āđāļ—āļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āļ­āļ‡ GDB āļ­āļĩāļāļ•āđˆāļ­āļŦāļ™āļķāđˆāļ‡
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ™āļģāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Buildroot āļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ›āļĢāļ°āļāļ­āļšāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ
āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āļāļąāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ—āļĩāđˆāļĄāļĩāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰
āļšāļ­āļĢāđŒāļ” Target (ARM)
Pre-compiled Toolchain
Openssh
source
BusyBox
source
DirectFB
source
specic
Library
source
Kernel
source
gcc binutils
gdb Libc
Target File System
Openssh BusyBox
Specic
Library
DirectFB
Application
Kernel Image
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86)
Toolchain
Openssh
headers & lib
DirectFB
headers & lib
Specic Library headers & lib
gcc
gdb
binutils
Libc
Host's
utilities āđ€āļŠāđˆāļ™
pkg-cong..
Buildroot
InputOutput
āļĢāļđāļ›āļ—āļĩāđˆ 3.10 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒ Buildroot
119
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļšāļ™ Embedded Linux
āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ„āļ›āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āļ āļēāļĒāđƒāļ•āđ‰ Embedded Linux āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host)
Tools
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target)
Compiler
Debugger
IDE
āđ‚āļ›āļĢāđāļāļĢāļĄ
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
Kernel
āđ‚āļ›āļĢāđāļāļĢāļĄ
Bootloader
āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ„āļĨāļšāļĢāļēāļĢāļĩ
āļĢāļđāļ›āļ—āļĩāđˆ 3.11 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target
1) āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross-compiling toolchains āđ€āļžāļ·āđˆāļ­āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆ
āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
2) āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Bootloader āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ
āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāđˆāļēāļĒāđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡āđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļ•āļąāļ§ bootloader āļˆāļ°āđ‚āļŦāļĨāļ”āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļ–āļēāļ™āļ°
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđāļĨāđ‰āļ§āļˆāļķāļ‡āļˆāļ°āđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļĨāļģāļ”āļąāļšāļ•āđˆāļ­āđ„āļ›
3) āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰
āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ‚āļ”āļĒāđ„āļ”āđ‰āļšāļĢāļĢāļˆāļļāļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ device drivers āđāļĨāļ°āļšāļĢāļīāļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™
4) Filesystem āļŦāļĢāļ·āļ­āļ­āļēāļˆāđƒāļŠāđ‰āļ„āļģāļ§āđˆāļē Root le system āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš
āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°
āļ„āļģāļŠāļąāđˆāļ‡āļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ
120
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļŠāđˆāļ™āļ•āļąāļ§ Ubuntu āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē Ubuntu āļˆāļ°āļĄāļĩāļāļēāļĢ
āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļ”āļąāļšāļ­āļĒāļđāđˆāļšāđ‰āļēāļ‡āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄāļ—āļĩ āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļžāļąāļ’āļ™āļē
āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ•āđ‰āļ­āļ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰
āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļ·āđˆāļ™āđ† āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ‚āđ‰āļēāđ„āļ› āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ auto-
conf automake libtool libncurses5-dev ncurses-dev bison flex
patch curl cvs texinfo build-essential subversion python-dev
texi2html nfs-kernel-server tftp minicom gtkcom āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ™āļąāđ‰āļ™āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđˆāļŠāļīāļ—āļ˜āļīāđŒ super user (āļŦāļĢāļ·āļ­ root) āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē
(Conguration) āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ (Make) āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļāļĢāļ“āļĩāļāđ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļ™āļ° root āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡
device node āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™ root le systems (āļ„āļģāļŠāļąāđˆāļ‡ mknode) āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļžāļīāđˆāļĄ
āđ€āļ•āļīāļĄāļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ APT āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļšāļĢāļīāļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (/etc/init.d/nfs-kernel-server,
/etc/init.d/networking)āļŦāļĢāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ/āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāļ™āļ­āļ (make in-
stall)
āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļŠāļīāļ—āļ˜āļīāđŒ root āļ™āļąāđ‰āļ™āļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļ™āđ‰āļ­āļĒāļĨāļ‡āđ€āļĢāļ·āđˆāļ­āļĒāđ† āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļĢāļīāđˆāļĄāļĄāļĩāļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāđˆāļ§āļĒ
āļ­āļģāļ™āļ§āļĒāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļšāļšāļāļķāđˆāļ‡āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›āđƒāļŦāđ‰āđƒāļŠāđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Buil-
droot, CodeSourcery (Sourcery G++ Lite), Linaro, crossTool NG āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ
āđƒāļŦāđ‰āļāļąāļš Ubuntu
$ sudo apt-get install autoconf automake libtool libncurses5-dev
ncurses-dev bison flex patch curl cvs texinfo build-essential subver-
sion python-dev g++ gcc texi2html nfs-kernel-server tftp minicom
gtkterm
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ”āđ‰āļ§āļĒ Buildroot āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ wget http://buildroot.uclibc.org/downloads/buildroot-2013.05.tar.gz
$ tar -xzvf buildroot-2013.05.tar.gz
$ cd buildroot-2013.05/
$ make menuconfig
121
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļ·āđˆāļ­āļ§āđˆāļē Sourcery G++ Lite āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ wget
http://www.codesourcery.com/sgpp/lite/arm/portal/package6490/public/ar
m-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi.bin
$ chmod 755 arm-2010q1-202-arm-none-linux-gnueabi.bin
$ ./arm-2010q1-202-arm-none-linux-gnueabi.bin
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ”āđ‰āļ§āļĒ Croostool-NG āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ mkdir -p ctool-ng
$ cd ctool-ng/
122
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.18.0.tar.bz2
$ tar -xjvf crosstool-ng-1.18.0.tar.bz2
$ cd crosstool-ng-1.18.0/
$ ./configure
$ make
$ sudo make install
$ ct-ng list-samples
$ ct-ng arm-unknown-linux-gnueabi
$ ct-ng menuconfig
TOOLCHAIN OPTIONS āļ—āļĩāđˆāļŠāļģāļ„āļąāļ
āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ toolchain āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļŠāļģāļ„āļąāļāļ„āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆ
āđ€āļĢāļĩāļĒāļāļ§āđˆāļē ABI (Application Binary Interface) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— ARM āļĢāđˆāļ§āļĄāļāļąāļš
āļšāļĢāļīāļĐāļąāļ—āļžāļąāļ™āļ˜āļĄāļīāļ•āļĢ āđ‚āļ”āļĒāļ—āļĩāđˆ ABI āļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĢāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļāļąāļ™āđ€āļ­āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļŸāļĨāđŒ āļāļēāļĢāļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§
āđ€āļĄāđ‰āļ™āļ•āđŒ/āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ•āđ‡āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļŠāļ™āļīāļ” ABI āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ°āļ™āļīāļĒāļĄāđƒāļŠāđ‰ ABI āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē
EABI (Embedded Application Binary Interface) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Floating Point āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļšāļēāļ‡
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļš ïŽ‚oating point āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļ•āđˆāļšāļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļēāļˆāļˆāļ°
123
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ­āļ‡āļĢāļąāļš (āđ„āļĄāđˆāļĄāļĩ Floating Point Unit - FPU) āđāļ•āđˆāļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđƒāļŠāđ‰āļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“ ïŽ‚oating
point āđƒāļ™āļĢāļ°āļ”āļąāļšāļ‹āļ­āļŸāļ—āđŒāđāļ§āļĢāđŒāđāļ—āļ™ āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARMv4 āđāļĨāļ° āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARMv5 āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļē
āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļš ïŽ‚oating point āļ•āļąāļ§ toolchain āđ€āļ­āļ‡āļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ hard oat code āđ€āļžāļ·āđˆāļ­
āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ ïŽ‚oating point āđƒāļŦāđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļ”āđ‰āļ§āļĒāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ -mfloat-abi=hard āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩ
FPU āļāđ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļ›āđ‡āļ™ -mfloat-abi=softfp āđāļ—āļ™āđāļĨāļ°āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļāđ‡
āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡āļāļąāļšāļĢāļļāđˆāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ† āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļļāđˆāļ™
ARM Core āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰ -march=armv7 -mcpu=cortex-a8
Bootloaders
bootloader āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāđƒāļŦāđ‰
āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™ (Hardware Initialization) āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ
(DRAM) āđāļĨāļ° MMC Controller āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āļĄāļēāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” Kernel
image (bzImage, zImage) āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđāļĨāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (āđ€āļŠāđˆāļ™ MMC/SD card,
NAND Flash, USB Storage āļŦāļĢāļ·āļ­āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ tftp NFS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡
āļˆāļ°āļ—āļģāļāļēāļĢāđāļ•āļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļšāļ™āļēāļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Kernel image āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™
āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™ (RAM) āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļ·āđˆāļ™āđ† āđ€āļŠāđˆāļ™ āļžāļ­āļĢāđŒāļ• Ethernet āļŦāļĢāļ·āļ­ āļžāļ­āļĢāđŒāļ• USB
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Bootloader āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ„āļ­āļ™āđ‚āļ‹āļĨ (console) āđ€āļžāļ·āđˆāļ­
āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰ āđ€āļŠāđˆāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļŦāļĢāļ·āļ­āļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ
āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āđ€āļŦāđ‡āļ™āļ āļēāļžāļĄāļēāļāļ‚āļķāđ‰āļ™āļˆāļķāļ‡āļ‚āļ­āļŠāļĢāļļāļ›āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ bootloader āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļē
āļĢāļ°āļšāļšāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ (āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 3.12 āđāļĨāļ° 3.13)
1.āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ­āđˆāļēāļ™āļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ ROM āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāļ°
āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļģāļ•āļēāļĄāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™
2.āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļ āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļŦāļ™āđˆāļ§āļĒ
āļ„āļ§āļēāļĄāļˆāļģ (SDRAM Controller) āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ (MMC Controller) āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄ
āļ­āļīāļ™āļžāļļāļ—/āđ€āļ­āļēāļ—āđŒāļžāļļāļ— (I/O Controllers) āđāļĨāļ° āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ (Graphics Controllers)
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
3.āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđ‚āļ”āļĒāļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļāļąāļš
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ„āļ§āļšāļ„āļļāļĄāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™ āđāļĨāļ°āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆ
āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ
124
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
4.āđ€āļĄāļ·āđˆāļ­āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđāļĨāđ‰āļ§ āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°
āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆ
āđ€āļŦāļĨāļ·āļ­āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē root le system āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļŠāļ„āļĢāļīāļ›āļ—āđŒ āđ„āļĨāļšāļĢāļēāļĢāļĩ āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ€āļ­āļēāđ„āļ§āđ‰
5.āđ€āļĄāļ·āđˆāļ­ root le system āļ–āļđāļāđ‚āļŦāļĨāļ”āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāđ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ (le system) āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ (process)
āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāļĨāļģāļ”āļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (process scheduling) āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļš
āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē
Flash
SDRAM
āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡
ROM
āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡
1
st
Boot: (ROM boot)
- āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™
āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡, āļ•āđāļēāđāļŦāļ™āđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ-
āļˆāđāļēāļ•āđˆāļēāļ‡āđ† āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
- āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē Flash āđ„āļ›āļĒāļąāļ‡ SDRAM
- āđ€āļĢāļĩāļĒāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ SDRAM
2
nd
Boot: (Boot loader)
- āļ—āđāļēāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™
āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡, āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļšāļąāļŠ, āļ‚āļ™āļēāļ”āļšāļąāļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
- āļ„āđ‰āļ™āļŦāļēāđ€āļžāļ·āđˆāļ­āļ•āļąāđ‰āļ‡āļ„āđˆāļē āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡
- āļĢāļąāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāļāļēāļĢāļšāļđāļ• (boot script) āđāļĨāļ°āļĢāļąāļ™āļ„āļ­āļ™āđ‚āļ‹āļĨ
āļĢāļđāļ›āļ—āļĩāđˆ 3.12 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļšāļđāļ—āļĢāļ°āļšāļš
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Initialisation)
Bootloader
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļš
āļĨāđˆāļēāļ‡ (āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ) āđāļĨāđ‰āļ§
āļ—āđāļēāļāļēāļĢāđ‚āļŦāļĨāļ” Kernel āļ‚āļķāđ‰āļ™
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē
āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡
Kernel
init process
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢ
āđ€āļ‹āļŠāļĢāļ°āļšāļš āđāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™
āļĢāļ°āļ”āļąāļš user-space
āļĢāļđāļ›āļ—āļĩāđˆ 3.13 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡ Linux Kernel
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡ bootloader āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰ OMAP3 SoC āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ—
TI āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
125
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
ROM Code
āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ ROM (āļ āļēāļĒāđƒāļ™ CPU)
X-Loader
āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND āļŦāļĢāļ·āļ­ MMC āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”
āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM
U-Boot
āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND āļŦāļĢāļ·āļ­ MMC āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”
āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM
Linux Kernel
āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND, MMC āļŦāļĢāļ·āļ­ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­
āļ‚āđˆāļēāļĒ āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM
ROM Code:
āđ€āļāđ‡āļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļ āđāļĨāļ°āļ„āđ‰āļ™āļŦāļē
bootstrap image āļˆāļēāļāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ† āđ€āļžāļ·āđˆāļ­
āđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđ‚āļ”āļĒāļ‚āļ™āļēāļ”āđ‚āļ„āđ‰āļ”
āļˆāļ°āđ„āļĄāđˆāđ€āļāļīāļ™ 64 KB
X-Loader: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ MLO
āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ
āđ‚āļŦāļĨāļ” bootloader āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļ™ SDRAM āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē
āļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†
U-boot: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ u-boot.bin
āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ USB, Ethernet āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ‚āļŦāļĨāļ” Kernel image āļˆāļēāļāļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­
āļˆāļēāļāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ‚āļķāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM
āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆ shell āļ‚āļ­āļ‡ bootloader
Linux Kernel: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ zImage
āļ–āļđāļāļĢāļąāļ™āļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ‹āļķāđˆāļ‡āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ bootloader āļ­āļĩāļāļ•āđˆāļ­āđ„āļ›
āļĢāļđāļ›āļ—āļĩāđˆ 3.14 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ bootloader āļšāļ™ OMAP3 SoC
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ KERNEL IMAGE āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āđāļāđˆ Kernel image (āđ€āļŠāđˆāļ™
bzImage, zImage) āđāļĨāļ° root le system (RFS) āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒ Kernel image āļˆāļ°āļ–āļđāļāļ™āļģāļĄāļēāļšāļĢāļĢāļˆāļļāļĨāļ‡āļ­āļĒāļđāđˆāđƒāļ™
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđ€āļžāļ·āđˆāļ­āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāđ„āļ›āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āđāļ•āđˆāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ Kernel
image āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāļ›āļĢāļ°āļāļ­āļšāļĄāļēāļˆāļēāļāđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ <linux version>/
arch/arm/boot/compressed/ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ buildroot
āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļĩāđˆāđƒāļŠāđ‰ SoC āļĢāļļāđˆāļ™ Versatile
$ ls ~/buildroot/output/build/linux-3.9.4/arch/arm/boot/compressed
ashldi3.o head-shark.S misc.c piggy.xzkern.S
ashldi3.S head-sharpsl.S misc.o sdhi-sh7372.c
atags_to_fdt.c head-shmobile.S mmcif-sh7372.c sdhi-shmobile.c
big-endian.S head-xscale.S ofw-shark.c sdhi-shmobile.h
decompress.c lib1funcs.o piggy.gzip string.c
decompress.o lib1funcs.S piggy.gzip.o string.o
head.o libfdt_env.h piggy.gzip.S vmlinux
head.S ll_char_wr.S piggy.lzma.S vmlinux.lds
head-sa1100.S Makefile piggy.lzo.S vmlinux.lds.in
126
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļ›āļĢāļ°āļāļ­āļšāđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āđ‚āļ”āļĒāļ™āļģāļ„āļģāļŠāļąāđˆāļ‡āļ‚āļ­āļ‡āļŠāļļāļ”
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Binutils āļĄāļēāđƒāļŠāđ‰āļ›āļĢāļ°āļāļ­āļšāđƒāļ™āđāļ•āđˆāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļˆāļ™āđ„āļ”āđ‰āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ Kernel image āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđƒāļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē
zImage āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”
vmlinux Image
piggy.gz
piggy.gzip.S
piggy.gzip.o
head.o
misc.o
head-cpu.o
decompress.o
libfuncs.o
vmlinux
zImage
objcopy gzip as ld objcopy
Raw kernel
executable
(ELF object)
Stripped
kernel binary
(binary object)
Compressed
kernel binary
asm wrapper
+ bootstrap code
composite
kernel image
(ELF object)
kernel image
for bootloader
(binary object)
āļĢāļđāļ›āļ—āļĩāđˆ 3.15 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Kernel Image
Linux File Systems
VIRTUAL FILESYSTEMS
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļŠāļĄāļ·āļ­āļ™āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļ§āđˆāļē Virtual Filesystem Switch (VFS) āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
āļŦāļĢāļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš (System Call Interface) āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰
(user-space) āđāļĨāļ°āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļžāļĒāļēāļĒāļēāļĄ
āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āđ€āļŠāļīāļ‡āļĨāļķāļāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āļ™āļąāđ‰āļ™āđ†
(āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ Ext3 āđƒāļ™āļŪāļēāļĢāđŒāļ”āļīāļŠāļāđŒ āļŦāļĢāļ·āļ­ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ISO 9660 āđƒāļ™āļ‹āļĩāļ”āļĩāļĢāļ­āļĄ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļ‹āļķāđˆāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāļ‹āļąāļš
āļ‹āđ‰āļ­āļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāļŦāļĨāļēāļāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ‡āđˆāļēāļĒāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ (abstrac-
tion layer) āļ‹āļķāđˆāļ‡āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄ uniform interface āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™
ext3 NTFS (āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ) CDFS (āļ‹āļĩāļ”āļĩāļĢāļ­āļĄ) NFS/CIFS (Network Interface Card) āđāļĨāļ° USBFS (USB
Storage) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
127
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļœāļđāđ‰āđƒāļŠāđ‰
Block layer / Device drivers
Abstraction layer
ext3 NTFS CDFS
NFS/
CIFS
USBFS
āļĢāļđāļ›āļ—āļĩāđˆ 3.16 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļŠāļąāđ‰āļ™ Virtual Filesystem
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™ (system call functions) āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ read() āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļšāļ•āđŒāļˆāļēāļāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ„āļĄāđˆ
āļ•āđ‰āļ­āļ‡āļŠāļ™āđƒāļˆāļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™āđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āđƒāļ” āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļ”āļąāļš kernel-space āđ€āļ­āļ‡āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ§āđˆāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™/āđ€āļ‚āļĩāļĒāļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢ
āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ™āļąāđ‰āļ™āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
Linux Kernel
Virtual File System (VFS)
Filesystem drivers
Block device drivers
āđ‚āļ›āļĢāđāļāļĢāļĄ GNU C Library
User-space
Kernel-space
read()
syscall(SYS_read)
āļĢāļđāļ›āļ—āļĩāđˆ 3.17 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (system call) āļ‚āļ­āļ‡ Virtual Filesystem
āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ (partition) āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆ āļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āļ–āļđāļāđāļšāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŠāļĄāļ·āļ­āļ™ (logical disk)
āļ­āļĒāļđāđˆāļšāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (physical disk) āđ€āļŠāđˆāļ™ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļŦāļĢāļ·āļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash memory
āļ‹āļķāđˆāļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē le system āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
128
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Partition
File System
Metadata
File System
Data
Flash Memory
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡
Partition
āļĢāļđāļ›āļ—āļĩāđˆ 3.18 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļŸāļĨāļŠ
āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļšāđˆāļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļĩāđˆāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđƒāļ”
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ āļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‹āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 90
āļŠāļ™āļīāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ sudo fdisk -l
Disk /dev/sda: 107.4 GB, 107374182400 bytes
255 heads, 63 sectors/track, 13054 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000c74
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13055 104855552 83 Linux
Disk /dev/sdb: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0001e836
Device Boot Start End Blocks Id System
/dev/sdb1 1 2089 16775168 82 Linux swap / Solaris
āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ„āđˆāļēāļˆāļģāļ™āļ§āļ™ heads āļ—āļĩāđˆ 255 āļšāđˆāļ‡āļ–āļķāļ‡āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļˆāļēāļ™ platters āļŦāļĢāļ·āļ­ disks āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­
āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° disk āđ€āļ›āđ‡āļ™ D1, D2, ... D255 āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđāļœāđˆāļ™āļˆāļ°āļĄāļĩ track āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ§āļ‡āļāļĨāļĄāđāļĨāļ°āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ™āļąāļšāļˆāļēāļ
āļ§āļ‡āļ™āļ­āļāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ§āļ‡āđƒāļ™āļŠāļļāļ”āļ‹āļķāđˆāļ‡āļĄāļĩāļˆāļģāļ™āļ§āļ™āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 13,054 tracks/disk āđ‚āļ”āļĒāļˆāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđāļ•āđˆāļĨāļ° track āļ§āđˆāļēāđ€āļ›āđ‡āļ™ T1, T2,
...T13054
āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ° track āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ disk āļˆāļ°āļ–āļđāļāđāļšāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ†āđ€āļĢāļĩāļĒāļāļ§āđˆāļē cylinder āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™
āļ•āļģāđāļŦāļ™āđˆāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ tracks āļ—āļĩāđˆ T2 āļ‚āļ­āļ‡āđāļœāđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ D1, D2, āļ–āļķāļ‡ D255 āļˆāļ°āļĢāļ§āļĄāļāļąāļ™āđ€āļ›āđ‡āļ™
129
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
cylinder C2 āļˆāļēāļāļœāļĨāļĨāļąāļžāļžāļ˜āđŒāļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđāļ•āđˆāļĨāļ° track āļˆāļ°āļĄāļĩ logical sectors āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļ„āļ·āļ­āļĄāļĩāļ„āđˆāļē
āđ€āļ—āđˆāļēāļāļąāļš 63 sectors āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ S1, S2, ... S63 āļ•āļēāļĄāļĨāļģāļ”āļąāļšāđ‚āļ”āļĒāđāļ•āđˆāļĨāļ° sector āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļ
āđ€āļ—āđˆāļēāļāļąāļš 512 bytes
	
  	
  	
  
āļĢāļđāļ›āļ—āļĩāđˆ 3.19 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļˆāļēāļ™āđāļĄāđˆāđ€āļŦāļĨāđ‡āļ
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļŠāļđāļ•āļĢāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļˆāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļ—āđˆāļēāļāļąāļš
āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ (Byte) = (āļˆāļģāļ™āļ§āļ™ heads āļŦāļĢāļ·āļ­ disks) * (āļˆāļģāļ™āļ§āļ™ tracks āļ•āđˆāļ­
disk) * (āļˆāļģāļ™āļ§āļ™ sectors āļ•āđˆāļ­ track) * (āļˆāļģāļ™āļ§āļ™ bytes āļ•āđˆāļ­ sector āļŦāļĢāļ·āļ­ sector size)
āļ•āļąāļ§āļ­āļĒāđˆāđˆāļēāļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ = 255 * 13054 * 63 * 512 = 107,372,805,120 bytes
āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ:
āļ„āđˆāļēāļ—āļĩāđˆāļ„āļģāļ™āļ§āļ“āļˆāļēāļāļŠāļđāļ•āļĢāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āđ€āļĨāđ‡āļāļ™āđ‰āļ­āļĒāļˆāļēāļāļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļˆāļĢāļīāļ‡ (107,374,182,400
bytes) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļđāļ•āļĢāđ„āļĄāđˆāđ„āļ”āđ‰āļŠāļ™āđƒāļˆāļˆāļģāļ™āļ§āļ™āđ„āļšāļ•āđŒāđƒāļ™āļŠāđˆāļ§āļ™āļ—āđ‰āļēāļĒāļŠāļļāļ”āļ‚āļ­āļ‡ cylinder āļŦāļĢāļ·āļ­āļ„āļ§āļēāļĄāđ„āļĄāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āļŠāđˆāļ§āļ™
cylinder
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ partition_info.c āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 
130
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#define SECTOR_SIZE 512
#define MBR_SIZE SECTOR_SIZE
#define MBR_DISK_SIGNATURE_OFFSET 440
#define MBR_DISK_SIGNATURE_SIZE 4
#define PARTITION_TABLE_OFFSET 446
#define PARTITION_ENTRY_SIZE 16 // sizeof(PartEntry)
#define PARTITION_TABLE_SIZE 64 // sizeof(PartTable)
#define MBR_SIGNATURE_OFFSET 510
#define MBR_SIGNATURE_SIZE 2
#define MBR_SIGNATURE 0xAA55
#define BR_SIZE SECTOR_SIZE
#define BR_SIGNATURE_OFFSET 510
#define BR_SIGNATURE_SIZE 2
#define BR_SIGNATURE 0xAA55
 
typedef struct {
    unsigned char boot_type; // 0x00 - Inactive; 0x80 - Active (Bootable)
    unsigned char start_head;
    unsigned char start_sec:6;
    unsigned char start_cyl_hi:2;
    unsigned char start_cyl;
    unsigned char part_type;
    unsigned char end_head;
    unsigned char end_sec:6;
    unsigned char end_cyl_hi:2;
    unsigned char end_cyl;
    unsigned long abs_start_sec;
    unsigned long sec_in_part;
} PartEntry;
 
typedef struct {
    unsigned char boot_code[MBR_DISK_SIGNATURE_OFFSET];
    unsigned long disk_signature;
    unsigned short pad;
    unsigned char pt[PARTITION_TABLE_SIZE];
    unsigned short signature;
} MBR;
 
void print_computed(unsigned long sector) {
    unsigned long heads, cyls, tracks, sectors;
 
    sectors = sector % 63 + 1 /* As indexed from 1 */;
    tracks = sector / 63;
    cyls = tracks / 255 + 1 /* As indexed from 1 */;
    heads = tracks % 255;
    printf("(%3d/%5d/%1d)", heads, cyls, sectors);
}
 
int main(int argc, char *argv[]) {
    char *dev_file = "/dev/sda";
    int fd, i, rd_val;
    MBR m;
131
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
    PartEntry *p = (PartEntry *)(m.pt);
    if (argc == 2) {
        dev_file = argv[1];
    }
    if ((fd = open(dev_file, O_RDONLY)) == -1) {
        fprintf(stderr, "Failed opening %s: ", dev_file);
        perror("");
        return 1;
    }
    if ((rd_val = read(fd, &m, sizeof(m))) != sizeof(m)) {
        fprintf(stderr, "Failed reading %s: ", dev_file);
        perror("");
        close(fd);
        return 2;
    }
    close(fd);
    printf("nDOS type Partition Table of %s:n", dev_file);
    printf("  B Start (H/C/S)   End (H/C/S) Type  StartSec    TotSecn");
    for (i = 0; i < 4; i++) {
        printf("%d:%d (%3d/%4d/%2d) (%3d/%4d/%2d)  %02X %10d %9dn",
            i + 1, !!(p[i].boot_type & 0x80),
            p[i].start_head,
            1 + ((p[i].start_cyl_hi << 8) | p[i].start_cyl),
            p[i].start_sec,
            p[i].end_head,
            1 + ((p[i].end_cyl_hi << 8) | p[i].end_cyl),
            p[i].end_sec,
            p[i].part_type,
            p[i].abs_start_sec, p[i].sec_in_part);
    }
    printf("nRe-computed Partition Table of %s:n", dev_file);
    printf("  B Start (H/C/S)   End (H/C/S) Type  StartSec    TotSecn");
    for (i = 0; i < 4; i++) {
        printf("%d:%d ", i + 1, !!(p[i].boot_type & 0x80));
        print_computed(p[i].abs_start_sec);
        printf(" ");
        print_computed(p[i].abs_start_sec + p[i].sec_in_part - 1);
        printf(" %02X %10d %9dn", p[i].part_type,
            p[i].abs_start_sec, p[i].sec_in_part);
    }
    printf("n");
    return 0;
}
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ—āļĩāđˆāđƒāļŠāđ‰āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāđ‰āļ§ āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ­āļ·āđˆāļ™āđ†āđ€āļŠāđˆāļ™ āļ„āļģāļŠāļąāđˆāļ‡ parted
āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđƒāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ parted -l
Model: VMware, VMware Virtual S (scsi)
132
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Disk /dev/sda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 107GB 107GB primary ext4 boot
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 17.2GB 17.2GB primary linux-swap(v1)
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
/dev/sda1 / ext4 errors=remount-ro 0 1
/dev/sdb1 none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§ āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļēāļāļąāļ™āļ„āļ·āļ­ Root le system (RFS) āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļŠāļļāļ”
āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰
āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđ‚āļ”āļĒ RFS āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāļšāļąāļ™āļ—āļķāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”
āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ–āļđāļāļˆāđˆāļēāļĒāđ„āļŸāđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āļ•āļąāļ§āđ€āļ­āļ‡āļ‚āļķāđ‰āļ™āļ•āļąāļ§ bootloader āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ ROM āļāđ‡āļˆāļ°
āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ Kernel image āļ‚āļķāđ‰āļ™āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM) āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ Kernel āļˆāļ°āļ—āļģāļāļēāļĢ
āđ‚āļŦāļĨāļ” RFS āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļšāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš āļ‹āļķāđˆāļ‡āļ•āļąāļ§
āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ­āļĒāļđāđˆāļŦāļĨāļąāļāđ† 2 āđāļšāļšāļ„āļ·āļ­ āđāļšāļš Block āđāļĨāļ° āđāļšāļš Flash
āđāļšāļš Block āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļĨāļ‡āđ„āļ›āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĨāļšāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢ
āđ€āļ‚āļĩāļĒāļ™āļ‹āđ‰āļģ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļšāļš Block āđ„āļ”āđ‰āđāļāđˆ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠ āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđāļšāļšāļ­āđˆāļ­āļ™ (oppy disk) āđāļĨāļ°
āļ”āļīāļŠāļāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM disk) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Flash āļ—āļĩāđˆāđƒāļŠāđ‰āļ§āļīāļ˜āļĩ
āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Block āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Compact Flash, Smart Media, Memory Stick,
Multimedia Card , Flash Drive, MMC/SD card āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Flash āđ€āļŠāđˆāļ™
NOR ash āļŦāļĢāļ·āļ­ NAND ash āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ”āļīāļĄāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› āđ‚āļ”āļĒāļ•āļąāļ§
NOR ash āļ™āļąāđ‰āļ™āļˆāļ°āļ—āļ™āļ•āđˆāļ­āļāļēāļĢāļĨāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“ 10,000 āļ„āļĢāļąāđ‰āļ‡ āļ‹āļķāđˆāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
133
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļ°āđ€āļĢāđ‡āļ§ āđāļ•āđˆāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđāļĨāļ°āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļŠāđ‰āļē āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļķāļ‡āđ€āļŦāļĄāļēāļ°āļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāđƒāļŠāđ‰āđāļ—āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ
āļˆāļģ ROM āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āļŦāļĢāļ·āļ­āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļšāđˆāļ­āļĒāđ† āđ€āļŠāđˆāļ™ BIOS (Basic Input/Output System) āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ, āđ€āļāđ‡āļšāđ€āļŸāļīāļĢāđŒāļĄāđāļ§āļĢāđŒ (rmware) āļšāļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āđāļĨāļ°āđ€āļāđ‡āļš bootloader āļ āļēāļĒāđƒāļ™
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ NAND ash āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ—āđ‚āļ•āļŠāļīāļšāļē āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1989 āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĨāļšāđāļĨāļ°
āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āļāļ§āđˆāļē āļŠāļīāļžāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļāļ§āđˆāļē āļ„āļ§āļēāļĄāļˆāļļāļŠāļđāļ‡āļāļ§āđˆāļēāđāļĨāļ°āļĄāļĩāļĢāļēāļ„āļēāļ•āđˆāļģāļāļ§āđˆāļēāļ•āļąāļ§ NOR ash āļ™āļ­āļāļˆāļēāļ
āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āļāļ§āđˆāļēāļ–āļķāļ‡āļŠāļīāļšāđ€āļ—āđˆāļē āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāđ‰āļēāļāļ§āđˆāļēāđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ•āđˆāļĨāļ°āđ„āļšāļ•āđŒāđƒāļ™āļĢāļđāļ›āđāļšāļš
āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš (random access) āđāļĨāļ°āļ­āļēāļˆāļĄāļĩāđ‚āļ­āļāļēāļŠāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļĢāļ°āļ”āļąāļšāļšāļīāļ•āļŠāļđāļ‡āļāļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒ
NOR Flash āļ­āļĩāļāļ”āđ‰āļ§āļĒ
āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļ•āđˆāļĨāļ°āļŠāļ™āļīāļ”āļˆāļ°āļĄāļĩāļ§āļīāļ˜āļĩāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļŠāļđāļāļŦāļēāļĒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļĄāļąāļĒāļāđˆāļ­āļ™
(Traditional BLock Filesystems) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļāļīāļ”āļāļēāļĢāļœāļīāļ”āļžāļĨāļēāļ”āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđāļšāļš
āļāļĢāļ°āļ—āļąāļ™āļŦāļąāļ™ āļĢāļ°āļšāļšāļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (State) āļ‚āļ“āļ°āļāđˆāļ­āļ™āļ›āļīāļ”āļĢāļ°āļšāļšāđ„āļ”āđ‰ āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ
āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ‹āđˆāļ­āļĄāđāļ‹āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ ext2 (Linux
lesystem), vfat (Windows lesystem) āļ•āđˆāļēāļ‡āđ† āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ‹āđˆāļ­āļĄāđāļ‹āļĄāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆ
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ„āļ”āđ‰āđāļāđˆāļ„āļģāļŠāļąāđˆāļ‡ fsck.ext2 āļŦāļĢāļ·āļ­ fsck.vat āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđāļ•āđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ‰āļĨāļēāļ”āļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”
Journaled Filesystems āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāļ–āļđāļ
āļ•āđ‰āļ­āļ‡āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđāļšāļšāļāļĢāļ°āļ—āļąāļ™āļŦāļąāļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ§āļīāļ˜āļĩāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļŠāļ–āļēāļ™āļ°
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĨāļ‡āđƒāļ™ Journal āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ entry āļĨāļ‡āđƒāļ™ journal
āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļŸāļĨāđŒ
āļĨāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ entry āļ āļēāļĒāđƒāļ™ journal
āđ‚āļ›āļĢāđāļāļĢāļĄ
User-space
Kernel-space
āļĢāļđāļ›āļ—āļĩāđˆ 3.20 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡ journal
134
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĄāļ·āđˆāļ­āļĢāļ°āļšāļšāļāļĨāļąāļšāļĄāļēāļ—āļģāļ‡āļēāļ™āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš Journal āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš journal āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāļāđˆāļ­āļ™
āļ—āļĩāđˆāļĢāļ° āļšāļšāļ›āļīāļ”āļ—āļģāļ‡āļēāļ™āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰āļ§āđˆāļēāļĄāļĩāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ–āđ‰āļēāļĄāļĩāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļāļđāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļŠāļĩāļĒāļŦāļēāļĒāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļāļĨāļąāļšāļ„āļ·āļ™āļĄāļēāļ”āđ‰āļ§āļĒ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡ āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļĩāļŠāļ•āļēāļĢāđŒāļ—
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
Journal
āļ§āđˆāļēāļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆ?
āļĨāļ°āļ—āļīāđ‰āļ‡āļŠāđˆāļ§āļ™
journal entries
āļ—āļĩāđˆāđ„āļĄāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒ
āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ journal
Filesystem
OK
No
Yes
āļĢāļđāļ›āļ—āļĩāđˆ 3.21 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ journal āđƒāļ™āļ‚āļ“āļ°āļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĄāļēāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš ext3 āđāļĨāļ° ext4 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđāļšāļš journal
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļāļˆāļēāļ ext2 āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš journal āđāļĨāļ°
āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļđāļ‡āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°
āļ‹āđˆāļ­āļĄāđāļ‹āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļ­āļ‡āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ e2fsck āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ sudo e2fsck /dev/sda1
e2fsck 1.41.11 (14-Mar-2010)
/dev/sda1 is mounted.
WARNING!!! The filesystem is mounted. If you continue you ***WILL*** cause
***SEVERE*** filesystem damage.
Do you really want to continue (y/n)?
āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext3 āđāļĨāļ° ext4 āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2008 āļ™āļēāļĒ
Theodore Ts'o āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext2 ext3 āđāļĨāļ° ext4 āđ„āļ”āđ‰āđƒāļŦāđ‰āļ„āļ§āļēāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāđƒāļ™āļ­āļ™āļēāļ„āļ•
āļ­āļąāļ™āđƒāļāļĨāđ‰āļ™āļĩāđ‰āļ­āļēāļˆāļˆāļ°āļĄāļĩāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļ”āđāļ—āļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē Btrfs (B-tree lesystem) āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ—
Oracle āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļąāđ‰āļ‡ ext3 āđāļĨāļ° ext4 āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļāđˆāļēāļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢ
āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ­āļ™āļēāļ„āļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž (reliability) āļ„āļ§āļēāļĄ
āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§ (scalability) āđāļĨāļ°āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢ
135
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ext2, ext3, ext4 āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ mkfs.ext<āļŦāļĄāļēāļĒāđ€āļĨāļ‚> āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡
empty lesystem
$ mkfs.ext2 /dev/hda3
$ mkfs.ext3 /dev/sda2
$ mkfs.ext4 /dev/sda3
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ„āļŸāļĨāđŒ image āđ€āļ”āļīāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§
$ mkfs.ext2 disk.img
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļđāļ›āđāļšāļšāđ„āļŸāļĨāđŒ image āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
# dd if=/dev/zero of=rootfs.image bs=1MB count=1024
1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB) copied, 15.3415 s, 66.7 MB/s
# mkfs.ext3 rootfs.image
mke2fs 1.41.11 (14-Mar-2010)
rootfs.image is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
62592 inodes, 250000 blocks
12500 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=260046848
8 block groups
32768 blocks per group, 32768 fragments per group
7824 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkdir /mnt/rootfs
# mount rootfs.image /mnt/rootfs/ -o loop
# rsync -a ~/busybox/_install/ /mnt/rootfs/
# chown -R root:root /mnt/rootfs/
# sync
# umount /mnt/rootfs
136
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ /mnt/rootfs/ āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ rootfs.image āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ­āļĒāļēāļāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļāļ­āļšāđ€āļ›āđ‡āļ™ rootfs āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ
āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ rootfs āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩāđāļĨāđ‰āļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” device
āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ rootfs āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ mkdir ~/rootfs
$ cd ~/rootfs
$ mkdir bin dev etc lib proc sbin tmp usr var
$ chmod 1777 tmp
$ mkdir usr/{bin,lib,sbin}
$ mkdir var/{lib,lock,log,run,tmp}
$ chmod 1777 var/tmp
# cd dev/
# mknod -m 600 mem c 1 1 // Physical memory access
# mknod -m 666 null c 1 3 // Null device
# mknod -m 666 zero c 1 5 // Null byte source
# mknod -m 644 random c 1 8 // Nondeterministic rnd nbr
# mknod -m 600 tty0 c 4 0 // Current virtual console
# mknod -m 600 tty1 c 4 1 // First virtual console
# mknod -m 600 ttyS0 c 4 64 // First UART serial port
# mknod -m 666 tty c 5 0 // Current TTY device
# mknod -m 600 console c 5 1 // System console
$ ln -s /proc/self/fd fd
$ ln -s /proc/self/fd/0 stdin
$ ln -s /proc/self/fd/1 stdout
$ ln -s /proc/self/fd/2 stderr
Embedded Linux File System
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļˆāļģāļ™āļ§āļ™āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļš ïŽle system āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ‚āļ”āļĒ
āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš Flash āļ‹āļķāđˆāļ‡āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ” NOR Flash āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ device
driver āļˆāļ°āļ–āļđāļāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļœāđˆāļēāļ™āļ•āļąāļ§ MTD Drivers
137
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Root File System
JFFS2 CRAMFS RAMFS
MTD
Drivers
NOR Flash RAM
User-space
Kernel-space
Hardware
āļĢāļđāļ›āļ—āļĩāđˆ 3.22 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ MTD driver
āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ°āđ€āļˆāļ­āļāļąāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē initrd (initial
RAM disk) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ” (compressed lesystem) āđ‚āļ”āļĒāđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
initrd āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļ”āđ‰āļ§āļĒāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļēāļĢāđƒāļ™āļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļĒāđˆāļ­āđƒāļŦāđ‰
āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļ™āļģāđ„āļ›āļšāļĢāļĢāļˆāļļāļĨāļ‡āđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđāļšāļšāļ­āđˆāļ­āļ™ (oppy disk) āđ„āļ”āđ‰āđāļĨāļ°āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļšāļđāļ—āđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āđ€āļ•āđ‡āļĄāļĨāļ‡āđƒāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ‹āļķāđˆāļ‡āļŦāļĨāļąāļ‡āļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 2.6 āđ„āļ”āđ‰āļ–āļđāļāļ›āļĨāđˆāļ­āļĒ
āļ­āļ­āļāļĄāļē āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ initrd āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļ™āļŠāļ·āđˆāļ­āđƒāļŦāļĄāđˆāļ§āđˆāļē “initramfs” (Initial RAM FileSystem)
āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļˆāļ°āļžāļšāđ€āļŦāđ‡āļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđāļœāđˆāļ™ Live CD (āđ€āļŠāđˆāļ™ Knoppix āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāļ—āļģ Live USB
āļāļąāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡ Live CD āļŦāļĢāļ·āļ­ Live USB āļ™āļąāđ‰āļ™āđ‚āļ”āļĒāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļĒāđˆāļ­āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļĄāļē
āļ­āļĒāļđāđˆāļšāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (DDRAM) āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđƒāļ”āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļĨāļ‡āđƒāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļœāđˆāļēāļ™āđ€āļĄāļ™āļđāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™
138
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 3.23 āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļāļēāļĢāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļāļēāļĢāđƒāļŠāđ‰ Live CD āļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡ initramfs āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļ™āļēāļ”āđ„āļĄāđˆāđ€āļāļīāļ™
āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āđāļœāđˆāļ™ CD-ROM āļ—āļąāđˆāļ§āđ„āļ›āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļ™āļēāļ” 700 MB āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”
āđƒāļŦāļāđˆāļ‚āļķāđ‰āļ™ Live USB āļˆāļķāļ‡āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļŠāļļāļ”āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŦāļĢāļ·āļ­āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđāļāđˆ
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” cramfs
cramfs āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđ€āļ­āļēāđ„āļ§āđ‰ āđāļĨāļ°āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Linus Torvalds
āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ°
āđāļĒāļāđ€āļ›āđ‡āļ™ āđ€āļžāļˆ (page) āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš (random access) āļ‚āđ‰āļ­āļ”āļĩ
āļ‚āļ­āļ‡āļāļēāļĢāļ—āļģāđƒāļŦāđ‰āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ‚āļ­āļ‡ cramfs āļ™āļąāđ‰āļ™āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āļ‚āļ­āļ‡āļĢāļ°āļšāļš
āđ€āļžāļĢāļēāļ°āļˆāļ°āđ„āļĄāđˆāļĄāļĩāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđ„āļŸāļĨāđŒāļĢāļ°āļšāļšāđ€āļŠāļĩāļĒāļŦāļēāļĒāļŦāļĢāļ·āļ­āļŠāļđāļāļŦāļēāļĒāļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™
139
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ramfs
ramfs āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Linus Torvalds āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļķāđ‰āļ™āđ„āļ§āđ‰āđƒāļ™
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (RAM) āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash āđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰
āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” initrd āļŦāļĢāļ·āļ­
initramfs āļ—āļĩāđˆāļ–āļđāļāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ•āļēāļĒāļ•āļąāļ§āđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” jffs2
jffs2 āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļĒāļ­āļ”āļ™āļīāļĒāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™/āļ­āđˆāļēāļ™ āđāļĨāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđƒāļ™āļĢāļđāļ›āđāļšāļš journalling
ash lesystem āđ‚āļ”āļĒāļ•āļąāļ§ jffs2 āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” Flash memory āļĄāļēāļāļāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”
RAM āđ€āļžāļĢāļēāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ramfs āđāļ•āđˆāļˆāļ°āļĄāļĩāļ‚āđ‰āļ­āļ”āļĩāļ—āļĩāđˆāļŠāļģāļ„āļąāļ
āļ­āļĩāļāļ­āļĒāđˆāļēāļ‡āļ„āļ·āļ­āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ jffs2 āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļāļđāđ‰āļ„āļ·āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ‚āļ“āļ°āđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš
āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™ ext2/ext3
āļ•āļēāļĢāļēāļ‡ 3.3 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
FILE SYSTEM WRITE PERSISTENT
POWER DOWN RE-
LIABILITY
COMPRES-
SION
LIVES IN
RAM
CRAMFS No No N/A Yes No
JFFS2 Yes Yes Yes Yes No
RAMFS Yes Yes Yes No Yes
YAFFS2 Yes Yes Yes No No
Ext2 over NFTL Yes Yes No No No
Ext3 over NFTS Yes Yes Yes No No
Ext2 over RAM disk Yes No No No Yes
MEMORY TECHNOLOGY DEVICES (MTD)
MTD āđ€āļ›āđ‡āļ™āļŠāļīāļŸāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš ïŽ‚ash āļ—āļĩāđˆāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļēāļ NAND/NOR ash āļ—āļĩāđˆāļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļš
āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļšāđˆāļ­āļĒ (non-volatile data) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒ boot image āđāļĨāļ°āđ€āļāđ‡āļšāļ„āđˆāļē
cong āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ bootloader
āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” ïŽ‚ash āđāļ•āđˆāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash āđ€āļŠāđˆāļ™ USB
sticks, MMC/SD cards āđ€āļžāļĢāļēāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđāļšāđˆāļ‡āđ€āļ›āđ‡āļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ„āļ”āđ‰
āđ€āļŦāļĄāļ·āļ­āļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āđāļ•āđˆāļāđ‡āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM) āđƒāļ™āļŦāļĨāļēāļĒāđ†āļ”āđ‰āļēāļ™āļ‹āļķāđˆāļ‡
āļˆāļļāļ”āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒ
āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ–āļđāļāļĨāļšāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļ› (āļ—āļĩāđˆāļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē erase-block)
140
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļģāļ™āļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļāđ‡āļˆāļģāļāļąāļ”āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āđ€āļžāļĩāļĒāļ‡ 1,000 āļ–āļķāļ‡ 10,000 āļ„āļĢāļąāđ‰āļ‡
āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļāđ‡āļĒāļąāļ‡āļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āļŦāļĨāļąāļāđ†āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļš
bootloaders āđāļĨāļ° Kernel image
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ /proc/mtd
$ cat /proc/mtd
dev:  size    erasesize name
mtd0: 000a0000 00020000 "misc"
mtd1: 00420000 00020000 "recovery"
mtd2: 002c0000 00020000 "boot"
mtd3: 0fa00000 00020000 "system"
mtd4: 02800000 00020000 "cache"
mtd5: 0af20000 00020000 "userdata"
āļĢāļđāļ›āđāļŠāļ”āļ‡āļāļēāļĢāđāļšāđˆāļ‡āđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
Partition
Partition
Partition
Partition
sector
sector
sector
sector
āļĢāļđāļ›āļ—āļĩāđˆ 3.24 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ sector āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™
āļˆāļēāļāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļ§āđˆāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĨāļšāļāđˆāļ­āļ™āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āđƒāļŦāļĄāđˆāļĨāļ‡āđ„āļ› āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
old data
new data 1 new data 2
old data
new data 1
erased
sector
old data
new data 2
temp buf
āļĢāļđāļ›āļ—āļĩāđˆ 3.25 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
141
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļ›āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļŠāļąāļ‡āđ€āļāļ•āļˆāļēāļāļ”āđ‰āļēāļ™āļ‹āđ‰āļēāļĒāļˆāļ°āļžāļšāļ§āđˆāļēāļŦāļĨāļąāļ‡āļˆāļēāļ
āļāļēāļĢāļĨāļšāļ„āļĢāļąāđ‰āļ‡āļĨāđˆāļēāļŠāļļāļ”āļāđ‡āđ€āļĢāļīāđˆāļĄāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ•āļąāļ§āđāļĢāļ (new data 1) āļĨāļ‡āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡ offset āļ—āļĩāđˆāļĻāļđāļ™āļĒāđŒ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰
āļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ•āļąāļ§āļ–āļąāļ”āļĄāļē (new data 2) āļĨāļ‡āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āđ€āļ”āļīāļĄāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđāļĢāļ āļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
āļˆāļ°āļ•āđ‰āļ­āļ‡āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāđˆāļēāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļŠāļļāļ”āđ„āļ›āļžāļąāļāđ„āļ§āđ‰āđƒāļ™āļšāļąāļŸāđ€āļŸāļ­āļĢāđŒāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļāđˆāļ­āļ™ (temp buf) āđāļĨāđ‰āļ§āļˆāļķāļ‡āļŠāļēāļĄāļēāļĢāļ–
āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļĨāļšāđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ„āđˆāļ­āļĒāļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāđˆāļē (temp buf) āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ (new
data 2) āļĄāļēāđ€āļāđ‡āļšāļ•āļēāļĄāļĨāļģāļ”āļąāļš
āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđƒāļ™āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ ïŽ‚ash translation layer (FTL) āđ€āļžāļ·āđˆāļ­āļĨāļ”āļ„āļ§āļēāļĄāļĒāļļāđˆāļ‡āļĒāļēāļāđƒāļ™
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļœāđ‰āļđāđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ€āļŠāđˆāļ™ JFFS2 āđāļĨāļ° YAFFS āđ‚āļ”āļĒ
āļ—āļąāđ‰āļ‡ JFFS2 āđāļĨāļ° YAFFS le systems āļ™āļąāđ‰āļ™āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™ loopback device āđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ
āļ—āļģāļāļēāļĢ mount āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ„āļ”āđ‰ (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ -o loop) āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš linux lesystem āļ—āļąāđˆāļ§āđ„āļ› āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆ
āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļšāļš block āļ”āļąāļ‡āļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāđ„āļ›āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āļļāļ›āļāļĢāļ“āđŒ MTF
āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ mount āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ•āļąāļ§āđ„āļ”āđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” MTD Driver āļŠāļ·āđˆāļ­āļ§āđˆāļē mtdram
module āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™ āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ‚āļķāđ‰āļ™āļĄāļēāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ™āļĩāđ‰
# modprobe mtdram total_size=65536 erase_size=128
āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ—āļĩāđˆāļ–āļđāļāļˆāļģāļĨāļ­āļ‡āļ‚āļķāđ‰āļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
# cat /proc/mtd
dev: size erasesize name
mtd0: 04000000 00020000 "mtdram test device"
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ dd āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ jffs2 le system āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ mtdblock0
# dd if=rootfs.jffs2 of=/dev/mtdblock0
mount āļ•āļąāļ§ jffs2 lesystem āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
# mount -t jffs2 /dev/mtd0 ~/rootfs
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
142
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#include <mtd/mtd-user.h>
 
int main()
{
    mtd_info_t mtd_info;
    int fd = open("/dev/mtd5", O_RDWR);
ioctl(fd, MEMGETINFO, &mtd_info);
 
    printf("MTD type: %un", mtd_info.type);
    printf("MTD total size : %u bytesn", mtd_info.size);
    printf("MTD erase size : %u bytesn", mtd_info.erasesize);
 
    return 0;
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD
unsigned char buf[64];
unsigned char data[7] = { ‘B’, ‘U’, ‘R’, ‘A’ , ‘P’ , ‘H’ , ‘A’ };
/* read something from last sector */
lseek(fd, -mtd_info.erasesize, SEEK_END);
read(fd, buf, sizeof(buf));
/* write something to last sector */
lseek(fd, -mtd_info.erasesize, SEEK_END);
write(fd, data, sizeof(data));
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ device āļŠāļ·āđˆāļ­ /dev/mtd0
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <mtd/mtd-user.h>
int main() {
	 mtd_info_t mtd_info; // the MTD structure
	 erase_info_t ei; // the erase block structure
	 int i;
	 unsigned char data[20] = { 0xDE, 0xAD, 0xBE, 0xEF, // our data to write
	 	 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE,
	 	 0xEF, 0xDE, 0xAD, 0xBE, 0xEF };
	 unsigned char read_buf[20] = { 0x00 }; // empty array for reading
	 int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and
	 // writing. Note you want mtd0 not mtdblock0
	 // also you probably need to open permissions
	 // to the dev (sudo chmod 777 /dev/mtd0)
	 ioctl(fd, MEMGETINFO, &mtd_info); // get the device info
143
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
// dump it for a sanity check, should match what's in /proc/mtd
	 printf("MTD Type: %xnMTD total size: %x bytesnMTD erase size: %x bytesn",
mtd_info.type, mtd_info.size, mtd_info.erasesize);
	 ei.length = mtd_info.erasesize; //set the erase block size
	 for (ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length) {
	 	 ioctl(fd, MEMUNLOCK, &ei);
	 // printf("Eraseing Block %#xn", ei.start); // show the blocks erasing
	 	 // warning, this prints a lot!
	 	 ioctl(fd, MEMERASE, &ei);
	 }
	 lseek(fd, 0, SEEK_SET); // go to the first block
	 read(fd, read_buf, sizeof(read_buf)); // read 20 bytes
	 // sanity check, should be all 0xFF if erase worked
	 for (i = 0; i < 20; i++)
	 	 printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]);
	 lseek(fd, 0, SEEK_SET); // go back to first block's start
	 write(fd, data, sizeof(data)); // write our message
	 lseek(fd, 0, SEEK_SET); // go back to first block's start
	 read(fd, read_buf, sizeof(read_buf)); // read the data
	 // sanity check, now you see the message we wrote!
	 for (i = 0; i < 20; i++)
	 	 printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]);
	 close(fd);
	 return 0;
}
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢ EMBEDDED LINUX
āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļģāļ‡āļēāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒāļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āđāļāđˆāđ„āļŸāļĨāđŒ Kernel
Image (initrd, vmlinux, bzImage, zImage āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ„āļŸāļĨāđŒ Root le system (ext2/3/4,
cramfs, jffs2, hfffs āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāđ‰āļ§āļ™āļģāđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰
â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āļŦāļĢāļ·āļ­ USB Storage
â€Ģ root=/dev/sdXY āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŠāļ·āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ° Y āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™
root=/dev/sdb2 (āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 2 āļ‚āļ­āļ‡āļ”āļīāļŠāļāđŒāļ—āļĩāđˆ 2)
â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ MMC/SD Card
â€Ģ root=/dev/mmcblkXpY āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ° Y āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒ
āļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™ root=/dev/mmcblk0p2 (āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 2 āļ‚āļ­āļ‡āļ”āļīāļŠāļāđŒāđāļĢāļ)
144
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ NAND ash
â€Ģ root=/dev/mtdblockX āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™ root=/dev/mtdblock3
(āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 4)
â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ NFS āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
â€ĒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™ (ROM)
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš (RAM) āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāļ āļēāļ§āļ°āļāđˆāļ­āļ™āļ—āļģāļ‡āļēāļ™
āđāļĨāļ°āļŠāļ āļēāļ§āļ°āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ” Kernel image āđāļĨāļ° root lesystem āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆ
āļ āļēāļĒāđƒāļ™ ROM āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
Compressed
Kernel
RootFS
image
Bootloader
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļēāļĢāļ°āļšāļš
RootFS
image
Bootloader
Kernel
RootFS
User
Memory
ROM
RAM RAM
ROM
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļēāļĢāļ°āļšāļš (āļĢāļ°āļšāļšāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™)
Compressed
Kernel
āļĢāļđāļ›āļ—āļĩāđˆ 3.26 āđāļŠāļ”āļ‡āļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđāļĨāļ° RootFS āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ” Kernel image āđāļĨāļ° root lesystem āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™ āļ—āļĩāđˆāļ­āļĒāļđāđˆ
āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
145
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
Bootloader
RAM
ROM
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host/āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Server
DHCP Server
/tftproot/
- Compressed Kernel
(zImage)
TFTP Server
/nfsroot/
- Root Filesystem directory
NFS Server
Kernel
āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
(Ethernet/Internet)
Target IP: 192.168.0.5
Server IP: 192.168.0.1
Kernel: zImage
NFS mount: /nfsroot/
āļĢāļđāļ›āļ—āļĩāđˆ 3.27 āđāļŠāļ”āļ‡āļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ° RootFS āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ server
āļ•āļēāļĢāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ ïŽlesystem āļ—āļĩāđˆāļ™āļīāļĒāļĄāļŠāļđāļ‡āļŠāļļāļ”āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļ­āļ”āļ™āļīāļĒāļĄāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™
āļ•āļēāļĢāļēāļ‡ 3.4 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
FS WINDOWS MAC LINUX ANDROID CHROME OS IPAD XBOX360 PS3
FAT32 Yes Yes Yes Yes Yes (1) Yes Yes
EXFAT Yes(2) No(3) (3) Yes No No No No
EXt3 (4) Yes Yes No(6) Yes No No No
NTFS Yes Yes Yes (8) Yes No No[9] No
HFS+ No[10] Yes (11) (8) (12) (1) No No
āđ‚āļ”āļĒāļ—āļĩāđˆ:
(1) iPads (āđ„āļĄāđˆāļĢāļ§āļĄ iPhones) āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ FAT āđāļĨāļ° HFS āđ„āļ”āđ‰ āđāļ•āđˆāļˆāļ°āļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒ
āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āļĢāļđāļ›āļ āļēāļž āđāļĨāļ°āļ§āļīāļ”āļĩāđ‚āļ­āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
(2) exFAT āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĄāļēāļˆāļēāļ FAT āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Vista / Windows 7 / Windows 8, āđāļĨāļ°
XP
(3) āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ FUSE āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰
(4) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ explore2fs, Ext2Fsd āļŦāļĢāļ·āļ­ Ext2IFS āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™
āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— ext2/ext3/ext4 āđ„āļ”āđ‰
(5) āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ OSXFUSE fuse-ext2, āļŦāļĢāļ·āļ­ Paragon
(6) āđ€āļ‰āļžāļēāļ°āļšāļēāļ‡ ROMs āļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext3 āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
146
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
(7) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡
āļ•āļīāļ”āļ•āļąāđ‰āļ‡ OSXFUSE with NTFS-3G, Paragon āļŦāļĢāļ·āļ­ Tuxera
(8) āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Android āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Paragon app āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS
āđāļĨāļ° HFS āđ„āļ”āđ‰
(9) Xbox 360 āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Microsoft āđ€āļ­āļ‡ āđ„āļĄāđˆāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS
(10)āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Paragon āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ
(11)āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ HFS+ āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ āļāđ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļīāļ”āļ„āļ§āļēāļĄ
āļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡ journalling āđ„āļ›
(12)āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ journaled HFS+ āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§
BusyBox āļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ
BusyBox āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ™āļēāļĒ Bruce Perens āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1996 āļ‹āļķāđˆāļ‡āđ€āļ”āļīāļĄāļ—āļĩāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āļāļđāđ‰āļ„āļ·āļ™āđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđ€āļāđ‡āļ•āđāļšāļšāļšāļđāļ—āļ•āļąāļ§āđ€āļ­āļ‡āđ„āļ”āđ‰
āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian (bootable Debian Linux system)
āđ‚āļ”āļĒāļĄāļĩāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”
āļĢāļ§āļĄāļāļąāļ™āđāļĨāđ‰āļ§āđ„āļĄāđˆāđ€āļāļīāļ™ 1.4 MB āļ–āļķāļ‡ 1.7 MB āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļš
āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđ€āļāđ‡āļ•āđƒāļ™āļĒāļļāļ„āļ™āļąāđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŦāļĨāļąāļāļāļēāļĢāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡
āļ—āļģāđƒāļŦāđ‰ BusyBox āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđ€āļ•āđ‡āļĄāđ„āļ›āļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļĄāļēāļĒāļ„āļ·āļ­
āļāļēāļĢāđƒāļŠāđ‰āļŠāđˆāļ§āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āļąāļ§ Busy-
Box āļˆāļ°āļ—āļģāļāļēāļĢāļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄ grep āđāļĨāļ° ïŽnd āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđ‚āļ”āļĒ
āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ–āļķāļ‡āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļļāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (recursive) āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ€āļ›āđ‡āļ™āļœāļĨāđƒāļŦāđ‰āļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢ
āļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļĨāļ”āļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ BusyBox āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ™āļĩāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāļĄāļĩ
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 3.5 MB āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļĨāļ”āļĨāļ‡āđ€āļŦāļĨāļ·āļ­āđ€āļžāļĩāļĒāļ‡ 200 KB āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰
āļ”āļąāļ‡āļ™āļąāđ‰āļ™ BusyBox āļˆāļķāļ‡āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨ
āļāļąāļ‡āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ†āļˆāļ™āļ–āļđāļāļ•āļąāđ‰āļ‡āļ‰āļēāļĒāļēāļ§āđˆāļēāđ€āļ›āđ‡āļ™ â€œāļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒâ€ (Swiss Army Knife) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄāļŠāļļāļ”
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĢāļĢāļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™ āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļˆāļąāļ”āļāļēāļĢāļšāļĢāļīāļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļ‚āļ“āļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāļģāļĨāļąāļ‡āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ (Init program), āļŠāļļāļ”āļ„āļģ
āļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļš (System & Conguration) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™ BusyBox ver-
sion 1.13 āđ„āļ”āđ‰āđāļāđˆ
[, [[ , addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, base-
name, bbconfig, bbsh, brctl, bunzip2, busybox, bzcat, bzip2, cal, cat,
catv, chat, chattr, chcon, chgrp, chmod, chown, chpasswd, chpst,
chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab,
147
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 3.28 āļĄāļĩāļ” Swiss Army Knife
cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser,
depmod, devfsd, df, dhcprelay, diff, dirname, dmesg, dnsd, dos2unix,
dpkg, dpkg_deb, du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep,
eject, env, envdir, envuidgid, ether_wake, expand, expr, fakeidentd,
false, fbset, fbsplash, fdflush, fdformat, fdisk, fetchmail, fgrep,
find, findfs, fold, free, freeramdisk, fsck, fsck_minix, ftpget,
ftpput, fuser, getenforce, getopt, getsebool, getty, grep, gunzip,
gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush,
hwclock, id, ifconfig, ifdown, ifenslave, ifup, inetd, init, inotifyd,
insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute,
iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, lash,
last, length, less, linux32, linux64, linuxrc, ln, load_policy, load-
font, loadkmap, logger, login, logname, logread, losetup, lpd, lpq,
lpr, ls, lsattr, lsmod, lzmacat, makedevs, man, matchpathcon, md5sum,
mdev, mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod,
mkswap, mktemp, modprobe, more, mount, mountpoint, msh, mt, mv,
nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, parse,
passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root,
pkill, poweroff, printenv, printf, ps, pscan, pwd, raidautorun, rdate,
rdev, readahead, readlink, readprofile, realpath, reboot, renice, re-
set, resize, restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio,
rtcwake, run_parts, runcon, runlevel, runsv, runsvdir, rx, script,
sed, selinuxenabled, sendmail, seq, sestatus, setarch, setconsole, se-
tenforce, setfiles, setfont, setkeycodes, setlogcons, setsebool, set-
sid, setuidgid, sh, sha1sum, showkey, slattach, sleep, softlimit,
sort, split, start_stop_daemon, stat, strings, stty, su, sulogin, sum,
sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac,
tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd,
time, top, touch, tr, traceroute, true, tty, ttysize, tune2fs, udhcpc,
udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos,
unlzma, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock,
watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļąāļ™āļĄāļēāļˆāļēāļāđ€āļžāļĩāļĒāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļ”āļĩāļĒāļ§āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļĢāļđāđ‰āļŠāļķāļāļ§āđˆāļēāļĄāļĩāļŦāļĨāļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļ•āđˆāļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§āđ€āļ›āđ‡āļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ (argu-
ment passing) āđ„āļ›āļĒāļąāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĐāļēāļ‹āļĩ
// myBusyBox.c
#include <stdio.h>
int main( int argc, char *argv[] )
{
int i;
for (i = 0 ; i < argc ; i++) {
printf("argv[%d] = %sn", i, argv[i]);
}
return 0;
148
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
}
āļˆāļēāļāļ‚āđ‰āļēāļ‡āļšāļ™āļ•āļąāļ§ argc āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāđ€āļāđ‡āļšāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āđāļĨāļ° argv āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ™āļīāļ”āļ­āļ°āđ€āļĢāļĒāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļ•āđˆāļĨāļ°āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ
āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļžāļĢāđ‰āļ­āļĄāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ
āļ”āļąāļ‡āļ™āļĩāđ‰
$ gcc -o myBusyBox myBusyBox.c
$ ./myBusyBox arg1 arg2
argv[0] = ./myBusyBox
argv[1] = arg1
argv[2] = arg2
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” symbolic link āļŠāļ·āđˆāļ­āļ§āđˆāļē my_grep āđāļĨāļ° my_nd āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ myBusyBox
āđ€āļ”āļīāļĄ
$ ln -s myBusyBox my_grep
$ ln -s myBusyBox my_find
$ ls -al my*
-rwxr-xr-x 1 student student 8503 2013-08-13 08:21 myBusyBox
-rw-r--r-- 1 student student 162 2013-08-13 08:21 myBusyBox.c
lrwxrwxrwx 1 student student 9 2013-08-13 08:27 my_find -> myBusyBox
lrwxrwxrwx 1 student student 9 2013-08-13 08:22 my_grep -> myBusyBox
$ ./my_grep -R 'declare' /usr/include/
argv[0] = ./my_grep
argv[1] = -R
argv[2] = declare
argv[3] = /usr/include/
$ ./my_find /usr/include/ -name 'declare' -print
argv[0] = ./my_find
argv[1] = /usr/include/
argv[2] = -name
argv[3] = declare
argv[4] = -print
āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āđāļ™āļ§āļ„āļīāļ”āđāļĨāļ°āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
myBusyBox āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨ (grep) āđāļĨāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ (nd)
āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ”āļāđ‡āļ•āļēāļĄāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļ„āđˆāļēāđƒāļ™ argv[0] āļˆāļ°āļšāļĢāļĢāļˆāļļāļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡
āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļžāļīāļĄāļžāđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āđāļ—āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™āđ†āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļ•āļąāļ§
āđ‚āļ›āļĢāđāļāļĢāļĄ myBusyBox āļāđ‡āļˆāļ°āļ™āļģāļ„āđˆāļēāļ āļēāļĒāđƒāļ™ argv[0] āđ„āļ›āļ•āļĢāļ§āļˆāđ€āļŠāđ‡āļ„āļ•āđˆāļ­āđ„āļ›āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ”
149
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ”āđ‰āļ§āļĒāđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāļĢāļ§āļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļŦāđ‰āļāļĨāļēāļĒ
āļĄāļēāđ€āļ›āđ‡āļ™ BusyBox āđ€āļžāļĩāļĒāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļĩāļĒāļ§āļ™āļąāđ‰āļ™ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĨāļ”āļ‚āļ™āļēāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āđ„āļ”āđ‰āļ–āļķāļ‡ 3 āļ–āļķāļ‡ 4 āđ€āļ—āđˆāļēāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļš
āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ls -al āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ§āđˆāļēāļ—āļļāļāļ„āļģāļŠāļąāđˆāļ‡āļˆāļ°āļ–āļđāļāļŠāļĩāđ‰
(symbolic link) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ busybox āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™
Busybox Inittab
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡ BSP (Board Support Package) āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ (Initialization) āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĨāļģāļ”āļąāļš
āļāļēāļĢāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš (System services) āļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļŦāļĨāļ”
āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāļģāļĨāļąāļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Inittab āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/ āļ‹āļķāđˆāļ‡
āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ inittab āļ™āļąāđ‰āļ™āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
< id >:< runlevels >:< action >:< process >
150
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ”āļĒāļ—āļĩāđˆ:
â€Ē< id > āļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ‚āļ”āļĒ BusyBox init āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļ console āļ—āļĩāđˆāđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļē (controlling tty) āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđ€āļ‹
āļŠāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļ°āļšāļļāđ„āļ§āđ‰āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļē BusyBox āļ•āļĢāļ§āļˆāļžāļšāļ§āđˆāļēāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ serial console āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ„āđˆāļēāļ™āļĩāđ‰āļāđ‡āļˆāļ°āļ–āļđāļ
āđ€āļžāļīāļāđ€āļ‰āļĒāđ„āļ›
â€Ē< runlevels > āļ„āđˆāļēāļ™āļĩāđ‰āļˆāļ°āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āđƒāļ™ BusyBox āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļāļēāļĢ
āđāļĒāļāļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ āđāļ•āđˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ‰āļžāļēāļ°āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
â€Ē< action > āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ sysinit, respawn, askrst, wait, once, restart, ctrlaltdel, āđāļĨāļ°
shutdown āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
â€Ģ sysinit āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļĢāļ°āļšāļšāļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ–āļđāļāļšāļđāļ—āļ‚āļķāđ‰āļ™
â€Ģ respawn āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļāđ‡āļ•āļēāļĄāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ–āļđāļāļ›āļīāļ”āļĨāļ‡
â€Ģ askrst āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„āļĨāđ‰āļēāļĒāļāļąāļš respawn āđāļ•āđˆāļāđˆāļ­āļ™āļˆāļ°āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļˆāļ°āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ "Please press Enter to activate this console." āđ€āļžāļ·āđˆāļ­āļĢāļ­
āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Enter āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļģāļ”āļąāļšāļ–āļąāļ”āđ„āļ›
â€Ģ ctrlaltdel āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļĄāļ·āđˆāļ­ init āđ„āļ”āđ‰āļĢāļąāļšāļŠāļąāļāļāļēāļ“ SIGINT āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ CTRL-ALT-
DEL āļžāļĢāđ‰āļ­āļĄāļāļąāļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ inittab
# Boot-time system configuration/initialization script.
# This is run first except when booting in single-user mode.
#
::sysinit:/etc/init.d/rcS
# Put a getty on the serial line (for a terminal)
::respawn:/sbin/getty -L ttyS 115200 vt100
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
151
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡
āļŠāļĄāļąāļĒāļāđˆāļ­āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļˆāļ°āļĄāļĩāļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ™āđ‰āļ­āļĒāđƒāļ™āļāļēāļĢāļŦāļēāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡
āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāļĄāļēāļĻāļķāļāļĐāļēāđ€āļžāļ·āđˆāļ­āļ—āļ”āļĨāļ­āļ‡āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ•āļēāļĄ
āđ‚āļˆāļ—āļĒāđŒāđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™āđ† āđāļ•āđˆāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āļ­āļĒāđˆāļđāđˆāđƒāļ™āļŠāļĩāļ§āļīāļ•āļ›āļĢāļ°āļˆāļģāļ§āļąāļ™
āļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđƒāļŦāļĄāđˆāđ† āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāđ†āđƒāļ™āļ§āļ‡āļāļ§āđ‰āļēāļ‡ āļŠāđˆāļ‡āļœāļĨāļ”āļĩāļ•āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™
āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŦāļēāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ” Evaluation Kit āļ—āļĩāđˆāļĄāļĩāļ§āļēāļ‡āļˆāļģāļŦāļ™āđˆāļēāļĒāļˆāļēāļāļšāļĢāļīāļĐāļąāļ—āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļšāļ­āļĢāđŒāļ” Mi-
croBlaze, Sitara, Beagleboard, Beaglebone, Pandaboard, FriendlyARM, Raspberry Pi,
ODROID, Versatile Express, Gumstix āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļĢāļēāļ„āļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļŦāļĨāļąāļāļžāļąāļ™āļāļ§āđˆāļēāļšāļēāļ—āļ–āļķāļ‡āļŦāļĨāļēāļĒāļŦāļĄāļ·āđˆāļ™āļšāļēāļ—
āļ—āļģāđƒāļŦāđ‰āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļīāļŠāļĢāļ° āļ™āļąāļāđ€āļĢāļĩāļĒāļ™āļ™āļąāļāļĻāļķāļāļĐāļē āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™āļšāļĢāļīāļĐāļąāļ—āļ•āđˆāļēāļ‡āđ†āļŠāļēāļĄāļēāļĢāļ–
āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĨāļķāļāļ‹āļķāđ‰āļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āļ„āļēāļ”āļ§āđˆāļēāđƒāļ™āļ­āļĩāļāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ‚āđ‰āļēāļ‡āļŦāļ™āđ‰āļē
āļĄāļđāļĨāļ„āđˆāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļĩāđ‰āļˆāļ°āļŠāļđāļ‡āļĄāļēāļāļāļ§āđˆāļēāļĄāļđāļĨāļ„āđˆāļēāļˆāļēāļāļāļēāļĢāļœāļĨāļīāļ•
āļ­āļĒāđˆāļēāļ‡āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļŠāļąāļ”
āļ•āļēāļĢāļēāļ‡ 3.5 āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļ•āđˆāļĨāļ°āļĒāļĩāđˆāļŦāđ‰āļ­āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄ
āļšāļ­āļĢāđŒāļ” SOC āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ RAM I/O āļĢāļēāļ„āļē
BeagleBone Sitara AM3358
500MHz
(on
USB)/
720MHz
(on DC)
256MB
USB OTG, USB Host, Ethernet, onboard
Serial, onboard JTAG, expansion head-
ers, microSD
$89
BeagleBoard xM Davinci DM3730 1GHz 512MB
USB OTG, USB Host, Ethernet, expan-
sion headers, microSD, DVI-D, LCD
header, S-Video, Camera header, Stereo
IN/OUT
$149
iMX53 QSB i.MX53 1GHz 1GB
USB OTG, USB Host, Ethernet, Serial,
expansion headers, SD, microSD, SATA,
VGA, LCD header, Stereo IN/OUT
$149
PandaBoard ES OMAP4 dual-core 1.2GHz 1GB
USB OTG, USB Host, Ethernet, WLAN,
Bluetooth, Serial, expansion headers, SD,
HDMI, DVI, LCD header, Camera header,
Stereo IN/OUT
$182
AM335x Starter Kit Sitara AM3358 720MHz 256MB
USB OTG, USB Host, Ethernet, WLAN,
Bluetooth, onboard Serial, onboard
JTAG, expansion headers, microSD,
capacity-touch LCD, Accelerometer, Ste-
reo OUT
$199
OrigenBoard
Exynos 4210
dual-core
1.2GHz 1GB
USB OTG, USB Host, Ethernet, WLAN,
Bluetooth, Serial, JTAG, SD, HDMI, LCD
header, Camera header, Stereo IN/OUT
$199
Origen 4 Quad
Exynos 4 quad-
core
1.4GHz 1GB
USB OTG, USB Host, Ethernet, SD,
JTAG, Serial, HDMI, onboard LCD
header, audio
$199
152
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ­āļĢāđŒāļ” SOC āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ RAM I/O āļĢāļēāļ„āļē
ODROID-X2
Quad core ARM
Cortex-A9
MPCore
1.7GHz 2GB
USB OTG, USB Host, Ethernet, onboard
Serial, expansion headers, SD, Stereo
IN/OUT
$135
DragonBoard
APQ8060A
Snapdragon dual-
core
1.2GHz 1GB
USB OTG, USB Host, Ethernet, WLAN,
Bluetooth, GPS, onboard Serial, onboard
JTAG, expansion headers, microSD,
capacity-touch LCD, Accelerometer, Ste-
reo OUT
$499
Snapdragon MDP
Snapdragon S4
dual-core
1.5GHz 1GB
USB OTG, WLAN, Bluetooth, GPS, Accel-
erometer, Gyroscope, Compass, Proxim-
ity sensor, Temperature sensor, SD,
HDMI, LCD Panel , Camera, Stereo OUT
$999
RaspBerry Pi
Broadcom ARM11
BCM2835
700MHz 512MB
USB OTG, USB Host, onboard Ethernet,
onboard Serial, expansion headers, MMC,
SD, VGA, HDMI, Stereo OUT
$35
SABRE i.MX53 1GHz 1GB
USB OTG, USB Host, Ethernet, WLAN,
Bluetooth, GPS, ZigBee, Accelerometer,
Light sensor, Serial, JTAG, eMMC, SD,
SATA, NOR Flash, VGA, HDMI, LCD
Panel, Camera, Stereo IN/OUT
$999
āļŠāļģāļŦāļĢāļąāļšāļ­āļĩāļāļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆ āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ”
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ (Virtualization) āđ€āļžāļ·āđˆāļ­āļˆāļģāļĨāļ­āļ‡āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđāļĨāļ°āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ™āļąāđ‰āļ™āđ€āļŠāđˆāļ™ ARM, MIPS, PowerPC, x86
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄāļāļąāļ™āļĄāļēāļ™āļēāļ™āđāļĨāļ°āđƒāļŠāđ‰āļāļąāļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ
QEMU (Quick EMUlator) āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰
āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ† āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļŦāļĢāļ·āļ­
āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ§āđˆāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āđ‚āļ›āļĢāđāļāļĢāļĄ
QEMU āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ‚āļŦāļĄāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ 2 āđāļšāļšāđ„āļ”āđ‰āđāļāđˆ
A.user-mode emulation āļ„āļ·āļ­āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļšāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨ
āļœāļĨ āļāļĨāļēāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ (āđ€āļŠāđˆāļ™āļšāļ™āļšāļ­āļĢāđŒāļ” target) āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰
(āđ€āļŠāđˆāļ™āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host) āļ”āđ‰āļ§āļĒāļ•āļąāļ§ Dynamic Translator āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđ€āļĨāļĩāļĒāļ™āđāļšāļš
Wine Windows API (http://www.winehq.org) āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢ cross-compile āđāļĨāļ°
cross-debugging āļ‚āđ‰āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡
āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ‹āļķāđˆāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāļģāļŦāļĢāļąāļšāđ‚āļŦāļĄāļ”āļ™āļĩāđ‰āđ„āļ”āđ‰āđāļāđˆ x86, PowerPC, ARM,
32-bit MIPS, Sparc32/64, ColdFire(m68k), CRISv32 and MicroBlaze CPUs
B.System-mode emulation āļ„āļ·āļ­āļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļĢāļ°āļšāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļąāđ‰āļ‡āļĢāļ°āļšāļš āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒ
āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ•āđˆāļēāļ‡āđ† āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ (Virtual
Machine) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ PowerPC āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļĢāļ°āļšāļš
153
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian āđāļ•āđˆāļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§āļ•āļąāļ§āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86-64 āļšāļīāļ• āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Ubuntu āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆ QEMU āļĢāļ­āļ‡āļĢāļąāļš āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 3.6 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
PC (x86 or x86_64 processor) Luminary Micro LM3S6965EVB (ARM Cortex-M3)
ISA PC (old style PC without PCI bus) Freescale MCF5208EVB (ColdFire V2)
PREP (PowerPC processor) Arnewsh MCF5206 evaluation board (ColdFire V2)
G3 Beige PowerMac (PowerPC processor) Palm Tungsten|E PDA (OMAP310 processor)
Mac99 PowerMac (PowerPC processor, in progress) N800 and N810 tablets (OMAP2420 processor)
Sun4m/Sun4c/Sun4d (32-bit Sparc processor) MusicPal (MV88W8618 ARM processor)
Sun4u/Sun4v (64-bit Sparc processor, in progress) Gumstix "Connex" and "Verdex" motherboards (PXA255/270)
Malta board (32-bit and 64-bit MIPS processors) Siemens SX1 smartphone (OMAP310 processor)
MIPS Magnum (64-bit MIPS processor) Syborg SVP base model (ARM Cortex-A8)
ARM Integrator/CP (ARM) AXIS-Devboard88 (CRISv32 ETRAX-FS)
ARM Versatile baseboard (ARM) Petalogix Spartan 3aDSP1800 MMU ref design (MicroBlaze)
ARM RealView Emulation/Platform baseboard (ARM) Luminary Micro LM3S811EVB (ARM Cortex-M3)
Spitz, Akita, Borzoi, Terrier and Tosa PDAs (PXA270 proc-
essor)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ‚āļ”āļĒ Linaro āļ‹āļķāđˆāļ‡āđ€āļ™āđ‰āļ™āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđ€āļ›āđ‡āļ™
āļžāļīāđ€āļĻāļĐ
$ sudo add-apt-repository ppa:linaro-maintainers/tools
$ sudo apt-get update
$ sudo apt-get install qemu-user-static qemu-system
$ qemu --version
QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008
Fabrice Bellard
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ QEMU āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
qemu-alpha qemu-ppc qemu-system-mips64el
qemu-arm qemu-ppc64 qemu-system-mipsel
qemu-armeb qemu-ppc64abi32 qemu-system-moxie
qemu-cris qemu-s390x qemu-system-or32
qemu-ga qemu-sh4 qemu-system-ppc
qemu-i386 qemu-sh4eb qemu-system-ppc64
qemu-img qemu-sparc qemu-system-ppcemb
154
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
qemu-io qemu-sparc32plus qemu-system-s390x
qemu-m68k qemu-sparc64 qemu-system-sh4
qemu-microblaze qemu-system-alpha qemu-system-sh4eb
qemu-microblazeel qemu-system-arm qemu-system-sparc
qemu-mips qemu-system-cris qemu-system-sparc64
qemu-mips64 qemu-system-i386 qemu-system-unicore32
qemu-mips64el qemu-system-lm32 qemu-system-x86_64
qemu-mipsel qemu-system-m68k qemu-system-xtensa
qemu-mipsn32 qemu-system-microblaze qemu-system-xtensaeb
qemu-mipsn32el qemu-system-microblazeel qemu-unicore32
qemu-nbd qemu-system-mips qemu-x86_64
qemu-or32 qemu-system-mips64
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩ āļšāļ™ QEMU
āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Sourcery CodeBench āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ cross-compiling toolchain āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ‚āļŦāļĨāļ”āļˆāļēāļāļĢāļļāđˆāļ™āļĨāđˆāļēāļŠāļļāļ”āļˆāļēāļāļĨāļīāļ‡āļ„āđŒāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Men-
tor Graphics
$ chmod +x arm-2013.05-24-arm-none-linux-gnueabi.bin
$ ./arm-2013.05-24-arm-none-linux-gnueabi.bin
Checking for required programs: awk grep sed bzip2 gunzip
Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
Launching installer...
155
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­ init.c āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ
“Hello World”
$ mkdir ~/qemu
$ cd ~/qemu
$ vim init.c
#include <stdio.h>
void main() {
printf("Hello World!n");
while(1);
}
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ cross-compiler āđāļĨāļ°āļ§āļēāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ ramdisk
$ arm-none-linux-gnueabi-gcc -static init.c -o init
$ echo init|cpio -o --format=newc > initramfs
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.9
$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.tar.xz
$ tar -xJvf linux-3.9.tar.xz
$ cd linux-3.9
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- vexpress_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all
$ cp arch/arm/boot/zImage ~/qemu
$ cd ~/qemu
$ ls -al
total 74488
drwxr-xr-x 3 student student 4096 2013-08-16 11:05 .
drwxr-xr-x 46 student student 4096 2013-08-16 11:16 ..
-rwxr-xr-x 1 student student 648380 2013-08-16 03:50 init
-rw-r--r-- 1 student student 76 2013-08-16 03:20 init.c
-rw-r--r-- 1 student student 648704 2013-08-16 03:54 initramfs
drwxr-xr-x 24 student student 4096 2013-08-16 04:10 linux-3.9
-rw-r--r-- 1 student student 72104164 2013-04-28 17:40 linux-3.9.tar.xz
-rw-r--r-- 1 student student 699 2013-08-16 09:33 README
-rwxr-xr-x 1 student student 2844736 2013-08-16 04:16 zImage
āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ init āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ qemu-system-arm āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ qemu-system-arm -M vexpress-a9 -kernel zImage -initrd initramfs
-serial stdio -append "console=tty1"
156
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļš BUSYBOX āļ āļēāļĒāđƒāļ™ ROOT FILESYSTEM āļšāļ™ QEMU
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 3.9 āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡ ARM SoC āļ—āļĩāđˆāļŠāļ·āđˆāļ­
āļ§āđˆāļē versatile āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ make mrproper
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- versatile_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāļāļēāļĢāđ„āļĄāđˆāđ€āļĨāļ·āļ­āļ â€œEnable loadable module support” feature āđāļ•āđˆāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ
“Use the ARM EABI to compile the kernel” āđāļ—āļ™ āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļĄāļ™āļđ Kernel Features
157
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļŸāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļĢāļļāđˆāļ™ 1.21.0 āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/qemu āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļēāļĄ
āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
$ wget http://busybox.net/downloads/busybox-1.21.0.tar.bz2
$ tar -xjvf busybox-1.21.0.tar.bz2
$ cd busybox-1.21.0
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig
āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡ BusyBox āđ€āļ›āđ‡āļ™āđāļšāļš static binary āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ€āļĄāļ™āļđ Busybox Setting -> Build Op-
tions -> āļ—āļģāļāļēāļĢ check Build BusyBox as a static binary
158
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŦāļĢāļ·āļ­ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™
āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ NFS (Network File System) āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ†āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ”āđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™
BusyBox āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļĄāļ™āļđ “Linux System Utilities” āļŠāļ·āđˆāļ­āļ§āđˆāļē Support mounting NFS le systems
on Linux āļ”āļąāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
159
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ install āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡ BusyBox āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ _install
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install
...
./_install//usr/sbin/ubimkvol -> ../../bin/busybox
./_install//usr/sbin/ubirmvol -> ../../bin/busybox
./_install//usr/sbin/ubirsvol -> ../../bin/busybox
./_install//usr/sbin/ubiupdatevol -> ../../bin/busybox
./_install//usr/sbin/udhcpd -> ../../bin/busybox
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļģāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™ āļŠāļģāļŦāļĢāļąāļš root lesystem
$ cd _install
$ mkdir proc sys dev etc etc/init.d
$ ls -al
total 36
drwxr-xr-x 9 student student 4096 2013-08-16 12:14 .
drwxr-xr-x 34 student student 4096 2013-08-16 11:58 ..
drwxr-xr-x 2 student student 4096 2013-08-16 11:58 bin
drwxr-xr-x 2 student student 4096 2013-08-16 12:14 dev
drwxr-xr-x 3 student student 4096 2013-08-16 12:14 etc
lrwxrwxrwx 1 student student 11 2013-08-16 11:58 linuxrc -> bin/busybox
drwxr-xr-x 2 student student 4096 2013-08-16 12:14 proc
drwxr-xr-x 2 student student 4096 2013-08-16 11:58 sbin
drwxr-xr-x 2 student student 4096 2013-08-16 12:14 sys
drwxr-xr-x 4 student student 4096 2013-08-16 11:58 usr
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ rcS āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ etc/init.d/ āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āđāļĨāļ° /sysfs āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™
virtual lesystem
$ vim etc/init.d/rcS
āđ€āļžāļīāđˆāļĄ shell script āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ rcS āļ”āļąāļ‡āļ™āļĩāđ‰
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
āđāļ›āļĨāļ‡āļŠāļīāļ—āļ˜āļīāđŒāđ„āļŸāļĨāđŒ rcS āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ„āļ”āđ‰ āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ root lesystem āļŠāļ·āđˆāļ­ rootfs.img āļˆāļēāļ
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ _install
$ chmod +x etc/init.d/rcS
$ find . | cpio -o --format=newc > ../rootfs.img
11984 blocks
160
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ cd ..
$ gzip -c rootfs.img > rootfs.img.gz
$ cp rootfs.img.gz ~/qemu
āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ qemu-system-arm āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ BusyBox
$ cd ~/qemu
$ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd
rootfs.img.gz -append "root=/dev/ram rdinit=/bin/sh"
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ”āđ‰āļ§āļĒāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ BUILDROOT āļšāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU
āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡
$ sudo apt-get install autoconf automake libtool libexpat1-dev
libncurses5-dev bison flex patch curl cvs texinfo build-essential sub-
version gawk python-dev gperf ncurses-dev g++ gcc texi2html nfs-
kernel-server
āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļš root lesystem āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ NFS (Network File System) āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ LAN
$ mkdir ~/nfsroot
āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļĢāđŒāļœāđˆāļēāļ™ NFS āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ /etc/exports āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
161
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ sudo vim /etc/exports
/home/student/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļāļšāļĢāļīāļāļēāļĢ NFS Server āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
$ sudo /etc/init.d/nfs-kernel-server restart
āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ buildroot āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ cross-compiling toolchain
$ wget http://buildroot.uclibc.org/downloads/buildroot-2013.05.tar.gz
$ tar -xzvf buildroot-2013.05.tar.gz
$ cd buildroot-2013.05/
āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļ·āđˆāļ™āđ†
āļ”āļąāļ‡āļ™āļĩāđ‰
$ make menuconfig
āđ‚āļ”āļĒāđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰:
Target Architecture ==> ARM (little endian)
Target Architecture Variant ==> arm926t
Target ABI ==> EABI
System Conguration ==> serial port to run getty on (ttyAMA0)
Package Selection ==> Busybox
FileSystem Images ==> cpio the root lesystem āđāļĨāļ° tar the root lesystem
Kernel ==>āļĢāļ°āļšāļļāļŠāļ·āđˆāļ­ defcong āđ€āļ›āđ‡āļ™ â€œversatile”
Kernel ==> Kernel binary format to zImage
162
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
163
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
164
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ make
$ ls -al output/images/
total 6712
drwxr-xr-x 2 student student 4096 2013-07-22 11:45 .
drwxr-xr-x 8 student student 4096 2013-07-22 21:03 ..
-rw-r--r-- 1 student student 1922560 2013-07-22 21:03 rootfs.cpio
-rw-r--r-- 1 student student 858843 2013-07-22 21:03 rootfs.cpio.gz
-rw-r--r-- 1 student student 2181120 2013-07-22 21:03 rootfs.tar
-rw-r--r-- 1 student student 1895000 2013-07-22 11:44 uImage
$ cp output/images/uImage ~/qemu/
āļ§āļēāļ‡ root lesystem āđ„āļ›āļĒāļąāļ‡ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ NFS āļŠāļ·āđˆāļ­āļ§āđˆāļē ~/nfsroot āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļ”āđ‰āđ€āļ›āļīāļ”āđāļŠāļĢāđŒāđ„āļ§āđ‰
$ sudo tar -xvf rootfs.tar ~/nfsroot/
$ sudo chown -R student:student ~/nfsroot
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ tun/tap device āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļ§āļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ—āđ‰āļ­āļ‡āļ–āļīāđˆāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡ QEMU
āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ™ QEMU āļŠāļēāļĄāļēāļĢāļ– mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
NFS āļ—āļĩāđˆāđ€āļ›āļīāļ”āđāļŠāļĢāđŒāđ„āļ§āđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļ„āđˆāļē IP Address āđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļ›āđ‡āļ™ 192.168.1.1 āđāļĨāļ°
āļ•āļąāđ‰āļ‡āļ„āđˆāļē IP Address āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ target āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļāđ‡āļ„āļ·āļ­ 192.168.1.101
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ›āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ uml-utilities (āļ—āļĩāđˆāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ tunctl) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļˆāļģāļĨāļ­āļ‡āļŠāļąāļāļāļēāļ“
āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (network trafc)
165
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ sudo apt-get install uml-utilities
$ sudo tunctl -u $(whoami) -t tap1
$ sudo ifconfig tap1 192.168.1.1
$ sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev tap1
$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āđ€āļžāļ·āđˆāļ­āļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Versatile
Board) āđāļĨāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” root lesystem āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
$ qemu-system-arm -M versatilepb -m 128M -kernel ~/uImage -append
"console=ttyAMA0 root=/dev/nfs rw nfsroot=192.168.1.1:~/nfsroot
ip=192.168.1.101" -net nic -net tap,ifname=tap1,script=no -nographic
Set 'tap1' persistent and owned by uid 1000
SIOCADDRT: File exists
Uncompressing Linux... done, booting the kernel.
Booting Linux on physical CPU 0x0
Linux version 3.9.4 (student@marabuntu) (gcc version 4.7.3 (Buildroot 2013.05) ) #1
Mon Jul 22 11:44:32 PDT 2013
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
CPU: VIVT data cache, VIVT instruction cache
Machine: ARM-Versatile PB
Memory policy: ECC disabled, Data cache writeback
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyAMA0 root=/dev/nfs rw
nfsroot=192.168.1.1:/home/student/nfsroot ip=192.168.1.101
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
__ex_table already sorted, skipping sort
Memory: 128MB = 128MB total
Memory: 126192k/126192k available, 4880k reserved, 0K highmem
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
vmalloc : 0xc8800000 - 0xff000000 ( 872 MB)
lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0xc0008000 - 0xc0342850 (3307 kB)
.init : 0xc0343000 - 0xc035f87c ( 115 kB)
.data : 0xc0360000 - 0xc0385440 ( 150 kB)
.bss : 0xc0385440 - 0xc039f78c ( 105 kB)
NR_IRQS:224
VIC @f1140000: id 0x00041190, vendor 0x41
FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs
Console: colour dummy device 80x30
Calibrating delay loop... 300.44 BogoMIPS (lpj=1502208)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0xc027e748 - 0xc027e7a0
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
Serial: AMBA PL011 UART driver
dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44) is a PL011 rev1
console [ttyAMA0] enabled
dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45) is a PL011 rev1
166
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46) is a PL011 rev1
...
Console: switching to colour frame buffer device 80x60
brd: module loaded
physmap platform flash device: 04000000 at 34000000
physmap-flash physmap-flash.0: map_probe failed
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net>
eth0: SMC91C11xFD (rev 1) at c8800000 IRQ 57 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
mousedev: PS/2 mouse device common for all mice
TCP: cubic registered
NET: Registered protocol family 17
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
eth0: link up
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.1.101,
mask=255.255.255.0, gw=255.255.255.255
host=192.168.1.101, domain=, nis-domain=(none)
bootserver=255.255.255.255, rootserver=192.168.1.1, rootpath=
input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0
input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1
VFS: Mounted root (nfs filesystem) on device 0:9.
Freeing init memory: 112K
Starting logging: OK
Initializing random number generator... done.
Starting network...
ip: RTNETLINK answers: File exists
Welcome to Burapha Embedded System Lab
Burapha login:
# ls
# ls -al
total 20
drwxr-xr-x 2 default default 4096 Jul 23 2013 .
drwxr-xr-x 17 default default 4096 Jul 23 2013 ..
-rw------- 1 root root 10 Jul 23 2013 .ash_history
-rw-r--r-- 1 default default 0 May 31 2013 .bash_history
-rw-r--r-- 1 default default 175 May 31 2013 .bash_logout
-rw-r--r-- 1 default default 161 May 31 2013 .bash_profile
#
167
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” RASPBERRY PI āļšāļ™ QEMU
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ image āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry PI āļˆāļēāļ http://www.raspberrypi.org/
downloads āđāļĨāļ°āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ wheezy-raspbian.img āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ unzip 2013-07-26-wheezy-raspbian.zip
$ mv 2013-07-26-wheezy-raspbian.img ~/qemu/wheezy-raspbian.img
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ïŽle āđ€āļžāļ·āđˆāļ­āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ wheezy-raspbian.img
$ file wheezy-raspbian.img
wheezy-rasbian.img: x86 boot sector; partition 1: ID=0xc, starthead 130,
startsector 8192, 114688 sectors; partition 2: ID=0x83, starthead 165,
startsector 122880, 3665920 sectors, code offset 0xb8
āļ™āļģāļ„āđˆāļē startsector (122880) āļˆāļēāļ partition 2 āļĄāļēāļ„āļđāļ“āļāļąāļšāļ„āđˆāļē 512 āļˆāļ°āđ„āļ”āđ‰āļ„āđˆāļē offset āđ€āļ—āđˆāļēāļāļąāļš
62914560 āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ™āļģāļ„āđˆāļē offset āļāļēāļĢāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ mount āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ wheezy-raspbian.img āđ€āļžāļ·āđˆāļ­
āđƒāļŦāđ‰āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /mnt āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ sudo mount wheezy-raspbian.img -o offset=62914560 /mnt
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ /mnt/etc/ld.so.preload āđāļĨāđ‰āļ§āļ›āļīāļ”āļšāļĢāļĢāļ—āļąāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ # āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ‚āļŦāļĨāļ”
āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
...
# /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
...
$ sudo umount /mnt
āļāđˆāļ­āļ™āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi
168
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ cd ~/qemu/
$ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu
$ qemu-system-arm -kernel ~/qemu/kernel-qemu -cpu arm1176 -m 256 -M
versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1"
-hda ~/qemu/wheezy-raspbian.img
āļˆāļēāļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļšāļ™āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĨāđ‰āļĄāđ€āļŦāļĨāļ§āļˆāļēāļāļāļēāļĢāļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ (lesystem)
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāđƒāļŠāđˆāļŠāļīāļ—āļ˜āļīāđŒ root āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ‹āđˆāļ­āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļ™āļ° root āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
$ sudo fsck /dev/sda2
āļ„āļģāļŠāļąāđˆāļ‡ fsck āļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ‹āđˆāļ­āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āđƒāļ™āļāļĢāļ“āļĩāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
root@raspberrypi# raspi-config
169
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļēāļāđ€āļĄāļ™āļđāļ”āđ‰āļēāļ™āļšāļ™āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļ·āđˆāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆ GUI Mode āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ‚āđ‰āļ­
āļ—āļĩāđˆ 3 (Enable Boot to Desktop) āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļēāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļāđ‡āļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆ GUI Mode āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 3.29 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļšāļ™ QEMU
170
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Friendly ARM (Mini2440) āļšāļ™
QEMU
āļšāļ­āļĢāđŒāļ” FriendlyARM Mini2440 āļŦāļĢāļ·āļ­āļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Mini2440 āđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāđƒāļ™āļĨāļąāļāļĐāļ“āļ°
āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļ™āļīāļ” SBC (Single-Board Computer) āļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ ARM9 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ System-
on-Chip āļĢāļļāđˆāļ™ Samsung S3C2440
āļĢāļđāļ›āļ—āļĩāđˆ 3.30 āļšāļ­āļĢāđŒāļ” Friendly ARM Mini2440
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Mini2440 āđ‚āļ”āļĒāđ€āļĨāđˆāļ™āļ­āļĒāļđāđˆāļšāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļ—āļĩāđˆāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ”āļąāļ‡āļ•āđˆāļ­
āđ„āļ›āļ™āļĩāđ‰ (āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļ http://project4fun.com/node/33)
$ sudo apt-get -y update
$ sudo apt-get -y install build-essential
$ sudo apt-get -y install git-core
$ sudo apt-get -y install zlib1g-dev
$ sudo apt-get -y install libsdl-console-dev
$ sudo apt-get -y install ia32-libs
$ sudo apt-get -y install bridge-utils
$ sudo apt-get -y install uml-utilities
$ sudo apt-get -y install qemu-utils
$ sudo apt-get -y install nbd-client
$ sudo apt-get -y install kpartx
āļ•āļīāļ”āļ•āļąāđ‰āļ‡ cross-compiling toolchains
# cd /opt
# wget
http://dl-12.one2up.com/onetwo/content/2012/12/24/614ca76f9a53c060bd8c
fa7effd541f6.tgz
# mv 614ca76f9a53c060bd8cfa7effd541f6.tgz arm920t-eabi.tgz
171
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
# tar xzvf arm920t-eabi.tgz -C /
# export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin
# export CROSS_COMPILE=arm-angstrom-linux-gnueabi-
āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ git://repo.or.cz/qemu/mini2440.git āļ”āļąāļ‡āļ™āļĩāđ‰
$ mkdir ~/eeburapha/qemu
$ cd ~/eeburapha/qemu
$ git clone git://repo.or.cz/qemu/mini2440.git
...
Receiving objects: 100% (xxxxx/xxxxx), xx.xx MiB | xxxx KiB/s, done.
Resolving deltas: 100% (xxxxx/xxxxx), done.
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩ qemu āļ—āļĩāđˆāļ‹āļąāļžāļžāļ­āļĢāđŒāļ• Mini2440
$ cd mini2440
$ wget
http://dl-10.one2up.com/onetwo/content/2013/9/10/fde6b403a54066a6aa138
38f7588b91e.patch
$ mv fde6b403a54066a6aa13838f7588b91e.patch bug_SIGFPE.patch
$ patch –p0 < bug_SIGFPE.patch
$ ./configure --target-list=arm-softmmu
$ make
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ mini2440_start.sh āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ vim ~/eeburapha/qemu/mini2440/mini2440/mini2440_start.sh
echo Starting in $base
name_nand="$base/mini2440_nand.bin"
name_sd="$base/sd.img"
if [ ! -f "$name_nand" ]; then
echo $0 : creating NAND empty image : "$name_nand"
dd if=/dev/zero of="$name_nand" bs=528 count=131072
fi
cmd="$base/../arm-softmmu/qemu-system-arm 
-M mini2440 $* 
-serial stdio 
-mtdblock "$name_nand" 
-sd $name_sd 
-show-cursor 
-usb -usbdevice keyboard -usbdevice mouse 
-net nic,vlan=0 
-net tap,vlan=0,ifname=tap1,script=/etc/qemu-ifup 
-monitor telnet::5555,server,nowait"
echo $cmd
$cmd
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ network.sh
$ vim network.sh
172
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#!/bin/sh
sudo chown root.users /dev/net/tun
sudo chmod g+rw /dev/net/tun
sudo brctl addbr br0
sudo ifconfig eth0 0.0.0.0 promisc
sudo brctl addif br0 eth0
sudo dhclient br0
sudo tunctl -t tap1 -u `whoami`
$ chmod 755 network.sh
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ qemu-ifup āđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/
$ vim qemu-ifup
#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /sbin/brctl addif br0 $1
sleep 2
$ chmod 755 qemu-ifup
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ u-boot.bin
$ cd ~/eeburapha/qemu/mini2440/mini2440
$ mkdir uboot
$ cd uboot
$ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
$ cd mini2440
$ make mini2440_config
$ make all
dd if=u-boot.bin of=u-boot-nand2k.bin bs=2K conv=sync
119+1 records in
120+0 records out
245760 bytes (246 kB) copied, 0.000734641 s, 335 MB/s
dd if=u-boot.bin of=u-boot-nand16k.bin bs=16K conv=sync
14+1 records in
15+0 records out
245760 bytes (246 kB) copied, 0.000435712 s, 564 MB/s
āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ u-boot.bin āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
~/eeburapha/qemu/mini2440/mini2440
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ sd image
$ cd eeburapha/qemu/mini2440/
173
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ qemu-img create sd.img 256M
Formatting 'sd.img', fmt=raw size=268435456
$ sudo modprobe nbd
$ sudo modprobe dm-mod
$ qemu-nbd -p 24561 sd.img &
$ sudo nbd-client localhost 24561 /dev/nbd0
Negotiation: ..size = 256MB
bs=1024, sz=268435456 bytes
$ sudo fdisk -u=cylinders /dev/nbd0
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF
disklabel
Building a new DOS disklabel with disk identifier 0xe5f5bdf3.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by
w(rite)
WARNING: cylinders as display units are deprecated. Use command 'u' to
change units to sectors.
Command (m for help): o
Building a new DOS disklabel with disk identifier 0x1999a406.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by
w(rite)
WARNING: cylinders as display units are deprecated. Use command 'u' to
change units to sectors.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First cylinder (1-32, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-32, default 32): +50MB
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): b
Changed system type of partition 1 to b (W95 FAT32)
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2): 2
First cylinder (7-32, default 7):
Using default value 7
174
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Last cylinder, +cylinders or +size{K,M,G} (7-32, default 32):
Using default value 32
Command (m for help): p
Disk /dev/nbd0: 268 MB, 268435456 bytes
255 heads, 63 sectors/track, 32 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x1999a406
Device Boot Start End Blocks Id System
/dev/nbd0p1 1 7 55203 b W95 FAT32
/dev/nbd0p2 7 32 200813 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
$ sudo kpartx -a /dev/nbd0
$ sudo mkfs.vfat /dev/mapper/nbd0p1
$ sudo mkfs.ext3 /dev/mapper/nbd0p2
$ mkdir disk
$ sudo mount /dev/mapper/nbd0p2 ./disk
$ mkdir -p disk/boot
$ sudo mount /dev/mapper/nbd0p1 ./disk/boot
$ wget
http://mini2440.googlecode.com/files/emdebian-grip-090306-armel-lenny-
installed.tar.bz2
$ (cd disk; sudo tar jxf
../emdebian-grip-090306-armel-lenny-installed.tar.bz2)
$ sudo umount disk/boot disk
$ sudo nbd-client -d /deb/nbd0
āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ sd.img āđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āļ—āļĩāđˆ ~/eeburapha/qemu/mini2440/mini2440 āđāļĨāļ°āđ€āļĢāļīāđˆāļĄ
āļāļēāļĢāļĢāļąāļ™ mini2440 āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ cd ~/eeburapha/qemu/mini2440/mini2440
$ ./network.sh
Set 'tap1' persistent and owned by uid 1000
$ ./ mini2440_start.sh
*** Warning - bad CRC or NAND, using default environment
175
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
USB:   S3C2410 USB Deviced
ERROR: usbd_device_event_irq(), 613: (3401ea64,1) NULL device or device->bus
ERROR: usbd_device_event_irq(), 613: (3401ea64,2) NULL device or device->bus
ERROR: usbd_device_event_irq(), 613: (3401ea64,3) NULL device or device->bus
In:    serial
Out:   serial
Err:   serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot:  0
MINI2440 #
āļ—āļģāļāļēāļĢāļŸāļ­āļĢāđŒāđāļĄāļ— nand
# nand scrub"
NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
There is no reliable way to recover them.
Use this command only for testing purposes if you
are sure of what you are doing!
Really scrub this NAND flash? <y/N>
Erasing at 0x3ffc000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
OK
āļŠāļĢāđ‰āļēāļ‡ bad block table
# nand createbbt
Create BBT and erase everything ? <y/N>
Skipping bad block at 0x03ff0000
Skipping bad block at 0x03ff4000
Skipping bad block at 0x03ff8000
Skipping bad block at 0x03ffc000
Creating BBT. Please wait ...Bad block table not found for chip 0
Bad block table not found for chip 0
Bad block table written to 0x03ffc000, version 0x01
Bad block table written to 0x03ff8000, version 0x01
āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš (env)
# dynenv set 40000
device 0 offset 0x40000, size 0x3fc0000
45 4e 56 30 - 00 00 04 00
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢ reset āļˆāļ°āđ„āļ”āđ‰ emulator āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŠāđˆ sd.img āđ„āļ”āđ‰
# reset
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=57
QEMU mini2440_reset: loaded default u-boot from NAND
176
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
QEMU mini2440_reset: loaded override u-boot (size 3c000)
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=48
S3C: CLK=304 HCLK=304 PCLK=304 UCLK=48
S3C: CLK=304 HCLK=101 PCLK=50 UCLK=48
S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48
S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48
S3C: CLK=405 HCLK=101 PCLK=50 UCLK=48
U-Boot 1.3.2-moko12 (Jun 26 2009 - 18:16:16)
I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 64 MiB
Found Environment offset in OOB..
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0
MINI2440 #
177
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 4 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āđāļĨāļ°
QT āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđƒāļ™āļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļˆāļ°āđ„āļĄāđˆ
āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩ/āļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄ
āđ€āļ•āļīāļĄāļ—āļąāļāļĐāļ°āļ­āļ°āđ„āļĢāļĄāļēāļāļĄāļēāļĒāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āļ­āļ·āđˆāļ™āđ†āđ€āļāļ·āļ­āļš
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ™āļąāđ‰āļ™ āļˆāļ°āļĒāļąāļ‡āļ„āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđ‰āļ­āļ‡āļžāļķāļ‡āļĢāļ°āļ§āļąāļ‡āļ„āļ·āļ­āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡
āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļŦāļĢāļ·āļ­
āļ–āļēāļ§āļĢ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ‡āļ›āļāļīāđ€āļŠāļ˜āđ„āļĄāđˆāđ„āļ”āđ‰āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļ‹āļĩ (C
Language) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđāļĨāļ°āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļĄāļēāļāļāļ§āđˆāļēāļĢāđ‰āļ­āļĒāļĨāļ° 80 āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļ‡āđ„āļ›āđƒāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĨāđ‰āļ§āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™
āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒ I/O āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļĢāļ°āļšāļšāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢ
āđ€āļ‹āļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ (C++) āļ‹āļķāđˆāļ‡āļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļīāļ‡āļ§āļąāļ•āļ–āļļ (Object
oriented Programming - OOP) āđ€āļŦāļĄāļēāļ°āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļš
āļ‹āđ‰āļ­āļ™āđāļĨāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰āđāļ™āļ§āļ„āļīāļ”āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ™āļ§āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāđāļšāļš OOP āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ•āļąāļ§āļ„āļ­āļĄāđ„āļžāļĨāđŒ (Compiler) āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ (C++ Tools) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩ (C++ library) āđ€āļžāļīāđˆāļĄ
āđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļĄāļšāļđāļĢāļ“āđŒ
178
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ MAKEFILE
Makele (GNU automake system) āļ„āļ·āļ­āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāļ„āļģāļŠāļąāđˆāļ‡āļŦāļĢāļ·āļ­
āļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
make āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāļđāđˆāļšāļ™āđ€āļŠāļĨāļĨāđŒ āđ‚āļ”āļĒāļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ
āļŠāļ·āđˆāļ­ â€œMakele” āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āđˆāļēāļ‡āđ†āđ„āļ§āđ‰ āđ€āļŠāđˆāļ™ āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āđ‚āļ„āđ‰āļ”āđ„āļŸāļĨāđŒāđ€āļŠāļĢāļīāļĄ
āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™ Makele āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
(Macros)
! VARIABLE DECLARATIONS
(Targets)
! TARGET:! DEPENDENCIES
! ! RULES TO BUILD TARGET
āđ‚āļ”āļĒāļ—āļĩāđˆ (Macros) āļˆāļ°āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
CC=gcc
OPT=-g
āđ€āļĄāļ·āđˆāļ­āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ āļēāļĒāđƒāļ™ (Targets) āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$(CC) a_source_file.c
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđ„āļ”āđ‰āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ•āļąāļ§āđāļ›āļĢāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāđƒāļŦāļĄāđˆ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
COMP = $(CC) $(OPT)
āļĢāļēāļĒāļāļēāļĢ (Targets) āļ„āļ·āļ­āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āļ§āđˆāļēāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰ (dependencies) āļ‹āļķāđˆāļ‡āļ§āļīāļ˜āļĩ
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ™āļąāđ‰āļ™āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢāđƒāļŠāđ‰ whitespace (spacebar āđāļĨāļ°
tab) āļ–āđ‰āļēāđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļąāļ”āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡ make āļāđ‡āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļ­āļĄāđ„āļžāļĨāđŒ
āđ„āļ”āđ‰ āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
tab space space
| | |
target:" dependency1 dependency2 dependency3
" rule1
" rule2
" rule3
^^^^^
|
tab
179
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 1
all: hello
hello: main.o factorial.o hello.o
! g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
! g++ -c main.cpp
factorial.o: factorial.cpp
! g++ -c factorial.cpp
hello.o: hello.cpp
! g++ -c hello.cpp
clean:
! rm -rf *o hello
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 2
āđƒāļŠāđ‰ macro āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢ CC āđāļĨāļ° CFLAGS
# the compiler to use
CC=g++
# options passed to the compiler
CFLAGS=-c -Wall
all: hello
hello: main.o factorial.o hello.o
! $(CC) main.o factorial.o hello.o -o hello
main.o: main.cpp
! $(CC) $(CFLAGS) main.cpp
factorial.o: factorial.cpp
! $(CC) $(CFLAGS) factorial.cpp
hello.o: hello.cpp
! $(CC) $(CFLAGS) hello.cpp
clean:
! rm -rf *o hello
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 3
āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢ SOURCES, OBJECTS āđāļĨāļ° EXECUTABLE āđ€āļžāļ·āđˆāļ­āļĢāļ§āļĄāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
!
180
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$(EXECUTABLE): $(OBJECTS)
! $(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
! $(CC) $(CFLAGS) $< -o $@
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 4
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ (include) āđ„āļŸāļĨāđŒ header (.h) āđ€āļžāļīāđˆāļĄāļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩāļ āļēāļĒāļ™āļ­āļāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđˆ option
-I āđāļĨāļ° -l āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
MY_INCLUDES=/home/student/project/myLib/
MY_LIBRARIES=zlib fltk
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
!
$(EXECUTABLE): $(OBJECTS)
! $(CC) -I$(MY_INCLUDES) $(LDFLAGS) $(OBJECTS) -o $@ -l$(MY_LIBRARIES)
@echo “Compile hello completed...”
.cpp.o:
! $(CC) $(CFLAGS) $< -o $@
@echo “Compile all object files completed...”
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
@echo “Clean all object files and hello program done...”
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ
āļ‚āļšāļ§āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (source code) āļˆāļ™āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļĢāļ·āļ­āļĢāļąāļ™āđ„āļ”āđ‰ (executable le) āļ™āļąāđ‰āļ™ āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļēāļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ·āļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (.c) āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđ„āļšāļ™āļēāļĢāļĩāđ„āļŸāļĨāđŒ āļ—āļĩāđˆ
āđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ” (object code) āļ‹āļķāđˆāļ‡āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ â€œ.o” āđ„āļŸāļĨāđŒāļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ”āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ
āļĢāļ§āļĄāļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ ar (archiver) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĢāļ·āļ­āļˆāļ°āļ–āļđāļāđāļ›āļĨāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ
āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ„āļ”āđ‰ (executable le) āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ ld (linker)
181
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ„āļŸāļĨāđŒāđ‚āļ„āđ‰āļ”
āđ‚āļ›āļĢāđāļāļĢāļĄ (.c)
Compiler
āđ„āļŸāļĨāđŒāļ­āļ­āļ›āđ€āļˆāđ‡āļ„
(.o)
āđ„āļĨāļšāļĢāļēāļĢāļĩ (.a
āļŦāļĢāļ·āļ­ .so)Archiver
āđ‚āļ›āļĢāđāļāļĢāļĄ
(executable)
āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆ
āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡
āđ„āļŸāļĨāđŒāđ‚āļ„āđ‰āļ”
āđ‚āļ›āļĢāđāļāļĢāļĄ (.c)
Compiler
āđ„āļŸāļĨāđŒāļ­āļ­āļ›āđ€āļˆāđ‡āļ„
(.o)
Linker
āđ„āļŸāļĨāđŒ Embedded
Binary/Hex)
Translator
āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļ•āļąāļ§āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ”āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ§āļĄāļāļąāļ™āļˆāļ™
āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ (executable le) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ™āļąāđ‰āļ™
āļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļēāđāļ›āļĨāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđāļšāļšāđ„āļšāļ™āļēāļĢāļĩāļŦāļĢāļ·āļ­āđ„āļĄāđˆāļāđ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļāļļāļĨ .hex āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°
āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāđāļŸāļĨāļŠāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰
āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ 2 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ„āļ”āđ‰āđāļāđˆ
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ src/ āđāļĨāļ° āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ inc/
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ SRC/ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ INC/
main.c
func1.c func1.h
func2.c func2.h
182
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ SRC/ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ INC/
func3.c func3.h
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āđāļšāļšāļ„āļ·āļ­ āļŠāđāļ•āļ•āļīāļāđ„āļĨāļšāļĢāļēāļĢāļĩ (static library) āđāļĨāļ°
āđ„āļ”āļ™āļēāļĄāļīāļāđ„āļĨāļšāļĢāļēāļĢāļĩ (dynamic library) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ™āļīāļ” static
$ gcc -c src/func1.c src/func2.c src/func3.c -I./inc
$ ar libmine.a func1.o func2.o func3.o
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ™āļīāļ” dynamic
$ gcc -shared -o libmine.so func1.o func2.o func3.o -I./inc
āđ€āļĄāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ›āđƒāļŠāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļˆāļ„āļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ gcc src/main.c libmine.a -I/inc -o myprogram
āļŦāļĢāļ·āļ­
$ gcc src/main.c -lmine -L./ -I/inc -o myprogram
āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makefile āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
CC=gcc
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.c
OBJECTS=$(SOURCES:.c=.o)
MY_INCLUDES=/home/student/project/inc/
# MY_STATIC_LIBRARIES=libmine.a
MY_DYNAMIC_LIBRARIES=mine
EXECUTABLE=myprogram
all: $(SOURCES) $(EXECUTABLE)
!
$(EXECUTABLE): $(OBJECTS)
! $(CC) -I$(MY_INCLUDES) $(LDFLAGS) $(OBJECTS) -o $@ -l$(MY_DYNAMIC_LI-
BRARIES)
@echo “Compile hello completed...”
.c.o:
! $(CC) $(CFLAGS) $< -o $@
183
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
@echo “Compile all object files completed...”
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
@echo “Clean all object files and hello program done...”
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ
āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļĩāđ‚āļ­āļāļēāļŠāđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļĢāļąāļšāļ„āđˆāļē
āļŠāļ–āļēāļ™āļ°āļˆāļēāļāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāļĨāļ‡āđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒāļŦāļĢāļ·āļ­āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļšāļąāļ™āļ—āļķāļ
āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ§āđ‰āđāļĨāđ‰āļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđāļĢāļāđ†āļ‚āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āļ™āļąāļ
āļžāļąāļ’āļ™āļē āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ stdio.h āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int fflush(FILE *stream);
int fclose(FILE *stream);
āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆ 3 āđ‚āļŦāļĄāļ”āđ„āļ”āđ‰āđāļāđˆ āļ­āđˆāļēāļ™āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (O_RDONLY) āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (O_WRONLY)
āđāļĨāļ° āļ­āđˆāļēāļ™āđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰ (O_RDWR)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒāđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ
// file_manipulation.c
#include <stdio.h>
#include <string.h>
int	 usage(){
printf("n");
printf("Usage : file Manipulation [OPTION] [FILE]n");
printf("Demo for text file operation, read and write. [Jamp II]n");
printf(" -r tt read operationn");
printf(" -w tt write operationn");
printf("n");
return 0;
}
int	 check_operation(char *opt){
184
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
if(!strcmp(opt, "-r")){ 	 // read operation
	 return 0;
}
else if(!strcmp(opt, "-w")){	 // write operation
	 return 1;
}	 	 	 	
else{	 	 	 	 // error
	 return -1;
}
}
int	 main(int argc, char *argv[]){
FILE	 *file;
int 	 opt;
// check for argument
if(argc != 3){
	 usage();
	 return 0;
}
// check for getting operation
if((opt = check_operation(argv[1])) < 0){
	 usage();
	 return 0;
}
// start file operation
if(file = fopen(argv[2], (argv[1]+1))){
	 char dataBuf[256];
	 if(opt == 0){	 	 // READ
	 printf("****************** READ *******************n");
	 while(fgets(dataBuf, 256, file) != 0){
	 	 printf("%s", dataBuf);
	 	 memset(dataBuf, 0, 256);
	 }
	 printf("*******************************************n");
	 }
	 else{		 	 // WRITE
	 printf("***************** WRITE *******************n");
	
	 while(1){
	 	 memset(dataBuf, 0, 256);
	 	 gets(dataBuf);
185
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
if(!strcmp(dataBuf, ":exit"))
	 	 break;
	 	 fprintf(file, "%sn", dataBuf);
	 }
	 printf("*******************************************n");
	 }
	 fclose(file);
}
else{
	 printf("Can not open filen");
}
return 0;
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ ïŽle_manipulation.c āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡
arm-linux-gcc āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM
#
# Makefile!: File Manipulation sample Program
#
# Macro
# CROSS_COMPILE=
CROSS_COMPILE=arm-linux-
CC=$(CROSS_COMPILE)gcc
CFLAGS=-Os
LDFLAGS=-Os -static
# Targets
all: file_manipulation
fileOpt: file_manipulation.o
! $(CC) $(LDFLAGS) $< -o $@
fileOpt.o: file_manipulation.c
! $(CC) $(CFLAGS) -c -o $@ $<
clean:
! rm -rf *.o file_manipulation
186
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ
āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļēāļāļāļēāļ™āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāđ€āļŠāđˆāļ™ āđ‚āļĄāđ€āļ”āļĄ, āđ€āļĄāļēāļŠāđŒ āļŦāļĢāļ·āļ­ āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļŠāļ™āļīāļ”āļ™āļĩāđ‰
āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ—āļĩāļĨāļ°āļšāļīāļ• (bit-by-bit) āļšāļ™āļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš RS-232 āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āđˆāļēāļ‡āļˆāļēāļ
āļžāļ­āļĢāđŒāļ•āļ‚āļ™āļēāļ™ (parallel port) āļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ—āļĩāļĨāļ°āļŦāļĨāļēāļĒāđ†āļšāļīāļ• (8-bit) āđ‚āļ”āļĒāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļāļēāļĢ
āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāļˆāļ°āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāļ–āļĩāđˆāļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ‚āđ‰āļ­āļ”āļĩāļ‚āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄ
āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļĒāļ°āļ—āļēāļ‡āļ—āļĩāđˆāđ„āļāļĨāļāļ§āđˆāļēāđāļĨāļ°āđƒāļŠāđ‰āļŠāļēāļĒāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļēāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ‚āļ™āļēāļ™
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāđāļšāđˆāļ‡āļ•āļēāļĄāļĨāļąāļāļĐāļ“āļ°āļŠāļąāļāļāļēāļ“āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļ”āđ‰ 2 āđāļšāļš āđ„āļ”āđ‰āđāļāđˆ
1. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ (Synchronous) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāđƒāļ™āļāļēāļĢ
āļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ‡āļŦāļ§āļ°āļ‚āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“
āļĢāļđāļ›āļ—āļĩāđˆ 4.2 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ
2. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ (Asynchronous) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ āļˆāļ°
āđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Bit Pattern) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āđˆāļēāļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™
āļ•āļąāļ§āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāđˆāļ§āļ™āđ„āļŦāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ›āļīāļ”āļ—āđ‰āļēāļĒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāđ€āļ—āđˆāļēāļāļąāļ™āļ—āļąāđ‰āļ‡āļ āļēāļ„āļŠāđˆāļ‡āđāļĨāļ°āļ āļēāļ„āļĢāļąāļš
āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ
āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ āļ‹āļķāđˆāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢ
āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļĢāļąāļšāđāļĨāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāļžāđˆāļ§āļ‡āđ„āļ›āļ”āđ‰āļ§āļĒ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē UART (Universal Asyn-
chronous Receiver Transmitter) āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđƒāļŠāđ‰āļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļš RS-232 āļ–āđ‰āļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļšāļ™
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āđ€āļĢāļĩāļĒāļāļ§āđˆāļē COMPORT āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļĄāļēāļ•āļĢāļāļēāļ™ RS-232 āđāļĨāđ‰āļ§āļĢāļ°āļ”āļąāļšāđāļĢāļ‡āļ”āļąāļ™āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđƒāļŦāđ‰
āđ€āļ›āđ‡āļ™āđ„āļŸāļšāļ§āļāļĨāļšāđ€āļžāļ·āđˆāļ­āļĨāļ”āļŠāļąāļāļāļēāļ“āļĢāļšāļāļ§āļ™āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āđ„āļ›āđ„āļ”āđ‰āļĢāļ°āļĒāļ°āļ—āļēāļ‡āļŦāļĨāļēāļĒāļŠāļīāļšāđ€āļĄāļ•āļĢ āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āđ„āļĄāđ‚āļ„āļĢ
āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ āđ€āļŠāđˆāļ™ PIC, MCS-51 āļŦāļĢāļ·āļ­ AVR āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩāđ‚āļĄāļ”āļđāļĨ UART āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢ
āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļąāļ§āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļˆāļ°āļĄāļĩāļĢāļ°āļ”āļąāļšāļŠāļąāļāļāļēāļ“āđ€āļ›āđ‡āļ™āļĢāļ°āļ”āļąāļšāļŠāļąāļāļāļēāļ“
TTL (5V) āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āļĢāļ°āļ”āļąāļšāđāļĢāļ‡
āļ”āļąāļ™āļ”āđ‰āļ§āļĒāđ„āļ­āļ‹āļĩ MAX232
187
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļēāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩ 2 āļ‚āļēāļŦāļĨāļąāļāļ„āļ·āļ­āļ‚āļēāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ (RxD) āđāļĨāļ° āļ‚āļēāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (TxD)
āđ‚āļ”āļĒāļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļĢāļ‡āļāļąāļ™āļ—āļąāđ‰āļ‡āļ•āļąāļ§āļĢāļąāļšāđāļĨāļ°āļ•āļąāļ§āļŠāđˆāļ‡ āđ€āļŠāđˆāļ™āļšāļ­āļ”āđ€āļĢāļ• (baudrate) 9600 āļšāļīāļ•āļ•āđˆāļ­āļ§āļīāļ™āļēāļ—āļĩ
āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āđ€āļĢāļīāđˆāļĄ āļšāļīāļ•āļŦāļĒāļļāļ” āļšāļīāļ•āļžāļēāļĢāļīāļ•āļĩāđ‰ āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļ‚āđ‰āļ­āļĄāļđāļĨ
āļ•āļēāļĢāļēāļ‡ 4.1 āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” character āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev
āļ­āļļāļ›āļāļĢāļ“āđŒ āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ MAJOR MINOR
Parallel port 0 /dev/lp0 āļŦāļĢāļ·āļ­ /dev/par0 6 0
Parallel port 1 /dev/lp1 āļŦāļĢāļ·āļ­ /dev/par1 6 1
1st
Serial port /dev/ttyS0 4 64
2nd
Serial port /dev/ttyS1 4 65
IDE tape drive /dev/ht0 37 0
1st
SCSI tape drive /dev/st0 9 0
2nd
SCSI tape drive /dev/st1 9 1
System Console /dev/console 5 1
1st
Virtual Terminal /dev/tty1 4 1
2nd
Virtual Terminal /dev/tty2 4 2
Process current terminal /dev/tty 5 0
Sound card /dev/audio 14 4
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ (/dev/ttySx āļŦāļĢāļ·āļ­ /dev/ttyUSBx) āļ āļēāļĒ
āđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
// serial_thread.c
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <pthread.h> /* Create pthread to run reading prog in background */
struct serial_data {
	 int fd, nbytes, portsite; /* device file */
	 char *bufptr; /* set pointer of buffer */
	 char buffer[255], data[255]; /* target buffer to get from pointer */
};
struct serial_data ffuart;
void *ffuart_thread() {
	 ffuart.portsite = 1;
188
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
ffuart.fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
	 if (ffuart.fd == -1) {
	 	 /* Could not open the port. */
	 	 perror("open_port: Unable to open /dev/ttyS1 - ");
	 } else {
	 	 struct termios options;
	 	 fcntl(ffuart.fd, F_SETFL, 0);
	 	 tcgetattr(ffuart.fd, &options);
	 	 cfsetispeed(&options, B9600);
	 	 cfsetospeed(&options, B9600);
	 	 options.c_cflag |= (CLOCAL | CREAD);
	 	 options.c_cflag |= PARENB;
	 	 options.c_cflag &= ~PARODD;
	 	 options.c_cflag &= ~CSTOPB;
	 	 options.c_cflag &= ~CSIZE;
	 	 options.c_cflag |= CS8;
	 	 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
	 	 options.c_oflag &= ~OPOST;
	 	 options.c_cc[VMIN] = 0;
	 	 options.c_cc[VTIME] = 10;
	 	 tcsetattr(ffuart.fd, TCSANOW, &options);
	 	 printf("Port is scanning. ^^n");
	 	 ffuart.bufptr = ffuart.buffer; /* set buffer to get from pointer */
	 	 printf("Hey! You Reading yet.n");
	 	 printf("Now working in ST Port.n");
	 	 while (1) {
	 	 	 printf("ReadingFFn");
	 	 	 ffuart.nbytes = read(ffuart.fd, ffuart.buffer, 255);
	 	 	 if (ffuart.nbytes != 0) {
	 	 	 	 ffuart.buffer[8] = '0';
	 	 	 	 printf("From %d side : %sn", ffuart.portsite,
ffuart.buffer);
	 	 	 }
	 	 }
	 }
	 close(ffuart.fd);
}
int main() {
	 pthread_t ff_tid;
	 int rc;
	 printf("FF_Thread creating!!n");
	 rc = pthread_create(&ff_tid, NULL, ffuart_thread, (void *) NULL);
	 if (rc) {
	 	 printf("ERROR; return code from pthread_create() is %drn", rc);
	 	 exit(-1);
	 }
	 printf("FF_Thread created!!t[Complete!!]n");
	 pthread_join(ff_tid, NULL);
	 printf("Created all!!t[Complete!!]n");
	 pthread_exit(NULL);
}
189
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ serial_thread.c āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM
#
# Makefile! : Serial communication Sample Program
#
CROSS_COMPILE=arm-linux-uclibc-
CC=$(CROSS_COMPILE)gcc
SOURCES=serial_thread.c
OBJECTS=$(SOURCES:.c=.o)
CFLAGS=-Os
LDFLAGS=-Os -lm -static
LIBRARIES=pthread
EXECUTABLE=serial_thread
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -l$(LIBRARIES)
.c.o:
! $(CC) $(CFLAGS) $< -o $@
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āļ„āļ·āļ­āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
// serial_chat.c
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 //POSIX compliant source
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); //definition of signal handler
int wait_flag=TRUE; //TRUE while no signal received
char devicename[80];
long Baud_Rate = 38400; // default Baud Rate (110 through 38400)
long BAUD; // derived baud rate from command line
long DATABITS;
long STOPBITS;
190
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
long PARITYON;
long PARITY;
int Data_Bits = 8; // Number of data bits
int Stop_Bits = 1; // Number of stop bits
int Parity = 0; // Parity as follows:
// 00 = NONE, 01 = Odd, 02 = Even, 03 = Mark, 04 = Space
int Format = 4;
FILE *input;
FILE *output;
int status;
main(int Parm_Count, char *Parms[])
{
char version[80] = " POSIX compliant Communications test program version
1.00 4-25-1999rn";
char version1[80] = " Copyright(C) Mark Zehner/Peter Baumann 1999rn";
char version2[80] = " This code is based on a DOS based test program by Mark Zeh-
ner and a Serialrn";
char version3[80] = " Programming POSIX howto by Peter Baumann, integrated by
Mark Zehnerrn";
char version4[80] = " This program allows you to send characters out the speci-
fied port by typingrn";
char version5[80] = " on the keyboard. Characters typed will be echoed to the
console, and rn";
char version6[80] = " characters received will be echoed to the console.rn";
char version7[80] = " The setup parameters for the device name, receive data for-
mat, baud ratern";
char version8[80] = " and other serial port parameters must be entered on the
command line rn";
char version9[80] = " To see how to do this, just type the name of this program.
rn";
char version10[80] = " This program is free software; you can redistribute it
and/or modify itrn";
char version11[80] = " under the terms of the GNU General Public License as pub-
lished by the rn";
char version12[80] = " Free Software Foundation, version 2.rn";
char version13[80] = " This program comes with ABSOLUTELY NO WARRANTY.rn";
char instr[100] ="rnOn the command you must include six items in the following
order, they are:rn";
char instr1[80] =" 1. The device name Ex: ttyS0 for com1, ttyS1 for com2,
etcrn";
char instr2[80] =" 2. Baud Rate Ex: 38400 rn";
char instr3[80] =" 3. Number of Data Bits Ex: 8 rn";
char instr4[80] =" 4. Number of Stop Bits Ex: 0 or 1rn";
char instr5[80] =" 5. Parity Ex: 0=none, 1=odd, 2=evenrn";
char instr6[80] =" 6. Format of data received: 1=hex, 2=dec, 3=hex/asc,
4=dec/asc, 5=ascrn";
char instr7[80] =" Example command line: serial_chat ttyS0 38400 8 0 0 4 rn";
char Param_strings[7][80];
char message[90];
int fd, tty, c, res, i, error;
191
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
char In1, Key;
//place for old and new port settings for serial port
struct termios oldtio, newtio;
//place tor old and new port settings for keyboard teletype
struct termios oldkey, newkey;
struct sigaction saio; //definition of signal action
char buf[255]; //buffer for where data is put
input = fopen("/dev/tty", "r"); //open the terminal keyboard
output = fopen("/dev/tty", "w"); //open the terminal screen
if (!input || !output)
{
fprintf(stderr, "Unable to open /dev/ttyn");
exit(1);
}
error=0;
fputs(version,output); //display the program introduction
fputs(version1,output);
fputs(version2,output);
fputs(version3,output);
fputs(version4,output);
fputs(version5,output);
fputs(version6,output);
fputs(version7,output);
fputs(version8,output);
fputs(version9,output);
fputs(version10,output);
fputs(version11,output);
fputs(version12,output);
fputs(version13,output);
//read the parameters from the command line
if (Parm_Count==7)
//if there are the right number of parameters on the command line
{
for (i=1; i<Parm_Count; i++) // for all wild search parameters
{
strcpy(Param_strings[i-1],Parms[i]);
}
i=sscanf(Param_strings[0],"%s",devicename);
if (i != 1) error=1;
i=sscanf(Param_strings[1],"%li",&Baud_Rate);
if (i != 1) error=1;
i=sscanf(Param_strings[2],"%i",&Data_Bits);
if (i != 1) error=1;
i=sscanf(Param_strings[3],"%i",&Stop_Bits);
if (i != 1) error=1;
i=sscanf(Param_strings[4],"%i",&Parity);
if (i != 1) error=1;
i=sscanf(Param_strings[5],"%i",&Format);
if (i != 1) error=1;
192
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
sprintf(message,"Device=%s, Baud=%lirn",devicename, Baud_Rate);
//output the received setup parameters
fputs(message,output);
sprintf(message,"Data Bits=%i Stop Bits=%i Parity=%i Format=%irn",D-
ata_Bits, Stop_Bits, Parity, Format);
fputs(message,output);
} //end of if param_count==7
if ((Parm_Count==7) && (error==0)) //if the command line entrys were correct
{ //run the program
tty = open("/dev/tty", O_RDWR | O_NOCTTY | O_NONBLOCK);
//set the user console port up
tcgetattr(tty,&oldkey);
// save current port settings
//so commands are interpreted right for this program
// set new port settings for non-canonical input processing //must be NOCTTY
newkey.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newkey.c_iflag = IGNPAR;
newkey.c_oflag = 0;
newkey.c_lflag = 0; //ICANON;
newkey.c_cc[VMIN]=1;
newkey.c_cc[VTIME]=0;
tcflush(tty, TCIFLUSH);
tcsetattr(tty,TCSANOW,&newkey);
switch (Baud_Rate)
{
case 38400:
default:
BAUD = B38400;
break;
case 19200:
BAUD = B19200;
break;
case 9600:
BAUD = B9600;
break;
case 4800:
BAUD = B4800;
break;
case 2400:
BAUD = B2400;
break;
case 1800:
BAUD = B1800;
break;
case 1200:
BAUD = B1200;
break;
case 600:
BAUD = B600;
break;
case 300:
193
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
BAUD = B300;
break;
case 200:
BAUD = B200;
break;
case 150:
BAUD = B150;
break;
case 134:
BAUD = B134;
break;
case 110:
BAUD = B110;
break;
case 75:
BAUD = B75;
break;
case 50:
BAUD = B50;
break;
} //end of switch baud_rate
switch (Data_Bits)
{
case 8:
default:
DATABITS = CS8;
break;
case 7:
DATABITS = CS7;
break;
case 6:
DATABITS = CS6;
break;
case 5:
DATABITS = CS5;
break;
} //end of switch data_bits
switch (Stop_Bits)
{
case 1:
default:
STOPBITS = 0;
break;
case 2:
STOPBITS = CSTOPB;
break;
} //end of switch stop bits
switch (Parity)
{
case 0:
default: //none
PARITYON = 0;
194
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
PARITY = 0;
break;
case 1: //odd
PARITYON = PARENB;
PARITY = PARODD;
break;
case 2: //even
PARITYON = PARENB;
PARITY = 0;
break;
} //end of switch parity
//open the device(com port) to be non-blocking (read will return immediately)
fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd < 0)
{
perror(devicename);
exit(-1);
}
//install the serial handler before making the device asynchronous
saio.sa_handler = signal_handler_IO;
sigemptyset(&saio.sa_mask); //saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
// allow the process to receive SIGIO
fcntl(fd, F_SETOWN, getpid());
// Make the file descriptor asynchronous (the manual page says only
// O_APPEND and O_NONBLOCK, will work with F_SETFL...)
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); // save current port settings
// set new port settings for canonical input processing
newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY |
CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0; //ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
// loop while waiting for input. normally we would do something useful here
while (STOP==FALSE)
{
status = fread(&Key,1,1,input);
if (status==1) //if a key was hit
{
switch (Key)
195
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
{ /* branch to appropriate key handler */
case 0x1b: /* Esc */
STOP=TRUE;
break;
default:
fputc((int) Key,output);
// sprintf(message,"%x ",Key); //debug
// fputs(message,output);
write(fd,&Key,1); //write 1 byte to the port
break;
} //end of switch key
} //end if a key was hit
// after receiving SIGIO, wait_flag = FALSE, input is available and can be read
if (wait_flag==FALSE) //if input is available
{
res = read(fd,buf,255);
if (res>0)
{
for (i=0; i<res; i++) //for all chars in string
{
In1 = buf[i];
switch (Format)
{
case 1: //hex
sprintf(message,"%x ",In1);
fputs(message,output);
break;
case 2: //decimal
sprintf(message,"%d ",In1);
fputs(message,output);
break;
case 3: //hex and asc
if ((In1<32) || (In1>125))
{
sprintf(message,"%x",In1);
fputs(message,output);
}
else fputc ((int) In1, output);
break;
case 4: //decimal and asc
default:
if ((In1<32) || (In1>125))
{
sprintf(message,"%d",In1);
fputs(message,output);
}
else fputc ((int) In1, output);
break;
case 5: //asc
fputc ((int) In1, output);
break;
} //end of switch format
196
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
} //end of for all chars in string
} //end if res>0
// buf[res]=0;
// printf(":%s:%dn", buf, res);
// if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
wait_flag = TRUE; /* wait for new input */
} //end if wait flag == FALSE
} //while stop==FALSE
// restore old port settings
tcsetattr(fd,TCSANOW,&oldtio);
tcsetattr(tty,TCSANOW,&oldkey);
close(tty);
close(fd); //close the com port
} //end if command line entrys were correct
else //give instructions on how to use the command line
{
fputs(instr,output);
fputs(instr1,output);
fputs(instr2,output);
fputs(instr3,output);
fputs(instr4,output);
fputs(instr5,output);
fputs(instr6,output);
fputs(instr7,output);
}
fclose(input);
fclose(output);
} //end of main
/***************************************************************************
* signal handler. sets wait_flag to FALSE, to indicate above loop that *
* characters have been received. *
***************************************************************************/
void signal_handler_IO (int status)
{
// printf("received SIGIO signal.n");
wait_flag = FALSE;
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ serial_thread.c āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 āđ‚āļ”āļĒāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļē
āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡ gcc
#
# Makefile! : Serial chat sample Program
#
# CROSS_COMPILE=arm-linux-uclibc-
CC=$(CROSS_COMPILE)gcc
197
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
SOURCES=serial_chat.c
OBJECTS=$(SOURCES:.c=.o)
CFLAGS=-Os
LDFLAGS=-Os -lm -static
LIBRARIES=
EXECUTABLE=serial_chat
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -l$(LIBRARIES)
.c.o:
! $(CC) $(CFLAGS) $< -o $@
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ
(COM1) āđ‚āļ”āļĒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
$ serial_chat /dev/ttyS0 38400 8 1 0 4
āđ‚āļ”āļĒāļ—āļĩāđˆ:
- āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ• /dev/ttyS0
- baud rate āļ—āļĩāđˆ 38,400 bps
- āļ‚āļ™āļēāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ 8 āļšāļīāļ•
- āļ‚āļ™āļēāļ”āļšāļīāļ•āļŦāļĒāļļāļ” (stop bit) 1 āļšāļīāļ•
- āđ„āļĄāđˆāļĄāļĩ parity bit
- āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļš
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ
āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Interprocess Communication - IPC) āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļœāđˆāļēāļ™āđ€āļŠāļĨāļĨāđŒāđ‚āļ”āļĒāļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĢāļāļˆāļ°āļŠāđˆāļ‡āđ„āļ›
āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ—āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ–āļąāļ”āđ„āļ›
$ ls -al | grep "source"
drwxr-xr-x 24 root root 4096 2013-09-25 04:51 linux-source-2.6.32
āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāđ„āļ›āļ›āđŒ (Pipe) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāđƒāļ™āļāļēāļĢāļ™āļģāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™
āļ‹āđ‰āļēāļĒāđ„āļ›āļĒāļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™āļ‚āļ§āļē āļ‹āļķāđˆāļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™
āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
198
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļēāļĢāļēāļ‡ 4.2 āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āđāļšāļšāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ IPC
M E T H O D D E S C R I P T I O N
File āļšāļąāļ™āļ—āļķāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ”āļīāļŠāļāđŒ āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰
Signal
āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āđ„āļ›āļ‚āļąāļ”āļˆāļąāļ‡āļŦāļ§āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļžāļ·āđˆāļ­
āļšāļ­āļāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļģāļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ™āļąāđ‰āļ™āđ† āļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰
āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ”āđ‰āļ§āļĒāļāļąāļ™
Socket
āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ™āđ‡āļ—āđ€āļ§āļīāļĢāđŒāļ„āļšāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļŦāļĢāļ·āļ­āđ„āļ›āļĒāļąāļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™
Pipe āļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļžāļĢāđ€āļ‹āļŠāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļŦāļĢāļ·āļ­ half duplex
Message queue āļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļĢāļ°āļšāļļāļ„āļĨāđ‰āļēāļĒāļāļąāļšāđ„āļ›āļ›āđŒ āđāļ•āđˆāđ€āļāđ‡āļšāđāļĨāļ°āđ€āļĢāļĩāļĒāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđƒāļ™āđāļžāđ‡āļāđ€āļāļˆ
Named pipe āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒāļšāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļ—āļ™āļĄāļēāļ•āļĢāļāļēāļ™ input āđāļĨāļ° output
Semaphore
āđ‚āļ„āļĢāļŠāļĢāđ‰āļēāļ‡āļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāļ›āļĢāļ°āļŠāļēāļ™ thread āļŦāļĢāļ·āļ­āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļĩāđˆāļāļĢāļ°āļ—āļģāļāļąāļš
āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™
Shared memory
āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āđ„āļ§āđ‰āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđāļŠāļĢāđŒāđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ·āđˆāļ™āđ†
āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™āđ„āļ”āđ‰
Message passing (shared
nothing)
āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš message queue
Memory-mapped le
āđāļĄāļžāđ„āļŸāļĨāđŒāđ„āļ›āļĒāļąāļ‡ RAM āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ
āļˆāļģāđ‚āļ”āļĒāļ•āļĢāļ‡
Pipe
āđ„āļ›āļ›āđŒ (Pipe) āđ€āļ›āđ‡āļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ‡āđˆāļēāļĒāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāļ™āļģāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļ
āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡āđ„āļ›āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ—āļ‚āļ­āļ‡āļ­āļĩāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡ āđ‚āļ”āļĒāđ„āļ›āļ›āđŒāļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ
āļ‹āļķāđˆāļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļšāļ—āļīāļĻāļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ (unidirectional)
pfd[1]
āđ€āļ‚āļĩāļĒāļ™āļ‚āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡
pfd[0]
āļ­ïœŠāļēāļ™āļ‚āļ­āļĄāļđāļĨāļ•āļģāđāļŦāļ™ïœŠāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡
Pipe
āļĢāļđāļ›āļ—āļĩāđˆ 4.4 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ—āļīāļĻāļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ”āđ‰āļ§āļĒ Pipe
199
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļžāļĢāđ€āļ‹āļŠāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe āļ—āļĩāđˆ
āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē unistd.h
#include <unistd.h>
int pipe ( int pipefd[2] ); <--- pipefd - āļ•āļąāļ§āđāļ›āļĢ array āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ„āđˆāļē le descriptors
pipefd[0] - le descriptor āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āđˆāļēāļ™
pipefd[1] - le descriptor āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™
āļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ pipe
0 - āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ, -1 - āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļĨāđ‰āļĄāđ€āļŦāļĨāļ§
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ
āđ‚āļ”āļĒāļˆāļ°āļ„āļ·āļ™āļ„āđˆāļē le descriptor āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļāļąāđˆāļ‡ āļœāđˆāļēāļ™āļ•āļąāļ§āđāļ›āļĢ pipefd[] āļāļĨāđˆāļēāļ§āļ„āļ·āļ­ āļ›āļĨāļēāļĒāļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™
(pipefd[0]) āđāļĨāļ°āļ­āļĩāļāļ›āļĨāļēāļĒāļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™ (pipefd[1]) āļ„āđˆāļēāļ‚āļ­āļ‡ ïŽle descriptor āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄ
(int) āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ–āļķāļ‡āđāļŸāđ‰āļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™
pipe āļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāđˆāļ‡āļ­āļēāđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄāļ—āļĩāđˆāļĄāļĩāļŠāļĄāļēāļŠāļīāļ 2 āļ•āļąāļ§āđƒāļŦāđ‰āđāļāđˆ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe()
int pipefd[2]; // file descriptor āļ‚āļ­āļ‡ pipe
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ pipe
// pipe.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
pid_t pid;
int mypipefd[2];
int ret;
char buf[20];
ret = pipe(mypipefd);
if(ret == -1) {
perror("pipe");
exit(1);
}
pid = fork();
if(pid == 0) {
/* Child Process */
printf("Child Processn");
write(mypipefd[1], "Hello there!", 12);
}else{
/* Parent Process */
printf("Parent Processn");
read(mypipefd[0], buf, 15);
200
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
printf("buf : %sn", buf);
}
return 0;
}
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ pipe.c āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡ (āđ‚āļ›āļĢāđ€āļ‹āļŠ parent āđāļĨāļ°āđ‚āļ›āļĢ
āđ€āļ‹āļŠ child)
$ gcc -o pipe pipe.c
$ ./pipe
Parent Process
Child Process
buf : Hello there!
Message Queues
āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļšāđ„āļŸāļĨāđŒ pipe āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļ™āļķāđˆāļ‡āđ„āļ›āļĒāļąāļ‡āļ­āļĩāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļ™āļķāđˆāļ‡
āļœāđˆāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢ
āđ€āļ‹āļŠāļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ pipe āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡
āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‹āļķāđˆāļ‡āļāļąāļ™āđāļĨāļ°āļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš message queue āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ·āļ­
āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡ queue (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ msgsnd) āđāļĨāđ‰āļ§ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļˆāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ–āđ‰āļē
āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ”āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āđˆāļēāļ™ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ queue āđ„āļ”āđ‰āļ āļēāļĒāļŦāļĨāļąāļ‡ (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ msgrcv) āļ”āļąāļ‡āđāļŠāļ”āļ‡
āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ message queue āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđ€āļĢāļ·āđˆāļ­āļ‡āļ‚āļ™āļēāļ”āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ”āđ„āļ§āđ‰
āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļģāļ™āļ§āļ™āļšāļĨāđ‡āļ­āļāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļĄāļĩāļšāļ™āļĢāļ°āļšāļšāļāđ‡āļˆāļ°āļ–āļđāļāļˆāļģāļāļąāļ”āđ„āļ§āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āđāļ›āļĢ
āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļŠāđˆāļ§āļ™āļ„āļ·āļ­ MSGMAX(4096) āđāļĨāļ° MSGMNB(16384) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āđāļĢāļāļˆāļ°āļŦāļĄāļēāļĒ
āļ–āļķāļ‡āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āđāļĨāļ°āļ•āļąāļ§āļ—āļĩāđˆāļŠāļ­āļ‡āļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļ§āļēāļĄāļˆāļļāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡ queue āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļĢāļ°āļšāļš
āļ„āđˆāļēāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ­āļēāļˆāļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāđƒāļŠāđ‰āļ„āđˆāļēāļ™āļĩāđ‰āđ€āļĨāļĒāļāđ‡āđ€āļ›āđ‡āļ™āđ„āļ”āđ‰
...āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ›āļĢāđ€āļ‹āļŠ
āđ‚āļ›āļĢāđ€āļ‹āļŠ
āđ‚āļ›āļĢāđ€āļ‹āļŠ
msgsnd() msgrev()
msgget()
msgctl()
āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš message queue
201
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļēāļĒāļāļēāļĢāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ sys/msg.h āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™ Message Queues
#include<sys/msg.h>
int msgct1(int msqid, int cmd, struct msqid_ds *buf);
int megget1(key_t key, int ms_gflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ‡āļšāļĨāđŠāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ Message Queues
/*
** msg_sender.c -- writes to a message queue
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void)
{
struct my_msgbuf buf;
int msqid;
key_t key;
if ((key = ftok("msg_sender.c", 'B')) == -1) {
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("Enter lines of text, ^D to quit:n");
buf.mtype = 1; /* we don't really care in this case */
while(gets(buf.mtext), !feof(stdin)) {
if (msgsnd(msqid, (struct msgbuf *)&buf, sizeof(buf), 0) == -1)
perror("msgsnd");
}
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
202
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
exit(1);
}
return 0;
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™āļšāļĨāđŠāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļ āļēāļĒāđƒāļ™ Message Queues
/*
** msg_receiver.c -- reads from a message queue
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct my_msgbuf {
long mtype;
char mtext[200];
};
int main(void)
{
struct my_msgbuf buf;
int msqid;
key_t key;
if ((key = ftok("msg_sender.c", 'B')) == -1) {
/* same key as msg_sender.c */
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644)) == -1) { /* connect to the queue */
perror("msgget");
exit(1);
}
printf("spock: ready to receive messages, captain.n");
for(;;) { /* Spock never quits! */
if (msgrcv(msqid, (struct msgbuf *)&buf, sizeof(buf), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("spock: "%s"n", buf.mtext);
}
return 0;
}
203
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Thread
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ° multi-tasking programming āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ—āļĢāļ”
(thread) āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļš
āļŦāļĨāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ€āļ—āļĢāļ”āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē “lightweight processes”
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđˆāļ§āđ„āļ›āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
(āđ€āļŠāđˆāļ™āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ AX,BX,DX), āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļˆāļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļš code,
globals, heap āđāļĨāļ° stack) āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ,
āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ) āļ‹āļķāđˆāļ‡āđ€āļ—āļĢāļ”āļāđ‡āļˆāļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļ™ āđāļ•āđˆāļˆāļ°āļ•āđˆāļēāļ‡āļāļąāļ™āļ•āļĢāļ‡āļ—āļĩāđˆ multiple processes āļˆāļ°āđāļĒāļāļāļēāļĢāđ€āļāđ‡āļš
āļŠāļ–āļēāļ™āļ°āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ multiple threads āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ code, globals āđāļĨāļ° heap āļĢāđˆāļ§āļĄāļāļąāļ™
āđ€āļ—āļĢāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āļĄāļĩāļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āđ‚āļ”āļĒāđƒāļ™
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ (āđ„āļ”āđ‰āđāļāđˆ main(), function1() āđāļĨāļ° function2()) āļ‹āļķāđˆāļ‡āļ–āđ‰āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļāđ‡āļˆāļ°āļ—āļģāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļ•āđˆāļĨāļ°
āļšāļĢāļĢāļ—āļąāļ” (program counter) āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 2 āļ™āļēāļ—āļĩ āđāļ•āđˆāļ–āđ‰āļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļˆāļģāļ™āļ§āļ™ 3
āļ•āļąāļ§āļ—āļąāđ‰āļ‡āļŠāļēāļĄāļŠāđˆāļ§āļ™āļāđ‡āļˆāļ°āđāļĒāļāļāļąāļ™āļ—āļģāļ‡āļēāļ™āđ„āļ›āđāļ•āđˆāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™āđ€āļžāļĩāļĒāļ‡ 50 āļ§āļīāļ™āļēāļ—āļĩāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
main thread
thread 3
thread 2
āđ€āļ§āļĨāļē (Time)
āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Single-Thread
CPU #1
CPU #1
CPU #2
CPU #3
āļ„āļ·āļ­ main()
āļ„āļ·āļ­ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 2()
āļ„āļ·āļ­ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 1()
āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Multi-Thread
āđ€āļ§āļĨāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āđ€āļ§āļĨāļēāļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ‚āļ”āļĒāđƒāļŠāđ‰ multi-thread
āđ€āļ§āļĨāļēāļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ‚āļ”āļĒāđƒāļŠāđ‰ single-thread
āļĢāļđāļ›āļ—āļĩāđˆ 4.6 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Single-Thread āđāļĨāļ° Multi-Thread
204
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ—āļĢāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļāļąāļ™āđ„āļ”āđ‰āļ—āļēāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ­āļĒāļđāđˆāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđƒāļ™
āļ‚āļ“āļ°āļ—āļĩāđˆāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļāļąāļ™āđ„āļ”āđ‰āļ•āđ‰āļ­āļ‡āļœāđˆāļēāļ™āļ—āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļŠāđˆāļ™
āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ, āļœāđˆāļēāļ™āđ„āļ›āļ›āđŒ āļŦāļĢāļ·āļ­āļœāđˆāļēāļ™āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
POSIX threads
āđ„āļĨāļšāļĢāļēāļĢāļĩ POSIX thread āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļĄāļēāļ•āļĢāļēāļāļēāļ™āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ€āļ—āļĢāļ”āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē
C/C++ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ†āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ€āļ—āļĢāļ”āđāļĨāļ°āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž
āļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (multi-processor āļŦāļĢāļ·āļ­ multi-core
systems) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļ•āļēāļĢāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļšāļ™āđāļ•āđˆāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆ
āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđāļĨāļ°āđ€āļ—āļĢāļ”āļ—āļļāļāļ•āļąāļ§āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒ
āļ„āļ§āļēāļĄāļˆāļģāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ (address space) āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ‚āļ™āļēāļ™ (Parallel
programming) āđ€āļŠāđˆāļ™ MPI āđāļĨāļ° PVM āļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļšāļāļĢāļ°āļˆāļēāļĒ (distributed
computing) āđ„āļ›āļĒāļąāļ‡āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ† āļ—āļĩāđˆāļ­āļĒāļđāđˆāđ„āļāļĨāļ­āļ­āļāđ„āļ›āļŦāļĢāļ·āļ­āļ•āđˆāļēāļ‡āļŠāļ–āļēāļ™āļ—āļĩāđˆāļāļąāļ™
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ—āļĢāļ”āđ‚āļ”āļĒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix threads (pthread.h) āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰
#include <pthread.h>
int pthread_create(pthread_t *new_thread_ID,
const pthread_attr_t *attr,
void * (*start_func)(void *),
void *arg);
int pthread_join(pthread_t target_thread, void **status);
āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ™āļąāđ‰āļ™āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ thread creation, termination, thread synchro-
nization (joins,blocking), scheduling, data management āđāļĨāļ° process interaction
Master Thread
Worker Thread
Worker Thread
pthread_create() pthread_join()
pthread_exit()
āļ•āļąāļ§āļĨāļđāļāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™
āļ•āļąāļ§āļĨāļđāļāļ—āđāļēāļ‡āļēāļ™
āđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ
āļ—āđāļēāļ‡āļēāļ™
āļĢāļđāļ›āļ—āļĩāđˆ 4.7 āđāļŠāļ”āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļĨāļđāļāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāļ™āļŠāļīāđ‰āļ™āļŠāļļāļ”
205
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ āļˆāļ°āļĄāļĩāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
â€Ē āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process instructions)
â€Ē āļ„āđˆāļē les descriptors āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļīāļ”āđ„āļ§āđ‰
â€Ē āļŠāļąāļāļāļēāļ“ (signals) āđāļĨāļ°āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ (signal handlers)
â€Ē āđ„āļ”āđ€āļĢāļ”āļ—āļ­āļĢāļĩāđˆāļ›āļąāļˆāļˆāļļāļšāļąāļ™ (current working directory)
â€Ē āļŦāļĄāļēāļĒāđ€āļĨāļ‚ User āđāļĨāļ° Group
Thread #1
Registers
Thread #2
RegistersFiles
Heap Static Code
Stack Stack Stack
Thread #3
Stack
Registers
Thread #2
Stack
Registers
Thread #1
Stack
Registers
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ
āļĢāļđāļ›āļ—āļĩāđˆ 4.8 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ
āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđ€āļ—āļĢāļ”āļˆāļ°āļĄāļĩ:
â—Ķ āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ—āļĢāļ” (Thread ID)
â—Ķ āļāļĨāļļāđˆāļĄāļ•āļąāļ§āđāļ›āļĢāļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ (set of registers) āđāļĨāļ° stack pointer
â—Ķ āļŠāđāļ•āđ‡āļāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢ (local variables)
â—Ķ signal mask
â—Ķ āļ„āđˆāļē priority
â—Ķ āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāļŠāđˆāļ‡āļāļĨāļąāļš: errno
āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix threads āļ”āđ‰āļ§āļĒ -lpthread āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ gcc -o main main.c –lpthread
206
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ simple_threads.c
// simple_threads.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *print_message_function(void *ptr);
main()
{
	 pthread_t thread1, thread2;
	 const char *message1 = "Thread 1";
	 const char *message2 = "Thread 2";
	 int iret1, iret2;
/* Create independent threads each of which will execute function */
	 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) mes-
sage1);
	 iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) mes-
sage2);
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
	 pthread_join( thread1, NULL);
	 pthread_join( thread2, NULL);
	 printf("Thread 1 returns: %dn",iret1);
	 printf("Thread 2 returns: %dn",iret2);
	 exit(0);
}
void *print_message_function(void *ptr) {
	 char *message;
	 message = (char *) ptr;
	 printf("%s n", message);
}
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
$ gcc -o simple_threads simple_threads.c –lpthread
$ ./simple_threads
Thread 2
Thread 1
Thread 1 returns: 0
Thread 2 returns: 0
Thread Synchronization
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™
āļ›āļĢāļ°āļŠāļēāļ™āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ—āļĢāļ” (synchronization mechanisms) āđ‚āļ”āļĒāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ—āļĢāļ”
āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ
pthread
207
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āđāļ›āļĢ
(var)
Thread #1 Thread #2
mutex_var
lock
āļ•āļąāđ‰āļ‡āļ„āđˆāļē
blocked
āļĢāļđāļ›āļ—āļĩāđˆ 4.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ™ mutex āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļ‚āļ­āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢ
āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āđ€āļžāļĩāļĒāļ‡ thread #1 āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļē mutex (Mutual
Exclusion Lock) āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢ āđ‚āļ”āļĒāļ—āļĩāđˆ thread #2 āļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ­ (block) āļ„āļīāļ§āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡
āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆ thread #1 āļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ•āļąāļ§ thread #2 āļˆāļķāļ‡āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–
āđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļē mutex āđ€āļžāļ·āđˆāļ­āļ‚āļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļ™āļąāđ‰āļ™āļ•āđˆāļ­āđ„āļ›
Mutexes āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļēāļĢāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļŠāđˆāļ§āļĒāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ›āļąāļāļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āļāļēāļĢāđ„āļĄāđˆ
āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (data inconsistency) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļēāđ€āļŦāļ•āļļāļāļēāļĢāđāļĒāđˆāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŠāđˆāļ§āļ™āļāļĨāļēāļ‡
āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļŦāļĨāļēāļĒāļ•āļąāļ§āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āđ€āļŠāđˆāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (shared memory) āļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡ (global
variable) āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļ™āļąāđ‰āļ™āļ§āđˆāļē critical region āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰ mutexes
āļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āđƒāļ™āļāļĢāļ“āļĩāļĄāļĩāļŦāļĨāļēāļĒāđ€āļ—āļĢāļ”āđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļē
āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„ semaphores āđāļ—āļ™ mutexes
208
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļĢāļ“āļĩāđ„āļĄāđˆāđƒāļŠāđ‰ MUTEXāļāļĢāļ“āļĩāđ„āļĄāđˆāđƒāļŠāđ‰ MUTEX āļāļĢāļ“āļĩāđƒāļŠāđ‰ MUTEXāļāļĢāļ“āļĩāđƒāļŠāđ‰ MUTEX
int counter=0;
void func()
{
counter++;
}
int counter=0;
void func()
{
counter++;
}
pthread_mutex_t var = PTHREAD_MUTEX_INTIALIZER;
int counter=0;
void func()
{
pthread_mutex_lock(&var);
counter++;
pthread_mutex_unlock(&var);
}
pthread_mutex_t var = PTHREAD_MUTEX_INTIALIZER;
int counter=0;
void func()
{
pthread_mutex_lock(&var);
counter++;
pthread_mutex_unlock(&var);
}
Thread #1 Thread #2 Thread #1 Thread #2
counter=0 counter=0 counter=0 counter=0
counter=1 counter=1 counter=1
Thread #2 āļ–āļđāļāļšāļĨāđ‡āļ­āļ„āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢ counter
āđāļ•āđˆ Thread #1 āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢ counter āđ„āļ”āđ‰
counter=2
āļ‹āļķāđˆāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļš mutex āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ pthread āđ„āļ”āđ‰āđāļāđˆ
â€Ēpthread_mutex_lock() āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļĨāđ‡āļ­āļ„āļ„āđˆāļēāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ mutex āļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļāđ‡
āļˆāļ°āļ–āļđāļāļšāļĨāđŠāļ­āļ„āđ€āļ­āļēāđ„āļ§āđ‰āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļĄāļē āļˆāļ™āļāļ§āđˆāļēāđ€āļ—āļĢāļ”āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāļ—āļģāļāļēāļĢāļ›āļĨāđˆāļ­āļĒāļ•āļąāļ§ mutex āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
â€Ēpthread_mutex_unlock() āđ€āļžāļ·āđˆāļ­āļ›āļĨāđˆāļ­āļĒāļŦāļĢāļ·āļ­āļ›āļĨāļ”āļĨāđ‡āļ­āļ„āļ„āđˆāļē mutex āļˆāļēāļāđ€āļ—āļĢāļ”āļ—āļĩāđˆāđƒāļŠāđ‰ mutex āļ­āļĒāļđāđˆ
â€Ēpthread_mutex_trylock() āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•āļąāļ§āđāļ›āļĢ mutex āļ§āđˆāļēāļāļģāļĨāļąāļ‡āļ–āļđāļāđƒāļŠāđ‰āļĨāđŠāļ­āļ„āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ
āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļ™āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļ•āđˆāļēāļ‡āļāđˆāļēāļĒāļ•āđˆāļēāļ‡āļĢāļ­āđƒāļŦāđ‰āđāļ•āđˆāļĨāļ°
āļ•āļąāļ§āđ€āļŠāļĢāđ‡āļˆ (deadlock conditions)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ—āļĢāļ”āļˆāļģāļ™āļ§āļ™ 10 āđ€āļ—āļĢāļ” āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē counter
āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄāļ„āđˆāļē counter āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āļĨāļ° 1 āđ€āļ—āļĢāļ”āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
// simple_mutex.c
#include <stdio.h>
#include <pthread.h>
#define NTHREADS 10
void *thread_function(void *);
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
main()
{
	 pthread_t thread_id[NTHREADS];
	 int i, j;
	 for(i=0; i < NTHREADS; i++)
209
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
{
	 	 pthread_create( &thread_id[i], NULL, thread_function, NULL );
	 }
	 for(j=0; j < NTHREADS; j++)
	 {
	 	 pthread_join( thread_id[j], NULL);
	 }
// Now that all threads are complete I can print the final result.
// Without the join I could be printing a value before all the threads
// have been completed.
	 printf("Final counter value: %dn", counter);
}
void *thread_function(void *dummyPtr) {
	 printf("Thread number %ldn", pthread_self());
	 pthread_mutex_lock(&mutex1);
	 counter++;
	 pthread_mutex_unlock(&mutex1);
}
āļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
$ gcc -o simple_mutex simple_mutex.c –lpthread
$ ./simple_mutex
Thread number 139638417069824
Thread number 139638425462528
Thread number 139638442247936
Thread number 139638433855232
Thread number 139638408677120
Thread number 139638400284416
Thread number 139638391891712
Thread number 139638383499008
Thread number 139638375106304
Thread number 139638366713600
Final counter value: 10
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩāļžāļ­āļĢāđŒāļ•āļŠāļģāļŦāļĢāļąāļšāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (Ethernet Port) āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™
āļāļēāļ™ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ—āļēāļ‡āļ”āđ‰āļēāļ™
āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§āđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļšāļ­āļĢāđŒāļ”āļ­āļ·āđˆāļ™āđ† āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ­āļ·āđˆāļ™āđ† āļŦāļĢāļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰
āđ‚āļ”āļĒāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļāļēāļāđ„āļ§āđ‰āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ­āļ·āđˆāļ™āđ†āļŦāļĢāļ·āļ­
210
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļ™āļąāđ‰āļ™āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļžāļ·āđˆāļ­
āļ„āļ§āļšāļ„āļļāļĄāļŦāļĢāļ·āļ­āļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļēāļāļ—āļĩāđˆāđ„āļŦāļ™āļāđ‡āđ„āļ”āđ‰
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Addresses āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ āđ„āļĄāđˆ
āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (Network ID) āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (Host ID) āļŦāļĄāļēāļĒāđ€āļĨāļ‚ Netmask Address
āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ”āđ‰āļ§āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āļēāļĄ
āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļš Transport Layer āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• (Port Ad-
dress) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđāļ­āļžāļžāļīāđ€āļ„āļŠāļąāđˆāļ™ (Application Protocol) āļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļ•āđˆāļĨāļ°āļāļąāđˆāļ‡āđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļąāļšāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ FTP āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āļ§āļšāļ„āļļāļĄāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ āđ€āļĢāļĩāļĒāļāļāļēāļĢāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āļ§āđˆāļē Socket Programming
TCP UDP
IP
1 2 ... ... ... ... 65535 1 2 ... ... ... ... 65535
... ...TCP sockets UDP sockets
UDP portsTCP ports
Application Application Application
āļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ port
āļŠāđāļēāļŦāļĢāļąāļš socket
Descriptor references
āļĢāļđāļ›āļ—āļĩāđˆ 4.10 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļ”āļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ‚āļ­āļ‡ TCP/IP
āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• (socket) āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 3 āļ›āļĢāļ°āđ€āļ āļ—āđ‚āļ”āļĒāļĒāļķāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 4.3 āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Socket
SOCKET āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
Datagram Socket
āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Connection less Socket āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ UDP (User
Datagram Protocol) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđāļžāđ‡āļāđ€āļāđ‡āļ•
(packet) āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļšāļ™ datagram socket āļ—āļĩāđˆāđāļĒāļāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļąāļ™āļ­āļ­āļāđ„āļ›
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāļŠāđˆāļ‡āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ™āļ—āļēāļ‡āļāđ‡āļˆāļ°āļ–āļđāļāļĨāļģāđ€āļĨāļĩāļĒāļ‡āļāļĢāļ°āļˆāļēāļĒāļ­āļ­āļāđ„āļ›āđƒāļ™āđāļ•āđˆāļĨāļ°āđ€āļŠāđ‰āļ™
āļ—āļēāļ‡ āļˆāļ™āļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļąāļšāļ›āļĨāļēāļĒāļ—āļēāļ‡ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđāļžāđ‡āļāđ€āļāđ‡āļ•āļāđ‡āļ­āļēāļˆāļˆāļ°āļĄāļēāļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡
āđāļšāļšāđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ•āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ™āļ—āļēāļ‡āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļąāđ‰āļ™
211
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
SOCKET āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
Stream Socket
āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Connection-oriented Socket āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ TCP
(Transport Control Protocol) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļāļēāļĢ
āļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āļāļēāļĢāļąāļ™āļ•āļĩāļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ• āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđāļžāđ‡āļāđ€āļāđ‡āļ•
āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļšāļ™ stream socket āđāļĨāļ°āļˆāļ°āļ–āļđāļāļĨāļģāđ€āļĨāļĩāļĒāļ‡āļŠāđˆāļ‡āļœāđˆāļēāļ™āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļ—āļĩāđˆāļ–āļđāļ
āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāļ™āļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡āļˆāļ™āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļŠāļĄāļšāļđāļĢāļ“āđŒ
Raw Socket
āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļžāļšāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ āļŠāļ§āļīāļ—āļ‹āđŒ (Switch) āđāļĨāļ° āđ€āļĢāļēāđ€āļ•āļ­āļĢāđŒ
(Router) āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļš Internet Layer āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļąāļš-
āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđ€āļŦāļĄāļ·āļ­āļ™ datagram āđāļĨāļ° stream socket
āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ
āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ€āļžāļ·āđˆāļ­
āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāļąāļ™ āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰āđ„āļ”āđ‰āđāļāđˆ
â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ āļēāļĒāļ™āļ­āļāđ„āļ”āđ‰āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™
â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļēāļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđāļ•āđˆāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļžāļšāđ€āļŦāđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰
āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ™āļĩāđ‰
â€Ē āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļąāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™
â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡ TCP āđāļĨāļ° UDP āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđāļĄāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļŦāļēāļĒāđ„āļ”āđ‰āļšāđ‰āļēāļ‡āļāđ‡āļˆāļ°
āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡ UDP āļŦāļĢāļ·āļ­āļ–āđ‰āļēāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ—āļĩāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāļŠāļđāļāļŦāļēāļĒāļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡
TCP āđƒāļ™āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āđāļ—āļ™
â€Ē āđ„āļŸāļĨāđŒ /etc/services āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļšāļ­āļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ
āđāļĨāļ°āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļ‹āđ‡āļīāļ­āļāđ€āļāđ‡āļ•āđƒāļ™āļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡ Transport layer
212
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
socket socket
bind bind
recvfrom/
sendto
sendto/
recvfrom
close close
Connect Listen
Accept
Client Server
āļŠāļĢāđ‰āļēāļ‡ socket
āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ socket
āđ„āļ›āļĒāļąāļ‡āļžāļ­āļĢāđŒāļ•
āļĢāđ‰āļ­āļ‡āļ‚āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ›
āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ server
āđāļĨāļ°āļĢāļ­āļ•āļ­āļšāļāļĨāļąāļš
āļĢāļąāļšāđāļĨāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āļŠāļĢāđ‰āļēāļ‡ socket
āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ socket
āđ„āļ›āļĒāļąāļ‡āļžāļ­āļĢāđŒāļ•
āļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡
Client āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
āļ•āļ­āļšāļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Client āđ€āļžāļ·āđˆāļ­
āļžāļĢāđ‰āļ­āļĄāļĢāļąāļš/āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āļŠāđˆāļ‡āđāļĨāļ°āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ
āļĢāļđāļ›āļ—āļĩāđˆ 4.11 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ Socket
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ•āļąāļ§āļĨāļđāļ (Client) āļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ›
āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server) āđāļĨāđ‰āļ§āļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello World of Socket āđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ āđ€āļĄāļ·āđˆāļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāđ„āļ”āđ‰āļĢāļąāļš
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ āļ”āļąāļ‡āļ™āļĩāđ‰
āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server):
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
/* Variables */
int sock;
struct sockaddr_in server;
int mysock;
char buff[1024];
213
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
int rval;
/* Create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0){
perror("Failed to create socket");
exit(1);
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(5000);
/* Call bind */
if(bind(sock, (struct sockaddr *)&server, sizeof(server)))
{
perror("bind failed");
exit(1);
}
/* Listen */
listen(sock, 5);
/* Accept */
do {
mysock = accept(sock, (struct sockaddr *) 0, 0);
if(mysock == -1) {
perror("accept failed");
}else{
memset(buff, 0, sizeof(buff));
if((rval = recv(mysock, buff, sizeof(buff), 0)) < 0 )
perror("reading stream message error");
else if(rval == 0)
printf("Ending connectionn");
else
printf("MSG: %sn", buff);
printf("Got the message (rval = %d)n", rval);
close(mysock);
}
}while(1);
return 0;
}
āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ (Client):
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
214
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define DATA "Hello World of Socket"
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in server;
struct hostent *hp;
char buff[1024];
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("socket failed");
exit(1);
}
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if(hp == 0)
{
perror("gethostbyname failed");
close(sock);
exit(1);
}
memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
server.sin_port = htons(5000);
if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0)
{
perror("connect failed");
close(sock);
exit(1);
}
if(send(sock, DATA, sizeof(DATA), 0) < 0 )
{
perror("send failed");
close(sock);
exit(1);
}
printf("Sent %sn", DATA);
close(sock);
return 0;
}
215
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server) āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ
āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđƒāļ™āļāļąāđˆāļ‡āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
Client
Program
Server
Program
Port:3333
xinetd
stdin
stdin
stdout
socket
socket
stdout
172.16.56.134172.16.56.130
āļĢāļđāļ›āļ—āļĩāđˆ 4.12 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļžāļ­āļĢāđŒāļ• 3333 āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 : āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒ āđ€āļžāļ·āđˆāļ­āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ
$ vim hello_server.sh 
#!/bin/bash
/bin/echo -n "Hello World:" | /usr/bin/tee /tmp/log.log
/bin/date | /usr/bin/tee -a /tmp/log.log
āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļĢāļąāļ™āđ„āļ”āđ‰
$ chmod 755 hello_server.sh
$ ./hello_server.sh
Hello World:Mon Sep 30 01:44:24 PDT 2013
   
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 : āļāļģāļŦāļ™āļ”āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļˆāļ°āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ:
$ gcc -o server server.c
$ ./server
MSG: Hello World of Socket
Got the message (rval = 22)
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ:
$ gcc -o client client.c
$ ./client <IP āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ>
Sent Hello World of Socket
216
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• 3333 āđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āđāļĨāļ°āļāļēāļĢāđ€āļŠāđ‡āļ„āļˆāļēāļāļāļēāļĢāđ€āļ›āļīāļ”āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āļāđˆāļ­āļ™āļ§āđˆāļēāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ”āļąāļ‡āļ™āļĩāđ‰
$ cat /etc/services | grep 3333
$ grep -r 3333 /etc/xinetd.d/*
āđ€āļĄāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāđ‰āļ§ āļ›āļĢāļēāļāļāļ§āđˆāļēāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• 3333 āđāļĨāļ°āļŠāļ·āđˆāļ­āļšāļĢāļīāļāļēāļĢ â€œhello” āļāđ‡āļŠāļēāļĄāļēāļĢāļ–
āđ€āļ‚āđ‰āļēāđ„āļ›āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āļšāļĢāļīāļāļēāļĢāđƒāļŦāļĄāđˆāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ sudo vim /etc/services
āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āđāļĨāđ‰āļ§āļšāļąāļ™āļ—āļķāļāđ„āļŸāļĨāđŒ /etc/services āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ
hello        3333/tcp        # sample hello service
āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ:
- āđƒāļŦāđ‰āļĨāļšāļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ /etc/services āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ—āļ”āļŠāļ­āļš hello service āđāļĨāđ‰āļ§ āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļē
āļāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āđƒāļ™āļ­āļ™āļēāļ„āļ•
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 : āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ hello service āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/xinetd.d/
$ sudo vim /etc/xinetd.d/hello
āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
# default: on
# description: Hello World socket server
service hello
{
! port! = 3333
! disable! = no
! socket_type! = stream
! protocol! = tcp
! user! = root
! wait! = no
! server! = /home/student/hello_server.sh
! log_on_success! += USERID
! log_on_failure! += USERID
}
āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆ
$ sudo /etc/init.d/xinetd restart
* Stopping internet superserver xinetd [ OK ]
* Starting internet superserver xinetd [ OK ]
217
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 : āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ telnet
$ telnet 172.16.56.134 3333
Trying 172.16.56.134...
Connected to 172.16.56.134.
Escape character is '^]'.
Hello World:Mon Sep 30 02:30:39 PDT 2013
Connection closed by foreign host.
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQLITE
āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āđāļ•āđˆāļ›āļąāļāļŦāļēāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļš
āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ„āļ·āļ­āļ–āđ‰āļēāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ log āđƒāļ™
āļĨāļąāļāļĐāļ“āļ° text le āļ˜āļĢāļĢāļĄāļ”āļē āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļšāļŦāļĢāļ·āļ­āđāļ—āļĢāļāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒ log āļˆāļ°āļĄāļĩ
āđ‚āļ­āļāļēāļŠāļ—āļģāđƒāļŦāđ‰āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļŦāļēāļĒāđ„āļ”āđ‰āļŠāļđāļ‡ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ log āļāđ‡āļˆāļ°āļĄāļĩ
āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļ­āļ­āļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļĄāļĩāļĢāļ°āļšāļš āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļ„āļ§āļĢāļˆāļ°
āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (Database) āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰
āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļŠāļđāļ‡ āđāļĨāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡
āļ•āļąāļ§āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ, iOS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite  āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ—
Open Source āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ āļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļšāđ€āļ›āđ‡āļ™ .db, .sdb, āļŦāļĢāļ·āļ­
.s3db āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļž
āđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļ—āļĩāđˆāđƒāļŠāđ‰āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡ SQLite āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļąāļ‡āļ•āļąāļ§āļ•āđˆāļ­āđ„āļ›
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 : āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĨāđˆāļēāļŠāļļāļ”
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite (sqlite-autoconf-3080002.tar.gz) āļˆāļēāļāļĨāļīāļ‡āļ„āđŒ
http://www.sqlite.org/download.html
$ tar -xzvf sqlite-autoconf-3080002.tar.gz
$ cd sqlite-autoconf-3080002/
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 : āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ•āļąāļ§ cross compiler āļĨāļ‡āđƒāļ™ Ubuntu
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 10.10 āļ‚āļķāđ‰āļ™āđ„āļ›
218
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ sudo apt-get install gcc-arm-linux-gnueabi.
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ•āđˆāļģāļāļ§āđˆāļē 10.10
$ sudo add-apt-repository ppa:linaro-maintainers/toolchain
$ sudo apt-get update
$ sudo apt-get install gcc-arm-linux-gnueabi
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 : āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM
$ mkdir ~/sqlite
$ ./configure --host=arm CC=arm-linux-gnueabi-gcc AR=arm-linux-
-gnueabi-ar STRIP=arm-linux-gnueabi-strip RANLIB=arm-linux-gnueabi-
-ranlib CFLAGS=" -mfpu=vfp -Os -lpthread -lrt" LDFLAGS=${LDFLAGS}
$ make
$ make install DESTDIR=~/sqlite
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļˆāļ°āļ–āļđāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/sqlite/ āļ”āļąāļ‡āļ™āļĩāđ‰
usr/local/bin
usr/local/include
usr/local/lib
usr/local/share
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 : āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ SQLite āđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒ cross compiler
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM
$ vim my_sqlite.c
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfullyn");
}
sqlite3_close(db);
}
219
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ arm-linux-gnueabi-gcc -o my_sqlite my_sqlite.c -I~/sqlite/usr/local/
include e -L~/sqlite/usr/local/lib -lsqlite3 -lpthread -ldl
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ "-lpthread" āļŦāļĢāļ·āļ­ "-pthread" āļāđ‡āđ„āļ”āđ‰ āđāļ•āđˆāļ–āđ‰āļēāđƒāļŠāđ‰ "-pthread" āļ•āļąāļ§āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļĨāļ­āļĢāđŒ
āļāđ‡āļˆāļ°āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix Thread āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī
āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ "-ldl" āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ§āđˆāļēāđƒāļŠāđˆāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ dlsym, dlopen āļ—āļĩāđˆāļĄāļĩāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
$ file my_sqlite
my_sqlite: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.31, not stripped
āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++
āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŦāļēāļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āđāļĄāđ‰āļāļĢāļ°āļ—āļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ§āđˆāļēāđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ„āļ§āđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļ™āļąāđ‰āļ™āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ›āļĨāđˆāļ­āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļāļģāļŦāļ™āļ” āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ”āļđāļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļŦāļĢāļ·āļ­āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļģāļĨāļąāļ‡
āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ (run-time) āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ‚āļšāļ§āļ™āļāļēāļĢāļ™āļĩāđ‰āļ§āđˆāļēāļāļēāļĢāļ”āļĩāļšāļąāļ (Debugging)
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™ āļāđ‡āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ”āļĩāļšāļąāļ āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē GNU debugger
āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ Richard Stallman āļšāļīāļ”āļēāđāļŦāđˆāļ‡ GPL āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1986 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļš GNU āļ‚āļ­āļ‡
Richard Stallman āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļāļĨāļļāđˆāļĄāļ„āļģāļŠāļąāđˆāļ‡ gdb kdb āļŦāļĢāļ·āļ­ ddd āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ„āļģāļŠāļąāđˆāļ‡ gdb āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāļ™āļąāļ
āļžāļąāļ’āļ™āļēāđƒāļ™āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰:
â€Ē āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļšāļĢāļĢāļ—āļąāļ”āļ•āđˆāļ­āļšāļĢāļĢāļ—āļąāļ” (line by line) āļ”āđ‰āļ§āļĒ
āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ gdb
â€Ē āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĒāļļāļ”āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āđ„āļ”āđ‰
â€Ē āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ āļ“ āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ (run-time)
â€Ē āļāļģāļŦāļ™āļ”āļˆāļļāļ”āļŦāļĒāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (breakpoints) āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļ•āđˆāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļšāļš step-
by-step āļŦāļĢāļ·āļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ›āļāļ•āļīāļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰
āđ‚āļ”āļĒāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ â€œ-g” āļ•āđ‰āļ­āļ‡āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ gcc āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ
āļāļģāļĨāļąāļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ gcc –g –c main.c
$ g++ -g –c function1.c
$ g++ -g –o my_program main.o function1.o
220
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļ­āļĄāđ„āļžāļĨāđ€āļĨāļ­āļĢāđŒāļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđˆāļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ gdb āļĨāļ‡āđ„āļ›āđƒāļ™āļ­āļ­āļ›āđ€āļˆāļ„āđ„āļŸāļĨāđŒ (.o) āđāļĨāļ°
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ (executable le) āļ‹āļķāđˆāļ‡ gdb āļˆāļ°āđƒāļŠāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļŦāļēāļšāļĢāļĢāļ—āļąāļ”
āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ­āļ­āļāļĄāļē āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ gdb āļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļāļąāļ™āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 4.4 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ gdb
āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ•āđ‡āļĄ āļ„āļģāļŠāļąāđˆāļ‡āļĒāđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
run r āđ€āļĢāļīāđˆāļĄāđ‚āļ›āļĢāđāļāļĢāļĄ
kill k āļŦāļĒāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
quit q āļ­āļ­āļāļˆāļēāļ GDB
continue c āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āđ‚āļ”āļĒāļŦāļĒāļļāļ”āļ—āļĩāđˆ breakpoint āļ–āļąāļ”āđ„āļ›
disassemble disass
āđāļŠāļ”āļ‡ assembly code āļ‚āļ­āļ‡ function āļ—āļĩāđˆ EIP
āļ­āļĒāļđāđˆ
disassemble ADDR disass ADDR
āđāļŠāļ”āļ‡ assembly code āļ—āļĩāđˆ address ADDR (āđƒāļŠāđ‰
āļŠāļ·āđˆāļ­ function āđ„āļ”āđ‰)
disassemble ADDR1 ADDR2 disass ADDR1 ADDR2
āđāļŠāļ”āļ‡ assembly code āļ—āļĩāđˆ address ADDR1
āļ–āļķāļ‡ ADDR2
info breakpoints i b āđāļŠāļ”āļ‡ breakpoint āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
info registers i r āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ CPU registers āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
info frame i f āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš stack frame āļ›āļąāļˆāļˆāļļāļšāļąāļ™
backtrace bt āđāļŠāļ”āļ‡ call stack
break *ADDR b *ADDR
set breakpoint āļ—āļĩāđˆ address ADDR (āļ–āđ‰āļēāđƒāļŠāđ‰āļŠāļ·āđˆāļ­
function āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩ *)
enable [NUM] en [NUM] enable breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM
disable [NUM] dis [NUM] disable breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM
delete [NUM] d [NUM] delete breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM
delete d delete breakpoint āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
nexti [num] ni [num] āļ—āļģāļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ call
stepi [num] si [num] āļ—āļģāļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ call
x/NFU ADDR
āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ address ADDR āđ‚āļ”āļĒ
N āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨ
F āļ„āļ·āļ­āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨ (āļ”āļđāļ•āļēāļĢāļēāļ‡āļ–āļąāļ”āđ„āļ›)
U āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™ byte āļĄāļĩ b (byte), h (2 bytes),
w (4 bytes), g (8 bytes)
display/F ADDR disp/F ADDR
āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ address ADDR āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļ–āļķāļ‡āļŦāļĒāļļāļ”
āļ—āļģāļ‡āļēāļ™āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§
display disp āđāļŠāļ”āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ display list āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
221
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ•āđ‡āļĄ āļ„āļģāļŠāļąāđˆāļ‡āļĒāđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
undisplay [NUM] und [NUM] āļĨāļš display āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļ§āđ‰āļ—āļĩāđˆ NUM
set ADDR=VAL set āļ„āđˆāļē VAL āđ„āļ›āļ—āļĩāđˆ address ADDR
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ factorial āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
$ vim factorial.c
# include <stdio.h>
int main()
{
	 int i=0, num=0, j=1;
	 printf ("Enter the number: ");
	 scanf ("%d", &num );
	 for (i=1; i<num; i++)
	 	 j=j*i;
	 printf("The factorial of %d is %dn",num,j);
}
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ factorial āđ‚āļ”āļĒāđƒāļŠāđˆāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -g āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ gcc -g factorial.c
$ ./a.out
Enter the number: 10
The factorial of 10 is 362880
āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ gdb āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ gdb ./a.out
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11~ppa1) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/student/unix/a.out...done.
āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āļ•āļąāđ‰āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡ breakpoint āđāļĨāļ° clear breakpoint āļ‹āļķāđˆāļ‡āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ 2
āđāļšāļšāļ„āļ·āļ­āđāļšāļšāļ—āļĩāđˆ 1 āļŦāļĒāļļāļ”āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļĢāļ°āļšāļļ
break [file_name]:line_number
222
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
clear [file_name]:line_number
āđāļšāļšāļ—āļĩāđˆ 2 āļ„āļ·āļ­āļŦāļĒāļļāļ”āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļĢāļ°āļšāļļ
break [file_name]:func_name
clear [file_name]:func_name
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ
(gdb) break 3
Breakpoint 2 at 0x40059c: file factorial.c, line 3.
(gdb) break 7
Breakpoint 2 at 0x4005c3: file factorial.c, line 7.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040059c in main at factorial.c:3
2 breakpoint keep y 0x00000000004005c3 in main at factorial.c:10
(gdb) run
Starting program: /home/student/unix/a.out
Breakpoint 2, main () at factorial.c:7
7! ! scanf ("%d", &num );
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ print [variables] āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ„āļ”āđ‰
(gdb) print j
$1 = 1
(gdb) s
Enter the number: 3
9! ! for (i=1; i<num; i++)
(gdb) s
10! ! ! j=j*i;
(gdb) s
9! ! for (i=1; i<num; i++)
(gdb) s
10! ! ! j=j*i;
(gdb) print j
$2 = 1
(gdb) print i
$3 = 2
223
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
(gdb) break 10 if j==2
Note: breakpoint 1 also set at pc 0x4005e5.
Breakpoint 3 at 0x4005e5: file factorial.c, line 10.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10
2 breakpoint keep y 0x000000000040059c in main at factorial.c:3
3 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10
! stop only if j==2
(gdb) watch j==3
Hardware watchpoint 2: j == 3
(gdb) disass main
Dump of assembler code for function main:
0x0000000000400594 <+0>:!push %rbp
0x0000000000400595 <+1>:!mov %rsp,%rbp
0x0000000000400598 <+4>:!sub $0x10,%rsp
0x000000000040059c <+8>:!movl$0x0,-0x4(%rbp)
0x00000000004005a3 <+15>:! movl$0x0,-0x8(%rbp)
0x00000000004005aa <+22>:! movl$0x1,-0xc(%rbp)
0x00000000004005b1 <+29>:! mov $0x40070c,%eax
0x00000000004005b6 <+34>:! mov %rax,%rdi
0x00000000004005b9 <+37>:! mov $0x0,%eax
0x00000000004005be <+42>:! callq 0x400478 <printf@plt>
0x00000000004005c3 <+47>:! mov $0x40071f,%eax
0x00000000004005c8 <+52>:! lea -0x8(%rbp),%rdx
0x00000000004005cc <+56>:! mov %rdx,%rsi
0x00000000004005cf <+59>:! mov %rax,%rdi
0x00000000004005d2 <+62>:! mov $0x0,%eax
0x00000000004005d7 <+67>:! callq 0x400498 <__isoc99_scanf@plt>
0x00000000004005dc <+72>:! movl$0x1,-0x4(%rbp)
0x00000000004005e3 <+79>:! jmp 0x4005f3 <main+95>
=> 0x00000000004005e5 <+81>:" mov -0xc(%rbp),%eax
0x00000000004005e8 <+84>:! imul -0x4(%rbp),%eax
0x00000000004005ec <+88>:! mov %eax,-0xc(%rbp)
0x00000000004005ef <+91>:! addl$0x1,-0x4(%rbp)
...
0x0000000000400608 <+116>:! mov %rax,%rdi
0x000000000040060b <+119>:! mov $0x0,%eax
0x0000000000400610 <+124>:! callq 0x400478 <printf@plt>
0x0000000000400615 <+129>:! leaveq
0x0000000000400616 <+130>:! retq
End of assembler dump.
224
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ ddd āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļĩāļšāļąāļāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ‹āļķāđˆāļ‡āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļžāļĢāļēāļ°āļĄāļĩāđ„āļ­āļ„āļ­āļ™āļ—āļĩāđˆ
āļŠāļēāļĄāļēāļĢāļ–āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ gdb āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.13 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ DDD āđāļĨāļ°āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ†
āļāļēāļĢāļ•āļąāđ‰āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡ breakpoint āđāļĨāļ°āļ”āļđāļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
225
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 4.14 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļˆāļļāļ” Break Point
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ (Signal) āđāļšāļšāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļ”āļđāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ āļēāļĐāļēāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āđ„āļ”āđ‰
āđ€āļŠāđˆāļ™āļāļąāļ™
āļĢāļđāļ›āļ—āļĩāđˆ 4.15 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āđāļĨāļ°āļ”āļđāļ āļēāļĐāļēāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰
226
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C++ āļ”āđ‰āļ§āļĒ Qt
āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļĒāļ­āļĄāļĢāļąāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™ cross-platform application framework āļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡
āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ API āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠ
āļžāļĨāļąāļŠ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŦāļĨāļēāļĒāđ†āļ”āđ‰āļēāļ™āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡āļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠāđ€āļ­āļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĨāļ°āđ€āļ—āļĢāļ” āđƒāļŦāđ‰āļĄāļĩ
āļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™ āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡
āļāļąāļ™āđ„āļ›
Qt āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāđāļšāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
āļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ‡āļēāļ™āļ”āđ‰āļēāļ™
āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒ XML āļŦāļĢāļ·āļ­āļ‡āļēāļ™āļ”āđ‰āļēāļ™āđ€āļ§āđŠāļ›āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļē
āļ āļēāļĒāđƒāļ•āđ‰ Qt āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ–āļđāļāļĢāļ­āļ‡āļĢāļąāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļŦāļĨāļēāļĒ
āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS X āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒ āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒāļ‹āļĩāļ­āļĩ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĄāļĩāđ‚āļāđ‰ āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āđ‚āļ„āđ‰āļ”āļ āļēāļĐāļē C++
Core Libraries GUI Libraries
Database
Network
XML
OpenGL
Multimedia
Web Kit
Windows Linux/X11 MacOS X Embedded Linux WinCE
āļĢāļđāļ›āļ—āļĩāđˆ 4.16 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Qt framework
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡ Qt framework āđ‚āļ”āļĒāļŠāļąāđ‰āļ™āļšāļ™āļŠāļļāļ”āļ„āļ·āļ­āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ
āļŠāļąāđ‰āļ™āļĢāļ­āļ‡āļĨāļ‡āļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ Qt classes āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ GUI, Webkit, Database āđāļĨāļ°āļ­āļ·āđˆāļ™āđ† āđāļĨāļ°āļŠāļąāđ‰āļ™
āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ„āļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ QT āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Qt āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē
Qt Installer āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄ Qt Libraries āđāļĨāļ° Qt Creator āļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļąāļ’āļ™āļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
āđāļĨāļ°āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļ”āđ‰āļˆāļēāļ http://qt-project.org/downloads
āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ
227
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux
āļ—āļģāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” Qt source code āļĨāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āđāļ•āļāđ„āļŸāļĨāđŒ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ wget
http://download.qt-project.org/official_releases/qt/4.8/4.8.5/qt-every
where-opensource-src-4.8.5.tar.gz
$ tar -xzvf qt-everywhere-opensource-src-4.8.5.tar.gz
āļāļģāļŦāļ™āļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™ ARM āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļēāļĄāļĨāļģāļ”āļąāļš
$ cd ~/qt-everywhere-opensource-src-4.8.5
$ ./configure -embedded [architecture]
āđ‚āļ”āļĒāļ—āļĩāđˆ:
[architecture] āļ„āļ·āļ­āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ arm, x86 āļŦāļĢāļ·āļ­ mips
āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļīāđ€āļĻāļĐāļ­āļ·āđˆāļ™āđ†āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ./congure āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļŠāļ āļēāļž
āđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ sudo /usr/local/qt-embedded-4.8.5
$ ./configure -prefix /usr/local/qt-embedded-4.8.5 
-embedded -qt-gfx-linuxfb -qt-gfx-qvfb 
-qt-gfx-vnc -no-largefile -exceptions -no-accessibility 
-no-qt3support -qt-zlib -no-gif -no-libtiff 
-qt-libpng -no-libmng -qt-libjpeg 
-no-nis -no-cups -depths 8,16,18,32 
-qt-kbd-tty -qt-kbd-qvfb -qt-kbd-linuxinput 
-qt-mouse-linuxinput -qt-mouse-qvfb -qt-mouse-pc
$ make
āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāđ‰āļ§ āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļīāđˆāļĄāļĨāļ‡āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡
āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ”āļąāļ‡āļ™āļĩāđ‰
-libQtCore.so <--- āđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĨāļąāļ
-libQtGui.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļŠāđˆāļ§āļ™āļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ (GUI)
-libQtNetwork.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
-libQtSql.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQlite
-libQtXml.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒ XML
āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib
āļ‚āļ­āļ‡ root le system āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
228
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ â€œHello World” āļ­āļĒāđˆāļēāļ‡
āļ‡āđˆāļēāļĒ āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰
$ vim main.cpp
// main.cpp
#include<QtCore>
int main(){
	 qDebug() << "Hello Worldn";
}
āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡ 2 āđ„āļŸāļĨāđŒāļ‚āļķāđ‰āļ™āļĄāļē āđ„āļ”āđ‰āđāļāđˆ āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ
Makele āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ qmake -project
āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
######################################################################
# Automatically generated by qmake
######################################################################
 
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
 
# Input
SOURCES += main.cpp
āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Makele āđ‚āļ”āļĒāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ qmake āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđˆāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ
$ qmake
$ cat Makefile
####### Compile
main.o: main.cpp
		 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
####### Install
install: FORCE
uninstall: FORCE
FORCE:
229
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ
$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB
-DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/
include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o
main.o main.cpp
g++ -Wl,-O1 -o qt main.o -L/usr/lib -lQtGui -lQtCore -lpthread
āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ
$ ./qt
Hello World
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (GUI program) āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
Qt Creator āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Text editor āļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ vim qt_gui.cpp
// qt_gui.cpp
#include<QApplication>
#include<QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel* hello = new QLabel("<h1>Hello, World</h1>");
hello->show();
hello->setWindowTitle("Welcome to Embedded System World");
return app.exec();
}
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ Makele āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ qmake -project
$ qmake
āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
$ ls
gui.pro Makefile qt_gui.cpp
$ cat gui.pro
######################################################################
# Automatically generated by qmake (2.01a) Mon Sep 30 23:09:58 2013
######################################################################
TEMPLATE = app
230
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += qt_gui.cpp
$ cat Makefile
#############################################################################
# Makefile for building: gui
# Generated by qmake (2.01a) (Qt 4.6.2) on: Mon Sep 30 23:10:00 2013
# Project: gui.pro
# Template: app
# Command: /usr/bin/qmake -unix -o Makefile gui.pro
#############################################################################
####### Compiler, tools and options
CC = gcc
CXX = g++
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
...
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean:
####### Compile
qt_gui.o: qt_gui.cpp
! $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qt_gui.o qt_gui.cpp
####### Install
install: FORCE
uninstall: FORCE
FORCE:
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ
$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB
-DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/
include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o
qt_gui.o qt_gui.cpp
g++ -Wl,-O1 -o gui qt_gui.o -L/usr/lib -lQtGui -lQtCore -lpthread
231
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Hello World āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ./gui
āļĢāļđāļ›āļ—āļĩāđˆ 4.17 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Hello World
āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ SIGNAL āđāļĨāļ° SLOT
Signals āđāļĨāļ° slots āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ§āļąāļ•āļ–āļļ (object) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ›
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (GUI) āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.18 āļāļĨāđ„āļāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Signals āđāļĨāļ° Slots
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ signals āļāļąāļš slots āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ signals āđāļĨāļ° slots
#include<QApplication>
232
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#include<QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton* hello = new QPushButton("Quit");
hello->resize(150, 75);
QObject::connect(hello, SIGNAL(clicked()), &app, SLOT(quit()));
hello->show();
hello->setWindowTitle("Hi");
return app.exec();
}
āļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ signal āļ‚āļ­āļ‡āļ›āļļāđˆāļĄāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ–āļđāļāļāļ” (clicked()) āđ„āļ›āļĒāļąāļ‡āļ•āļąāļ§ slot āļ—āļĩāđˆ
āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ quit() āļ‹āļķāđˆāļ‡āļ—āļģāļāļēāļĢāļ­āļ­āļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāļāđ‡āļˆāļ°
āļ­āļ­āļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļŠāļąāļ‡āđ€āļāļ•āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰ signal āđāļĨāļ° slot āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰
1. āļŦāļ™āļķāđˆāļ‡ signal āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ„āļ”āđ‰āļŦāļĨāļēāļĒ slots
2. āļŦāļĨāļēāļĒ signals āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļāļąāļš slot āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰
3. āļŠāļēāļĄāļēāļĢāļ–āļĒāļāđ€āļĨāļīāļāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ (connection) āđ„āļ”āđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt Creator
āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Qt Creator āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„āđƒāļŦāļĄāđˆ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ” Qt GUI Application āđāļĨāđ‰āļ§
āđ€āļĨāļ·āļ­āļ Base class āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļš QDialog āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.19 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļŠāđˆāļ§āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āļĨāļēāļŠ
233
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŦāļĨāļąāļ‡āļˆāļēāļāļāļ” Next āđāļĨāđ‰āļ§ Qt Creator āļˆāļ°āđ„āļ”āđ‰āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.20 āđāļŠāļ”āļ‡āđ‚āļ„āđ‰āļ”āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī
āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ dialog.ui āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ UI āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ QPushButton āđāļĨāļ° QLabel āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™
āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.21 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ GUI āļœāđˆāļēāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ Design
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡ āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļ›āļļāđˆāļĄ Count āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ â€œGo to Slot” āļˆāļēāļ
āļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ signal āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ„āļ›āļĒāļąāļ‡ slot āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ clicked() āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK
234
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 4.22 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Signal āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ” Slot āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ
āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ signals āđāļĨāļ° slots āđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ‚āļ”āļĒāļˆāļ°āļ•āļąāđ‰āļ‡
āļŠāļ·āđˆāļ­ slots āđƒāļŦāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē “on_pushButton_clicked” āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 4.23 Method āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĨāļ·āļ­āļ slot
āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ on_pushButton_clicked() āļ”āļąāļ‡āļ™āļĩāđ‰
void Dialog::on_pushButton_clicked()
{
    static int count;
235
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
    count++;
    ui->label->setText(QString::number(count));
}
āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļ”āļ›āļļāđˆāļĄāļĨāļąāļ” Ctrl+R āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ‹āļķāđˆāļ‡
āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Count āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļšāļ§āļāđ€āļĨāļ‚āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ—āļĩāļĨāļ° 1
āļĢāļđāļ›āļ—āļĩāđˆ 4.24 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Count
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āļ™āļąāđ‰āļ™āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļĄāļēāļāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āļ§āļ‡āļāļēāļĢāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āđāļĨāļ°āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļ”āļĩ
āļ‚āļķāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļ āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ”
āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāđ‡āļĒāļąāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ­āļĒāļđāđˆ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļ™ Qt āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđƒāļŦāļĄāđˆ āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ›
āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāđ‚āļĄāļ”āļđāļĨ QtSerialPort āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ Qt5 āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™
āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡ hardware serial ports āđāļĨāļ° virtual serial ports
āļ āļēāļĒāđƒāļ™āđ‚āļĄāļ”āļđāļĨ QtSerialPort āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļ„āļĨāļēāļŠāļŦāļĨāļąāļāđ†āļ„āļ·āļ­ SerialPort āđāļĨāļ° SerialPortInfo
āđ‚āļ”āļĒāļ„āļĨāļēāļŠ SerialPort āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļĩāđ€āļĄāļ—āļ˜āļ­āļ”āļ•āđˆāļēāļ‡āđ† āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ
āļ•āļēāļĢāļēāļ‡ 4.5 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ­āļĢāđŒāļĄāļ­āļ™āļļāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
Windows NT/2K/XP/Vista/7/8 YES Full support
Windows CE YES āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđāļĨāļ° 6 āļšāļ™āļ•āļąāļ§ WinCE Emulator
Gnu/Linux YES Full support
MacOS X YES Full support
236
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
Unix āļ­āļ·āđˆāļ™āđ† YES POSIX-compatible āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
āļŠāļģāļŦāļĢāļąāļšāļ„āļĨāļēāļŠ SerialPortInfo āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ•āļąāļ§āļŠāđˆāļ§āļĒ āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–
āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļŦāļĢāļ·āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ•āļēāļĢāļēāļ‡ 4.6 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SerialPortInfo āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
Windows NT/2K/XP/Vista/7/8 YES Full support āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SetupAPI
Windows CE YES āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđāļĨāļ° 6 āļšāļ™āļ•āļąāļ§ WinCE Emulator
Gnu/Linux YES
Full support āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ libudev āļŦāļĢāļ·āļ­āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰
āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev/ āđ‚āļ”āļĒāļ•āļĢāļ‡
MacOS X YES Full support
Unix āļ­āļ·āđˆāļ™āđ† YES
POSIX-compatible āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰āđƒāļ™
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev/ āđ‚āļ”āļĒāļ•āļĢāļ‡
āđāļ•āđˆāđ‚āļĄāļ”āļđāļĨ QtSerialPort āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰āđāļāđˆ
-āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ‚āļŦāļĄāļ” Terminal, control CR/LF
-āļ•āļąāđ‰āļ‡āļ„āđˆāļē timeouts āđāļĨāļ° delays āļ‚āļ­āļ‡āļāļēāļĢāļ­āđˆāļēāļ™
-āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļĄāļĩāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡ RS-232 āļ‚āļēOUT
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ Qt4/Qt5 āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ git clone git://gitorious.org/qt/qtserialport.git
Initialized empty Git repository in
/home/student/Downloads/qtserialport/.git/
remote: Counting objects: 4482, done.
remote: Compressing objects: 100% (1737/1737), done.
remote: Total 4482 (delta 3158), reused 3764 (delta 2719)
Receiving objects: 100% (4482/4482), 1.22 MiB | 233 KiB/s, done.
Resolving deltas: 100% (3158/3158), done.
237
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ cd qtserialport/
$ qmake qtserialport.pro
$ make
$ sudo make install
āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļ™āļąāđ‰āļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt4 āđāļĨāļ° Qt5 āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ
āļĢāļ°āļšāļļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđƒāļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ qmake
-project āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āļ”āļąāļ‡āļ™āļĩāđ‰
āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt4
CONFIG += serialport
āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt5
QT += serialport
āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ include āđƒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡ Qt4 āđāļĨāļ° Qt5 āļˆāļ°āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™
...
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
...
āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ read-only (r/o), write-only (w/o),
read/write (r/w) āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ āđ‚āļĄāļ”āļđāļĨ QSerialPort āļˆāļ°āđƒāļŠāđ‰āļ„āđˆāļēāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰āļ”āļąāđ‰āļ‡āđ€āļ”āļīāļĄāļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ™āļąāđ‰āļ™
āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ setBaudRate(), setDataBits(), set-
Parity(), setStopBits() āđāļĨāļ° setFlowControl() āļ•āļēāļĄāļĨāļģāļ”āļąāļš
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ /dev/ttyS0
QSerialPort serial;
serial.setPortName("/dev/ttyS0");
serial.setBaudRate(QSerialPort::Baud9600);
if (serial.open(QIODevice::ReadWrite)) {
// to do this
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ„āļĨāļēāļŠ QSerialPortInfo āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ
āļŠāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ™āļąāđ‰āļ™āļ•āđˆāļ­āđ„āļ›āđƒāļŦāđ‰āļ„āļĨāļēāļŠ QSerialPort āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļ•āđˆāļ­āđ„āļ›
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
238
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
QT_USE_NAMESPACE
int main(int argc, char *argv[]) {
	 QCoreApplication a(argc, argv);
	
	 // Example use QSerialPortInfo
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
	 qDebug() << "Name : " << info.portName();
	 qDebug() << "Description : " << info.description();
	 qDebug() << "Manufacturer: " << info.manufacturer();
	
	 // Example use QSerialPort
QSerialPort serial;
serial.setPort(info);
	 if (serial.open(QIODevice::ReadWrite))
	 serial.close();
	 }
	 return a.exec();
}
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāđ‰āļ§āđ€āļžāļīāđˆāļĄāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ qmake -project
$ echo “CONFIG += serialport” >> serial.pro
$ qmake
$ make
g++ -Wl,-O1 -Wl,-rpath,/usr/local/qt-embedded-4.8.5/lib -o serial main.o
-L/usr/local/qt-embedded-4.8.5/lib -lQtSerialPort -lQtGui
-L/usr/local/qt-embedded-4.8.5/lib -lQtNetwork -lQtCore -lpthread
$ ls
main.cpp main.o Makefile serial serial.pro
$ ./serial
Name : "ttyS0"
Description : ""
Manufacturer: ""
Name : "ttyS1"
Description : ""
Manufacturer: ""
239
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš MULTI-THREADING
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļŦāļĨāļēāļĒāļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđ„āļ”āđ‰ (multi-threading) āļ”āļąāļ‡āļ—āļĩāđˆāđ€āļ„āļĒ
āļ­āļ˜āļīāļšāļēāļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C āđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆ
āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C++ āļāļąāļšāļ•āļąāļ§ Qt āļ™āļąāđ‰āļ™ āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ–āđ‰āļēāļ‡āļēāļ™āđ„āļŦāļ™āļ—āļĩāđˆāļĄāļĩāđ‚āļ­āļāļēāļŠ
āļˆāļ°āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ™āļēāļ™ āļāđ‡āļ„āļ§āļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđƒāļŦāđ‰āđ„āļ›āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡āđāļ—āļ™ (background
processing) āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āļāļĢāļ°āļ—āļšāļ•āđˆāļ­āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŠāđˆāļ§āļ™āļāļĢāļēāļŸāļŸāļīāļāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ°
multi-threading āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ™āļģāļĄāļēāđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™ Qt āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ
āđāļĨāļ°āļĒāļąāļ‡āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāđāļšāļš signal āđāļĨāļ° slot āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ„āļ›āļĄāļēāļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđ„āļ”āđ‰
Qt āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ Thread āđ„āļ”āđ‰ 2 āđāļšāļšāđƒāļŦāļāđˆ āļ„āļ·āļ­
1. āđāļšāļš Low Level āļ”āđ‰āļ§āļĒ QThread
āļ„āļĨāļēāļŠ QThread āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš 1 āđ€āļ—āļĢāļ” āļ•āđˆāļ­ 1 QThread āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļˆāļēāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āđāļ•āđˆāļˆāļ°
āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢ implement āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āļ™āļĩāđ‰āļāđˆāļ­āļ™ (::run()) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ writer.h āđāļĨāļ° main.cpp āļ”āļąāļ‡āļ™āļĩāđ‰
$ vim writer.h
// writer.h
#ifndef WRITER_H
#define WRITER_H
#include <QThread>
#include <QString>
#include <iostream>
class Writer: public QThread {
public:
	 explicit Writer(const QString& mark) :
	 	 	 mark_(mark) {
	 }
	 void run();
private:
	 QString mark_;
};
#endif // WRITER_H
void Writer::run() {
	 for (int i = 0; i < 20; ++i) {
	 	 std::cout << qPrintable(mark_);
	 	 msleep(200);
	 }
}
240
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļ™āđ„āļŸāļĨāđŒ main.cpp āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļ›āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āđāļĨāļ°āļˆāļ°āļĄāļĩāļāļēāļĢāļŦāļĒāļļāļ”āđ„āļ›āļŠāļąāđˆāļ§āļ‚āļ“āļ°āļ›āļĢāļ°āļĄāļēāļ“ 200 āļĄāļīāļĨāļĨāļī
āļ§āļīāļ™āļēāļ—āļĩ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ vim main.cpp
// main.cpp
#include <QtCore/QCoreApplication>
#include <QTimer>
#include "writer.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Writer w1("One");
Writer w2("Two");
Writer w3("Three");
w1.start();
w2.start();
w3.start();
w1.wait();
w2.wait();
w3.wait();
QTimer::singleShot(12000, &a, SLOT(quit()));
return a.exec();
}
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ Makele āđ€āļžāļ·āđˆāļ­āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ qmake -project
$ qmake
$ make
$ ./thread
Two Three One Two Three One Two Three One Three Two One Two One Three Two One
Three Three Two One Three One Two Two Three One Two Three One Two Three One
Two One Three Two One Three Two One Three Two One Three One Three Two One
Three Two One Three Two One Three Two One Three Two
2. āđāļšāļš High Level āļ”āđ‰āļ§āļĒ QConcurrent
QtConcurrent āđ€āļ›āđ‡āļ™āļ•āļąāļ§ API āđƒāļ™āļĢāļ°āļ”āļąāļšāļŠāļđāļ‡ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš multi-threading āļšāļ™ Qt
āļ™āļĩāđ‰ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĨāļ‡āļĨāļķāļāđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļˆāļģāļ™āļ§āļ™āđ€āļ—āļĢāļ”
āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒ QtConcurrent āđ„āļ”āđ‰āļĢāļ§āļĄāđ€āļ­āļēāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ„āļ§āđ‰āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰
241
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļąāļšāļ‡āļēāļ™āđāļšāļšāđ„āļĄāđˆāļ•āļĢāļ‡āļˆāļąāļ‡āļŦāļ§āļ°āļāļąāļ™ (asynchronous task) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰
(GUI applications)
QtConcurrent::run() āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ āļēāļĒāđƒāļ™ thread āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ
extern void aFunction();
extern void bFunction();
QFuture<void> future1 = QtConcurrent::run(aFunction);
QFuture<void> future2 = QtConcurrent::run(bFunction);
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļĨāļēāļŠ QFuture āđāļĨāļ° QFutureWatcher āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļ‚āđ‰āļēāđ„āļ›
āđƒāļ™āđ€āļ—āļĢāļ”āđ„āļ”āđ‰āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
#include <QCoreApplication>
#include <qtconcurrentrun.h>
#include <QThread>
#ifndef QT_NO_CONCURRENT
void myRunFunction(QString name) {
	 for (int i = 0; i <= 5; i++) {
	 	 qDebug() << name << " " << i << "from" << QThread::currentThread();
	 }
}
int main(int argc, char *argv[]) {
	 QCoreApplication a(argc, argv);
	 QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));
	 QFuture<void> t2 = QtConcurrent::run(myRunFunction, QString("B"));
	 QFuture<void> t3 = QtConcurrent::run(myRunFunction, QString("C"));
	 t1.waitForFinished();
	 t2.waitForFinished();
	 t3.waitForFinished();
	 return a.exec();
}
#else
#include <QLabel>
int main(int argc, char *argv[])
{
	 QApplication app(argc, argv);
	 QString text("Qt Concurrent is not yet supported on this platform");
	 QLabel *label = new QLabel(text);
	 label->setWordWrap(true);
	 label->show();
242
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
qDebug() << text;
	 app.exec();
}
#endif
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāđ‰āļ§āđ€āļžāļīāđˆāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ concurrent āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ qmake -project
$ echo “CONFIG += concurrent” >> qtconcurrent.pro
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ multi-threading āļ”āļąāļ‡āļ„āļģ
āļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ qmake
$ make
$ ls
main.cpp main.o Makefile qtconcurrent qtconcurrent.pro
$ ./qtconcurrent
"B" 0 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 1 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 2 from QThread(0x128d1c0, name = "Thread (pooled)")
"A" 0 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 1 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 2 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 3 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 4 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 5 from QThread(0x128cb10, name = "Thread (pooled)")
"B" 3 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 4 from QThread(0x128d1c0, name = "Thread (pooled)")
"C" 0 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 1 from QThread(0x128cb10, name = "Thread (pooled)")
"B" 5 from QThread(0x128d1c0, name = "Thread (pooled)")
"C" 2 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 3 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 4 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 5 from QThread(0x128cb10, name = "Thread (pooled)")
243
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 5 āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļ
āļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļ›āļĢāļ°āļ§āļąāļ•āļīāļĻāļēāļŠāļ•āļĢāđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2002 āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āļāđˆāļ­āļ•āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđ
āđ€āļāļīāļĨāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ„āļ·āļ­ Larry Page āđāļĨāļ° Sergey Brin āđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļŸāļąāļ‡āļŠāļąāļĄāļ™āļē āļ“ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļŠāđāļ•āļ™āļŸāļ­āļĢāđŒāļ” (Stan-
ford University) āđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ â€œSideKick Phone” āļ™āļģāđ€āļŠāļ™āļ­āđ‚āļ”āļĒāļ™āļēāļĒ
Andy Rubin āļ‹āļķāđˆāļ‡āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āļģāļĢāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‹āļĩāļ­āļĩāđ‚āļ­ (CEO) āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Danger Inc. āđ€āļ‚āļēāđ„āļ”āđ‰āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–
āļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļŠāļ·āđˆāļ­āļ§āđˆāļē SideKick Phone āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ•āļąāļ§āđāļĢāļāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
āļœāđˆāļēāļ™āļĢāļ°āļšāļšāļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ• (Internet) āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Instant
Messenger), āļ­āļĩāđ€āļĄāļĨāđŒ (Mail), āļ•āļēāļĢāļēāļ‡āļ›āļāļīāļ—āļīāļ™ (Calendar), āđāļĨāļ°āļāļēāļĢāļ—āđˆāļ­āļ‡āđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒ (Browser) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢ
āļ•āļąāđ‰āļ‡āļŦāļ™āđ‰āļēāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļŦāļĨāļąāļ (Search Engine default) āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Google search āļāđ‡āļĒāļīāđˆāļ‡āļ—āļģāđƒāļŦāđ‰ Larry Page āđ€āļāļīāļ”
āļ„āļ§āļēāļĄāļ›āļĢāļ°āļ—āļąāļšāđƒāļˆāđāļĨāļ°āđ„āļ”āđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļœāļđāđ‰āđƒāļŠāđ‰ Sidekick Phone
āđāļĄāđ‰āļ§āđˆāļēāļ•āļąāļ§ Sidekick Phone āļˆāļ°āđ€āļ›āđ‡āļ™āļĄāļ·āļ­āļ–āļ·āļ­āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ‚āļ”āļ”āđ€āļ”āđˆāļ™āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđˆāļēāļ‡āļĢāļđāđ‰āļŠāļķāļāļ•āļ·āđˆāļ™āđ€āļ•āđ‰āļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒ
āļāđ‡āļ•āļēāļĄāļ—āļĩ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđƒāļŦāđ‰āđ€āļāļīāļ”āļœāļĨāļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ—āļĩāđˆāļ„āļ§āļĢāļˆāļ°āđ€āļ›āđ‡āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰ Andy Rubin
āļ–āļđāļāļšāļĩāļšāđƒāļŦāđ‰āļ­āļ­āļāļˆāļēāļāļšāļĢāļīāļĐāļąāļ— Danger Inc. āđƒāļ™āļŠāđˆāļ§āļ‡āļ•āđ‰āļ™āļ›āļĩ āļ„.āļĻ. 2003 āļŦāļĨāļąāļ‡āļˆāļēāļāļŦāļ™āļķāđˆāļ‡āļ›āļĩāļœāđˆāļēāļ™āđ„āļ› Andy Rubin
āļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ‡āļīāļ™āļāđ‰āļ­āļ™āļŦāļ™āļķāđˆāļ‡ āđ€āļ‚āļēāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāļ„āļ§āļēāļĄāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ™āļ§āļ„āļīāļ”āđƒāļŦāļĄāđˆ
āļŠāļģāļŦāļĢāļąāļšāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆ (Mobile Operating System) āđ€āļ‚āļēāļˆāļķāļ‡āļ—āļģāļāļēāļĢāļˆāļ”āđ‚āļ”āđ€āļĄāļ™āđƒāļŦāļĄāđˆāđƒāļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē
Android.com āļžāļĢāđ‰āļ­āļĄāļāļąāļšāļāđˆāļ­āļ•āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āđƒāļŦāļĄāđˆāđƒāļ™āļŠāļ·āđˆāļ­āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ§āđˆāļē Android Inc. āđāļĨāļ°āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļē Open
Mobile handset platform āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ” (Open Operating System)
āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļœāļĨāļīāļ•āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ•āļ™āđ„āļ”āđ‰
āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļĢāļ°āļĄāļēāļ“āđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ āļ›āļĩ āļ„.āļĻ. 2005 āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļ‚āļ­āđ€āļˆāļĢāļˆāļēāļāļąāļš Andy Rubin āđ€āļžāļ·āđˆāļ­
āļ‚āļ­āđ€āļ‚āđ‰āļēāļ‹āļ·āđ‰āļ­āļāļīāļˆāļāļēāļĢāļšāļĢāļīāļĐāļąāļ—āļ‚āļ­āļ‡āđ€āļ‚āļēāļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļšāļĢāļĢāļĨāļļāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļĢāđˆāļ§āļĄāļāļąāļ™āļ”āđ‰āļ§āļĒāļĄāļđāļĨāļ„āđˆāļēāļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļ–āļđāļāđ€āļ›āļīāļ”āđ€āļœāļĒāļ•āđˆāļ­
āļŠāļēāļ˜āļēāļĢāļ“āļ°āļŠāļ™ āđāļĨāļ°āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĨāļēāļĒāļ›āļĩ āļ„.āļĻ. 2007 āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļ›āļĢāļ°āļāļēāļĻāđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ€āļ›āđ‡āļ™
āļŠāļĄāļēāļŠāļīāļāđƒāļ™ Open Handset Alliance (OHA) āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ”āļŠāļģāļŦāļĢāļąāļšāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ
āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāđƒāļ™āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android Operating System) āļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢ āđāļĨāļ°āļ•āđˆāļ­
āļĄāļēāđƒāļ™āđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ āļ›āļĩ āļ„.āļĻ. 2008 āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āļ›āļĨāđˆāļ­āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 1.0 āđ‚āļ”āļĒ
āđƒāļŠāđ‰āļŠāļ·āđˆāļ­āļĢāļŦāļąāļŠ (Codename) āļ§āđˆāļē Astro āļ•āđˆāļ­āļŠāļēāļ˜āļēāļĢāļ“āļ°āļŠāļ™āđ€āļ›āđ‡āļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ āđāļĨāļ°āļāđ‡āđ„āļ”āđ‰āļ›āļĨāđˆāļ­āļĒāļĢāļļāđˆāļ™āļ•āđˆāļēāļ‡āđ†āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļ™
āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
244
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
1.5
Cupcake
1.6
Donut
2.0/2.1
Eclair
2.2
Froyo
2.3
Gingerbread
3.0/3.1
Honeycomb
4.0
Icecream Sandwich
4.1/4.2/4.3
Jelly Bean
4.4
KitKat
āļĢāļđāļ›āļ—āļĩāđˆ 5.1 āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļ•āļēāļĢāļēāļ‡ 5.1 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļŠāļ·āđˆāļ­āđ‚āļ„āđ‰āļ” āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­ āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļģāļ„āļąāļ KERNEL SDK API NDK API
āđ„āļĄāđˆāļĢāļ°āļšāļļ 1.0 āļāļąāļ™āļĒāļēāļĒāļ™ 2551 2.6.25 1 N/A
Petit Four 1.1 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2552 2.6.25 2 N/A
Cupcake 1.5 āđ€āļĄāļĐāļēāļĒāļ™ 2552
- Onscreen soft keyboard
- āļŦāļ™āđ‰āļēāļˆāļ­āļŦāļĄāļļāļ™āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī
2.6.27 3 1
Donut 1.6 āļāļąāļ™āļĒāļēāļĒāļ™ 2552
- āļĄāļĩāļŠāļ–āļēāļ™āļ°āļāļēāļĢāđƒāļŠāđ‰āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ
- āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ VPN
2.6.27 4 2
Eclair
2.0 āļ•āļļāļĨāļēāļ„āļĄ 2552
- āļĄāļĩ Live Wallpaper
- āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange
2.6.29 5 2
Eclair 2.0.1 āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2552
- āļĄāļĩ Live Wallpaper
- āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange
2.6.29 6 2Eclair
2.1 āļĄāļāļĢāļēāļ„āļĄ 2553
- āļĄāļĩ Live Wallpaper
- āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange
2.6.29 7 3
Froyo 2.2 āļžāļĪāļĐāļ āļēāļ„āļĄ 2553
- āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ WiFi Hotspot
- Just In Time Compile
- āļāļģāđ€āļ™āļīāļ” Nexus One
2.6.32 8 4
Ginger-
bread
2.3 - 2.3.2 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2553
- āļĢāļ­āļ‡āļĢāļąāļš NFC āđāļĨāļ° SIP
- āļĄāļĩāļ•āļąāļ§ Download Manager
- āļāļģāđ€āļ™āļīāļ” Nexus S
2.6.35 9 5Ginger-
bread
2.3.3 - 2.3.7 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2554 - āļĢāļ­āļ‡āļĢāļąāļš ADK 2.6.35 10 5
Honey-
comb
3.0 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2554
- āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļšāļ™āđāļ—āđŠāļ›āđ€āļĨāđŠāļ•
- āļĢāļ­āļ‡āļĢāļąāļš Multi-core CPU
2.6.36 11 6
Honey-
comb 3.1.x āļžāļĪāļĐāļ āļēāļ„āļĄ 2554 - āļĢāļ­āļ‡āļĢāļąāļš USB Host āđāļĨāļ°āļĄāļĩ APIs 2.6.36 12 6
Honey-
comb
3.2.x āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2554 2.6.36 13 6
245
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļ·āđˆāļ­āđ‚āļ„āđ‰āļ” āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­ āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļģāļ„āļąāļ KERNEL SDK API NDK API
Ice-Cream
Sandwich
4.0 - 4.0.2 āļ•āļļāļĨāļēāļ„āļĄ 2554
- āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļšāļ™āļĄāļ·āļ­āļ–āļ·āļ­āđāļĨāļ°āđāļ—āđŠāļ›āđ€āļĨāđ‡āļ•
- āļāļģāđ€āļ™āļīāļ” Galaxy Nexus
3.0.1 14 7
Ice-Cream
Sandwich
4.0.3 - 4.0.4 āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2554
- āļāļģāđ€āļ™āļīāļ” WiFi Direct āđāļĨāļ° Android Beam
- āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ– Face Unlock
3.0.1 15 7
Jelly Bean
4.1.1 - 4.1.2 āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2555 - āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ‚āļ”āļĒāļĢāļ§āļĄāļĄāļēāļāļ‚āļķāđ‰āļ™ 3.0.31 16 8
Jelly Bean
4.2 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2555 - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļšāļš Multi-user 3.0.31 17 8
Jelly Bean
4.3 āļāļĢāļāļāļēāļ„āļĄ 2556
- āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ Low Power Bluetooth
- āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļĢāļ°āļ”āļąāļš 4K
3.4.5 18 9
KitKat 4.4 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2556
- āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™āđ€āļāđˆāļē (RAM >512MB)
- āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāļ™āļąāļšāļāđ‰āļēāļ§āđ€āļ”āļīāļ™
- āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļŠāđˆāļ‡ Infrared Remote
3.4.5 19 9
āļ”āđ‰āļ§āļĒāļ„āļ§āļēāļĄāļĢāđˆāļ§āļĄāļĄāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāļĄāļ”āļđāđāļĨāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ—āļĩāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļāļđāđ€āļāļīāļĨ āļāđ‡āđ„āļ”āđ‰āļ—āļģāđƒāļŦāđ‰āđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĩ āļ„.āļĻ. 2011
āļ–āļķāļ‡ āļ„.āļĻ. 2012 āđ€āļāļīāļ”āđ‚āļ„āļĢāļ‡āļāļēāļĢ Android Mainlining Project āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ„āļ·āļ­āļāļēāļĢāļĢāļ§āļĄ
āđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android drivers) āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļēāļ‡āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ
āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.3 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ§āļĄāļāļąāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļ™
āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.5
āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļāļ™āļāļĨāļēāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē
(Mobile Environment) āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļāļēāļĢ
āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (InterProcess Communication - IPC) āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ
āļˆāļģāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŠāđ‰āļ‡āļēāļ™ āđāļĨāļ°āđāļāđ‰āļ›āļąāļāļŦāļēāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
āļŦāļĨāļąāļāđ†āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļĨāļ°āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡
āļĨāđˆāļēāļ‡
āļ•āļēāļĢāļēāļ‡ 5.2 āļāļēāļĢāļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļĢāļ·āđˆāļ­āļ‡ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
Binder
āļāļĨāđ„āļāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (An-
droid's IPC mechanism) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāļ„ Open Binder
Ashmem
āļĒāđˆāļ­āļĄāļēāļˆāļēāļ Anonymous Shared Memory āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆ āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰
āļĢāđˆāļ§āļĄāļāļąāļ™āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (Shared memory allocator) āđ‚āļ”āļĒāļˆāļ°āļ–āļ­āļ”
āļŠāđˆāļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāđ„āļ§āđ‰ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļĢāļīāđˆāļĄāļ§āļīāļāļĪāļ•āļī
Logger āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user space)
246
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĢāļ·āđˆāļ­āļ‡ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ
Wakelocks
āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ (suspend) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļ™āđ‰āļ­āļĒ
āļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļžāļąāļšāļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ›āļīāļ”
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ” suspend āđāļ•āđˆ Wakelocks āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ”āļąāļšāļŦāļ™āđ‰āļēāļˆāļ­
(Screen Turn-Off) āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđˆāļ­āļāđ‡āđ€āļžāļĩāļĒāļ‡āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļāļĨāļąāļšāļĄāļē (Screen
Turn-On) āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ”āļąāļš
OOM
āļĒāđˆāļ­āļĄāļēāļˆāļēāļ Out Of Memory handler āļ„āļ·āļ­āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ
āļˆāļģāđ€āļ•āđ‡āļĄāđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļēāļ“ Triggers āļāđˆāļ­āļ™āļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰ Kernel āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ
Alarm
āļ•āļąāļ§āļ™āļąāļšāļŦāļ™āđˆāļ§āļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ (Android's alarm timer) āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļē
āļˆāļēāļāļ•āļąāļ§āļ™āļēāļŽāļīāļāļē RTC (Real-time Clock) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ
RAM console
āļ•āļąāļ§āđāļŠāļ”āļ‡āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Kernel āļ āļēāļĒāđƒāļ™ āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ
/proc/last_kmsg
āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ‚āļ”āļĒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļąāđˆāļ§āđ„āļ›āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ„āļĨāđ‰āļēāļĒāļ„āļĨāļķāļ‡āļāļąāļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāđ†āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ­āļ­āļāđ„āļ›āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ
āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆāļĄāļĩāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāļāļģāļˆāļąāļ”āđāļĨāļ°āļžāļĪāļ•āļīāļāļĢāļĢāļĄ
āļāļēāļĢāđƒāļŠāđ‰āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļšāļšāļ•āļąāđ‰āļ‡āđ‚āļ•āđŠāļ° āļ”āļąāļ‡āļĢāļđāļ›āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡
Application Application Application
Application Application Application
Library
Framework & VM
middleware & Library
Kernel Kernel
scheduler scheduler
Linux Android
āļĢāļđāļ›āļ—āļĩāđˆ 5.2 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļĨāļ°āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
247
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
Launcher2 Phone AlarmClock
Email Settings Camera
Gallery Calendar Browser
Bluetooth Contacts ...
āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
Power Manager Mount Service
Activity Manager Notication Manager
Package Manager Location Manager
Battery Service Search Service ....
android.*
Libs
Bionic / OpenGL / WebKit / ...
Init / Toolbox Native Daenons Hardware Support
āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ (āļžāļąāļ’āļ™āļē/āļˆāļēāļ Play Store)
java.*
(Apache Harmony)
Android Runtime / Dalvik / Zygote
Linux Kernel
Wakelocks / lowmem / binder / ashmem / ...
App API
Java Native
Interface
Binder
āļĢāļđāļ›āļ—āļĩāđˆ 5.3 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļšāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ†āļ—āļĩāđˆāļĄāļĩ
āļ„āļ§āļēāļĄāđ€āļāļĩāđˆāļĒāļ§āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™ āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āļšāļ™āļŠāļļāļ”āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđ‚āļ”āļĒāļ•āļĢāļ‡āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
(Applications) āđāļĨāļ°āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļĨāļ‡āļĄāļēāļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļˆāļ™āļ–āļķāļ‡āļŠāļąāđ‰āļ™āļĨāđˆāļēāļ‡
āļŠāļļāļ”āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ‚āļ”āļĒāļœāđˆāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ‹āļķāđˆāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ
āļˆāļ°āļ­āļ˜āļīāļšāļēāļĒāļ”āļąāļ‡āļ™āļĩāđ‰
â€Ē Applications  āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĢāļ·āļ­āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™
āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āđ‚āļ”āļĒāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļ‹āļķāđˆāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°
āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ­āļēāđ„āļ§āđ‰
â€Ē Application Framework āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰
āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ—āļģāļāļēāļĢāļĻāļķāļāļĐāļēāļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Ap-
plication Framework āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āļ‹āļķāđˆāļ‡āļĄāļĩāļŦāļĨāļēāļĒāļāļĨāļļāđˆāļĄāļ”āđ‰āļ§āļĒāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™
o Activities Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ§āļ‡āļˆāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄ (Activity)
o Content Providers āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđāļĨāļ°
āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ›āļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰
o View System āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāđāļŠāļ”āļ‡āļœāļĨ
āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ (User Interface)
248
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
o Telephony Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļēāļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļŠāđˆāļ™
āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
o Resource Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ, āļĢāļđāļ›āļ āļēāļž
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
o Location Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļēāļ‡āļ āļđāļĄāļīāļĻāļēāļ•āļĢāđŒ āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāđ„āļ”āđ‰āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒ
o Notication Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡
āļœāļĨāđƒāļŦāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ āļœāđˆāļēāļ™āļ—āļēāļ‡āđāļ–āļšāļŠāļ–āļēāļ™āļ°(Status Bar) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­
â€Ē Libraries  āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C/C++ āđ‚āļ”āļĒāđāļšāđˆāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ•āļēāļĄ
āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™ Surface Manage āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ, Media Frame-
work āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļāļēāļĢāđāļŠāļ”āļ‡āļ āļēāļžāđāļĨāļ°āđ€āļŠāļĩāļĒāļ‡, Open GL | ES āđāļĨāļ° SGL āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ āļēāļž
3āļĄāļīāļ•āļī āđāļĨāļ° 2āļĄāļīāļ•āļī, SQLite āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē Android Runtime āļˆāļ°āļĄāļĩ Dalvik Virtual Machine āļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆ
āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory), āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđāļĨāļ°āļžāļĨāļąāļ‡āļ‡āļēāļ™ (Battery)āļ—āļĩāđˆāļˆāļģāļāļąāļ” āļ‹āļķāđˆāļ‡āļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Dalvik Virtual Machine āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ„āļ›āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .DEX āļāđˆāļ­āļ™
āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ€āļŦāļ•āļļāļœāļĨāļāđ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§
āđ„āļĄāđˆāļĄāļēāļ āļŠāđˆāļ§āļ™āļ•āđˆāļ­āļĄāļēāļ„āļ·āļ­ Core Libraries āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļĢāļ§āļšāļĢāļ§āļĄāļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļ„āļąāļāđ†āļ‹āļķāđˆāļ‡āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ”āđ‰āļ§āļĒ
āļ āļēāļĐāļēāļˆāļēāļ§āļē (Java Language)
â€Ē Linux Kernel  āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļąāļ§āđƒāļˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļąāļšāļšāļĢāļīāļāļēāļĢāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđ€āļŠāđˆāļ™ āđ€āļĢāļ·āđˆāļ­āļ‡
āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļĨāļąāļ‡āļ‡āļēāļ™ āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ† āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ‚āļ”āļĒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰
āļ™āļģāđ€āļ­āļēāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļĄāļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 2.6 (Kernel 2.6.24) āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļ–āđ‰āļē
āļˆāļ°āļ™āļģ vanilla kernel āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāļ‡āđˆāļēāļĒāļ™āļąāļ
āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āđāļĨāļ°āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļžāļ·āđ‰āļ™āļāļēāļ™
āļ āļēāļĒāđƒāļ•āđ‰āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļŠāļ·āđˆāļ­āļ§āđˆāļē AOSP (Android Open Source Project) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđāļ™āļ§āļ—āļēāļ‡āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļŠāļ°āļ”āļ§āļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™
249
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android
āđ€āļĄāļ·āđˆāļ­āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļ™āļ§āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āđ€āļŠāļīāļ‡āļĨāļķāļāļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡
āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ„āļ”āđ‰ 4 āļāļĨāļļāđˆāļĄāđ„āļ”āđ‰āđāļāđˆ
āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (Application Developers)
Application Framework
Linux Kernel
Applications
Surface
Manager
Dalvik VM
Media
Manager
Shared
Libraries
āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
System Image
āđ€āļ™āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē
(Android JAVA) āđāļĨāļ° āļ āļēāļĐāļēāļ‹āļĩ (Native C lan-
guage) āđƒāļ™āļĢāļ°āļ”āļąāļš Application Layer āđ€āļŠāđˆāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āđ€āļāļĄāļŠāđŒ āļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒ
āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ˜āļļāļĢāļāļīāļˆāļāļēāļĢāđ€āļ‡āļīāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (Platform Developers)
Application Framework
Linux Kernel
Applications
Surface
Manager
Dalvik VM
Media
Manager
Shared
Libraries
Rebuild āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™
āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Application
Framework āđ€āļŠāđˆāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļāļēāļĢ
āđāļŠāļ”āļ‡ UI āļžāļīāđ€āļĻāļĐ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđāļšāļšāļŠāļ­āļ‡āļŦāļ™āđ‰āļēāļžāļĢāđ‰āļ­āļĄ
āļāļąāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ ROMs
āđ€āļŠāđˆāļ™ CyanogenMod āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
250
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ™āļąāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (Android Porting)
Application Framework
Linux Kernel
Applications
Surface
Manager
Dalvik VM
Media
Manager
Shared
Libraries
āļāļēāļĢ Porting
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļ™āđ‰āļ™āļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢ Porting āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļļāđˆāļ™
āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļ·āđˆāļ™
āđ€āļŠāđˆāļ™ MIPS, Intel x86 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŦāļĢāļ·āļ­āđ„āļ›āļ­āļĒāļđāđˆāļšāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Netbook (EeePC) āļŦāļĢāļ·āļ­ Virtual Ma-
chine (VMWare, Virtual Box, GenyMotion
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™)
āļ™āļąāļāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (Hardware Developers)
Application Framework
Linux Kernel
Applications
Surface
Manager
Dalvik VM
Media
Manager
Shared
Libraries
āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļ›āļĢāļąāļšāđāļ•āđˆāļ‡
Kernel
āđ€āļ™āđ‰āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŠāļģāļŦāļĢāļąāļš
āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top-
box, Android USB Stick, āļ•āļđāđ‰ Kiosk āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđ‚āļ”āļĒāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰
āļĢāļ­āļ‡āļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļžāđˆāļ§āļ‡āļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāļ°
āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš, Launcher UI āļŦāļĢāļ·āļ­
āļāļēāļĢāđ€āļĨāđˆāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒāđāļšāļšāļžāļīāđ€āļĻāļĐ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
251
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android
āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āļšāļĢāļīāļāļēāļĢāļĢāļ°āļšāļš
Power Manager Mount Service
Activity Manager Notication Manager
Package Manager Location Manager
Battery Service Search Service ....
Media Server
Media WebKit Fresstype SQLite
Home Dialer Camera Media Player Settings ...
Service Manager
Network Manager
...
Skia Input ALSA ...
Core Libraries
Dalvik VM
Audio Camera
Radio
(RIL)
GPS ...Sensors NFS
Audio WiFi Camera Display ...Bimder Logger
Applications
Application
Frameworks
Libraries &
Runtimes
Hardware
Abstraction
Layer
Linux
Kernel
āļĢāļđāļ›āļ—āļĩāđˆ 5.4 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĻāļķāļāļĐāļēāđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ„āļ·āļ­
Ubuntu LTS (Long Term Support) āļĢāļļāđˆāļ™ 10.04 āļŦāļĢāļ·āļ­ Ubuntu LTS āļĢāļļāđˆāļ™ 12.04 āļ‹āļķāđˆāļ‡āļ—āļēāļ‡āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§
āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļļāđˆāļ™āļ•āđˆāļēāļ‡āđ†āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļĢāļļāđˆāļ™ Android Gingerbread (2.3.x)
āļ‚āļķāđ‰āļ™āđ„āļ›āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļš 64 āļšāļīāļ•āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļžāļ·āđ‰āļ™
āļāļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļāđ‡āļ„āļ§āļĢāļˆāļ°āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 8GB (āđāļ™āļ°āļ™āļģāļ­āļĒāļđāđˆāļ—āļĩāđˆ 16GB) āđāļĨāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ„āļ§āļēāļĄāļˆāļļ
āļ§āđˆāļēāļ‡āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 30GB āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Android IceScream Sandwich (ICS) āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 25GB
āļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļķāđˆāļ‡āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ āđƒāļ™āļāļĢāļ“āļĩāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ—āļļāļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ AOSP āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 80GB āļŠāļģāļŦāļĢāļąāļš
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ„āļ› āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ Python āļĢāļļāđˆāļ™ 2.6 - 2.7
â€Ēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ GNU Make āļĢāļļāđˆāļ™ 3.81 - 3.82
â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ JDK āļĢāļļāđˆāļ™ 6 āļŠāļģāļŦāļĢāļąāļš Android Gingerbread āļ‚āļķāđ‰āļ™āđ„āļ› āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ Android Froyo āļ•āđˆāļģāļĨāļ‡
āļĄāļē āļˆāļ°āļ•āđ‰āļ­āļ‡āļĨāļ‡ JDK āļĢāļļāđˆāļ™ 5 (fromjava.sun.com)
â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ Git āļĢāļļāđˆāļ™ 1.7 āļ‚āļķāđ‰āļ™āđ„āļ› (git-scm.com)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ JDK āļĢāļļāđˆāļ™ 6 āļŠāļģāļŦāļĢāļąāļš Gingerbread āļ‚āļķāđ‰āļ™āđ„āļ› āđāļĨāļ° JDK āļĢāļļāđˆāļ™ 5 āļŠāļģāļŦāļĢāļąāļš Froyo āļ•āđˆāļģāļĨāļ‡āļĄāļē
252
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid part-
ner"
$ sudo apt-get update
$ sudo apt-get install openjdk-6-jre
āļŦāļĢāļ·āļ­
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy
main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-
updates main multiverse"
$ sudo apt-get update
$ sudo apt-get install openjdk-6-jre
āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 64-bit Ubuntu LTS 10.04
$ sudo apt-get install git-core gnupg flex bison gperf build-essential 
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs 
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev 
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown 
  libxml2-utils xsltproc
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 64-bit Ubuntu LTS 12.04
$ sudo apt-get install git gnupg flex bison gperf build-essential 
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev 
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 
libgl1-mesa-dev g++-multilib mingw32 tofrodos 
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1
/usr/lib/i386-linux-gnu/libGL.so
253
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Android Open Source Project (AOSP)
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠ AOSP
āđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ repo āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ Git
Wrapper script āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļĨāļ°āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ‚āļ”āļĒāļ›āļāļ•āļī
āđāļĨāđ‰āļ§āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļĄāđˆāļ•āđˆāļģāļāļ§āđˆāļē 20GB āđāļĨāļ°āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ›āļĢāļ°āļĄāļēāļ“
3-6 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡ āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ™āļąāđ‰āļ™āđ†
āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” AOSP
$ mkdir ~/bin
$ export PATH=$PATH:~/bin
$ sudo apt-get install curl
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 22889 100 22889 0 0 50164 0 --:--:-- --:--:-- --:--:-- 111k
$ chmod a+x ~/bin/repo
āđ„āļŸāļĨāđŒ manifest āļˆāļ°āđ€āļāđ‡āļšāļĨāļīāļ‡āļ„āđŒāđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđāļŠāļ”āļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ XML āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ•āļēāļĢāļēāļ‡ 5.3 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ XML āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡ AOSP
āļŠāļ·āđˆāļ­ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
name āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāļ„ āļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāđ‚āļ„āđ‰āļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
fetch Server URL
revision git branch
remote āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” server
path āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļˆāļēāļāļāļēāļĢ unpack
project āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļ„
254
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” AOSP āļĢāļļāđˆāļ™āļĨāđˆāļēāļŠāļļāļ” āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
$ repo init -u https://android.googlesource.com/platform/manifest
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļĢāļļāđˆāļ™ āđ€āļŠāđˆāļ™ āļĢāļļāđˆāļ™ 4.0.1_r1 āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ option -b āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ repo init -u https://android.googlesource.com/platform/manifest -b
android-4.0.1_r1
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āđāļ™āļ§āļ„āļīāļ”āļ‚āļ­āļ‡ AOSP āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļ›āļĨāđˆāļ­āļĒāđ‚āļ„āđ‰āļ”āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™
āļĢāļđāļ›āļ—āļĩāđˆ 5.5 āđāļŠāļ”āļ‡āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ­āļ­āļāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ„āđ‰āļ” AOSP āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 3-5
āļ‚āļąāđˆāļ§āđ‚āļĄāļ‡
$ mkdir ~/aosp
$ cd ~/aosp
$ repo sync
255
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™ AOSP
āđ€āļĄāļ·āđˆāļ­āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™ āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp āļˆāļ°āļĄāļĩāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ†āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē
35,000 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāļģāļŦāļĢāļąāļšāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļ„āļąāļāđ†āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āđ„āļ”āđ‰āđāļāđˆ
āļ•āļēāļĢāļēāļ‡ 5.4 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ AOSP
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
abi āļšāļĢāļĢāļˆāļļ Minimal C++ Run-time Type information
bionic āđ„āļĨāļšāļĢāļēāļĢāļĩāļ āļēāļĐāļē C āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
bootable āļšāļĢāļĢāļˆāļļāđ‚āļ„āđ‰āļ”āļŠāļģāļŦāļĢāļąāļš Bootloader āđāļĨāļ° Recovery
build āļšāļĢāļĢāļˆāļļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ framework āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ AOSP
cts āļŠāļļāļ” Test Suite āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
dalvik āļšāļĢāļĢāļˆāļļāļ•āļąāļ§ Dalvik Virtual Machine
development āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļ•āđˆāļēāļ‡āđ†
device āļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒ conguration āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļœāļđāđ‰āļ‚āļēāļĒāļ•āļąāļ§ System-on-Chip
external āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāļ™āļ­āļāļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™ AOSP
frameworks Android core application framework
hardware āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (HAL)
kernel Linux Kernel
libcore
āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Apache Harmony āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļˆāļēāļ§āļēāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™
Dalvik
ndk Native Development Kit
packages āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ AOSP
prebuilt āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Toolchain āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›
sdk Android's Software Development Kit
system
āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļŦāļĨāļąāļāđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļŠāđˆāļ™ init, toolbox,
adb
tools āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™
āđ€āļĄāļ·āđˆāļ­āļ„āļīāļ”āđ€āļ›āđ‡āļ™āļŠāļąāļ”āļŠāđˆāļ§āļ™āđ€āļ›āļ­āļĢāđŒāđ€āļ‹āđ‡āļ™āļ•āđŒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļ‚āļ™āļēāļ”āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļ§āļ‡āļāļĨāļĄāđ„āļ”āđ‰āļ”āļąāļ‡āļĢāļđāļ›
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
256
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 5.6 āđāļŠāļ”āļ‡āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ AOSP
Stock Android Apps
packages/
android.*
frameworks/base/core/
System Services
frameworks/base/services/,
frameworks/base/media/,
java.*
(Apache Harmony)
libcore/
Linux Kernel
āđ„āļĄāđˆāļĄāļĩ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ Kernel āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđˆ AOSP
Libraries
bionic/, external/,
frameworks/base/
App API
āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļˆāļēāļ Play Store
HAL
hardware/, device/
Native Daemons
system/, external,
frameworks/base/cmds/
Init / Toolbox
system/core/
Binder
JNI
āļĢāļđāļ›āļ—āļĩāđˆ 5.7 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
bionic
0.3%
cts
2.3%
dalvik
0.7%
development
1.5%
device
0.7%
external
26.9%
frameworks
19.4%
hardware
0.9%
libcore
0.7%
ndk
0.5%
packages
4.7%
prebuilts
40.2%
sdk
0.9%
others
0.3%
257
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļīāļ—āļ˜āļīāđŒāļ­āļ™āļļāļāļēāļ• (License) āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āļ āļēāļĒāđƒāļ™ AOSP āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡āļ­āļĒāļđāđˆāđ„āļ”āđ‰ 4
āļāļĨāļļāđˆāļĄ āđ„āļ”āđ‰āđāļāđˆ
â€ĒāļŠāđˆāļ§āļ™ Kernel āļˆāļ°āļĄāļĩ GNU GPLv2/GPLv3 license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡
â€ĒāļŠāđˆāļ§āļ™ external libraries āļˆāļ°āļĄāļĩ LGPL āđāļĨāļ° GPL license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡
â€ĒāļŠāđˆāļ§āļ™ bionic āđāļĨāļ° toolbox āļˆāļ°āļĄāļĩ BSD license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡
â€ĒāļŠāđˆāļ§āļ™ framework āļˆāļ°āļĄāļĩ Apache 2.0 license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡
Android Kernel
āđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡ Android Kernel patches āđ„āļĄāđˆāđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ§āđ‰āđƒāļ™āļĢāļ°āļšāļšāļāļĨāļēāļ‡āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ”āļđāđāļĨāđ€āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļĢāļĩāļĒāļāđƒāļ™āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļ§āđˆāļē “android-common” āđ‚āļ”āļĒāļŠāđˆāļ§āļ™ An-
droid Kernel patches āļˆāļ°āļ§āļēāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļĢāļ°āļ”āļąāļšāļšāļ™āļ‚āļ­āļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļēāļĄāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļ‚āļ­āļ‡
Linus Torvalds
āļŠāđˆāļ§āļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āļ™āļąāđ‰āļ™ āļāđ‡āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļ‚āļēāļ”āļ­āļĒāļđāđˆāđāļĨāļ°
āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄāļšāļēāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļˆāļģāļāļąāļ” āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ
āđāļĨāļ°āļžāļĪāļ•āļīāļāļĢāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē (Portable device) āļˆāļ™āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ›āđ‡āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ
(Android Kernel) āđ€āļ‰āļžāļēāļ°āļ‚āļķāđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
â€ĒBinder - āļāļĨāđ„āļāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android's
IPC mechanism) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāļ„ Open Binder
āđ‚āļ›āļĢāđāļāļĢāļĄ A āđ‚āļ›āļĢāđāļāļĢāļĄ BBinder
Function(Object)
- Marshalling (assembling)
- Relaying
Thread
āļĢāļđāļ›āļ—āļĩāđˆ 5.8 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Binder
â€ĒAshmem (Anonymous Shared Memory) - āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™
āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (Shared memory allocator) āđ‚āļ”āļĒāļˆāļ°āļ–āļ­āļ”āļŠāđˆāļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāđ„āļ§āđ‰āđƒāļ™āļāļĢāļ“āļĩ
āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļĢāļīāđˆāļĄāļ§āļīāļāļĪāļ•āļī
â€ĒLogger - āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user space)
â€ĒWakelocks - āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ (suspend) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļ™āđ‰āļ­āļĒāļŦāļĢāļ·āļ­āļĄāļĩ
āļāļēāļĢāļžāļąāļšāļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ›āļīāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĨāļ”
suspend āđāļ•āđˆ Wakelocks āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ”āļąāļšāļŦāļ™āđ‰āļēāļˆāļ­ (Screen Turn-Off) āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰
āļ‡āļēāļ™āļ•āđˆāļ­āļāđ‡āđ€āļžāļĩāļĒāļ‡āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļāļĨāļąāļšāļĄāļē (Screen Turn-On) āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ”āļąāļš
258
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
CPU Screen Keyboard
Wakelock
āļšāļēāļ‡āļŠāđˆāļ§āļ™
Wakelock
āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš
āļĢāļđāļ›āļ—āļĩāđˆ 5.9 āļĢāļ°āļ”āļąāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ
â€ĒOOM (Out Of Memory handler) - āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļ•āđ‡āļĄ āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļē
āļĢāļŠāđˆāļ‡āļŠāļąāļāļēāļ“ Triggers āļāđˆāļ­āļ™āļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ
â€ĒAlarm - āļ•āļąāļ§āļ™āļąāļšāļŦāļ™āđˆāļ§āļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ (Android's alarm timer) āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļˆāļēāļāļ•āļąāļ§
āļ™āļēāļŽāļīāļāļē RTC (Real-time Clock) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ
â€ĒRAM console - āļ•āļąāļ§āđāļŠāļ”āļ‡āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ
/proc/last_kmsg
â€ĒParanoid network - āļ•āļąāļ§āļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ uid (user id) āđāļĨāļ° pid (process id)
āđ€āļŠāđˆāļ™ āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ uid āļŦāļĢāļ·āļ­ pid āļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (access permission) āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ
āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ manifest.xml āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
<permission name=”android.permission.INTERNET”>
<group gid=”inet” />
</permission>
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļžāļĢāđ‰āļ­āļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP
$ cd ~/aosp
$ source build/envsetup.sh
āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™āļšāļ™āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāļĢāļ°āļšāļšāđ€āļžāļ·āđˆāļ­āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđˆāļ­āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āđ€āļžāļīāđˆāļĄ
āļ„āļģāļŠāļąāđˆāļ‡ shell script āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāđāļžāļĨāļĄāļŸāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™
â€Ē hmm() - āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļĄāļ™āļđāļŠāđˆāļ§āļĒāđ€āļŦāļĨāļ·āļ­
â€Ē lunch() - āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡ lunch āđ€āļĄāļ™āļđāđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āļ­āļāđāļžāļĨāļĄāļŸāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ (target board)
â€Ē add_lunch_combo() - āļŠāļģāļŦāļĢāļąāļšāđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡
â€Ē mm() - āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ›āļąāļˆāļˆāļļāļšāļąāļ™
259
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļĢāļĩāļĒāļ envsetup.sh āļāđ‡āļˆāļ°āļĄāļĩāļāļēāļĢāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ source vendorsetup.sh,
vendor/*/vendorsetup.sh, vendor/*/*/vendorsetup.sh  āđāļĨāļ°Â device/*/*/
vendorsetup.sh āđ€āļžāļ·āđˆāļ­āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™ Samsung Maguro product āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ device/samsung/maguro
#
#	
  Copyright	
  (C)	
  2011	
  The	
  Android	
  Open	
  Source	
  Project
#
#	
  Licensed	
  under	
  the	
  Apache	
  License,	
  Version	
  2.0	
  (the	
  "License");
#	
  you	
  may	
  not	
  use	
  this	
  file	
  except	
  in	
  compliance	
  with	
  the	
  License.
#	
  You	
  may	
  obtain	
  a	
  copy	
  of	
  the	
  License	
  at
#
#	
  	
  	
  	
  	
  	
  http://www.apache.org/licenses/LICENSE-­‐2.0
#
#	
  Unless	
  required	
  by	
  applicable	
  law	
  or	
  agreed	
  to	
  in	
  writing,	
  software
#	
  distributed	
  under	
  the	
  License	
  is	
  distributed	
  on	
  an	
  "AS	
  IS"	
  BASIS,
#	
  WITHOUT	
  WARRANTIES	
  OR	
  CONDITIONS	
  OF	
  ANY	
  KIND,	
  either	
  express	
  or	
  implied.
#	
  See	
  the	
  License	
  for	
  the	
  specific	
  language	
  governing	
  permissions	
  and
#	
  limitations	
  under	
  the	
  License.
#	
  
add_lunch_combo	
  full_maguro-­‐userdebug
āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ shell script āļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāđ„āļŸāļĨāđŒ envsetup.sh
$ hmm
Invoke ". build/envsetup.sh" from your shell to add the following functions to your
environment:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
Look at the source to view more functions. The complete list is:
addcompletions add_lunch_combo cgrep check_product check_variant choosecombo choose-
product choosetype choosevariant cproj croot findmakefile gdbclient
get_abs_build_var getbugreports get_build_var getprebuilt gettop godir hmm is-
viewserverstarted jgrep key_back key_home key_menu lunch _lunch m mm mmm pid print-
config print_lunch_menu resgrep runhat runtest set_java_home setpaths set_se-
quence_number set_stuff_for_environment settitle smoketest startviewserver
stopviewserver systemstack tapas tracedmdump
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāļšāļ­āļĢāđŒāļ” target (āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđ€āļĨāļ·āļ­āļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ lunch
You're building on Linux
Lunch menu... pick a combo:
260
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_grouper-userdebug
5. mini_armv7a_neon-userdebug
6. mini_armv7a-userdebug
7. full_wingray-userdebug
8. full_crespo-userdebug
9. full_maguro-userdebug
10. full_panda-userdebug
Which would you like? [full-eng] full_x86-eng
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.0.0-burapha-x86_64-with-Ubuntu-10.04-lucid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļĨāļ·āļ­āļāđ„āļ§āđ‰ āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡
āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ† āđ„āļ”āđ‰āđāļāđˆ
â€ĒANDROID_BUILD_TOP
â€ĒANDROID_TOOLCHAIN
â€ĒANDROID_PRODUCT_OUT
â€ĒANDROID_HOST_OUT
āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ echo $ANDROID_BUILD_TOP
āļāđˆāļ­āļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 3-4 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ‹āļķāđˆāļ‡āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ™āļąāđ‰āļ™ āļˆāļ°
āļĄāļĩāļ­āļĒāļđāđˆāļ­āļĩāļ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰āđ„āļ”āđ‰āđāļāđˆ āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđ€āļāđ‡āļšāđāļ„āļŠāļ‹ (cache) āļ­āđŠāļ­āļŸāđ€āļˆāđ‡āļ„āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄ
āđ„āļžāļĨāđŒāđ‚āļ”āļĒāđ€āļœāļ·āđˆāļ­āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ„āļĢāļąāđ‰āļ‡āļ–āļąāļ”āđ„āļ›āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāļĄāđˆāļ­āļĩāļāļĢāļ­āļš āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰
$ export USE_CCACHE=1
261
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļĨāļ°āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļģāļ™āļ§āļ™āļ„āļ­āļĢāđŒāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāđƒāļŠāđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™
āđ‚āļ”āļĒāļāļēāļĢāļĢāļ°āļšāļļ option -jX āđ‚āļ”āļĒāļ—āļĩāđˆ X āļˆāļ°āđāļ—āļ™āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ„āļ­āļĢāđŒ (Core) āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļšāļ§āļ 1 āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ make -j3
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-2.6.32-42-server-x86_64-with-Ubuntu-10.04-lucid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
find: `src': No such file or directory
PRODUCT_COPY_FILES
frameworks/base/data/sounds/F1_MissedCall.ogg:system/media/audio/notifications/F1_Mi
ssedCall.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_M
MS.ogg ignored.
.
.
.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/effects/camera_click.ogg:system/media/audio/ui/camera_cl
ick.ogg ignored.
āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĄāļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 6 āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđāļāđˆ
1. boot.img – Native system boot image
2. ramdisk.img – Ramdisk rootfs
3. recovery.img – Recovery image
4. ramdisk-recovery.img – Ramdisk rootfs āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļāļđāđ‰āļ„āļ·āļ™ (recovery)
5. system.img – System data (āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /system)
6. userdata.img – User data (āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /data)
āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āđ€āļžāļĩāļĒāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļ AOSP āđāļ•āđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ§āļĄ
āļ–āļķāļ‡ Android Kernel āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĒāļāļ­āļ­āļāđ„āļ›āļˆāļēāļ AOSP āļ‹āļķāđˆāļ‡āļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āđƒāļ™āļšāļ—āļ–āļąāļ”
āđ„āļ› āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđˆāđ„āļ§āđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ” target āļ•āļēāļĄāļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ”āļąāļ‡āļ­āļ˜āļīāļšāļēāļĒ
āđ„āļ§āđ‰āđƒāļ™āļĢāļđāļ›
262
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Stack
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
PRJROOT (glibc)
sysapps/
rootfs/
build-tools/
...
AOSP (bionic)
build/
system/
frameworks/
packages/
external/
Kernel
āļšāļ­āļĢāđŒāļ” Target
Root (/) RAM disk
/acct
/cache
/d
/data
/dev
/etc
/mnt
/proc
/root
/sbin
/sdcard
/sys
/system
/vendor
/cong
/storage
/charger
/cache Image /data Image
/amr
/app
/app-private
/backup
/dalvik-cache
/data
/dontpanic
/local
/misc
/property
/secure
/system
SD Card
(/mnt/sdcard)
/system Image
/app
/bin
/etc
/fonts
/framework
/lib
/usr
/xbin
Live Kernel
procfs
sysfs
tmpfs
cgroup
congfs
āļĢāļđāļ›āļ—āļĩāđˆ 5.10 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļ•āļēāļĢāļēāļ‡ 5.5 āđāļŠāļ”āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ–āļđāļ mount āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļŸāļĨāđŒ image āđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
IMAGE FILE MTD PARTITION MOUNT POINT
ramdisk.img N/A /
system.img /dev/mtdblock0 /system
userdata.img /dev/mtdblock1 /data
N/A /dev/mtdblock2 /cache
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļ
āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ­āļ˜āļīāļšāļēāļĒāļ­āļĒāļđāđˆāđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 5.6 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ āļ›āļĢāļ°āđ€āļ āļ— āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
/acct āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ cgroup
/cache āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāđˆāļ§āļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
/d symlink
āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /sys/kernel/debug āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount-point āļŠāļģāļŦāļĢāļąāļš de-
bugfs
/data āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ data āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ
userdata.img
263
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ āļ›āļĢāļ°āđ€āļ āļ— āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
/dev āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ tmpfs āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļ device node āļ•āđˆāļēāļ‡āđ†
/etc symlink āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /system/etc
/mnt āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ”āļŠāļģāļŦāļĢāļąāļš mount āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§
/proc āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ procfs
/root āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš root āđ€āļ”āļīāļĄāļ‚āļ­āļ‡ Linux āđāļ•āđˆāđƒāļ™ Android āļˆāļ°āđ„āļĄāđˆāļĄāļĩ
āļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒāđƒāļ”āđ†
/sbin āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āđ‚āļ”āļĒāļ›āļāļ•āļīāđƒāļ™ Linux āļˆāļ°āđ€āļāđ‡āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš āđāļ•āđˆāđƒāļ™ Android
āļˆāļ°āđ€āļāđ‡āļšāđ€āļžāļĩāļĒāļ‡ ueventd āđāļĨāļ° adbd
/sdcard āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ”āļŠāļģāļŦāļĢāļąāļš mount āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļšāļ™ SD Card
/sys āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ sysfs
/system āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ system āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ
system.img
/vendor symlink āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /system/vendor āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļžāļšāđ€āļˆāļ­āđ„āļ”āđ‰āđƒāļ™āļšāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
/config āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ congfs
/storage āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
(āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.1) āļŠāļģāļŦāļĢāļąāļš mount āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāļ™āļ­āļ (Ex-
ternal Storage)
/charger āđ„āļŸāļĨāđŒ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ
/res āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āđ„āļŸāļĨāđŒ resources āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ charger
/init āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
āđ‚āļ›āļĢāđāļāļĢāļĄ init āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ‚āļ”āļĒ Kernel āļŦāļĨāļąāļ‡āļˆāļēāļāļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļĢāļ°āļšāļš
āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ
/init.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ init
/init<device_na
me>.rc
āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ† āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ init
/ueventd.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ uventd
/uventd<device_
name>.rc
āđ„āļŸāļĨāđŒ
āđ„āļŸāļĨāđŒ conguration āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ† āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ
ueventd
/default.prop āđ„āļŸāļĨāđŒ
āļ„āđˆāļēāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļąāđˆāļ§āđ„āļ›āļ‚āļ­āļ‡āļĢāļ°āļšāļš (global properties) āļ‹āļķāđˆāļ‡āļˆāļ°āļ­āđˆāļēāļ™āđ‚āļ”āļĒ
āđ‚āļ›āļĢāđāļāļĢāļĄ init
264
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļ™ Android Emulator
āđ„āļŸāļĨāđŒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ ls ~/aosp/out/target/product/generic_x86/
android-info.txt grub previous_build_config.mk system
userdata-qemu.img clean_steps.mk hardware-qemu.ini ramdisk.img
system.img data installed-files.txt root
test dex_bootjars obj symbols
userdata.img
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļāđ‡āļˆāļ°āļ‚āļķāđ‰āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡
āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ emulator &
265
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
266
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđƒāļŠāđ‰ ANDROID DEBUG BRIDGE (ADB)
āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Android Emulator āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļ”āļĩāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļĩāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ—āļąāđ‰āļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļ āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™
āđāļĨāļ° Android Kernel āļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ root
lesystem āđ„āļ”āđ‰āđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŦāļĢāļ·āļ­āļ–āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰
āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļ·āđˆāļ­āļ§āđˆāļē “adb” (Android Debug Bridge) āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđāļĨāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš
āļ āļēāļĒāđƒāļ™ Android Emulator āļ”āļąāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ adb āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 5.11 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ adb
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
emulator-5554 device
āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‚āļ­āļ‡ Android Emulator
$ adb shell
# ls -al
drwxr-xr-x root root 2013-08-17 15:11 acct
drwxrwx--- system cache 2013-08-17 15:11 cache
dr-x------ root root 2013-08-17 15:11 config
lrwxrwxrwx root root 2013-08-17 15:11 d -> /sys/kernel/debug
267
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
drwxrwx--x system system 2013-08-05 02:01 data
-rw-r--r-- root root 116 1970-01-01 00:00 default.prop
drwxr-xr-x root root 2013-08-17 15:11 dev
lrwxrwxrwx root root 2013-08-17 15:11 etc -> /system/etc
-rwxr-x--- root root 234929 1970-01-01 00:00 init
-rwxr-x--- root root 2344 1970-01-01 00:00 init.goldfish.rc
-rwxr-x--- root root 17057 1970-01-01 00:00 init.rc
-rwxr-x--- root root 1637 1970-01-01 00:00 init.trace.rc
-rwxr-x--- root root 3915 1970-01-01 00:00 init.usb.rc
drwxrwxr-x root system 2013-08-17 15:11 mnt
dr-xr-xr-x root root 2013-08-17 15:11 proc
drwx------ root root 2011-11-14 19:00 root
drwxr-x--- root root 1970-01-01 00:00 sbin
lrwxrwxrwx root root 2013-08-17 15:11 sdcard -> /mnt/sdcard
drwxr-xr-x root root 2013-08-17 15:11 sys
drwxr-xr-x root root 2013-08-04 18:33 system
-rw-r--r-- root root 272 1970-01-01 00:00 ueventd.goldfish.rc
-rw-r--r-- root root 3879 1970-01-01 00:00 ueventd.rc
lrwxrwxrwx root root 2013-08-17 15:11 vendor -> /system/vendor
# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 3
model name : Pentium II (Klamath)
stepping : 3
cpu MHz : 2293.936
cache size : 2048 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu de pse tsc msr pae mce cx8 apic sep pge cmov pat mmx fxsr sse
sse2 pni ssse3
bogomips : 4587.87
clflush size: 32
āđāļŠāļ”āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™ MTD Device āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđāļ•āđˆāļĨāļ°āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ”āđ‰āļ§āļĒ
āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
# cat /proc/mtd
dev: size erasesize name
mtd0: 0f180000 00020000 "system"
mtd1: 0c200000 00020000 "userdata"
mtd2: 04000000 00020000 "cache"
# cat /proc/mounts
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,nosuid,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0
268
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0
/dev/block/mtdblock0 /system yaffs2 ro 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
Android Emulator
Android Emulator āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Goldsh āļ–āļđāļāļžāļąāļ’āļ™āļēāļšāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ QEMU
āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ‹āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡ Android Kernel āļ‹āļķāđˆāļ‡āđ€āļŦāļĄāļēāļ°āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš
āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļ·āđˆāļ™āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™
āļˆāļĢāļīāļ‡ Goldsh āļ•āļąāļ§āļ™āļĩāđ‰āļĄāļĩ āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 4 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
1. āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē cross-compiling toolchain āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ Android kernel
2. āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡ Android Kernel āđ‚āļ”āļĒāļĢāļ°āļšāļļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ
3. āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Android Kernel
4. āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļĄāļ™āļđāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš loadable kernel module (LKM)
$ cd ~/aosp
$ source build/envsetup.sh
$ lunch full_x86-eng
$ emulator -help
Android Emulator usage: emulator [options] [-qemu args]
options:
-sysdir <dir> search for system disk images in <dir>
-system <file> read initial system image from <file>
-datadir <dir> write user data into <dir>
....
-help-build-images about disk images when building Android
-help-all prints all help content
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -show-kernel āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Android Kernel āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰
āļ”āļąāļ‡āļ™āļĩāđ‰
$ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -wipe-data
-show-kernel
emulator: WARNING: system partition size adjusted to match image file (249 MB > 200
MB)
serial0 console
student@marabuntu:~/aosp$ [ 0.000000] Linux version 3.4.0+ (student@marabuntu)
(gcc version 4.4.3 (GCC) ) #1 PREEMPT Tue Aug 6 12:14:53 PDT 2013
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
[ 0.000000] BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000e8000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 000000001fff0000 (usable)
[ 0.000000] BIOS-e820: 000000001fff0000 - 0000000020000000 (ACPI data)
[ 0.000000] BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved)
269
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
[ 0.000000] Notice: NX (Execute Disable) protection missing in CPU!
[ 0.000000] DMI 2.4 present.
[ 0.000000] last_pfn = 0x1fff0 max_arch_pfn = 0x100000
[ 0.000000] init_memory_mapping: 0000000000000000-000000001fff0000
[ 0.000000] RAMDISK: 1ffb4000 - 1fff0000
.....
for 1f700000-1f796000, got write-back
[ 4.816692] Clocksource tsc unstable (delta = 70001460 ns)
[ 35.829113] warning: `zygote' uses 32-bit capabilities (legacy support in use)
[ 86.091553] binder: 1208: binder_alloc_buf, no vma
[ 86.091710] binder: 1115:1126 transaction failed 29201, size 4-0
[ 86.091868] binder: send failed reply for transaction 3147 to 1208:1208
[ 99.262724] init: sys_prop: permission denied uid:1003
name:service.bootanim.exit
270
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš
Emulator
āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļē Android Emulator āļ‚āļ­āļ‡ Android āļĢāļļāđˆāļ™ 4.1.1 (ICS) āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļēāļāļąāļš
AOSP āļ™āļąāđ‰āļ™āļĒāļąāļ‡āđƒāļŠāđ‰ Android Kernel āļĢāļļāđˆāļ™ 2.6.29 āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ” ANDROID KERNEL āļŠāļģāļŦāļĢāļąāļš ANDROID EMULATOR (GOLDFISH)
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” Android Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cd ~/aosp
$ git clone http://android.googlesource.com/kernel/goldfish.git
āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ git branch -r āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩ Kernel āļĢāļļāđˆāļ™āđ„āļŦāļ™āļ­āļĒāļđāđˆāļšāđ‰āļēāļ‡
$ cd goldfish
$ git branch -r
origin/HEAD -> origin/master
origin/android-goldfish-2.6.29
271
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
origin/android-goldfish-3.4
origin/linux-goldfish-3.0-wip
origin/master
āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ Kernel āļĢāļļāđˆāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđˆāļˆāļ°āđ€āļĨāļ·āļ­āļāļĢāļļāđˆāļ™ 3.4
$ git checkout -b 3.4 origin/android-goldfish-3.4
Checking out files: 100% (38868/38868), done.
Branch 3.4 set up to track remote branch android-goldfish-3.4 from origin.
Switched to a new branch '3.4'
āļ•āļąāđ‰āļ‡āļ„āđˆāļē Kernel āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Goldsh
āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļš Goldsh Emulator āļ‹āļķāđˆāļ‡āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/x86/configs/
$ ls -al arch/x86/configs/
total 80
drwxr-xr-x 2 student student 4096 2013-08-17 18:46 .
drwxr-xr-x 25 student student 4096 2013-08-17 18:46 ..
-rw-r--r-- 1 student student 55883 2013-08-17 18:46 goldfish_defconfig
-rw-r--r-- 1 student student 7511 2013-08-17 18:46 i386_defconfig
-rw-r--r-- 1 student student 7528 2013-08-17 18:46 x86_64_defconfig
$ make goldfish_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļĄāļēāļāļąāļšāļšāļ­āļĢāđŒāļ” target āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļĄāļ·āļ­āļ–āļ·āļ­/āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ•āļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļ›āļāļ•āļīāļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒ
.cong āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđāļĨāļ°āđ€āļāđ‡āļšāđƒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāļ§āđˆāļē cong.gz āđāļĨāļ°āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
/proc/ āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļąāđ‰āļ™āđ† āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb pull āđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āđ„āļŸāļĨāđŒ cong.gz āļ­āļ­āļāļĄāļē āđāļĨāđ‰āļ§
āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ .cong āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ
āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰
$ adb pull /proc/config.gz .
$ gunzip config.gz
$ cp config .config
272
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ Kernel image āđƒāļŦāļĄāđˆ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩ
āļ­āļĒāļđāđˆāđƒāļ™ āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ•āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Networking support, Device Drivers, Firmware Driv-
ers, File systems, Security options, Cryptographic API, Virtualization, Library routines
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
$ make menuconfig
āļ—āļ”āļĨāļ­āļ‡āđ€āļžāļīāđˆāļĄāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Bluetooth āđāļĨāļ° NFC āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āđ€āļĨāļ·āļ­āļāļˆāļēāļāđ€āļĄāļ™āļđ Network-
ing support
273
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĨāļ·āļ­āļāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Kernel Loading Module (KLM) āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđƒāļ™āđ€āļĄāļ™āļđ enable loadable module
support āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
274
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļŠāļģāļŦāļĢāļąāļš Goldsh
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš cross-compiling āđāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡ Goldsh Emula-
tor āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ„āļ·āļ­āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86
$ export
CROSS_COMPILE=~/aosp/external/qemu/distrib/kernel-toolchain/android-ke
rnel-toolchain-
$ export
REAL_CROSS_COMPILE=~/aosp/prebuilts/gcc/linux-x86/x86/i686-android-lin
ux-4.4.3/bin/i686-android-linux-
$ export ARCH=x86
$ export SUBARCH=x86
$ make -j3
āļŦāļĨāļąāļ‡āļˆāļēāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļīāđ‰āļ™āļŠāļļāļ”āļĨāļ‡āļāđ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒ kernel image āļŠāļ·āđˆāļ­āļ§āđˆāļē “bzImage” āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/
x86/boot/ āļ”āļąāļ‡āļĢāļēāļĒāļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ ls arch/x86/boot/
a20.c cpustr.h mtools.conf.in version.o
a20.o ctype.h pm.c vesa.h
apm.c early_serial_console.c pmjump.o video-bios.c
bioscall.o early_serial_console.o pmjump.S video-bios.o
bioscall.S edd.c pm.o video.c
bitops.h edd.o printf.c video.h
boot.h header.o printf.o video-mode.c
bzImage header.S regs.c video-mode.o
cmdline.c install.sh regs.o video.o
cmdline.o main.c setup.bin video-vesa.c
code16gcc.h main.o setup.elf video-vesa.o
compressed Makefile setup.ld video-vga.c
copy.o mca.c string.c video-vga.o
copy.S mca.o string.o vmlinux.bin
cpu.c memory.c tools voffset.h
cpucheck.c memory.o tty.c zoffset.h
cpucheck.o mkcpustr tty.o
cpu.o mkcpustr.c version.c
āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđ‚āļ”āļĒāļĢāļ°āļšāļļāļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ kernel image
āļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ‚āļ”āļĒāđƒāļŠāđ‰ option -kernel āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ cd ~/aosp
$ source build/envsetup.sh
$ lunch full_x86-eng
$ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -wipe-data &
275
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel Module āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđƒāļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļ•āļąāļ§ Android Emulator āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ (āļĢāļļāđˆāļ™ 3.4) āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļĩāđ‰
āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĻāļķāļāļĐāļēāđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ Android Kernel āđ„āļ”āđ‰āđāļĨāđ‰āļ§ āļ™āļ­āļāļˆāļēāļ
āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ kernel module āļŦāļĢāļ·āļ­ kernel device driver āđƒāļ™āļĢāļ°āļ”āļąāļš kernel space
āđ€āļžāļ·āđˆāļ­āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŦāļĢāļ·āļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ‰āļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē kernel module āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ mkdir ~/aosp/goldfish/my_modules
$ cd ~/aosp/goldfish/my_modules/
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļĄāļ”āļđāļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello.c āđāļĨāļ° hello1.c āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
// hello.c
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_ALERT */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Wiroon Sriborrirux EE-Burapha, 2013");
MODULE_DESCRIPTION("Demo module");
int init_module(void)
276
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
{
printk(KERN_INFO "Hello world! 1n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_ALERT "Cleaning up module 1n");
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello1.c
// hello1.c
// Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually
available to userspace programs.
#undef __KERNEL__
#define __KERNEL__
#undef MODULE
#define MODULE
// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is
needed for KERN_INFO.
#include <linux/module.h> // included for all kernel modules
#include <linux/kernel.h> // included for KERN_INFO
#include <linux/init.h> // included for __init and __exit macros
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Wiroon Sriborrirux EE-Burapha, 2013");
MODULE_DESCRIPTION("Demo module");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello world! 2n");
return 0; // Non-zero return means that the module couldn't be loaded.
}
static void __exit hello_cleanup(void)
{
printk(KERN_INFO "Cleaning up module 2n");
}
module_init(hello_init);
module_exit(hello_cleanup);
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰
$ vim Makefile
VERSION = 3
PATCHLEVEL = 4
277
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
SUBLEVEL = 0
EXTRAVERSION=
obj-m += hello.o hello1.o
all:
make -C /home/student/aosp/goldfish/ M=$(PWD) modules
clean:
make -C /home/student/aosp/goldfish/ M=$(PWD) clean
āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļĄāļ”āļđāļĨ hello āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļĄāļ”āļđāļĨ
āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ cd ~/aosp/goldfish/
$ make ARCH=x86
CROSS_COMPILE=~/aosp/prebuilts/gcc/linux-x86/x86/i686-android-linux-4.
4.3/bin/i686-android-linux- modules_prepare
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CC kernel/bounds.s
GEN include/generated/bounds.h
CC arch/x86/kernel/asm-offsets.s
GEN include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CC scripts/mod/empty.o
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ kernel module āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļ§āđ‰ (hello.c)
$ cd ~/aosp/goldfish/my_modules/
$ make
make -C /home/student/aosp/goldfish/ M=/home/student/aosp/goldfish-
/custom_modules modules
make[1]: Entering directory `/home/student/aosp/goldfish'
CC [M] /home/student/aosp/goldfish/custom_modules/hello.o
CC [M] /home/student/aosp/goldfish/custom_modules/hello1.o
Building modules, stage 2.
MODPOST 2 modules
CC /home/student/aosp/goldfish/custom_modules/hello.mod.o
LD [M] /home/student/aosp/goldfish/custom_modules/hello.ko
CC /home/student/aosp/goldfish/custom_modules/hello1.mod.o
LD [M] /home/student/aosp/goldfish/custom_modules/hello1.ko
make[1]: Leaving directory `/home/student/aosp/goldfish'
$ ls
278
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
hello1.c hello1.mod.o hello.ko hello.o Makefile_old
hello1.ko hello1.o hello.mod.c Makefile modules.order
hello1.mod.c hello.c hello.mod.o Makefile1 Module.symvers
āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļāđ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāđ‚āļĄāļ”āļđāļĨāļŠāļ·āđˆāļ­āļ§āđˆāļē hello.ko āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ‚āļ”āļĒāļŠāđˆāļ‡āļœāđˆāļēāļ™ adb
push āđ„āļ›āļĒāļąāļ‡ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ adb push hello.ko /data/local
52 KB/s (2203 bytes in 0.040s)
$ adb push hello1.ko /data/local
54 KB/s (2238 bytes in 0.040s)
$ adb shell
# cd /data/local
# ls
hello.ko
hello1.ko
tmp
āļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨ hello āđāļĨāļ° hello1 āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ
(3.4.0) āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ dmesg
# insmod hello.ko
# insmod hello1.ko
# lsmod
hello1 506 0 - Live 0x00000000 (PO)
hello 540 0 - Live 0x00000000 (O)
# rmmod hello
# rmmod hello1
# dmesg
...
<3>[ 79.016988] init: sys_prop: permission denied uid:1003
name:service.bootanim.exit
<4>[ 4000.418990] hello: module license 'unspecified' taints kernel.
<4>[ 4000.419343] Disabling lock debugging due to kernel taint
<6>[ 4064.182198] Hello world! 1
<6>[ 4068.910892] Hello world! 2
<6>[ 4086.416483] Cleaning up module 1
<6>[ 4089.112969] Cleaning up module 2
279
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āļāļąāļ‡āļĨāļ‡āđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (.APK) āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āļˆāļ°āļĄāļĩ
āļ§āļīāļ˜āļĩāļāļēāļĢāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļ§āļīāļ˜āļĩāļ„āļ·āļ­āļāļēāļĢāļ™āļģāļ‚āļķāđ‰āļ™ Google PlayStore āđāļĨāđ‰āļ§āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđāļĨāļ°āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļŠāļ­āļ‡āļ„āļ·āļ­āļāļēāļĢāļ™āļģ
āđ„āļŸāļĨāđŒāļ•āļīāļ”āļ•āļąāđ‰āļ‡ (āļ™āļēāļĄāļŠāļāļļāļĨ .APK) āļĄāļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāļāļąāļ‡āļĨāļ‡āđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™
āļāļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļĒāļĩāđˆāļŦāđ‰āļ­āļ™āļąāđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™
āļ”āļĢāļ­āļĒāļ”āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
1. āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđāļ­āļžāļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē MyApp
280
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
281
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
// MainActivity.java
package com.example.myapp;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
// activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
282
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
2. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Android.mk
283
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
3. āļŠāļĢāđ‰āļēāļ‡ symbolic link āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ MyApp
$ cd ~/aosp/packages/apps
$ ln -s /home/student/android/workspace/MyApp MyApp
$ ls -al
total 148
drwxr-xr-x 37 student student 4096 2013-08-19 02:27 .
drwxr-xr-x 7 student student 4096 2012-09-04 04:30 ..
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 BasicSmsReceiver
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Bluetooth
drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Browser
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Calculator
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Calendar
drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Camera
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 CellBroadcastReceiver
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 CertInstaller
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Contacts
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 DeskClock
drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Email
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 Exchange
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Gallery
drwxr-xr-x 8 student student 4096 2012-09-04 22:50 Gallery2
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 HTMLViewer
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 KeyChain
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Launcher2
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 LegacyCamera
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 Mms
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Music
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 MusicFX
lrwxrwxrwx 1 student student 37 2013-08-19 02:27 MyApp -> /home/student/android/
workspace/MyApp
drwxr-xr-x 8 student student 4096 2012-09-04 22:50 Nfc
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 PackageInstaller
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Phone
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Protips
drwxr-xr-x 3 student student 4096 2012-09-04 22:50 Provision
drwxr-xr-x 6 student student 4096 2012-09-04 22:50 QuickSearchBox
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Settings
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SoundRecorder
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SpareParts
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SpeechRecorder
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Stk
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Tag
drwxr-xr-x 4 student student 4096 2012-09-04 22:50 VideoEditor
drwxr-xr-x 5 student student 4096 2012-09-04 22:50 VoiceDialer
4. āļĨāļšāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ gen/ āđāļĨāļ° bin/ āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MyApp
$ cd MyApp
$ rm -rf gen bin
5. āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āđāļ­āļžāļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ ~/aosp/build/target/product/core.mk āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡
PRODUCT_PACKAGES
284
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ cd /home/student/aosp/build/target/product/
$ gedit core.mk
6. āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš AOSP āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
$ cd ~/aosp
$ source build/envsetup.sh
$ lunch 2
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-2.6.32-42-server-x86_64-with-Ubuntu-10.04-lucid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
7. āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MyApp
$ cd package/apps/MyApp
$ make
$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
285
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
....
Processing
target/product/generic_x86/obj/APPS/MyAppAndroid_intermediates/package.apk
Done!
Install: out/target/product/generic_x86/system/app/MyAppAndroid.odex
Install: out/target/product/generic_x86/system/app/MyAppAndroid.apk
make: Leaving directory `/home/student/aosp'
8.āļĨāļšāđ„āļŸāļĨāđŒ system.img āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp/out/target/product/generic_x86
āđāļĨāļ°āđāļŸāđ‰āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ
~/aosp/out/target/product/generic_x86/obj/PACKAGING/systemimage_
intermediates/
$ cd ~/aosp/out/target/product/generic_x86
$ rm -rf system.img obj/PACKAGING/systemimage_intermediates/
9. āļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
$ cd ~/aosp
$ make -j3
ringtones/Rigel.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtone
s/Scarabaeus.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/
Solarium.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Th
emos.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones
/UrsaMinor.ogg ignored.
PRODUCT_COPY_FILES
frameworks/base/data/sounds/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta
.ogg ignored.
Target system fs image:
out/target/product/generic_x86/obj/PACKAGING/systemimage_intermediates/system.img
Running: mkyaffs2image -f out/target/product/generic_x86/system
out/target/product/generic_x86/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/generic_x86/system.img
286
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
10. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
$ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -system
out/target/product/generic_x86/system.img -ramdisk
out/target/product/generic_x86/ramdisk.img &
287
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™ Android Emulator
āđ€āļžāļ·āđˆāļ­āļĻāļķāļāļĐāļēāļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ•āļąāļ§ Android Emulator āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŠāļąāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 5.7 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ āļēāļĒāđƒāļ™ Android Emulator
āļ„āļģāļŠāļąāđˆāļ‡ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
services āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ”āļđ Service āļ—āļĩāđˆāļ­āļĒāļđāđˆ Android āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
dumpsys
āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļšāļšāļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡CPU
dumpstate āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™ Android
rawbu āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ backup āđāļĨāļ° restore āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆ /data
am āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Activity
pm āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Package
dalvikvm āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ„āļŸāļĨāđŒ Java Class āđƒāļ™āļĢāļđāļ›āđāļšāļš DEX format
288
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļģāļŠāļąāđˆāļ‡ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
getprop
āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļĢāļ°āļšāļš āđ€āļŠāđˆāļ™ DNS servers, gateways, GSM, serv-
ices āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™, build parameters, āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđ€āļĢāļēāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
$ cd ~/aosp/
$ source build/envsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/armv7-a/vendorsetup.sh
including device/moto/wingray/vendorsetup.sh
including device/samsung/crespo/vendorsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_grouper-userdebug
5. mini_armv7a_neon-userdebug
6. mini_armv7a-userdebug
7. full_wingray-userdebug
8. full_crespo-userdebug
9. full_maguro-userdebug
10. full_panda-userdebug
Which would you like? [full-eng] 2
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.1.1
TARGET_PRODUCT=full_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86-atom
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.2.17-x86_64-with-Ubuntu-10.04-lucid
HOST_BUILD_TYPE=release
BUILD_ID=JRO03L
OUT_DIR=out
============================================
$ emulator &
289
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āļāļąāļšāļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ (Mounting)
āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡:
mount -o rw,remount -t "filesystem" "Device" "Mount Point"
$ adb shell
āļāļēāļĢāļ•āļąāđ‰āļ‡āđƒāļŦāđ‰ root le system āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰
# mount -o rw,remount -t rootfs /
āļāļēāļĢāļ•āļąāđ‰āļ‡āđƒāļŦāđ‰āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ /system āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰
# mount -o rw,remount -t yaffs2 /dev/block/mtdblock4 /system
$ adb shell
āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Android Emulator
# service
Usage: service [-h|-?]
service list
service check SERVICE
service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
i32: Write the integer INT into the send parcel.
s16: Write the UTF-16 string STR into the send parcel.
# service list
Found 65 services:
0! phone: [com.android.internal.telephony.ITelephony]
1! iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo]
2! simphonebook: [com.android.internal.telephony.IIccPhoneBook]
3! isms: [com.android.internal.telephony.ISms]
4! commontime_management: []
5! samplingprofiler: []
6! diskstats: []
7! appwidget: [com.android.internal.appwidget.IAppWidgetService]
8! backup: [android.app.backup.IBackupManager]
9! uimode: [android.app.IUiModeManager]
10! serial: [android.hardware.ISerialManager]
11! usb: [android.hardware.usb.IUsbManager]
12! audio: [android.media.IAudioService]
13! wallpaper: [android.app.IWallpaperManager]
14! dropbox: [com.android.internal.os.IDropBoxManagerService]
15! search: [android.app.ISearchManager]
16! country_detector: [android.location.ICountryDetector]
17! location: [android.location.ILocationManager]
18! devicestoragemonitor: []
19! notification: [android.app.INotificationManager]
20! updatelock: [android.os.IUpdateLock]
21! throttle: [android.net.IThrottleManager]
290
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
22! servicediscovery: [android.net.nsd.INsdManager]
23! connectivity: [android.net.IConnectivityManager]
24! wifi: [android.net.wifi.IWifiManager]
25! wifip2p: [android.net.wifi.p2p.IWifiP2pManager]
26! netpolicy: [android.net.INetworkPolicyManager]
27! netstats: [android.net.INetworkStatsService]
28! textservices: [com.android.internal.textservice.ITextServicesManager]
29! network_management: [android.os.INetworkManagementService]
30! clipboard: [android.content.IClipboard]
31! statusbar: [com.android.internal.statusbar.IStatusBarService]
32! device_policy: [android.app.admin.IDevicePolicyManager]
33! lock_settings: [com.android.internal.widget.ILockSettings]
34! mount: [IMountService]
35! accessibility: [android.view.accessibility.IAccessibilityManager]
36! input_method: [com.android.internal.view.IInputMethodManager]
37! input: [android.hardware.input.IInputManager]
38! window: [android.view.IWindowManager]
39! alarm: [android.app.IAlarmManager]
40! vibrator: [android.os.IVibratorService]
41! battery: []
42! hardware: [android.os.IHardwareService]
43! content: [android.content.IContentService]
44! account: [android.accounts.IAccountManager]
45! permission: [android.os.IPermissionController]
46! cpuinfo: []
47! dbinfo: []
48! gfxinfo: []
49! meminfo: []
50! activity: [android.app.IActivityManager]
51! package: [android.content.pm.IPackageManager]
52! scheduling_policy: [android.os.ISchedulingPolicyService]
53! telephony.registry: [com.android.internal.telephony.ITelephonyRegistry]
54! usagestats: [com.android.internal.app.IUsageStats]
55! batteryinfo: [com.android.internal.app.IBatteryStats]
56! power: [android.os.IPowerManager]
57! entropy: []
58! sensorservice: [android.gui.SensorServer]
59! media.audio_policy: [android.media.IAudioPolicyService]
60! media.camera: [android.hardware.ICameraService]
61! SurfaceFlinger: [android.ui.ISurfaceComposer]
62! media.player: [android.media.IMediaPlayerService]
63! media.audio_flinger: [android.media.IAudioFlinger]
64! drm.drmManager: [drm.IDrmManagerService]
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™
# service call statusbar 1
Result: Parcel(00000000 '....')
291
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
# service call statusbar 2
Result: Parcel(00000000 '....')
292
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļģāļŠāļąāđˆāļ‡ dumpsys āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ† āļ‚āļ­āļ‡āļ•āļąāļ§āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš
(system service) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
$ adb shell dumpsys | grep "DUMP OF SERVICE"
Output Command
DUMP OF SERVICE SurfaceFlinger:
DUMP OF SERVICE accessibility:
DUMP OF SERVICE account:
DUMP OF SERVICE activity:
DUMP OF SERVICE alarm:
DUMP OF SERVICE appwidget:
DUMP OF SERVICE audio:
DUMP OF SERVICE backup:
DUMP OF SERVICE battery:
DUMP OF SERVICE batteryinfo:
DUMP OF SERVICE clipboard:
DUMP OF SERVICE commontime_management:
DUMP OF SERVICE connectivity:
DUMP OF SERVICE content:
DUMP OF SERVICE country_detector:
DUMP OF SERVICE cpuinfo:
DUMP OF SERVICE dbinfo:
DUMP OF SERVICE device_policy:
DUMP OF SERVICE devicestoragemonitor:
DUMP OF SERVICE diskstats:
DUMP OF SERVICE drm.drmManager:
DUMP OF SERVICE dropbox:
DUMP OF SERVICE entropy:
DUMP OF SERVICE gfxinfo:
DUMP OF SERVICE hardware:
DUMP OF SERVICE input:
DUMP OF SERVICE input_method:
DUMP OF SERVICE iphonesubinfo:
DUMP OF SERVICE isms:
DUMP OF SERVICE location:
DUMP OF SERVICE lock_settings:
DUMP OF SERVICE media.audio_flinger:
DUMP OF SERVICE media.audio_policy:
DUMP OF SERVICE media.camera:
DUMP OF SERVICE media.player:
DUMP OF SERVICE meminfo:
DUMP OF SERVICE mount:
DUMP OF SERVICE netpolicy:
DUMP OF SERVICE netstats:
DUMP OF SERVICE network_management:
DUMP OF SERVICE notification:
DUMP OF SERVICE package:
DUMP OF SERVICE permission:
DUMP OF SERVICE phone:
DUMP OF SERVICE power:
DUMP OF SERVICE samplingprofiler:
DUMP OF SERVICE scheduling_policy:
DUMP OF SERVICE search:
DUMP OF SERVICE sensorservice:
DUMP OF SERVICE serial:
DUMP OF SERVICE servicediscovery:
DUMP OF SERVICE simphonebook:
DUMP OF SERVICE statusbar:
DUMP OF SERVICE telephony.registry:
DUMP OF SERVICE textservices:
293
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
DUMP OF SERVICE throttle:
DUMP OF SERVICE uimode:
DUMP OF SERVICE updatelock:
DUMP OF SERVICE usagestats:
DUMP OF SERVICE usb:
DUMP OF SERVICE vibrator:
DUMP OF SERVICE wallpaper:
DUMP OF SERVICE wifi:
DUMP OF SERVICE wifip2p:
DUMP OF SERVICE window:
$ adb shell dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
status: 2
health: 2
present: true
level: 50
scale: 100
voltage:0
temperature: 0
technology: Li-ion
$ adb shell dumpsys wifi
Wi-Fi is disabled
Stay-awake conditions: 1
Internal state:
current HSM state: DriverUnloadedState
mLinkProperties LinkAddresses: [] Routes: [] DnsAddresses: []
mWifiInfo SSID: <none>, BSSID: <none>, MAC: <none>, Supplicant state: UNINITIALIZED,
RSSI: -9999, Link speed: -1, Net ID: -1, Metered hint: false
mDhcāļ‚āļēfoInternal addr: null/0 mRoutes: dns: null,null dhcpServer: null leaseDura-
tion: 0
mNetworkInfo NetworkInfo: type: WIFI[], state: UNKNOWN/IDLE, reason: (unspecified),
extra: (none), roaming: false, failover: false, isAvailable: false
mLastSignalLevel -1
mLastBssid null
mLastNetworkId -1
mReconnectCount 0
mIsScanMode false
Supplicant status
null
mLastPriority -1
Configured networks
Latest scan results:
Locks acquired: 0 full, 0 full high perf, 0 scan
Locks released: 0 full, 0 full high perf, 0 scan
Locks held:
Scan count since last plugged in
WifiWatchdogStateMachine dump
WatchdogStatus: State:
android.net.wifi.WifiWatchdogStateMachine$NotConnectedState@b444f100mWifiInfo:
[null]
mLinkProperties: [null]
mCurrentSignalLevel: [0]
mArpCheckIntervalMs: [120000]
mRssiFetchIntervalMs: [1000]
mWalledGardenIntervalMs: [1800000]
294
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
mNumArppings: [5]
mMinArpResponses: [1]
mArppingTimeoutMs: [100]
mPoorNetworkDetectionEnabled: [true]
mWalledGardenTestEnabled: [true]
mWalledGardenUrl: [http://clients3.google.com/generate_204]
WifiStateMachine dump
WifiStateMachine:
total messages=3
msg[0]: time=09-21 16:03:00.308 state=DefaultState orgState=DriverUnloadedState
what=69632(0x11000)
msg[1]: time=09-21 16:03:00.389 state=DefaultState orgState=DriverUnloadedState
what=131085(0x2000d)
msg[2]: time=09-21 16:03:00.408 state=DefaultState orgState=DriverUnloadedState
what=131147(0x2004b)
curState=DriverUnloadedState
$ adb shell dumpsys cpuinfo
Load: 3.24 / 1.4 / 0.51
CPU usage from 533936ms to 513149ms ago:
23% 2477/system_server: 22% user + 0.7% kernel / faults: 625 minor
4.8% 2445/surfaceflinger: 4.6% user + 0.1% kernel / faults: 592 minor
1.5% 2634/android.process.acore: 1.4% user + 0% kernel / faults: 252 minor
1.9% 2782/android.process.media: 1.7% user + 0.1% kernel / faults: 125 minor
1.7% 2619/com.android.launcher: 1.4% user + 0.2% kernel / faults: 145 minor
1.5% 2570/com.android.inputmethod.latin: 1.3% user + 0.1% kernel / faults: 141 mi-
nor
1.4% 2708/com.android.deskclock: 1.3% user + 0% kernel / faults: 150 minor
1.3% 2765/com.android.email: 1.3% user + 0% kernel / faults: 106 minor
1.3% 2851/com.android.providers.calendar: 1.3% user + 0% kernel / faults: 148 mi-
nor
1.3% 2552/com.android.systemui: 1.2% user + 0% kernel / faults: 60 minor
0.9% 2731/com.android.contacts: 0.8% user + 0% kernel / faults: 160 minor
1% 2589/com.android.phone: 0.8% user + 0.1% kernel / faults: 55 minor
0.7% 2681/zygote: 0.6% user + 0% kernel / faults: 160 minor
0.9% 2805/com.android.exchange: 0.9% user + 0% kernel / faults: 120 minor
0.5% 2659/com.android.smspush: 0.4% user + 0% kernel / faults: 165 minor
0.8% 2878/com.android.calendar: 0.8% user + 0% kernel / faults: 99 minor
0.5% 806/adbd: 0% user + 0.5% kernel / faults: 11 minor
0.1% 2428/mediaserver: 0% user + 0% kernel / faults: 27 minor
0% 4/events/0: 0% user + 0% kernel
0% 783/servicemanager: 0% user + 0% kernel
+0% 2900/sh: 0% user + 0% kernel
+0% 2902/dumpsys: 0% user + 0% kernel
48% TOTAL: 45% user + 3.3% kernel
$ adb shell dumpsys meminfo
Applications Memory Usage (kB):
Uptime: 9118113 Realtime: 9118113
Total PSS by process:
22980 kB: system (pid 2477)
19899 kB: com.android.settings (pid 2681)
19648 kB: com.android.launcher (pid 2619)
12665 kB: com.android.systemui (pid 2552)
8792 kB: com.android.phone (pid 2589)
7504 kB: com.android.contacts (pid 2731)
7085 kB: com.android.inputmethod.latin (pid 2570)
6619 kB: android.process.acore (pid 2634)
5815 kB: com.android.email (pid 2765)
5402 kB: android.process.media (pid 2782)
295
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
5328 kB: com.android.calendar (pid 2878)
4603 kB: com.android.providers.calendar (pid 2851)
4287 kB: com.android.deskclock (pid 2708)
4282 kB: com.android.exchange (pid 2805)
2824 kB: com.android.smspush (pid 2659)
2686 kB: com.android.defcontainer (pid 2965)
Total PSS by OOM adjustment:
22980 kB: System
22980 kB: system (pid 2477)
21457 kB: Persistent
12665 kB: com.android.systemui (pid 2552)
8792 kB: com.android.phone (pid 2589)
19648 kB: Foreground
19648 kB: com.android.launcher (pid 2619)
2824 kB: Visible
2824 kB: com.android.smspush (pid 2659)
7085 kB: Perceptible
7085 kB: com.android.inputmethod.latin (pid 2570)
22585 kB: Previous
19899 kB: com.android.settings (pid 2681)
2686 kB: com.android.defcontainer (pid 2965)
43840 kB: Background
7504 kB: com.android.contacts (pid 2731)
6619 kB: android.process.acore (pid 2634)
5815 kB: com.android.email (pid 2765)
5402 kB: android.process.media (pid 2782)
5328 kB: com.android.calendar (pid 2878)
4603 kB: com.android.providers.calendar (pid 2851)
4287 kB: com.android.deskclock (pid 2708)
4282 kB: com.android.exchange (pid 2805)
Total PSS by category:
53374 kB: Dalvik
23817 kB: Unknown
19418 kB: Other mmap
18091 kB: Native
11556 kB: .apk mmap
11425 kB: .so mmap
1936 kB: Ashmem
718 kB: .ttf mmap
68 kB: Other dev
12 kB: Cursor
4 kB: .jar mmap
0 kB: .dex mmap
Total PSS: 140419 kB
KSM: 0 kB saved from shared 0 kB
0 kB unshared; 0 kB volatile
$ adb shell dumpsys meminfo com.android.providers.calendar
Applications Memory Usage (kB):
Uptime: 8961566 Realtime: 8961566
** MEMINFO in pid 2851 [com.android.providers.calendar] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 806 684 760 1908 1692 143
Dalvik 2145 8904 1608 6407 6093 314
Cursor 0 0 0
Ashmem 0 0 0
296
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Other dev 4 0 0
.so mmap 522 1828 216
.jar mmap 4 0 0
.apk mmap 95 0 0
.ttf mmap 0 0 0
.dex mmap 0 0 0
Other mmap 912 24 24
Unknown 177 36 176
TOTAL 4665 11476 2784 8315 7785 457
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 1 Activities: 0
Assets: 2 AssetManagers: 2
Local Binders: 10 Proxy Binders: 8
Death Recipients: 0
OpenSSL Sockets: 0
SQL
MEMORY_USED: 171
PAGECACHE_OVERFLOW: 53 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 120 117 24/36/11
/data/data/com.android.providers.calendar/databases/calendar.db
Asset Allocations
zip:/system/app/CalendarProvider.apk:/resources.arsc: 57K
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ dumpsys āđ„āļ”āđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” <uses-permission
android:name="android.permission.DUMP" /> āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml
āļ„āļģāļŠāļąāđˆāļ‡ dumpstate āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
$ adb shell
# dumpstate
......
PROVIDER ContentProviderRecord{b4669e98
com.android.email/.provider.AttachmentProvider} pid=1306
Client:
nothing to dump
PROVIDER ContentProviderRecord{b470bc88
com.android.providers.contacts/.CallLogProvider} pid=1151
Client:
nothing to dump
PROVIDER ContentProviderRecord{b462a2a0
com.android.providers.downloads/.DownloadProvider} pid=1324
Client:
nothing to dump
PROVIDER ContentProviderRecord{b46e1b68
com.android.providers.userdictionary/.UserDictionaryProvider} pid=1151
Client:
nothing to dump
[dumpsys: 0.4s elapsed]
========================================================
== dumpstate: done
========================================================
297
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ„āļģāļŠāļąāđˆāļ‡ dalvikvm (Dalvik VM) āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Dalvik VM āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āđ„āļŸāļĨāđŒ
Java class āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļš DEX āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ mkdir dalvik
$ cd dalvik/
āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ
$ cat hello.java
package org.apache;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ JAVA Compiler
$ javac -d . -g Hello.java
āļ—āļģāļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .jar
$ jar -cvf Temp.jar *
added manifest
adding: Hello.java(in = 139) (out= 115)(deflated 17%)
adding: org/(in = 0) (out= 0)(stored 0%)
adding: org/apache/(in = 0) (out= 0)(stored 0%)
adding: org/apache/Hello.class(in = 541) (out= 336)(deflated 37%)
āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ â€œdx” āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ classes.dex āļˆāļēāļāđ„āļŸāļĨāđŒ Temp.jar
$ dx --dex --output=./classes.dex Temp.jar
$ ls
classes.dex Hello.java org Temp.jar
āļ–āļąāļ”āđ„āļ›āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ â€œaapt” āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ .jar āļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ•āđ‰ Dalvik VM āđ„āļ”āđ‰
$ aapt add CmdLine.jar classes.dex
'classes.dex'...
āļ™āļģāđ„āļŸāļĨāđŒ CmdLine.jar āļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒ classes.dex āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ•āļąāļ§ Android Emulator āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļ
āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Dalvikvm āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ adb push CmdLine.jar /data
298
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
10 KB/s (547 bytes in 0.050s)
$ adb shell
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar
-version
DalvikVM version 1.6.0
Copyright (C) 2007 The Android Open Source Project
This software is built from source code licensed under the Apache Licen-
se,Version 2.0 (the "License"). You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
See the associated NOTICE file for this software for further details.
Dalvik VM init failed (check log file)
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar
-classpath /data/CmdLine.jar org.apache.Hello
Hello World!
am (Activity Manager)
āļ„āļģāļŠāļąāđˆāļ‡ am āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (activities) āđ€āļŠāđˆāļ™ āđ€āļĢāļĩāļĒāļāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™ āļŠāļąāđˆāļ‡āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™
āđāļĨāļ°āđ€āļāđ‰āļēāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
# am
usage: am [subcommand] [options]
usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]
[--R COUNT] [-S] [--opengl-trace] <INTENT>
am startservice <INTENT>
am force-stop <PACKAGE>
am kill <PACKAGE>
am kill-all
am broadcast <INTENT>
....
[--activity-single-top] [--activity-clear-task]
[--activity-task-on-home]
[--receiver-registered-only] [--receiver-replace-pending]
[--selector]
[<URI> | <PACKAGE> | <COMPONENT>]
# am start com.android.deskclock .Clock
Starting: Intent { act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }
Warning: Activity not started, its current task has been brought to the front
299
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
# am start -a android.intent.action.MAIN -n
com.android.browser/.BrowserActivity
Starting: Intent { action=android.intent.action.MAIN
comp={com.android.browser/com.android.browser.BrowserActivity} }
Warning: Activity not started, its current task has been brought to the front
# am start -a android.intent.action.MAIN -n
com.android.settings/.Settings
Starting: Intent { action=android.intent.action.MAIN
comp={com.android.settings/com.android.settings.Settings} }
āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļžāđ‡āļāđ€āļāđ‡āļ• (package manager)
# pm list package
package:android
package:com.android.backupconfirm
package:com.android.bluetooth
package:com.android.browser
package:com.android.calculator2
....
package:com.android.wallpaper.holospiral
package:com.android.wallpaper.livepicker
package:com.example.myapp
package:com.svox.pico
package:jp.co.omronsoft.openwnn
300
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ (.apk) āđ€āļžāļīāđˆāļĄ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ pm install āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
# pm install /sdcard/com.twitter.android-1.apk
āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ›āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰
# pm list packages | grep twitter
āđāļŠāļ”āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļ—āļĩāđˆāđ€āļāđ‡āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ›
# pm path com.twitter.android
āļ„āļģāļŠāļąāđˆāļ‡ svc (service control) āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļĢāļīāļāļēāļĢāļ āļēāļĒāđƒāļ™
# svc help
Available commands:
help Show information about the subcommands
power Control the power manager
data Control mobile data connectivity
wifi Control the Wi-Fi manager
usb Control Usb state
# svc power
Control the power manager
usage: svc power stayon [true|false|usb|ac]
Set the 'keep awake while plugged in' setting.
# svc data
Control mobile data connectivity
usage: svc data [enable|disable]
Turn mobile data on or off.
svc data prefer
Set mobile as the preferred data network
# svc wifi
Control the Wi-Fi manager
usage: svc wifi [enable|disable]
Turn Wi-Fi on or off.
svc wifi prefer
Set Wi-Fi as the preferred data network
# svc usb
Control Usb state
usage: svc usb setFunction [function]
Set the current usb function.
svc usb getFunction
Gets the list of currently enabled functions
301
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 6 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāļšāļ™
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆ
āļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļŠāļđāļ‡āļŠāļļāļ”āđ€āļ—āđˆāļēāļ—āļĩāđˆāđ€āļ„āļĒāļĄāļĩāļĄāļēāđāļĨāļ°āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļžāļīāļŠāļđāļˆāļ™āđŒāđƒāļŦāđ‰
āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļĻāļąāļāļĒāļ āļēāļžāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļšāļ—āļšāļēāļ—āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ•āđˆāļ­āļĄāļ§āļĨāļĄāļ™āļļāļĐāļĒāļŠāļēāļ•āļīāļī āļ—āļąāđ‰āļ‡āđƒāļ™āđ‚āļĨāļāļ‚āļ­āļ‡āļāļēāļĢ
āļŠāļ·āđˆāļ­āļŠāļēāļĢ āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđāļĨāļ°āļĄāļ­āļšāđ‚āļ­āļāļēāļŠāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļāđˆāđ€āļŦāļĨāđˆāļēāļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ—āļąāđˆāļ§āļ—āļļāļāļĄāļļāļĄāđ‚āļĨāļāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āļœāļđāđ‰āļœāļĨāļīāļ•āđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢ
āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĢāļ§āļĄāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĢāļ°āļšāļš
āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđāļĨāļ°āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĨāļ‡āļ•āļąāļ§ āđāļĨāļ°
āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āļ„āļ™āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒāļĢāļ°āļ”āļąāļšāļ āļēāļ„āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ āļĢāļ§āļĄāļ–āļķāļ‡
āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĒāļāļĢāļ°āļ”āļąāļšāļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āđƒāļŦāđ‰āļāļąāļšāļ›āļĢāļ°āđ€āļ—āļĻāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļ„āļĒāļĄāļĩāļĄāļēāļāđˆāļ­āļ™āđāļĨāļ°
āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ—āļĢāļēāļšāļāļąāļ™āļ”āļĩāļ§āđˆāļēāļ•āđ‰āļ™āļ™āđ‰āļģāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļ›āļĢāļ°āđ€āļ—āļĻāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđāļĨāđ‰āļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ›āļĢāļ°āđ€āļ—āļĻāļ—āļĩāđˆāļāļģāļĨāļąāļ‡
āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ­āļĒāļđāđˆāđƒāļ™āļāļēāļ™āļ°āļœāļđāđ‰āđƒāļŠāđ‰āļĄāļēāđ‚āļ”āļĒāļ•āļĨāļ­āļ”āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ„āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ‹āļ·āđ‰āļ­āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĄāļēāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļ›āļĢāļ°āđ€āļ—āļĻ
āļ‚āļ­āļ‡āļ•āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ€āļĄāļ·āđˆāļ­āļĒāļļāļ„āļ‚āļ­āļ‡āļ‹āļ­āļŸāļ—āđŒāđāļ§āļĢāđŒāđ€āļŠāļĢāļĩ (Open Source) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ” (Open
Operating System) āđāļŦāļĨāđˆāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ­āļąāļ™āļĄāļŦāļēāļĻāļēāļĨāđƒāļ™āđ‚āļĨāļāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļ™āđ‡āļ• āļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ
āđāļšāļšāđ€āļ›āļīāļ” (Open Hardware) āđ„āļ”āđ‰āļĄāļēāļ–āļķāļ‡āļˆāļļāļ”āļĨāļ‡āļ•āļąāļ§āđƒāļ™āļŠāđˆāļ§āļ‡āđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļāđ‡āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āđ‚āļ­āļāļēāļŠāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ™āļģ
āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āđ‰āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļ•āđˆāļ­āļĒāļ­āļ”āļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļĩāđ‰
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āđ„āļ—āļĒāļžāļĒāļēāļĒāļēāļĄāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĻāļēāļŠāļ•āļĢāđŒāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡
āđāļĨāļ°āļ™āļēāļ™āđ€āļžāļĩāļĒāļ‡āļžāļ­āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļœāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āļĄāļēāđāļāđ‰āļ›āļąāļāļŦāļēāļĢāļ°āļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļ­āļĒāđˆāļēāļ‡āđāļ—āđ‰āļˆāļĢāļīāļ‡ āļĢāļ§āļĄ
āļ—āļąāđ‰āļ‡āļ–āđ‰āļēāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļ„āļ™āđ„āļ—āļĒāļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ­āļ‡āļ„āđŒāļāļĢāļ āļēāļ„āļĢāļąāļāļŦāļĢāļ·āļ­
āļ āļēāļ„āđ€āļ­āļāļŠāļ™āļ”āđ‰āļ§āļĒāđāļĨāđ‰āļ§ āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļāđ‡āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļąāđˆāļ™āļ§āđˆāļēāđƒāļ™āļ­āļĩāļāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ‚āđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒāļāđ‡āļ­āļēāļˆāļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡
āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļžāļķāđˆāļ‡āļžāļēāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļˆāļēāļāļ›āļĢāļ°āđ€āļ—
āļĻāļ­āļ·āđˆāļ™āđ†āļĄāļēāļāđ€āļāļīāļ™āđ„āļ› āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđāļ‚āđˆāļ‡āļ‚āļąāļ™āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļ™āļēāļ™āļēāļŠāļēāļ•āļīāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ āļēāļ„āļ āļđāļĄāļīāđƒāļˆāđ„āļ”āđ‰
302
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļķāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļ‚āļąāļšāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļāļēāļĢ
āļžāļąāļ’āļ™āļēāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļāļĐāļ•āļĢāļāļĢāļĢāļĄāđāļĨāļ°
āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđƒāļ™āļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ—āļąāđˆāļ§āļ–āļķāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļŦāļĨāļēāļĒāđ†āļ­āļĒāđˆāļēāļ‡āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°
āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļš
āļŠāļđāļ‡ āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļĢāļ°āļšāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™
āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļĢāļ§āļĄāļ–āļķāļ‡āļĢāļđāđ‰āđāļ™āļ§āļ—āļēāļ‡āļ§āļīāļ˜āļĩāļāļēāļĢāđāļāđ‰āđ„āļ‚āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļēāļ
āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļĻāļēāļŠāļ•āļĢāđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āđˆāļēāļ‡āđ† (āđ€āļŠāđˆāļ™
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āđāļĨāļ°āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ) āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Android Studio IDE
āđƒāļ™āļ‡āļēāļ™ Google I/O 2013 āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē Android
Studio IDE āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ IntelliJ IDEA āđ€āļžāļ·āđˆāļ­āļĄāļēāđāļ—āļ™āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ•āļąāļ§āđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰
āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE āđ‚āļ”āļĒāļ‚āđ‰āļ­āļ”āļĩāļ‚āļ­āļ‡ Android Studio IDE āļ„āļ·āļ­āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™ āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļąāļāļĐāļ“āļ°
Live Layout, Live Coding (WYSIWYG Editor) āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļŦāđ‡āļ™āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļđāļ›āļ āļēāļžāđāļĨāļ°
āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļĢāļēāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāđ„āļŸāļĨāđŒāļ­āļ·āđˆāļ™ (Preview) āđāļĨāļ°āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (Lint tools) āļ„āļĢāļš
āļ–āđ‰āļ§āļ™ āđ€āļŠāđˆāļ™āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĢāļļāđˆāļ™āļāđˆāļ­āļ™āđ† āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļĢāļđāļ›āļ—āļĩāđˆ 6.1 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio
303
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ ANDROID STUDIO IDE
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows:
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ EXE android-studio-bundle-<version>.exe āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ­āļĒāļđāđˆāļĄāļĩāļāļēāļĢ
āļĢāđ‰āļ­āļ‡āļ‚āļ­āđƒāļŦāđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡ JAVA āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ (environment variables)
āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļ Start menu > Computer > System Properties > Advanced System Properties
āđ€āļĨāļ·āļ­āļāđāļ—āļš Advanced > Environment Variables āļāļ”āļ›āļļāđˆāļĄ â€œadd a new system variable” āļˆāļēāļāļ™āļąāđ‰āļ™
āđƒāļŦāđ‰āđƒāļŠāđˆ path āļ‚āļ­āļ‡ JAVA_HOME āđ€āļŠāđˆāļ™ C:Program FilesJavajdk1.7.0_21.
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS X:
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ dmg android-studio-bundle-<version>.dmg āļ‹āļķāđˆāļ‡āļ›āļąāļāļŦāļēāļ—āļĩāđˆāļžāļšāđ€āļˆāļ­āļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ„āļ·āļ­
āļāļēāļĢāļ‚āļ­āļŠāļīāļ—āļ˜āļīāđŒāļ­āļ™āļļāļāļēāļ• (Permissions) āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰ āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ System Preferences > Security &
Privacy āļ—āļĩāđˆāđāļ—āļšāļ‚āļ­āļ‡ Allow applications downloaded āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Anywhere
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ:
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ android-studio-bundle-<version>.tgz āđ€āļĄāļ·āđˆāļ­āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāļāđ‡āđƒāļŦāđ‰āđāļ•āļ
āđ„āļŸāļĨāđŒ āđāļĨāđ‰āļ§āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ ./studio.sh āđ€āļĄāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĢāđ‡āļˆāđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāđƒāļ™āđ„āļŸāļĨāđŒ ~/.bashrc āđ€āļŠāđˆāļ™
PATH āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ android-studio/bin/
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļ„āļĢāļąāđ‰āļ‡āđāļĢāļāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.2 āļŦāļ™āđ‰āļēāļ•āļēāļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āļŦāļĢāļ·āļ­āļ™āļģāđ€āļ‚āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
304
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ—āļ”āļŠāļ­āļšāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ (New Project...) āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āđāļĨāđ‰āļ§āļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›
āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ€āļŠāđˆāļ™
Application name: āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
Module name:
Package name: āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡ Package āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™
Project location: āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļ„
Minimum required SDK: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ•āđˆāļģāļŠāļļāļ”āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰
Target SDK: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļ‚āđ‰āļ‡āļēāļ™
Compile with: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ—āļĩāđˆāļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
Theme: āļĨāļąāļāļĐāļ“āļ°āļ˜āļĩāļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļĢāļđāļ›āļ—āļĩāđˆ 6.3 āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ„āļ­āļ„āļ­āļ™ āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ„āļ­āļ„āļ­āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
305
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.4 āļāļģāļŦāļ™āļ”āļĢāļđāļ›āđ„āļ­āļ„āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ„āđˆāļēāļ—āļēāļ‡āļāļĢāļēāļŸāļŸāļīāļāļ•āđˆāļēāļ‡āđ†
āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Blank
Activity, Fullscreen Activity, Login Activity, Master/Detail Flow āļŦāļĢāļ·āļ­ Settings Activity āđ‚āļ”āļĒāđƒāļ™
āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ‚āļ­āđ€āļĨāļ·āļ­āļ Blank Activity āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Activity āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ§āđˆāļē MainActivity āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ
Finish āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
āļĢāļđāļ›āļ—āļĩāđˆ 6.5 āđ€āļĨāļ·āļ­āļ template āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Activity
306
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ āđāļĨāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđ€āļˆāļ„āļ•āļēāļĄāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 6.6 āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļœāđˆāļēāļ™ Gradle āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„
āļĢāļēāļĒāļāļēāļĢāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 6.7 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„
307
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res (Resource) āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒāđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— XML āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš
āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Layout āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res āļˆāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™
āđ„āļŸāļĨāđŒāļ āļēāļž āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļ‡ āđ€āļĄāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res āļāđ‡āļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĢāļ§āļĄ
āļāļąāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē R.java
āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āđƒāļ™āđ„āļŸāļĨāđŒ AndroidMainfest.xml
āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāđ„āļŸāļĨāđŒāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ Activities, Services, Broadcast Receivers āđāļĨāļ° Con-
tent Providers āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
AndroidManifest.xml
Activities
Services
BroadcastReceiviers
ContentProviders
āļĢāļđāļ›āļ—āļĩāđˆ 6.8 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļ‚āļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļš āļ”āļąāļ‡āļ™āļąāđ‰āļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļāļēāļĻāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļŠāļīāļ—āļ˜āļīāđŒ āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē AndroidManifest.xml āļ”āđ‰āļ§āļĒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidaudiostream"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
308
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
android:name="com.example.androidaudiostream.ActivityAudioDecode"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡ XML āļ”āđ‰āļēāļ™āļšāļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ—āļĩāđˆāļĄāļĩāļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē
manifest āđ‚āļ”āļĒāļŦāļĨāļąāļāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļŠāļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāļ„āļ·āļ­ android:versionCode āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ
āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ“āļ°āļ—āļĩāđˆāļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļĢāļēāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļšāļšāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ (upgrade) āļŦāļĢāļ·āļ­āļĨāļ”āļĢāļļāđˆāļ™āļĨāļ‡
(downgrade) āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ android:versionName āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļĢāļ°āļšāļļāđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđāļŠāļ”āļ‡āđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <application> āļˆāļ°āļĢāļ°āļšāļļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ‰āļĨāļēāļ (label) āđāļĨāļ°āđ„āļ­āļ„āļ­āļ™ (Icon) āļ‚āļ­āļ‡
āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <activity> āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ°
āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ•āļąāļ§ android:name āđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āđāļžāđ‡āļ„āđ€āļāļˆāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ
āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <intent-filter> āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļđāđ‰āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
āļ‡āļēāļ™āļ„āļ­āļĄāđ‚āļžāđ€āļ™āđ‡āļ™āļ•āđŒāļ•āļąāļ§āđ„āļŦāļ™āļšāđ‰āļēāļ‡ āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻāļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ < a c t i o n > āđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­
android.intent.action.MAIN āđ€āļ›āđ‡āļ™āļāļēāļĢāļšāļ­āļāļ§āđˆāļēāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļšāļ™āļ­āļļāļ›-
āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ„āļ”āđ‰ 2 āļ—āļēāļ‡āļ„āļ·āļ­
āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Emulator
āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Emulator āļāđˆāļ­āļ™āļ­āļ·āđˆāļ™āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Emulator āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™
āļĢāļēāļĒāļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļāđˆāļ­āļ™ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āļ›āļĢāļēāļāļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ
āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļ”āļŠāļ­āļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
309
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Android Emulator
āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļœāđˆāļēāļ™ ADB
āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĩāļāļ§āļīāļ˜āļĩāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ ADB āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡
āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ§āļīāļ˜āļĩāļāļēāļĢāļ™āļĩāđ‰āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ„āļ§āļēāļĄāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ”āļĩāļāļ§āđˆāļē
āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™ Emulator
āļĢāļđāļ›āļ—āļĩāđˆ 6.10 āđāļŠāļ”āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Android āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
310
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ ECLIPSE IDE āļĄāļēāļŠāļđāđˆ ANDROID STUDIO
āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™āļĒāļļāļ„āđāļĢāļāđ†āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Eclipse
IDE āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļ”āļīāļĄāļ—āļĩāđˆāđ€āļ„āļĒāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™ Eclipse IDE āļĄāļēāļŠāļđāđˆ Android Studio IDE
āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: Export āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄāļˆāļēāļ Eclipse IDE
1. āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđ€āļˆāļ„āđāļĨāļ°āļ­āļąāļžāđ€āļ”āļ• ADT Plugin (āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 22.0 āļŦāļĢāļ·āļ­āļŠāļđāļ‡āļāļ§āđˆāļē)
2. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File > Export
3. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Generate Gradle build les āļ āļēāļĒāđƒāļ™ Android āļˆāļēāļāļ™āļąāđ‰āļ™
āļāļ”āļ›āļļāđˆāļĄ Finish
āļĢāļđāļ›āļ—āļĩāđˆ 6.11 āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Gradle build les
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: Import āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆ Android Studio
1. āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File > Import Project
2. āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāđ„āļ›āļĒāļąāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđ‚āļ›āļĢāđ€āļˆāļ„ āđ€āļĨāļ·āļ­āļ build.gradle āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Finish
3. āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ•āļēāļĄ Dialog āļ—āļĩāđˆāđāļŠāļ”āļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK
311
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
APACHE ANT āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
Apache Ant āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļŠāļ„āļĢāļīāļ›āļ—āđŒ (Script) āđƒāļ™āļĢāļđāļ›āđāļšāļš XML āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļ packages āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰
āđ‚āļ›āļĢāđāļāļĢāļĄ ant āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ .APK (Android Package) āđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš
āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđāļĨāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ â€œmake” āđƒāļ™āļĢāļ°āļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ
āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Ant (http://ant.apache.org) āļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļŠāļ­āļšāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™
āļāļēāļ™ (srcantTest.java) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
package ant;
class Test {  
public static void main(String args[])  
{     
System.out.println("Hello World from ANT");   
}
}
āļŠāļ„āļĢāļīāļ›āļ—āđŒāđ„āļŸāļĨāđŒ srcantbuild.xml
<project basedir="." default="make"> 
<property name="root" value="../.." />
 <property name="classes" value="${root}/classes" /> 
 <property name="srcroot" value="${root}/src" />
 <path id="project.class.path">
  <pathelement location="${classes}" />   
    </path>
 <target name="make"> 
  <javac debug="true" srcdir="${srcroot}" includes="ant/**/*.java"
destdir="${classes}">
  </javac>
 </target>
 <target name="run" depends="make" description="Run Test"> 
  <java classname="ant.Test" classpathref="project.class.path"  fork="true">
  </java>
 </target> 
  <target name="clean" description="clean all classes">
  <delete dir="${classes}/ant"/>
  </target>
</project>
<?xml version="1.0" encoding="UTF-8"?>
āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™ .APK
C:...srcant>ant make
Buildfile: build.xml
make:
312
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
BUILD SUCCESSFUL
Total time: 0 seconds
C:...srcant>ant run
Buildfile: build.xml
make:
run:
     [java] test ANT
BUILD SUCCESSFUL
Total time: 0 seconds
C:...srcant>ant clean
Buildfile: build.xml
clean:
   [delete] Deleting directory C:...classesant
BUILD SUCCESSFUL
Total time: 0 seconds
āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ (.APK) āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ bin āļœāļđāđ‰āđˆāđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļŸāļĨāđŒ .APK āđ„āļ›āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđƒāļ™ An-
droid Emulator āļŦāļĢāļ·āļ­āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb install <āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ>.apk
ANDROID ACTIVITY
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ : āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity)
āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity) āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļžāļĢāļēāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰
āļœāđˆāļēāļ™ UI āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
UI Activity
Service
Operating
System
āļŠāđˆāļ‡ broadcast
Intent
āļāļēāļĢ Intent
āđ‚āļ”āļĒāļ•āļĢāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.12 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđāļ•āđˆāļĨāļ° activity āļˆāļ°āđāļ—āļ™āļŦāļ™āļķāđˆāļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ‚āļķāđ‰āļ™āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
313
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.13 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° activity
āļ‹āļķāđˆāļ‡āđƒāļ™āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ•āļąāļ§āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđƒāļ”āļ•āļąāļ§
āļŦāļ™āļķāđˆāļ‡āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™ āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ°āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°
āđ€āļĢāļĩāļĒāļāđƒāļŦāđ‰āļ•āļąāļ§āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ­āļ·āđˆāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļŠāđāļ•āđ‡āļ (Stack) āļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļ•āļēāļĄāļĨāļģāļ”āļąāļšāđ„āļ›āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
Activity
Activity
Activity
Activity āļ—āļĩāđˆāļ—āđāļēāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļē (foreground)
(visible āđāļĨāļ° focused)
Task (stack of activity)
Activity āļ—āļĩāđˆāļ—āđāļēāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡
(background)
āļĢāļđāļ›āļ—āļĩāđˆ 6.14 āļ‚āļšāļ§āļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āļ­āļ‡ activities āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ
āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļˆāļ°āļĄāļĩ 4 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāđ„āļ”āđ‰āđāļāđˆ
1)Activity
2)Service
3)Intent
4)Broadcast Receiver
314
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļēāļĢāļēāļ‡ 6.1 āđāļŠāļ”āļ‡āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ 4 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Android
āļ›āļĢāļ°āđ€āļ āļ— āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™
Activity
āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļš User
Interface
āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ, āļĢāļđāļ›āļ āļēāļž, āđ€āļĨāđˆāļ™āđ€āļāļĄāļŠāđŒ āļŊāļĨāļŊ
Service āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ āđ€āļĨāđˆāļ™āđ€āļžāļĨāļ‡, āļĢāļ°āļšāļšāļ‹āļīāļ‡āļ„āđŒāļ‚āđ‰āļ­āļĄāļđāļĨ
Intent
Intent āļŠāļ™āļīāļ” Directed Intent āļāļēāļĢāđāļˆāđ‰āļ‡āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰
Intent
Intent āļŠāļ™āļīāļ” Broadcast Intent āļāļēāļĢāđāļˆāđ‰āļ‡āđāļšāļšāļāļĢāļ°āļˆāļēāļĒāđ„āļ›āļĒāļąāļ‡āļ—āļļāļāđ‚āļ›āļĢāđ€āļ‹āļŠ
Intent
Intent Filter āļĢāļēāļĒāļāļēāļĢāļ‚āļ­āļ‡ Intents āđƒāļ™ Activity āļŦāļĢāļ·āļ­
Services
Broadcast Receiver āļāļēāļĢāļ‚āļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨ GPS, Internet, āļŠāļĄāļļāļ”āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āļŊāļĨāļŊ
āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ• (lifecycle) āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰
Starting
Running
Stopped Stopped
Destroyed
1. onCreate()
2. onStart()
3. onResume()
onPause()
onResume()
onStop()
onDestroy()
āļĢāļđāļ›āļ—āļĩāđˆ 6.15 āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity)
315
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāđˆāļ§āļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 3 āļŠāđˆāļ§āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļ„āļ·āļ­
1. Entire Lifetime āļ„āļ·āļ­āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđāļĨāļ°āļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āđƒāļ™āļŠāđˆāļ§āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ„āļ·āļ­ onCreate() āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ–āļđāļāļŠāļąāđˆāļ‡āļ›āļīāļ”āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ„āļ·āļ­ onDestroy()
2. Visible Lifetime āļ„āļ·āļ­āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ‚āļ”āļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē
āđāļĨāđ‰āļ§ āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onStart() āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰
āļ™āļąāđ‰āļ™āļ–āļđāļāļŠāļąāđˆāļ‡āļ›āļīāļ”āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāđˆāļ­āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onStop()
3. Foreground Lifetime āļ„āļ·āļ­āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļēāđ€āļŠāđˆāļ™ āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļ–āļđāļāļ”āļąāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ”āđ‰āļēāļ™āļšāļ™āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onResume()
āđāļĨāļ°āļ–āđ‰āļēāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļāļģāļĨāļąāļ‡āļˆāļ°āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļŦāļĢāļ·āļ­āļ–āļēāļ§āļĢ āļāđ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onPause() āļŦāļĢāļ·āļ­
onDestroy()
āļĢāļđāļ›āļ—āļĩāđˆ 6.16 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰
316
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰
āļˆāļēāļāđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āļ˜āļīāļšāļēāļĒāļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļˆāļ°
āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄ Lifecycle āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāđāļĨāđ‰āļ§āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™
public class ActivityA extends Activity {
	 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Log.d("Embedded Debug”, onCreate - Called when the Activity is first created”);
}
	 @Override
protected void onStart() {
Log.d("Embedded Debug”, onStart - Called when the Activity is becoming
visible to the User”);
	 super.onStart();
}
	 @Override
protected void onRestart() {
Log.d("Embedded Debug”, onRestart - Called after your activity has been
stopped, prior to it being started again”);
super.onRestart();
}
	 @Override
protected void onResume() {
Log.d("Embedded Debug”, onResume - Called when the Activity will start in-
teracting with the User”);
super.onResume();
}
	 @Override
protected void onPause() {
Log.d("Embedded Debug”, onPause - Called when the system is about to start
resuming a previous activity”);
super.onPause();
}
	 @Override
protected void onStop() {
Log.d("Embedded Debug”, onStop - Called when the Activity is no longer visi-
ble to the User because another activity has been resumed and is covering this
one”);
super.onStop();
}
	 @Override
protected void onDestroy() {
317
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Log.d("Embedded Debug”, onDestroy - the final call you receive before your
activity is destroyed”);
super.onDestroy();
}
	 public void startActivityB(View v) {
	 	 Intent intent = new Intent(ActivityA.this, ActivityB.class);
	 	 startActivity(intent);
	 }
	 public void startActivityC(View v) {
	 	 Intent intent = new Intent(ActivityA.this, ActivityC.class);
	 	 startActivity(intent);
	 }
	 public void finishActivityA(View v) {
	 	 ActivityA.this.finish();
	 }
}
āđ„āļŸāļĨāđŒ AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dark_blue"
android:padding="8dip"
>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
>
<Button
android:id="@+id/btn_start_b"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_start_b_label"
android:onClick="startActivityB"
/>
<Button
android:id="@+id/btn_start_c"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_start_c_label"
318
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
android:layout_toRightOf="@id/btn_start_b"
android:onClick="startActivityC"
/>
<Button
android:id="@+id/btn_finish_a"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_finish_a_label"
android:layout_toRightOf="@id/btn_start_c"
android:onClick="finishActivityA"
/>
<Button
android:id="@+id/btn_start_dialog"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_start_dialog_label"
android:layout_toRightOf="@id/btn_finish_a"
android:onClick="startDialog"
/>
</RelativeLayout>
</LinearLayout>
āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āđ‚āļ”āļĒāļˆāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™
āļ–āļķāļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ A āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ›āļĢāđāļāļĢāļĄ
āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļąāļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ A āļ‚āļķāđ‰āļ™āļĄāļē āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđāļŠāļ”āļ‡ layout āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ„āļ§āđ‰āļ‹āļķāđˆāļ‡
āļ āļēāļĒāđƒāļ™ layout āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ B āđ€āļĢāļĩāļĒāļāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ C
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđāļĨāļ°āļœāļĨāļāļēāļĢāļ—āļģāļāļēāļĢāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
android:onClick="startActivityB"
319
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.17 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
USER INTERFACE
āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļāļēāļĢāļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđāļĨāđ‰āļ§ āđƒāļ™āļŠāđˆāļ§āļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļĄāļĩāļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļ
āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļŸāļīāļāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ—āļąāđˆāļ§āđ„āļ› āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāļāļąāļ™āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļ§āđˆāļē User Inter-
face (UI) āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­ UI āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ†āļĄāļēāļāļĄāļēāļĒ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢ
āļāđ‡āļ•āļēāļĄāļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ•āđ‰āļ­āļ‡
āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē User Experience (UX) āļ„āļ§āļšāļ„āļđāđˆāđ„āļ›
āļ”āđ‰āļ§āļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĻāļķāļāļĐāļēāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļžāļĪāļ•āļīāļāļĢāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ„āļŪāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļĄāđˆ
āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŦāļ™āđ‰āļēāļˆāļ­āļŠāļąāļĄāļœāļąāļŠāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļĨāļ°āļāļēāļĢāļžāļąāļ’āļ™āļē
āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļšāļ„āļđāđˆāļāļąāļ™āđ„āļ›āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ
āļŦāļ™āđˆāļ§āļĒāļ„āđˆāļēāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŦāļ™āđ‰āļēāļˆāļ­āļŠāļąāļĄāļœāļąāļŠāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨ āļāļēāļĢāļ­āļ­āļāđāļšāļš
āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™
āđ‚āļ”āļĒāļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰
āļŦāļ™āđˆāļ§āļĒāļ„āđˆāļēāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļ
āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļĢāļēāļŸāļŸāļīāļ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĄāļĩāļ›āļąāļāļŦāļē
āđƒāļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļžāļ­āļŠāļĄāļ„āļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļĒāļđāđˆāđ„āļĄāđˆāļ™āđ‰āļ­āļĒ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ™āļąāđ‰āļ™
āļĄāļĩāļ­āļĒāļđāđˆāļĄāļēāļāļĄāļēāļĒāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ‚āļ­āļ‡āļŠāļąāļ”āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāļˆāļ­āđāļŠāļ”āļ‡āļœāļĨ āđ€āļŠāđˆāļ™āļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­
480x320, 800x480, 960x540, 1280x720 āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļœāļĨāļ•āđˆāļ­āļāļēāļĢāļ­āļ­āļāđāļšāļšāļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢ
āļāļģāļŦāļ™āļ”āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ§āļēāļ‡āļāļĢāļēāļŸāļŸāļīāļāļŦāļĢāļ·āļ­āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ†āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļˆāļļāļ”āļŠāļĩ (Pixel) āđāļšāļšāļ•āļēāļĒāļ•āļąāļ§āđ„āļ”āđ‰
āđ€āļžāļĢāļēāļ°āļŦāļēāļāļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļˆāļļāļ”āļŠāļĩāļ•āļēāļĒāļ•āļąāļ§āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļāđ‡
āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļœāļīāļ”āđ€āļžāļĩāđ‰āļĒāļ™āđ„āļ›āļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđ„āļ”āđ‰
320
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļœāļđāđ‰āļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āļ„āļīāļ”āļ„āđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļˆāļļāļ”āļŠāļĩāđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆ
āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ€āļāļīāļ”āļ„āļ§āļēāļĄāļ„āļĨāļēāļ”āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđ€āļĢāļĩāļĒāļāļŦāļ™āđˆāļ§āļĒāļ™āļĩāđ‰āļ§āđˆāļēāļŦāļ™āđˆāļ§āļĒ â€œdp” (Density Independent Pixel)
āļŦāļĢāļ·āļ­āļˆāļļāļ”āļŠāļĩāđ€āļŠāļĄāļ·āļ­āļ™ (Virtual Pixel) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ‚āļ­āļ‡āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļŠāļĄāļĄāļ•āļīāļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļ­āļīāļ‡āļˆāļēāļāļ„āļ§āļēāļĄ
āļĨāļ°āđ€āļ­āļĩāļĒāļ” (Resolution), āļ‚āļ™āļēāļ” (Size) āđāļĨāļ°āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™āļˆāļļāļ”āļŠāļĩ (Pixel) (Density) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ
āļ™āļąāđ‰āļ™āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āđˆāļē dp āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Text) āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļĢāļđāļ›āļ āļēāļžāļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ”
āļ‚āļ­āļ‡āļ›āļļāđˆāļĄāļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļ”āļąāļ‡āļ™āļĩāđ‰
1 dp = (āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™āļ‚āļ­āļ‡āļˆāļ­) / 160
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āđāļšāđˆāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ›āđ‡āļ™āļŦāļĨāļēāļĒāļ‚āļ™āļēāļ”āđ‚āļ”āļĒāļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
3" 5" 7" 11" 13"
120 160 240 320 480 640
ldpi mdpi hdpi xdpi xxdpi xxxdpi
Actual size (inches)
Actual density (dpi)
small normal large xlarge xxlarge xxxlarge
āļĢāļđāļ›āļ—āļĩāđˆ 6.18 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļĨāļ°āļ„āđˆāļē dpi
āļĨāđˆāļēāļŠāļļāļ”āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 4.3 āđ„āļ”āđ‰āļ›āļĢāļ°āļāļēāļĻāļ­āļ­āļāļĄāļēāļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢāđāļĨāđ‰āļ§āļ§āđˆāļēāļžāļĢāđ‰āļ­āļĄāļˆāļ°
āļĢāļ­āļ‡āļĢāļąāļšāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļĢāļ°āļ”āļąāļš extra extra high dpi (xxhdpi) āļ‚āļ™āļēāļ” 640 dpi āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™
āđāļĨāļ°āđƒāļ™āļ­āļ™āļēāļ„āļ•āļ­āļąāļ™āđƒāļāļĨāđ‰āļ™āļĩāđ‰āļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļāđ‡āļˆāļ°āđ€āļ—āļĩāļĒāļšāđ€āļ—āđˆāļēāļāļąāļšāļ„āđˆāļēāļ„āļ§āļēāļĄ
āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ‚āļ—āļĢāļ—āļąāļĻāļ™āđŒāļ—āļĩāđˆ 4K āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™
â€Ē ldpi (low dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āđ„āļĄāđˆāđ€āļāļīāļ™ 120 dpi
â€Ē mdpi (medium dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ 120 - 160 dpi āđ€āļŠāđˆāļ™āļĢāļļāđˆāļ™ T-Mobile G1
â€Ē hdpi (high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ 160 - 240 dpi āđ€āļŠāđˆāļ™āļĢāļļāđˆāļ™Â Nexus S
â€Ē xdpi (extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 240 dpi āļ‚āļķāđ‰āļ™āđ„āļ› (320 dpi āļšāļ™āļĢāļļāđˆāļ™Â Galaxy
Nexus/N4 āļŦāļĢāļ·āļ­ 480 dpi āļšāļ™āļĢāļļāđˆāļ™ HTC One)
321
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
â€Ē xxdpi (extra extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 480 dpi āļ‚āļķāđ‰āļ™āđ„āļ›
â€Ē xxxdpi (extra extra extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 640 dpi āļ‚āļķāđ‰āļ™āđ„āļ›
āļ‹āļķāđˆāļ‡āļ„āđˆāļē dpi (Dot Per Inch) āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļˆāļģāļ™āļ§āļ™āļˆāļļāļ”āļŠāļĩāļ—āļĩāđˆāļĄāļĩāđ„āļ”āđ‰
āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ™āļēāļ” 1 āļ•āļēāļĢāļēāļ‡āļ™āļīāđ‰āļ§ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ”āđ‰āļēāļ™āļ‚āļ§āļē
āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļˆāļģāļ™āļ§āļ™āļˆāļļāļ”āđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ™āļēāļ” 1 āļ•āļēāļĢāļēāļ‡āļ™āļīāđ‰āļ§
āļˆāļ°āļĄāļĩāļˆāļļāļ”āļŠāļĩāđ€āļĢāļĩāļĒāļ‡āļāļąāļ™āļ­āļĒāļđāđˆāļˆāļģāļ™āļ§āļ™āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 300 x 300 Pixel āļ‹āļķāđˆāļ‡āļ„āđˆāļē
dpi āļĒāļīāđˆāļ‡āļŠāļđāļ‡āļāđ‡āļˆāļ°āļĄāļĩāļœāļĨāļ•āđˆāļ­āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāļĄāļŠāđŒāđƒāļ™āļĨāļąāļāļĐāļ“āļ° FPS āļŦāļĢāļ·āļ­āđ€āļāļĄāļŠāđŒāļĨāļąāļāļĐāļ“āļ° Shooting
āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§
āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļŠāļđāļ•āļĢāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļˆāļēāļāļ„āđˆāļē dpi āļ„āļ·āļ­
dp = pixel * (160 / dpi)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĒāļĩāđˆāļŦāđ‰āļ­ Samsung Galaxy Note 10.1 āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš mdpi
āļ‹āļķāđˆāļ‡āđ€āļ—āļĩāļĒāļšāļ„āđˆāļē dpi āđ€āļ—āđˆāļēāļāļąāļš 160 (āļ•āļēāļĄāļĢāļđāļ›āļ—āļĩāđˆ 6.8) āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ­āļĒāļđāđˆāļ—āļĩāđˆ 1280 x 800
Pixel āļ„āđˆāļē dp āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ—āđˆāļēāļāļąāļš
1280 * (160 / 160) = 1280 dp
800 * (160 / 160) = 800 dp
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung Galaxy Note 10.1 āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āđˆāļēāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš dp āđ€āļ—āđˆāļēāļāļąāļšÂ 1280 x 800 dp 
āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļ™āļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung Nexus 10 āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš xhdpi āļ—āļĩāđˆāļ„āđˆāļē dpi āđ€āļ—āđˆāļēāļāļąāļš 320 dpi (āļ•āļēāļĄāļĢāļđāļ›
āļ—āļĩāđˆ 6.8) āđāļĨāļ°āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļŠāļđāļ‡āļ–āļķāļ‡ 2560 x 1600 Pixel āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩāļ„āđˆāļēāļŠāļđāļ‡āļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung
Galaxy Note 10.1 āđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ—āđˆāļēāļāļąāļš
2560 * (160 / 320) = 1280 dp
1600 * (160 / 320) = 800 dp
āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļ„āđˆāļē dp āļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļ„āđˆāļē 1280 x 800 dp āđ€āļ—āđˆāļēāļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļ„āļ§āļĢāļĒāļķāļ”āļ„āđˆāļē dp āđ€āļ›āđ‡āļ™
āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ§āļēāļ‡āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļ—āļĩāđˆāļĒāļąāļ‡āļ„āļ‡āđāļŠāļ”āļ‡āđƒāļ™āļŠāļąāļ”āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ
āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļĄāļēāļˆāļēāļ: http://www.akexorcist.com/2013/03/android-design-dp.html
322
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
1 āļ™āļīāđ‰āļ§
5āļˆāļļāļ”āļŠāļĩ
5 āļˆāļļāļ”āļŠāļĩ
1 āļˆāļļāļ”āļŠāļĩ (pixel)
āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ” āđ€āļ—āđˆāļēāļāļąāļš 5 dpi
(5 āļˆāļļāļ”āļŠāļĩāļ•āđˆāļ­ 1 āļ™āļīāđ‰āļ§)
āļĢāļđāļ›āļ—āļĩāđˆ 6.19 āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļīāļ”āļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ” (dpi) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­
View āđāļĨāļ° ViewGroup
View āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ‚āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ UI āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™
āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ TextView, ImageView, SurfaceView, ViewGroup āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ„āļĨāļēāļŠ
ViewGroup āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļĒāļēāļĒāļ‚āļ­āļ‡ View āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĄāļĩ View āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ•āļąāļ§āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāđ€āļŠāļ·āđˆāļ­āļĄ
āļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡ View āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰
ViewGroup
View
ViewGroup
View
View
āļĢāļđāļ›āļ—āļĩāđˆ 6.20 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ ViewGroup āđāļĨāļ° View
Input Controls
āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ§āļąāļ•āļ–āļļ (Object) āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ‚āļ•āđ‰āļ•āļ­āļšāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰ āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ›āļļāđˆāļĄ (Button),
āļŠāđˆāļ­āļ‡āđƒāļŠāđˆāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (text elds), āļšāļēāļĢāđŒāļ•āļąāđ‰āļ‡āļ„āđˆāļē (seek bars), āļ›āļļāđˆāļĄāđ€āļĨāļ·āļ­āļ (checkboxes), āļ›āļļāđˆāļĄāļ‚āļĒāļēāļĒ (zoom but-
tons), āļ›āļļāđˆāļĄāļāļĨāļąāļšāļ„āđˆāļē (toggle buttons) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļĢāļđāļ›āļ—āļĩāđˆ 6.21 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ Input Controls
Layout Containers
āļ–āđ‰āļēāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ JAVA AWT āļŦāļĢāļ·āļ­ JAVA Swing āļ•āļąāļ§ layout āļāđ‡āđ€āļ›āļĢāļĩāļĒāļš
āđ€āļŠāļĄāļ·āļ­āļ™ JAVA Containers āļŠāđˆāļ§āļ™ View āļāđ‡āļˆāļ°āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™ JAVA Components āļŦāļĢāļ·āļ­ Widgets āļ™āļąāđˆāļ™āđ€āļ­āļ‡
āđ‚āļ”āļĒāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ layout āđāļĨāļ° view āđāļŠāļ”āļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
323
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Parent Layout
Button
Another Layout View (aka Widget)
TextView EditView
āļĢāļđāļ›āļ—āļĩāđˆ 6.22 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Layout āđāļĨāļ° components āļ•āđˆāļēāļ‡āđ†
āđ‚āļ”āļĒ layout āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļšāļĢāļĢāļˆāļļ View āđāļĨāļ° layout āļ­āļ·āđˆāļ™āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđ†āļ•āļąāļ§ āđ„āļ”āđ‰āđāļāđˆ
1. RelativeLayout āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ layout
āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ•āļąāļ§āļ§āļąāļ•āļ–āļļ (object) āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļāļ™āļąāđ‰āļ™āļāļąāļšāļ§āļąāļ•āļ–āļļāļ­āļ·āđˆāļ™āļ āļēāļĒāđƒāļ™ layout
āļŦāļĢāļ·āļ­āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļąāļšāļ•āļąāļ§ layout āļ—āļĩāđˆāļ§āļąāļ•āļ–āļļāļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āđ‚āļ”āļĒāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļœāđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚ (android:id) āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļ
āļŦāļĢāļ·āļ­ layout
āļĢāļđāļ›āļ—āļĩāđˆ 6.23 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš RelativeLayout
2. FrameLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđ€āļ›āđ‡āļ™āļŠāļąāđ‰āļ™āđ† āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļĄāļļāļĄāļ‹āđ‰āļēāļĒāļšāļ™
(top-left) āļ‚āļ­āļ‡ layout āđ€āļŠāļĄāļ­āđāļĨāļ°āļˆāļ°āļ™āļģāļ§āļąāļ•āļ–āļļāļ—āļĩāđˆāļ§āļēāļ‡āļ—āļĩāļŦāļĨāļąāļ‡āļĄāļēāđ„āļ§āđ‰āļŠāļąāđ‰āļ™āļšāļ™āļŠāļļāļ”āļ‚āļ­āļ‡ layout
324
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.24 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš FrameLayout
3. LinearLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ§āļąāļ•āļ–āļļāđ€āļ›āđ‡āļ™āđāļ™āļ§āđ€āļŠāđ‰āļ™āļ•āļĢāļ‡ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđ€āļ›āđ‡āļ™āđāļ™āļ§āļ•āļąāđ‰āļ‡āļŦāļĢāļ·āļ­āđāļ™āļ§āļ™āļ­āļ™
āļāđ‡āđ„āļ”āđ‰ āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ™ android:orientation (horizontal/vertical)
āļĢāļđāļ›āļ—āļĩāđˆ 6.25 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš LinearLayout āđāļ™āļ§āļ•āļąāđ‰āļ‡
325
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.26 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš LinearLayout āđāļ™āļ§āļ™āļ­āļ™
4. TableLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđƒāļ™āđāļšāļšāļ•āļēāļĢāļēāļ‡ āđ‚āļ”āļĒāļ§āļąāļ•āļ–āļļāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļ·āļ­āđ€āļ›āđ‡āļ™ 1 āļ„āļ­āļĨāļąāļĄāļ™āđŒ
āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāđāļ–āļ§āđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄ XML tag āļ‚āļ­āļ‡ TableRow
āļĢāļđāļ›āļ—āļĩāđˆ 6.27 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš TableLayout āđ„āļĄāđˆāļĄāļĩāđāļ–āļ§
326
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.28 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš TableLayout āļĄāļĩāđāļ–āļ§
5. AbsoluteLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāļ•āļēāļĄāļ•āļģāđāļŦāļ™āđˆāļ‡āļˆāļĢāļīāļ‡āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­ āđ‚āļ”āļĒāļˆāļ°āļāļģāļŦāļ™āļ”
āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļāđ„āļ”āđ‰āļœāđˆāļēāļ™āļ„āđˆāļē android:layout_x āđāļĨāļ° android:layout_y
āļĢāļđāļ›āļ—āļĩāđˆ 6.29 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš AbsoluteLayout
327
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
6. ListView āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āļšāļ—āļ­āļ”āļˆāļēāļāļ„āļĨāļēāļŠ ViewGroup āļ—āļĩāđˆāļĄāļĩāļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāļĢāļēāļĒāļāļēāļĢ (list) āļ‚āļ­āļ‡āđ„āļ­
āđ€āļ—āđ‡āļĄ (item) āđ‚āļ”āļĒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āđˆāļ­āļ™āļ‚āļķāđ‰āļ™āļĨāļ‡ (Scrolling) āđ€āļžāļ·āđˆāļ­āļ”āļđāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ‚āļ­āļ‡āļĢāļēāļĒāļāļēāļĢāđāļ•āđˆāļĨāļ°
āļĢāļēāļĒāļāļēāļĢāļˆāļ°āļ–āļđāļāđāļ—āļĢāļāļĨāļ‡āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļœāđˆāļēāļ™āļ—āļēāļ‡āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒ (Adapter)
āļĢāļđāļ›āļ—āļĩāđˆ 6.30 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē ListView
7. GridView āđ€āļ›āđ‡āļ™āļ­āļĩāļāļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āļšāļ—āļ­āļ”āļˆāļēāļāļ„āļĨāļēāļŠ ViewGroup āļ—āļĩāđˆāļĄāļĩāļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāļŠāļ­āļ‡āļĄāļīāļ•āļī (āđāļ–āļ§-
āļ„āļ­āļĨāļąāļĄāļ™āđŒ) āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ•āļēāļĢāļēāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāđ€āļĨāļ·āđˆāļīāļ­āļ™āļ‚āļķāđ‰āļ™āļĨāļ‡āđ€āļžāļ·āđˆāļ­āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļāļēāļĢāļˆāļ°āļ–āļđāļāđāļ—āļĢāļāļĨāļ‡āļ­āļąāļ•āļī
āđ‚āļ™āļĄāļąāļ•āļīāļœāđˆāļēāļ™āļ—āļēāļ‡āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđāļšāļš ListView
āļĢāļđāļ›āļ—āļĩāđˆ 6.31 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē GridView
āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Dialog āđāļĨāļ° Alert
āļ„āļ·āļ­āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ•āļ­āļšāđ‚āļ•āđ‰ (Dialog) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļŦāļĢāļ·āļ­āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
328
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.32 āđāļŠāļ”āļ‡ Dialog āļžāļ·āđ‰āļ™āļāļēāļ™
āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļ­āļĩāļāđāļšāļšāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŠāļąāđ‰āļ™āđ†āļŠāļąāđˆāļ§āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļ™āļķāđˆāļ‡ āđƒāļŦāđ‰āļ›āļĢāļēāļāļ
āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē Toast āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ‚āļ•āđ‰āļ•āļ­āļšāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđƒāļ” āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡
Toast.makeText(this, “text”, Toast.LENGTH_SHORT).show() āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.33 āđāļŠāļ”āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļšāļš toast
ANDROID ADAPTER
āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒ (Adapter) āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ AdapterView āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āđƒāļ™
ListView, GridView, spinner āļŦāļĢāļ·āļ­ Gallery āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰ Adapter āļĒāļąāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ View āļāļąāļšāļŠāļļāļ”
āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ—āļĩāđˆ AdapterView āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ‹āļķāđˆāļ‡āļ–āļđāļāļāļģāļŦāļ™āļ”āđ‚āļ”āļĒ Adapter āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļĄāļĩ
āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāļāđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āđ„āļ”āđ‰āđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§
329
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Adapter Adapter ViewDataSource
Cursor
ArrayList
List View
Grid View
Spinner
āļĢāļđāļ›āļ—āļĩāđˆ 6.34 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Adapter
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Adapter
	
  	
  	
  	
  1.	
  ArrayAdapter
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ„āđˆāļēāđ€āļ‚āđ‰āļēāđ„āļ›āđāļŠāļ”āļ‡āļšāļ™ listview āđāļĨāļ°āļĨāļšāļ„āđˆāļēāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡ list
āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_list.xml
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
āļĢāļđāļ›āļ—āļĩāđˆ 6.35 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_list.xml
āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_name.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textSize="18sp" />
330
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.36 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_name.xml
āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ MainActivity.java āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
package com.example.basicarrayadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
	 ListView listview;
	 private ArrayAdapter<String> mNewDevicesArrayAdapter;
	 String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
	 	 "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux",
	 	 	 "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
	 	 	 "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Android",
	 	 	 "iPhone", "WindowsMobile" };
	 @Override
	 protected void onCreate(Bundle savedInstanceState) {
	 	 super.onCreate(savedInstanceState);
	 	 setContentView(R.layout.device_list);
	 	 listview = (ListView) findViewById(R.id.listview);
	 	 mNewDevicesArrayAdapter = new ArrayAdapter<String>(this,
	 	 	 	 R.layout.device_name);
331
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
for (int i = 0; i < values.length; ++i) {
	 	 	 mNewDevicesArrayAdapter.add(values[i]);
	 	 }
	 	 listview.setAdapter(mNewDevicesArrayAdapter);
	 	 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	 	 	 public void onItemClick(AdapterView<?> parent, View view,
	 	 	 	 	 int position, long id) {
	 	 	 	 String item = (String) parent.getItemAtPosition(position);
	 	 	 	 mNewDevicesArrayAdapter.remove(item);
	 	 	 	 mNewDevicesArrayAdapter.notifyDataSetChanged();
	 	 	 }
	 	 });
	 }
}
āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰ ArrayAdapter āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
â€Ē	
  āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ ID āļ‚āļ­āļ‡āļ•āļąāļ§ ListView āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ xml āđ€āļ‚āđ‰āļēāļāļąāļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
â€Ē āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ Layout āļ‚āļ­āļ‡ xml āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ„āđˆāļēāđƒāļ™ ListView
â€Ē āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ ArrayAdapter
â€Ē āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ ArrayAdapter āđ€āļ‚āđ‰āļēāļāļąāļš listview āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
āļĢāļđāļ›āļ—āļĩāđˆ 6.37 āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
332
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
ANDROID INTENT
Intent āđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļˆāļ°āļžāļš
āļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ Activity āļ•āļąāļ§āļ­āļ·āđˆāļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļāļēāļĢāļŠāđˆāļ‡
āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļĄāļēāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.38 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰ intent āđāļĒāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Activity āđāļ•āđˆāļĨāļ°āļ•āļąāļ§
āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Intents
Intent āđāļšāđˆāļ‡āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ—āļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļĩāđ‰
1. Implicit Intent āđ€āļ›āđ‡āļ™ Intent āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰
āđƒāļ™āļ—āļąāļ™āļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āđ€āļ§āđ‡āļšāđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļĢāļēāļĒāļŠāļ·āđˆāļ­āļœāļđāđ‰āļ•āļīāļ”āļ•āđˆāļ­āđƒāļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āļāļēāļĢāđ‚āļ—āļĢāļ­āļ­āļ āđāļĨāļ°
āđāļœāļ™āļ—āļĩāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻ Intent āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
Intent i = new Intent(Intent.ACTION_WEB_SEARCH);
2. Explicit Intent āđ€āļ›āđ‡āļ™ intent āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ	
  
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻ Intent āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ activity āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™ ActivityTwo.class āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
Intent i = new Intent(this, ActivityTwo.class);
333
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
BROADCAST RECEIVER
Broadcast receivers āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđ‡āļ•āđˆāļ­āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļŠāļ™āļ­āļ‡āļŦāļĢāļ·āļ­āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ•āļēāļĄāļ—āļĩāđˆ
āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļāļģāļŦāļ™āļ”āđ€āļ­āļēāđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāļ”āđ‰āļ§āļĒāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāđāļˆāđ‰āļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āđ‚āļ”āļĒāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļĨāļąāļ‡āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđāļĄāđ‰āļˆāļ°āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āđāļĨāđ‰āļ§
āļāđ‡āļ•āļēāļĄāļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļŠāđˆāļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļĨāļąāļ‡āļ‚āļąāļšāļĢāļ–āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļĢāļąāļšāļŠāļēāļĒāđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļ„āļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ
āđ€āļ‚āđ‰āļēāļĄāļēāļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļ—āļģāļāļēāļĢāļ•āļąāļ”āļŠāļēāļĒāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ‚āļ—āļĢāļŊāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļąāļ™āļ—āļĩāđāļĨāļ°āļˆāļ°āļ—āļģāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (SMS) āļāļĨāļąāļšāđ„āļ›āļŦāļēāļ„āļ™
āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ‚āļ—āļĢāđ€āļ‚āđ‰āļēāļĄāļēāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļŦāļĢāļ·āļ­āļ­āļĩāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āļ§āđˆāļēāđ€āļĄāļ·āđˆāļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļšāļđāļ—āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ (AC-
TION_BOOT_COMPLETED) āļāđ‡āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđƒāļ™ Broadcast
receiver āđƒāļŦāđ‰āļ—āļģāļ‚āļķāđ‰āļ™āļĄāļēāļ—āļąāļ™āļ—āļĩ
Android
System
Broadcast
Receiver
āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ Intent
āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļ§āđˆāļēāļĄāļĩāļāļēāļĢāļ‚āļ­āđƒāļŠāđ‰ Intent
āļĢāļđāļ›āļ—āļĩāđˆ 6.39 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ intent
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Broadcast receivers
â€Ēāļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™ AndroidManifest.xml āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ„āļ§āđ‰ āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļšāļ•āļēāļĄ
āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļœāđˆāļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Context.registerReceiver()
â€Ēāđ€āļ‚āļĩāļĒāļ™āļ„āļĨāļēāļŠāļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļŠāļ·āļšāļ—āļ­āļ”āļ•āđˆāļ­āļĄāļēāļˆāļēāļāļ„āļĨāļēāļŠ BroadcastReceiver
â€Ēāļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onReceive() āļŠāļģāļŦāļĢāļąāļšāļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒ
(event) āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰
System broadcasts
āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš (system events) āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ„āļ‡āļ—āļĩāđˆāđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™
āļ”āļĢāļ­āļĒāļ”āđŒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
334
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļēāļĢāļēāļ‡ 6.2 āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš
Event Usage
Intent.ACTION_BATTERY_LOW āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ•āđˆāļģ
Intent.ACTION_BATTERY_OKAY āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ”āļĩ
Intent.ACTION_BOOT_COMPLETED āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļđāļ—āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ
Intent.ACTION_DEVICE_STORAGE_LOW āļĢāļ°āļ”āļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ•āđˆāļģ
Intent.ACTION_DEVICE_STORAGE_OK āļĢāļ°āļ”āļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ”āļĩ
Intent.ACTION_HEADSET_PLUG āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŦāļđāļŸāļąāļ‡āļ§āđˆāļēāļ•āđˆāļ­āļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđ„āļĄāđˆ
Intent.ACTION_LOCALE_CHANGED āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ āļēāļĐāļēāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ
Intent.ACTION_MY_PACKAGE_REPLACED āļ­āļąāļžāđ€āļ”āļ—āđāļ—āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ
Intent.ACTION_PACKAGE_ADDED āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆ
Intent.ACTION_POWER_CONNECTED āļ•āđˆāļ­āļŠāļēāļĒāđ„āļŸāđ€āļ‚āđ‰āļēāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ
Intent.ACTION_POWER_DISCONNECTED āļ–āļ­āļ”āļŠāļēāļĒāđ„āļŸāļ­āļ­āļāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒ
KeyChain.ACTION_STORAGE_CHANGED āđ€āļāļīāļ”āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡ keystore
BluetoothDevice.ACTION_ACL_CONNECTED Bluetooth ACL āđ€āļāļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­
AudioManager.ACTION_AUDIO_BECOMING_NOISY āđ€āļĨāļ·āļ­āļ audio output āļ—āļĩāđˆāļĄāļĩāļŠāļąāļāļāļēāļ“āļĢāļšāļ§āļ™āļ™āđ‰āļ­āļĒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļŦāļđāļŸāļąāļ‡āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļ§āđˆāļē ACTION_HEAD-
SET_PLUG āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŠāļļāļ”āļŦāļđāļŸāļąāļ‡ āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡āļ­āļĒāļđāđˆāļāđ‡āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāđ€āļ›āđ‡āļ™ â€œ1” āļ–āđ‰āļēāđ„āļĄāđˆāļāđ‡āļˆāļ°āļŠāđˆāļ‡
āļ„āđˆāļē “0” āđāļ—āļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļšāļĢāļ­āļ”āļ—āđŒāđāļ„āļŠāļ—āđŒ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļŠāļĩāļĒāļšāļŦāļđāļŸāļąāļ‡āđ€āļ‚āđ‰āļēāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
// MainActivity.java
package com.example.demoeebuubroadcastreceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentfilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
335
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
MyBroadCast mybroadcast = new MyBroadCast();
registerReceiver(myboradcast,intentfilter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
// MyBroadCast..java
package com.example.demoeebuubroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
Toast.makeText(context, "Headset is unplugged", Toast.LENGTH_LONG).show();
break;
case 1:
Toast.makeText(context, "Headset is plugged", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(context, "Unknow", Toast.LENGTH_LONG).show();
}
}
}
}
āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ (āļ”āđ‰āļēāļ™āļ‹āđ‰āļēāļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡ āļ”āđ‰āļēāļ™āļ‚āļ§āļēāļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡)
336
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.40 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļĩāļĒāļšāļŦāļđ
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android Native Development Kit
āļžāļ·āđ‰āļ™āļāļēāļ™ ANDROID NDK
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ— āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ„āļ”āđ‰āđāļāđˆ
â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļēāļĢāđŒāļ§āļīāļ„ (Dalvik applications) āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđāļĨāļ° SDK API
āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāđ„āļŸāļĨāđŒāļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ† (resource les) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
āđ€āļŠāđˆāļ™ āđ„āļŸāļĨāđŒ XML āđ„āļŸāļĨāđŒāļĢāļđāļ›āļŠāļ™āļīāļ” PNG āļĢāļ§āļĄāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ APK
â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ NDK (Android NDK applications) āļ‹āļķāđˆāļ‡āļĢāļ§āļĄāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ„āļŸāļĨāđŒ
āļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ† (resource les) āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ (āļŦāļĢāļ·āļ­āļ­āļēāļˆāļĄāļĩāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē
āđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰ (Assembly) āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ (Dynamic
linked library) āļ‹āļķāđˆāļ‡āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ â€œ.so” āđāļĨāđ‰āļ§āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ‚āļ”āļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ•āļēāļĄ
āļāļĨāđ„āļāļ‚āļ­āļ‡ JNI (JAVA Native Interface) āđāļĨāļ°āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđ‡āļˆāļ°āļ–āļđāļāļĢāļ§āļĄāļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ APK
337
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Android NDK Application
Dalvik Application
Java* Native
Library
āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē
Java
āļ—āđāļēāļāļēāļĢ Compile
āļ”āđ‰āļ§āļĒāļ„āđāļēāļŠāļąāđˆāļ‡ Javac
Compile
with Javac
Dynamic
Library
Java Native
Library Class
Android App
Class
āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ āļēāļĐāļē C
Head File
āļ—āđāļēāļāļēāļĢ Compile
āđāļĨāļ° Link āđ‚āļ„āđ‰āļ” C
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ C header
āļ”āđ‰āļ§āļĒāļ„āđāļēāļŠāļąāđˆāļ‡ Javah -jni
Application
File
Makele
āļĢāļđāļ›āļ—āļĩāđˆ 6.41 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ NDK āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļąāđˆāļ§āđ„āļ›
Android NDK āđ€āļ›āđ‡āļ™āļ­āļĩāļāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— Android NDK āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŦāļĢāļ·āļ­ āļ āļēāļĐāļē Assembly (Native Language)
āđāļĨāļ°āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ”āļĒāļĢāļ§āļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļŦāļĄāļēāļ°āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ›āļĢāļ°āđ€āļ āļ—āļāļēāļĢāđ€āļ‚āđ‰āļē-āļ–āļ­āļ”āļĢāļŦāļąāļŠāļŠāļąāļāļāļēāļ“āļ§āļīāļ”āļĩāđ‚āļ­ (Video en-
coding and decoding) āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļ āļēāļž (Image processing) āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒāļ—āļĩāđˆāļ‹āļąāļš
āļ‹āđ‰āļ­āļ™āđāļĨāļ°āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļŦāļ•āļļāļœāļĨāļŦāļĨāļąāļāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Native language (C/C++, Assembly) āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™
āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡
āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒāđ„āļ”āđ‰āļ”āļĩāļāļ§āđˆāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡ āđ„āļ”āđ‰āđāļāđˆ
â€Ēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (C/C++ āļŦāļĢāļ·āļ­ Assembly) āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļŦāļąāļŠāđ„āļšāļ™āļēāļĢāļĩ (binary code)
āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ‹āļķāđˆāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļ°āļ–āļđāļāđāļ›āļĨāđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ JAVA byte-code āđ‚āļ”āļĒāļ•āļąāļ§ DVM (Dalvik Virtual Machine) āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē
āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļļāđˆāļ™ 2.2 āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļžāļīāđˆāļĄāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđƒāļŦāđ‰āļāļąāļš
JAVA byte-code āļ”āđ‰āļ§āļĒāđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāđāļ›āļĨāļ‡āļšāđ‰āļēāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļŦāļąāļŠāđ„āļšāļ™āļēāļĢāļĩ (binary code) āļ”āđ‰āļ§āļĒ JIT Com-
piler (Just-In-Time Compiler) āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāđ‰āļēāļāļ§āđˆāļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ C/C++ āļ­āļĒāļđāđˆāļ”āļĩ
â€ĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android NDK āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–
āļžāļīāđ€āļĻāļĐāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļšāļēāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Android SDK āđ„āļ”āđ‰
338
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āļąāļ§ NEON āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļĢāđˆāļ§āļĄāļ‚āļ­āļ‡ ARM CPU āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļšāļš SIMD
(Single Instruction Multiple Data) āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĒāļ­āļĄāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđāļšāļšāļ‚āļ™āļēāļ™
(Parallel processing) āļ‹āļķāđˆāļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ•āļąāļ§āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ
āđ€āļŠāđˆāļ™ āļāļēāļĢāļ—āļģ Video encoding/decoding āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļąāđ‰āļ‡āđāļšāļšāļŠāļ­āļ‡āļĄāļīāļ•āļīāđāļĨāļ°āļŠāļēāļĄāļĄāļīāļ•āļī
āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāļąāļāļāļēāļ“āđ€āļŠāļĩāļĒāļ‡āļžāļđāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āđ„āļŸāļĨāđŒ Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := neon_utils
LOCAL_SRC_FILES := neon_add.c
LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7
include $(BUILD_STATIC_LIBRARY)
NDK_PATH:=$(call my-dir)/../..
include $(CLEAR_VARS)
LOCAL_MODULE := test_conditional_load
LOCAL_C_INCLUDES := $(NDK_PATH)/sources/cpufeatures
LOCAL_SRC_FILES := main.c
LOCAL_STATIC_LIBRARIES := neon_utils cpufeatures
include $(BUILD_EXECUTABLE)
include $(NDK_PATH)/sources/cpufeatures/Android.mk
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ main.c
#include <stdio.h>
#include <cpu-features.h>
int main()
{
int32_t int32_4[] = {2,3,4,5};
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
339
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
{
neon_add(int32_4);
printf("NEON supportedn");
}
else
{
printf("NEON Not Supportedn");
}
printf("values = %d, %d, %d, %dn", int32_4[0], int32_4[1], int32_4[2],
int32_4[3]);
return 0;
}
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ neon_add.c
#include <arm_neon.h>
void neon_add(int32_t * ptr)
{
int32x4_t vin = vld1q_s32(ptr);
int32x4_t vout = vaddq_s32(vin, vin);
vst1q_s32(ptr, vout);
}
āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native āļĄāļēāđƒāļŠāđ‰āđƒāļŦāļĄāđˆ (Code Reusability) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ
āđāļšāļšāđ€āļ›āļīāļ” (Open source) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļ‹āļķāđˆāļ‡āļ–āļđāļāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§
āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļ·āđˆāļ™ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļžāļĩāļĒāļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ‚āđ‰āļ­
āļ•āļāļĨāļ‡āļ—āļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ
āđ€āļŠāđˆāļ™ āđ„āļĨāļšāļĢāļēāļĢāļĩ zlib āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĩāļšāļ­āļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­ āđ„āļĨāļšāļĢāļēāļĢāļĩ OpenMAX āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļŠāļģāļŦāļĢāļąāļšāđ€āļĨāđˆāļ™āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒāļ§āļīāļ”āļĩāđ‚āļ­āļŦāļĢāļ·āļ­āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ANDROID NDK
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android NDK
āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Android NDK āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĨāđˆāļēāļŠāļļāļ”āđ„āļ”āđ‰āļˆāļēāļ Android NDK āđāļĨāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡
āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļēāļĄāļ„āļģāđāļ™āļ°āļ™āļģāļˆāļēāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒ āļ—āļĩāđˆāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī
āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŦāļĨāļąāļ‡āļˆāļēāļāđāļ•āļāđ„āļŸāļĨāđŒāđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ Android NDK āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš
āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ ~/.bashrc āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
$ cat ~/.bashrc
340
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
...
export USE_CCACHE=0
export CCACHE_DIR=~/ccache
export JAVA_HOME=/usr/lib/jvm/jdk
export ANT_HOME=~/android/ant
export ANDROID_SDK_HOME=~/android/sdk
export ANDROID_NDK_HOME=~/android/ndk
export AOSP_HOME=~/aosp
export
PATH=$HOME/bin:$JAVA_HOME/bin:$ANT_HOME/bin:$ANDROID_SDK_HOME/tools:$ANDROID_
SDK_HOME/platform-tools:$ANDROID_NDK_HOME:$PATH
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ†āļ„āļ·āļ­
1.āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C/C++ āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ (Dynamic link library)
2.āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Android NDK āļĢāļļāđˆāļ™ r7b āđāļĨāļ° GNU make āļĢāļļāđˆāļ™
3.81 āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ ls -al ~/android-ndk-r7b/
total 320
drwxr-xr-x@ 19 sriborrirux staff 646 Mar 17 2012 .
drwxr-xr-x+ 94 sriborrirux staff 3196 Oct 6 02:12 ..
-rw-r--r--@ 1 sriborrirux staff 6148 Mar 17 2012 .DS_Store
-rw-r-----@ 1 sriborrirux staff 1306 Dec 19 2011 GNUmakefile
-rw-r-----@ 1 sriborrirux staff 1360 Dec 19 2011 README.TXT
-rw-r--r--@ 1 sriborrirux staff 4 Jan 25 2012 RELEASE.TXT
drwxr-xr-x@ 6 sriborrirux staff 204 Jan 25 2012 build
drwxr-xr-x@ 29 sriborrirux staff 986 Jan 25 2012 docs
-rw-r-----@ 1 sriborrirux staff 201 Dec 19 2011 documentation.html
-rwxr-x---@ 1 sriborrirux staff 2985 Dec 19 2011 ndk-build
-rw-r-----@ 1 sriborrirux staff 279 Dec 19 2011 ndk-build.cmd
-rwxr-x---@ 1 sriborrirux staff 21832 Dec 19 2011 ndk-gdb
-rwxr-xr-x@ 1 sriborrirux staff 103928 Jan 25 2012 ndk-stack
drwxr-x---@ 8 sriborrirux staff 272 Jan 25 2012 platforms
drwxr-xr-x@ 3 sriborrirux staff 102 Jan 25 2012 prebuilt
drwxr-x---@ 17 sriborrirux staff 578 Oct 6 02:09 samples
drwxr-xr-x@ 5 sriborrirux staff 170 Dec 18 2010 sources
drwxr-xr-x@ 10 sriborrirux staff 340 Jan 25 2012 tests
drwxr-xr-x@ 4 sriborrirux staff 136 Jan 25 2012 toolchains
$ ndk-build --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
341
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŠāđˆāļ§āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 āļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio
āļ—āļĩāđˆāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨ āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļˆāļēāļ InteliJ IDEA āđ€āļžāļ·āđˆāļ­āļĄāļēāđāļ—āļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE (āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”
āļ•āļąāđ‰āļ‡ Android ADT Plugin āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļāđ‡āđ„āļ”āđ‰āļĢāļ§āļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ
āļžāļąāļ’āļ™āļēāđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļąāļ”āļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ§āđ‰āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.42 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Android SDK Manager
āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļ°āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK āđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“āļ•āđ‰āļ™āļ›āļĩ āļž.āļĻ. 2557 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āļˆāļ°āđ€āļ›āđ‡āļ™
342
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ—āļģāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĨāļēāļĒāļ›āļĩ āļž.āļĻ. 2556 āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļšāļ™
Android Studio āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ native C/C++ āđ„āļ”āđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ HELLO WORLD āļ”āđ‰āļ§āļĒ ANDROID NDK
āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/android-ndk-r7b/samples/
$ ls -al
total 0
drwxr-x---@ 17 sriborrirux staff 578 Oct 6 02:09 .
drwxr-xr-x@ 19 sriborrirux staff 646 Mar 17 2012 ..
drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 bitmap-plasma
drwxr-x---@ 7 sriborrirux staff 238 Jan 25 2012 hello-gl2
drwxr-x---@ 10 sriborrirux staff 340 Oct 5 21:26 hello-jni
drwxr-x---@ 8 sriborrirux staff 272 Jul 14 2011 hello-neon
drwxr-x---@ 4 sriborrirux staff 136 Jul 14 2011 module-exports
drwxr-x---@ 6 sriborrirux staff 204 Jan 25 2012 native-activity
drwxr-x---@ 8 sriborrirux staff 272 Oct 1 2011 native-audio
drwxr-x---@ 10 sriborrirux staff 340 Nov 3 2011 native-media
drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 native-plasma
drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 san-angeles
drwxr-x---@ 3 sriborrirux staff 102 Dec 18 2010 test-libstdc++
drwxr-x---@ 8 sriborrirux staff 272 Jul 14 2011 two-libs
āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļŦāļĒāļīāļšāļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello-jni āļĄāļēāļ›āļĢāļąāļšāđƒāļŠāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđ‚āļ”āļĒ
āđƒāļŦāđ‰āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ hello-jni.c
$ cd samples/hello-jni/
$ ls
AndroidManifest.xml default.properties jni res src tests
$ cd jni/
āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ hello-jni.c āđ€āļžāļ·āđˆāļ­āđāļāđ‰āđ„āļ‚āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļŦāļĄāđˆāļˆāļēāļ
Java_com_example_hellojni_HelloJni_stringFromJNI
āđ€āļ›āđ‡āļ™
Java_com_example_hellondk_MainActivity_stringFromJNI
$ vim hello-jni.c
#include <string.h>
#include <jni.h>
Java_com_example_hellondk_MainActivity_stringFromJNI( JNIEnv* env,
	 	 jobject thiz ) {
343
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ndk-build
$ ndk-build
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
$ cd ..
āđ€āļĄāļ·āđˆāļ­āļ–āļ­āļĒāļ­āļ­āļāļĄāļēāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ jni/ āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđƒāļŦāļĄāđˆāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļ·āđˆāļ­ libs āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™
āļ„āļģāļŠāļąāđˆāļ‡ ls āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ ls
AndroidManifest.xml! res default.properties
libs! src jni! obj! tests
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio
āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE āļ„āļ·āļ­āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļšāļēāļ‡
āļ­āļĒāđˆāļēāļ‡āļžāļīāđ€āļĻāļĐ āđ„āļ”āđ‰āđāļāđˆ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđƒāļ™āļĢāļđāļ›āđāļšāļš .jar āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™ .so āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Android Studio āļ­āđ‰āļēāļ‡āļ­āļīāļ‡
āļœāđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđ„āļ”āđ‰ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāļˆāļ°āļĄāļĩ 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļĒāđˆāļ­āļĒāļ”āļąāļ‡āļ™āļĩāđ‰
$ mv libs lib <---- 1. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ lib
$ zip -r native-libs.zip lib/ <---- 2. āļ—āļģāļāļēāļĢāđāļžāđ‡āļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ lib āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļēāļĢāļĩ
adding: lib/ (stored 0%)
adding: lib/armeabi/ (stored 0%)
adding: lib/armeabi/gdb.setup (deflated 54%)
adding: lib/armeabi/gdbserver (deflated 39%)
adding: lib/armeabi/libhello-jni.so (deflated 48%)
(reverse-i-search)`mv': mv libs lib
$ mv native-libs.zip native-libs.jar <---- 3. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ .jar
$ ls
AndroidManifest.xml! lib! res default.properties!
src jni! obj! tests native-libs.jar
$ mv lib libs <---- 4. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļāļĨāļąāļšāļĄāļēāđ€āļ›āđ‡āļ™ libs āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ
$ mv native-libs.jar libs/ <---- 5. āļĒāđ‰āļēāļĒāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļāļĨāļąāļšāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs
āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ hello-jni āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–
āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
344
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio
āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application
name āļ§āđˆāļē “HelloNDK” āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.hellondk”
āļĢāļđāļ›āļ—āļĩāđˆ 6.43 āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ NDK
āđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ›āđ‡āļ™ Blank Activity āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Activity āļ§āđˆāļē “MainActivity”
āļĢāļđāļ›āļ—āļĩāđˆ 6.44 āļāļģāļŦāļ™āļ” template āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Activity
345
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ™āļģāđ€āļ‚āđ‰āļēāđ„āļĨāļšāļĢāļēāļĢāļĩ hello-jni āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„
āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļĄāļēāļŠāđŒāļĨāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs/ āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/android-ndk-r7b/
samples/hello-jni/ āđāļĨāđ‰āļ§āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāđƒāļ•āđ‰ src/main
āļĢāļđāļ›āļ—āļĩāđˆ 6.45 āļāļēāļĢāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3: āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ build.gradle
āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļˆāļ°āļ›āļĢāļēāļāļāđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē build.gradle āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļ­āļĄ
āđ„āļžāļĨāđŒ āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ task nativeLibsToJar, tasks.withType (Compile) āđāļĨāļ° dependencies
āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđƒāļŦāđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
346
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
targetSdkVersion 16
}
}
task nativeLibsToJar(
type: Zip,
description: 'create a jar archive of the native libs') {
destinationDir file("src/main/libs/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'src/main/libs', include: '**/*.so')
into 'lib/'
}
tasks.withType (Compile) {
compileTask -> compileTask.dependsOn (nativeLibsToJar)
}
dependencies {
compile fileTree(dir: "src/main/libs/native-libs", include:
'native-libs.jar')
}
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4: āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ
āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ MainActivity.java āđāļĨāļ°āđ„āļŸāļĨāđŒ activity_main.xml āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
// MainActivity.java
package com.example.hellondk;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv =(TextView)findViewById(R.id.hello);
tv.setText(stringFromJNI());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
347
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
}
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ activity_main.xml āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ android:id="@+id/text" āđāļĨāļ°
android:textSize="40dp"
android:text="No Message..."
āļĢāļđāļ›āļ—āļĩāđˆ 6.46 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ activity_main.xml
// activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40dp"
android:text="No Message..."/>
</RelativeLayout>
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5: āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ
āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Android Virtual Device āđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ HelloNDK āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
348
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.47 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē JAVA NATIVE INTERFACE (JNI)
Java Native Interface āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļĒāđˆāļ­āđ†āļ§āđˆāļē JNI āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē JDK (Java
Software Development Kit) āļ‹āļķāđˆāļ‡ JNI āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native (C/
C++) āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļŦāļĢāļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ
āļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆāļ āļēāļĐāļēāļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ­āļ·āđˆāļ™āļāđ‡āļĒāļąāļ‡
āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Invocation API āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™
JVM (Java virtual machine)
āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA (JAVA Code) āļāđ‡āļˆāļ°āļ–āļđāļāļĢāļąāļ™āļšāļ™ Dalvik āļ‹āļķāđˆāļ‡
āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™ (Virtual Machine) āļ„āļĨāđ‰āļēāļĒāļāļąāļš (āđāļ•āđˆāđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™) JVM āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Oracle āđāļ•āđˆāļ•āļąāļ§ Dalvik
āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļāļđāđ€āļāļīāļĨāđ€āļ­āļ‡ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native (Native Code)
āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ‚āļ„āđ‰āļ”āđ„āļšāļ™āļēāļĢāļĩ āļ‹āļķāđˆāļ‡āļžāļĢāđ‰āļ­āļĄāļ–āļđāļāđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ JNI āļˆāļķāļ‡āļ—āļģāļ•āļąāļ§āđ€āļ­āļ‡
āđ€āļŦāļĄāļ·āļ­āļ™āļŠāļ°āļžāļēāļ™āđ€āļŠāļ·āđˆāļ­āļĄāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļĨāļāļŠāļ­āļ‡āđ‚āļĨāļāļ™āļĩāđ‰ āļ”āļąāļ‡āļĢāļđāļ›āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ JAVA code, Dalvik
VM, native code, āđāļĨāļ° āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
JAVA Code
Android System
Dalvik VM JNI Native Code
āļĢāļđāļ›āļ—āļĩāđˆ 6.48 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Java āđāļĨāļ° Native C
349
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āļ—āļąāđ‰āļ‡ Dalvik VM āđāļĨāļ° Native Code āļ•āđˆāļēāļ‡āļāđ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™
āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ (execution environ-
ment) āđāļĨāļ°āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē JNI āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Dalvik VM āļ‹āļķāđˆāļ‡āļˆāļ°āļ­āļģāļ™āļ§āļĒāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļŦāđ‰ Native Code
āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢāļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ (Data elds) āđāļĨāļ°āļŠāļĄāļēāļŠāļīāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ (Member func-
tions) āđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (Access Permissions) āļ„āļĨāļēāļŠāļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ” JAVA
āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ native (C/C++) āļ™āļąāđ‰āļ™āļˆāļķāļ‡āđ€āļ›āđ‡āļ™
āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āļ‹āļķāđˆāļ‡āđƒāļ™ JNI āļ™āļąāđ‰āļ™āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļš
āļ•āļąāļ§āđāļ›āļĢāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ āļēāļĐāļē āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 6.3 āđāļŠāļ”āļ‡āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāđƒāļ™āļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļ—āļĩāļĒāļšāļāļąāļšāļ•āļąāļ§āđāļ›āļĢāđƒāļ™ JNI
J A V A T Y P E J N I
J AVA A R R A Y
T Y P E
J N I
byte jbyte byte[] jbyteArray
short jshort short[] jshortArray
int jint int[] jintArray
long jlong long[] jlongArray
oat joat oat[] joatArray
double jdouble double[] jdoubleArray
char jchar char[] jcharArray
boolean jboolean boolean[] jbooleanArray
void jvoid Object[] jobjectArray
Object jobject
Class jclass
String jstring
array jarray
Throwable jthrowable
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ JNI āļĒāļąāļ‡āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē (denition) āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢ
āđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™
#define JNI_FALSE 0
#define JNI_TRUE 1
typedef jint jsize;
350
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native āļˆāļ°āļĄāļĩāļ‚āļšāļ§āļ™āļāļēāļĢāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđ„āļ›āļāļ§āđˆāļēāļāļąāļ™
āļ„āļ·āļ­āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ native āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (Native Method Registration) āļ‹āļķāđˆāļ‡āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› JNI āđ€āļ­āļ‡āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–
āļ„āđ‰āļ™āļŦāļēāļŠāļģāļĢāļ§āļˆāļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ HelloNDK
āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āđāļ•āđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļ—āļģāđƒāļŦāđ‰ JNI āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļŠāļĩāļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļŠāļģāļĢāļ§āļˆāļŠāļ·āđˆāļ­
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āļāđˆāļ­āļ™āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native
āđ‚āļ”āļĒāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļŦāđ‰āļāļąāļš JNI āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Dalvik VM āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡ JNI āļŠāļ·āđˆāļ­ RegisterNatives(JNIEnv *env, jclass clazz, const
JNINativeMethod *methods, jint nMethods); āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
...
JNINativeMethod nm[2];
nm[0].name = "NativePlus";
nm[0].signature = "(II)I";
nm[0].fnPtr = NativePlus;
nm[1].name = "NativeMultiply";
nm[1].signature = "(II)I";
nm[1].fnPtr = NativeMultiply;
jclass cls = (*env)->FindClass(env, "com/example/NativeApp/Activity");
// Register methods with env->RegisterNatives.
(*env)->RegisterNatives(env, cls, nm, 2);
āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ cls (clazz) āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ RegisterNatives(..) āļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļ›āļĒāļąāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāđ€āļāđ‡āļš
āļĢāļēāļĒāļāļēāļĢāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđāļĨāđ‰āļ§ āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ (data struc-
ture) nm (JNINativeMethod) āļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ—āļĩāđˆāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™
āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰
typedef struct {
char *name; <--- āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (method name)
char *signature; <--- āļ•āļąāļ§āļ­āļ˜āļīāļšāļēāļĒāļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (descriptor)
void *fnPtr; <--- āļ•āļąāļ§āļŠāļĩāđ‰āđ„āļŸāļĨāđŒāļĒāļąāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (function pointer)
} JNINativeMethod;
āļĢāļđāļ›āđāļšāļšāļ—āļąāđˆāļ§āđ„āļ›āļ‚āļ­āļ‡āļāļēāļĢāļāļģāļŦāļ™āļ” method signature āļ„āļ·āļ­
method-name(argument-types)return-type
JVM āļˆāļ°āđƒāļŠāđ‰āļ­āļąāļāļ‚āļĢāļ°āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāđƒāļ™āļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļ•āļēāļĢāļēāļ‡ 6.4 āļ­āļąāļāļ‚āļĢāļ°āđ€āļžāļ·āđˆāļ­āđāļ—āļ™āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ āļēāļĐāļēāļˆāļēāļ§āļē
351
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
JVM SIGNATURE JAVA TYPE
Z boolean
B byte
C char
S short
I int
J long
F float
D double
V void
Lclass āļŠāļ·āđˆāļ­āļ„āļĨāļēāļŠ
[type āļŠāļ™āļīāļ”āļ•āļąāļ§āđāļ›āļĢ
(arg-type)ret-type āļŠāļ™āļīāļ”āļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ­āļēāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āđāļĨāļ°āļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļš
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SIGNATURE
void fun1() fun1()V
int fun2(int n, long l) fun2(IJ)I
long fun3(int n, String s, int[] arr) fun3(ILjava/lang/String;[I)J
boolean fun4(int[] arr) fun4([I)Z
double fun5(String s, int n) fun5(Ljava/lang/String;I)D
void fun6(int n, String[] arr, char c) fun6(I[Ljava/lang/String;C)V
long fun7(int n, String s, int[] arr) fun7(ILjava/lang/String;[I)J
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JNI METHODS
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native (C/C++) āđ‚āļ”āļĒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ„āļ›āļĒāļąāļ‡ Dalvik
VM āļ”āđ‰āļ§āļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ RegisterNatives āļ‚āļ­āļ‡ JNI āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĐāļēāļˆāļēāļ§āļē āļšāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰
352
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ
āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ NativeCalculation āđāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāļŠāļ·āđˆāļ­ jni/ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
(.c, .h) āđāļĨāļ° Android.mk āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ mkdir NativeCalculation
$ mkdir NativeCalculation/jni
$ cd NativeCalculation/jni
$ vim Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NativeCalculation
LOCAL_SRC_FILES := NativeCalculation.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
$ vim NativeCalculation.h
#include <jni.h>
#ifndef _Included_foo_Sqrt
#define _Included_foo_Sqrt
#ifdef __cplusplus
extern "C" {
#endif
#undef foo_Sqrt_EPSILON
#define foo_Sqrt_EPSILON 0.05
#ifdef __cplusplus
}
#endif
#endif
$ vim NativeCalculation.c
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
#include "NativeCalculation.h"
jint NativePlus(JNIEnv *pEnv, jobject pObj, jint pa, jint pb) {
	 return pa+pb;
}
jint NativeMultiply(JNIEnv *pEnv, jobject pObj, jint pa, jint pb) {
	 return pa*pb;
}
jdouble NativeSqrt(JNIEnv *pEnv, jobject pObj, jdouble pa) {
	 jdouble x0 = 10.0, x1 = pa, diff;
	 do {
353
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
x1 = x0 - (((x0 * x0) - pa) / (x0 * 2));
	 	 diff = x1 - x0;
	 	 x0 = x1;
	 } while (labs(diff) > 0.05);
	 return x1;
}
jdoubleArray NativeArraySumAndAverage(JNIEnv *pEnv, jobject pObj, jintArray rets) {
	 jboolean isCopy;
// Convert rets to C's jint[]
jint *intArr = (*pEnv)->GetIntArrayElements(pEnv, rets, &isCopy);
	 __android_log_print(ANDROID_LOG_INFO, "NativeArraySumAndAverage", "a new copy
is created: %d", isCopy);
if (NULL == intArr) return NULL;
	 jsize len = (*pEnv)->GetArrayLength(pEnv, rets);
	 int i;
	 jint sum = 0;
	 jdouble average = 0.0;
for (i = 0; i < len; ++i) {
	 __android_log_print(ANDROID_LOG_INFO, "NativeArraySumAndAverage of ", "%d =
%d", i, intArr[i]);
	 sum += intArr[i];
	 }
	 average = (jdouble)sum / len;
	 (*pEnv)->ReleaseIntArrayElements(pEnv, rets, intArr, 0);
	 jdouble outCArray[] = {sum, average};
// Convert the C's Native jdouble[] to JNI jdoublearray, and then return
// allocate array[2]
jdoubleArray returnJNIArray = (*pEnv)->NewDoubleArray(pEnv, 2);
if (NULL == returnJNIArray) return NULL;
// copy outCArray to returnJNIArray
(*pEnv)->SetDoubleArrayRegion(pEnv, returnJNIArray, 0 , 2, outCArray);
return returnJNIArray;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved)
{
JNIEnv* env;
if ((*pVm)->GetEnv(pVm, (void **)&env, JNI_VERSION_1_6)) {
	 	 return -1;
	 }
JNINativeMethod nm[4];
nm[0].name = "NativePlus";
nm[0].signature = "(II)I";
354
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
nm[0].fnPtr = NativePlus;
nm[1].name = "NativeMultiply";
nm[1].signature = "(II)I";
nm[1].fnPtr = NativeMultiply;
nm[2].name = "NativeSqrt";
nm[2].signature = "(D)D";
nm[2].fnPtr = NativeSqrt;
nm[3].name = "NativeArraySumAndAverage";
nm[3].signature = "([I)[D";
nm[3].fnPtr = NativeArraySumAndAverage;
jclass cls = (*env)->FindClass(env, "com/example/NativeCalculation/
MainActivity");
// Register methods with env->RegisterNatives.
(*env)->RegisterNatives(env, cls, nm, 4);
return JNI_VERSION_1_6;
}
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio
$ ndk-build
Compile thumb : NativeCalculation <= NativeCalculation.c
SharedLibrary : libNativeCalculation.so
Install : libNativeCalculation.so =>
libs/armeabi/libNativeCalculation.so
$ ls
Android.mk!! NativeCalculation.c! NativeCalculation.h
$ cd ..
$ mv libs lib
$ zip -r NativeCalculation.zip lib/
adding: lib/ (stored 0%)
adding: lib/android-support-v4.jar (deflated 14%)
adding: lib/armeabi/ (stored 0%)
adding: lib/armeabi/libNativeCalculation.so (deflated 47%)
$ mv NativeCalculation.zip NativeCalculation.jar
$ mn lib libs
$ mv NativeCalculation.jar libs/
āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ NativeCalcula-
tion āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio
āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application name āļ§āđˆāļē “NativeCalculation” āđāļĨāļ°
āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.NativeCalculation” āļ”āļąāļ‡āļĢāļđāļ›
355
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.49 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄ Calculation NDK
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ™āļģāđ€āļ‚āđ‰āļēāđ„āļĨāļšāļĢāļēāļĢāļĩ NativeCalculation āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„
āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļĄāļēāļŠāđŒāļĨāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs/ āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ src/main āļ”āļąāļ‡
āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 6.50 āļāļēāļĢāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ lib āđāļĨāļ°āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āđ„āļŸāļĨāđŒ MainActivity.java
356
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3: āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ build.gradle
āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āļˆāļ°āļ›āļĢāļēāļāļāđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē build.gradle āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļ­āļĄ
āđ„āļžāļĨāđŒ āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ task nativeLibsToJar, tasks.withType (Compile) āđāļĨāļ° dependencies
āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđƒāļŦāđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 18
buildToolsVersion "18.1.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 16
}
}
task nativeLibsToJar(
type: Zip,
description: 'create a jar archive of the native libs') {
destinationDir file("src/main/libs/NativeCaculation")
baseName 'NativeCaculation'
extension 'jar'
from fileTree(dir: 'src/main/libs', include: '**/*.so')
into 'lib/'
}
tasks.withType (Compile) {
compileTask -> compileTask.dependsOn (nativeLibsToJar)
}
dependencies {
compile fileTree(dir: "src/main/libs/NativeCaculation", include:
'NativeCaculation.jar')
}
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4: āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ
357
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ MainActivity.java āđāļĨāļ°āđ„āļŸāļĨāđŒ activity_main.xml āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļąāļ‡āļ™āļĩāđ‰
package com.example.NativeCalculation;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.tv = new TextView(this);
this.tv =(TextView)findViewById(R.id.calculation_text);
callingNative();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void callingNative() {
int a = 2342, b = 452;
double c = 2353.0;
int d = NativePlus(a, b);
this.tv.setText(a + "+" + b + "=" + d);
d = NativeMultiply(a, b);
this.tv.append("n" + a + "x" + b + "=" + d);
double e = NativeSqrt(c);
this.tv.append("nSqrt(" + c + ")" + "=" + e);
int numbers[] = new int[10000];
for (int i=0; i < numbers.length ; ++i) {
numbers[i] = i;
}
double[] results = this.NativeArraySumAndAverage(numbers);
this.tv.append("nSummation of Numbers (1-" + numbers.length + ") = " + re-
sults[0]);
this.tv.append("nAverage of Numbers (1-" + numbers.length + ") = " + re-
sults[1]);
}
private native int NativePlus(int a, int b);
private native int NativeMultiply(int a, int b);
private native double NativeSqrt(double a);
private native double[] NativeArraySumAndAverage(int[] numbers);
static {
System.loadLibrary("NativeCalculation");
}
}
358
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ activity_main.xml āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ android:id="@+id/calculation_text" āđāļĨāļ°
android:textSize="40dp"
android:text="No Message..."
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView android:id="@+id/calculation_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="No Message..." />
</RelativeLayout>
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5: āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ
āļœāļĨāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ NativeCalculation āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāļšāļ§āļāđ€āļĨāļ‚ āļ„āļđāļ“āđ€āļĨāļ‚ āļŦāļēāļĢāļēāļ
āļ—āļĩāđˆāļŠāļ­āļ‡ āļšāļ§āļāđ€āļĨāļ‚āđƒāļ™āļ­āļēāđ€āļĢāļĒāđŒ āđāļĨāļ°āļŦāļēāļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒāļ‚āļ­āļ‡āđ€āļĨāļ‚āđƒāļ™āļ­āļēāđ€āļĢāļĒāđŒ āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 6.51 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē ANDROID NDK MULTI-THREADING
āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļš Native code āļŠāļēāļĄāļēāļĢāļ–āļ”āļķāļ‡āļĻāļąāļāļĒāļ āļēāļžāļ—āļēāļ‡āļ”āđ‰āļēāļ™ multi-processing tech-
nique āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļāļ”āđ‰āļ§āļĒāļāļēāļĢāļ™āļģ Posix Thread āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰
āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ‡āļēāļ™āļ­āļ­āļāđ€āļ›āđ‡āļ™āļ‡āļēāļ™āļĒāđˆāļ­āļĒāđ† (thread) āđāļĨāđ‰āļ§āđāļĒāļāļāļąāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē multi-
359
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
threading programming āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĐāļēāļˆāļēāļ§āļē āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ posix thread āđ„āļ”āđ‰
āđ‚āļ”āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰ mutex āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāļ­āļ”āļ›āļĢāļ°āļŠāļēāļ™āđ„āļĄāđˆ
āļ‚āļąāļ”āđāļĒāđ‰āļ‡āļŦāļĢāļ·āļ­āđāļĒāđ‰āļ‡āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļšāļ—āļ—āļĩāđˆ 4 āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāļŸāļąāļ‡āļāđŒāļŠāļąāļ™
pthread_mutex āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļĄāļēāđƒāļŠāđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
āļ‹āļķāđˆāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ mutex āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļ™āļģāđ„āļ›āđ€āļ›āđ‡āļ™āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđƒāļ™āļāļēāļĢāļ‚āļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™
āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_lock_timeout_np(pthread_mutex_t *mutex, unsigned msecs);
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ€āļ—āļĢāļ”
āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ NativeThreadMutex āđāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāļŠāļ·āđˆāļ­ jni/ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ”
āđ‚āļ›āļĢāđāļāļĢāļĄ (.c, .h) āđāļĨāļ° Android.mk āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ mkdir NativeThreadsMutex
$ mkdir NativeThreadsMutex/jni
$ cd NativeThreadsMutex/jni
$ vim NativeThreadsMutex.cpp
#include <jni.h>
#include <unistd.h>
#include <pthread.h>
#include "mylog.h"
void jni_start_threads();
void *run_by_thread1(void *arg);
void *run_by_thread2(void *arg);
void jni_start_threads_dead();
void *run_by_thread1dead(void *arg);
void *run_by_thread2dead(void *arg);
jint JNI_OnLoad(JavaVM* pVm, void* reserved)
{
	 JNIEnv* env;
	 if (pVm->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK) {
360
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
return -1;
	 }
	 JNINativeMethod nm[2];
	 nm[0].name = "jni_start_threads";
	 nm[0].signature = "()V";
	 nm[0].fnPtr = (void*)jni_start_threads;
	 nm[1].name = "jni_start_threads_dead";
	 nm[1].signature = "()V";
	 nm[1].fnPtr = (void*)jni_start_threads_dead;
	 jclass cls = env->FindClass("com/example/NativeThreadsMutex/MainActivity");
	 // Register methods with env->RegisterNatives.
	 env->RegisterNatives(cls, nm, 2);
	 return JNI_VERSION_1_6;
}
//pthread_mutex_t mux1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mux1;
pthread_mutex_t mux2;
void jni_start_threads() {
	 pthread_t th1, th2;
	 int threadNum1 = 1, threadNum2 = 2;
	 int ret;
	 pthread_mutex_init(&mux1, NULL);
	 pthread_mutex_init(&mux2, NULL);
	 ret = pthread_create(&th1, NULL, run_by_thread1, (void*)&threadNum1);
	 if(ret) {
	 	 LOGE(1, "cannot create the thread %d thread: %d", threadNum1, ret);
	 }
	 LOGI(1, "thread 1 started");
	 ret = pthread_create(&th2, NULL, run_by_thread2, (void*)&threadNum2);
	 if(ret) {
	 	 LOGE(1, "cannot create the thread %d: %d", threadNum2, ret);
	 }
	 LOGI(1, "thread 2 started");
	 ret = pthread_join(th1, NULL);
	 LOGI(1, "thread 1 end %d", ret);
	 ret = pthread_join(th2, NULL);
	 LOGI(1, "thread 2 end %d", ret);
	 pthread_mutex_destroy(&mux1);
	 pthread_mutex_destroy(&mux2);
}
int cnt = 0;
int THR = 10;
void *run_by_thread1(void *arg) {
	 int* threadNum = (int*)arg;
	 while (cnt < THR) {
	 	 pthread_mutex_lock(&mux1);
	 	 while ( pthread_mutex_trylock(&mux2) ) {
	 	 pthread_mutex_unlock(&mux1); //avoid deadlock
	 	 usleep(50000);		 	 	 //if failed to get mux2, release
mux1 first
361
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
pthread_mutex_lock(&mux1);
	 	 }
	 	 ++cnt;
	 	 LOGI(1, "thread %d: cnt = %d", *threadNum, cnt);
	 	 pthread_mutex_unlock(&mux1);
	 	 pthread_mutex_unlock(&mux2);
	 	 sleep(1);
	 }
}
void *run_by_thread2(void *arg) {
	 int* threadNum = (int*)arg;
	 while (cnt < THR) {
	 	 pthread_mutex_lock(&mux2);
	 	 while ( pthread_mutex_trylock(&mux1) ) {
	 	 pthread_mutex_unlock(&mux2); //avoid deadlock
	 	 usleep(50000);		 	 	 //if failed to get mux2, release
mux1 first
	 	 pthread_mutex_lock(&mux2);
	 	 }
	 	 ++cnt;
	 	 LOGI(1, "thread %d: cnt = %d", *threadNum, cnt);
	 	 pthread_mutex_unlock(&mux2);
	 	 pthread_mutex_unlock(&mux1);
	 	 sleep(1);
	 }
}
void jni_start_threads_dead() {
	 pthread_t th1, th2;
	 int threadNum1 = 1, threadNum2 = 2;
	 int ret;
	 pthread_mutex_init(&mux1, NULL);
	 pthread_mutex_init(&mux2, NULL);
	 ret = pthread_create(&th1, NULL, run_by_thread1dead, (void*)&threadNum1);
	 if(ret) {
	 	 LOGE(1, "cannot create the thread %d thread: %d", threadNum1, ret);
	 }
	 LOGI(1, "thread 1 started");
	 ret = pthread_create(&th2, NULL, run_by_thread2dead, (void*)&threadNum2);
	 if(ret) {
	 	 LOGE(1, "cannot create the thread %d: %d", threadNum2, ret);
	 }
	 LOGI(1, "thread 2 started");
	 ret = pthread_join(th1, NULL);
	 LOGI(1, "thread 1 end %d", ret);
	 ret = pthread_join(th2, NULL);
	 LOGI(1, "thread 2 end %d", ret);
	 pthread_mutex_destroy(&mux1);
	 pthread_mutex_destroy(&mux2);
}
362
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
void *run_by_thread1dead(void *arg) {
	 int* threadNum = (int*)arg;
	 while (cnt < THR) {
	 	 pthread_mutex_lock(&mux1);
	 	 usleep(50);
	 	 pthread_mutex_lock(&mux2);
	 	 ++cnt;
	 	 LOGI(1, "thread %d: cnt = %d", *threadNum, cnt);
	 	 pthread_mutex_unlock(&mux2);
	 	 pthread_mutex_unlock(&mux1);
	 	 sleep(1);
	 }
}
void *run_by_thread2dead(void *arg) {
	 int* threadNum = (int*)arg;
	 while (cnt < THR) {
	 	 pthread_mutex_lock(&mux2);
	 	 usleep(50);
	 	 pthread_mutex_lock(&mux1);
	 	 ++cnt;
	 	 LOGI(1, "thread %d: cnt = %d", *threadNum, cnt);
	 	 pthread_mutex_unlock(&mux1);
	 	 pthread_mutex_unlock(&mux2);
	 	 sleep(1);
	 }
}
$ vim mylog.h
#ifndef COOKBOOK_LOG_H
#define COOKBOOK_LOG_H
#include <android/log.h>
#define LOG_LEVEL 4
#define LOG_TAG "NativeThreadsMutex"
#define LOGU(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_UNKNOWN,
LOG_TAG, __VA_ARGS__);}
#define LOGD(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEFAULT,
LOG_TAG, __VA_ARGS__);}
#define LOGV(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_VERBOSE,
LOG_TAG, __VA_ARGS__);}
#define LOGDE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEBUG,
LOG_TAG, __VA_ARGS__);}
#define LOGI(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_INFO,
LOG_TAG, __VA_ARGS__);}
#define LOGW(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_WARN,
LOG_TAG, __VA_ARGS__);}
#define LOGE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_ERROR,
LOG_TAG, __VA_ARGS__);}
#define LOGF(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_FATAL,
LOG_TAG, __VA_ARGS__);}
363
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#define LOGS(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_SILENT,
LOG_TAG, __VA_ARGS__);}
#endif
$ vim Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NativeThreadsMutex
LOCAL_SRC_FILES := NativeThreadsMutex.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio
$ ndk-build
Compile++ thumb : NativeThreadsMutex <= NativeThreadsMutex.cpp
SharedLibrary : libNativeThreadsMutex.so
Install : libNativeThreadsMutex.so =>
libs/armeabi/libNativeThreadsMutex.so
$ cd ..
$ mv libs lib
$ zip -r NativeThreadsMutex.zip lib/
adding: lib/ (stored 0%)
adding: lib/android-support-v4.jar (deflated 14%)
adding: lib/armeabi/ (stored 0%)
adding: lib/armeabi/libNativeThreadsMutex.so (deflated 49%)
$ mv NativeThreadsMutex.zip NativeThreadsMutex.jar
$ mv lib libs
$ mv NativeThreadsMutex.jar libs/
āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ NativeThreads-
Mutex āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio
āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application name āļ§āđˆāļē “NativeThreadsMutex”
āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.NativeThreadsMutex”
364
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 6.52 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄ NativeThreadsMutex NDK
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ adb
āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļ°āđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāđƒāļ™ logcat āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ”āļđāļœāļĨāļĨāļąāļžāļ˜āđŒ āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb logcat āļ”āļąāļ‡
āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
$ adb logcat -v time NativeThreadsMutex:I *:S
10-05 19:19:45.469 I/NativeThreadsMutex( 2836): thread 1 started
10-05 19:19:45.469 I/NativeThreadsMutex( 2836): thread 2 started
10-05 19:19:45.479 I/NativeThreadsMutex( 2836): thread 2: cnt = 1
10-05 19:19:45.479 I/NativeThreadsMutex( 2836): thread 1: cnt = 2
10-05 19:19:46.488 I/NativeThreadsMutex( 2836): thread 2: cnt = 3
10-05 19:19:46.492 I/NativeThreadsMutex( 2836): thread 1: cnt = 4
10-05 19:19:47.489 I/NativeThreadsMutex( 2836): thread 2: cnt = 5
10-05 19:19:47.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 6
10-05 19:19:48.490 I/NativeThreadsMutex( 2836): thread 2: cnt = 7
10-05 19:19:48.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 8
10-05 19:19:49.489 I/NativeThreadsMutex( 2836): thread 2: cnt = 9
10-05 19:19:49.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 10
10-05 19:19:50.499 I/NativeThreadsMutex( 2836): thread 1 end 0
10-05 19:19:50.499 I/NativeThreadsMutex( 2836): thread 2 end 0
365
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļ—āļĩāđˆ 7 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi
āđƒāļ™āļšāļ—āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļŠāđˆāļ§āļ™āđāļĢāļāļˆāļ°āđ€āļ›āđ‡āļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļĄāļēāļāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŠāļ·āđˆāļ­
āļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Raspberry Pi āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ (Single-
board computer) āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļ™āļēāļĒ Eben Upton āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļĢāļīāļĐāļąāļ— Broadcom āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļē
āļŦāļĨāļąāļāļ āļēāļĒāđƒāļ•āđ‰āļ­āļ‡āļ„āđŒāļāļĢāđ„āļĄāđˆāđāļŠāļ§āļ‡āļŦāļēāļāļģāđ„āļĢāļŠāļ·āđˆāļ­āļ§āđˆāļē Raspberry Pi Foundation āđƒāļ™āļ›āļĢāļ°āđ€āļ—āļĻāļ­āļąāļ‡āļāļĪāļĐ āđ‚āļ”āļĒāļĄāļĩ
āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ„āļ·āļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļšāļ­āļĢāđŒāļ”āļ•āļąāļ§āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļ—āļĒāļēāļĻāļēāļ•āļĢāđŒāđāļĨāļ°
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđƒāļ™āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™
āļ‹āļķāđˆāļ‡āļ„āļ§āļēāļĄāļ•āļąāđ‰āļ‡āđƒāļˆāđ€āļ”āļīāļĄāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ Raspberry Pi āļ„āļ·āļ­āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļĩāļĒāļ‡āļˆāļ°āļ—āļģāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢ
āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāđ‰āļēāļĒāļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™
āļĢāļ°āļ”āļąāļšāļšāļ­āļĢāđŒāļ”āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ—āļ™ āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ„āļĢāļđāđāļĨāļ°āļ™āļąāļāđ€āļĢāļĩāļĒāļ™āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™
āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļŦāļĄāļ·āļ­āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļąāđˆāļ§āđ„āļ› āļ—āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢ Raspberry Pi āđ„āļ”āđ‰āļ—āļģāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļ„āļ§āļēāļĄāļĢāđˆāļ§āļĄāļĄāļ·āļ­āļ—āļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āđŒāļĢāđˆāļ§āļĄ
āļāļąāļšāļšāļĢāļīāļĐāļąāļ— Element14 āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ— RS Components āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ”āđ‰āļēāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ‹āļ·āđ‰āļ­āļ­āļļāļ›āļāļĢāļ“āđŒ
āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļšāļšāļ­āļ­āļ™āđ„āļĨāļ™āđŒ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļœāļĨāļīāļ•āđāļĨāļ°āļœāļđāđ‰āđāļ—āļ™āļˆāļģāļŦāļ™āđˆāļēāļĒāļšāļ­āļĢāđŒāļ” Raspberry Pi
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ”āļąāļ‡āļ™āļĩāđ‰
1. āđƒāļŠāđ‰ System-on-Chip āļˆāļēāļāļ„āđˆāļēāļĒ Broadcom āļĢāļļāđˆāļ™ BCM2835 āļ‹āļķāđˆāļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ ARM1176JZF-S
āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļē 700 MHz āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ Over Clock āđ„āļ”āđ‰āļ–āļķāļ‡ 1 GHz
2. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āļ‚āļ™āļēāļ” 256 MB āđƒāļ™āļĢāļļāđˆāļ™ A āđāļĨāļ° SDRAM 512 MB āđƒāļ™āļĢāļļāđˆāļ™ B
3. āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļšāļđāļ• Image le āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļˆāļēāļ SD Card
4. āļĄāļĩUSB 2.0 āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™
5. āļĄāļĩāļŠāđˆāļ­āļ‡āđ€āļŠāļĩāļĒāļš Video āđāļšāļš Composite RCA āđāļĨāļ° HDMI
6. āļĄāļĩāļŦāļąāļ§āđāļˆāđŠāļ Audio āļ‚āļ™āļēāļ” 3.5 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ
7. āļĄāļĩ Ethernet 10/100
8. āļĄāļĩ GPIO 17 āļžāļīāļ™āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™
9. āļĄāļĩāđāļŦāļĨāđˆāļ‡āļˆāđˆāļēāļĒāđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ +3.3 V āđāļĨāļ° +5V
10. āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” 85.60 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ x 53.98 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ
11. āļ™āđ‰āļģāļŦāļ™āļąāļ 45 āļāļĢāļąāļĄ
366
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 7.1 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļ•āđˆāļēāļ‡āđ†āļāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi
āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŦāļĨāļēāļāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļ‹āļķāđˆāļ‡
āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ•āđˆāļˆāļ°
āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ€āļŸāļīāļĢāđŒāļĄāđāļ§āļĢāđŒ (rmware) āļŠāļģāļŦāļĢāļąāļšāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ ATMEL āļ—āļĩāđˆāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ” Arduino āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē
āļ­āļ·āđˆāļ™āđ† āđ€āļŠāđˆāļ™ āļ āļēāļĐāļēPython āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Python IDE āļ āļēāļĐāļēāđ€āļžāļīāļĢāđŒāļĨ (Perl) āļ āļēāļĐāļēāđ€āļšāļŠāļīāļ (Basic) āļŦāļĢāļ·āļ­ āļ āļēāļĐāļē
C++ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļšāļ­āļĢāđŒāļ” Raspberry Pi āļĒāļąāļ‡āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian GNU/Linux, Fedora, FreeBSD, NetBSD, Plan 9, Raspbian OS, RISC OS āđāļĨāļ°
Slackware Linux āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļšāļ­āļĢāđŒāļ”āļ™āļĩāđ‰āļāđ‡āļĒāļąāļ‡āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļģāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Media server
āļŦāļĢāļ·āļ­ Set-top-box āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ OpenELEC (Open Embedded
367
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Linux Entertainment Center) āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĄāļēāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŠāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ XBMC
media center āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi
āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļšāļ­āļĢāđŒāļ” RaspBerry Pi
āđƒāļ™āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĢāđ‰āļēāļ‡āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāđƒāļŦāđ‰āļāļąāļšāđ€āļ”āđ‡āļ āļŦāļĢāļ·āļ­
āļ™āļąāļāļĻāļķāļāļĐāļē āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļ‚āļ­āļ‡āđ€āļĨāđˆāļ™ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļ•āđˆāļēāļ‡āđ„āļ”āđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 7.2 āļāļēāļĢāļ™āļģ Raspberry Pi āđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ­āļ™āļ āļēāļĒāđƒāļ™āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™
āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļˆāļēāļāđ€āļŦāļĨāđˆāļē
āļ™āļąāļāļžāļąāļ’āļ™āļē āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āļ āļēāļĒāđƒāļ™
āļšāļ­āļĢāđŒāļ”āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļĨāļ‡āđ„āļ›āđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ” Data Acquisition (DAQ),
Mini Super Computer āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 7.3 āļāļēāļĢāļ™āļģ Raspberry Pi āđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āļ™āļēāļ™
368
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi
āļ•āļąāđ‰āļ‡āđāļ•āđˆāđƒāļ™āļ­āļ”āļĩāļ•āļˆāļ™āļ–āļķāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĄāļĩāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđāļĨāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
(Evaluation Kit) āļ­āļ­āļāļĄāļēāļˆāļģāļ™āļ§āļ™āļĄāļēāļāļĄāļēāļĒ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host) āđ„āļ§āđ‰
āļ­āļĩāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē cross-compiling toolchains āđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™
āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļēāļĒāđ€āļ„āđ€āļšāļīāļĨāđāļšāļšāļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ (Serial cable)
āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ—āļ„āļ­āļ™āđ‚āļ‹āļĨ (console) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ
āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļžāļīāļĄāļžāđŒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļ”āļĩāļšāļąāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ
āđ„āļ”āđ‰
āđāļ•āđˆāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāļ”āļąāļ‡āļ—āļĩāđˆāļāļĨāđˆāļēāļ§āļĄāļēāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļĒāļļāđˆāļ‡āļĒāļēāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđƒāļŦāđ‰āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĨāļēāļĒ āđāļ•āđˆ
āđ€āļĄāļ·āđˆāļ­āļĄāļēāļ–āļķāļ‡āļĒāļļāļ„āļāļēāļĢāļĄāļēāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄ
āđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ€āļžāļĩāļĒāļ‡āļ™āļģāļšāļ­āļĢāđŒāļ” Raspberry Pi āļĄāļēāļ•āđˆāļ­āļāļąāļšāļˆāļ­āļĄāļ­āļ™āļīāđ€āļ•āļ­āļĢāđŒ
āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđāļĨāļ°āđ€āļĄāļēāļŠāđŒ āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ remote āļŦāļ™āđ‰āļēāļˆāļ­ (Remote
Desktop) āļœāđˆāļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host) āđ‚āļ”āļĒāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ VNC (āļŦāļĢāļ·āļ­ ssh āđƒāļ™āļāļĢāļ“āļĩ text mode)
āđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host
Ethernet Hub
āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target)
āļŠāļēāļĒ RS-232
āļŠāļēāļĒ LAN
ARM, PowerPC, MIPS
(Linux OS)
x86, x86_64
(Desktp OS)
āļŠāļēāļĒ LAN
āļĢāļđāļ›āļ—āļĩāđˆ 7.4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļšāļšāļ—āļąāđˆāļ§āđ„āļ›
Ethernet Hub
āļšāļ­āļĢāđŒāļ” RaspBerry Pi (Target)
āļŠāļēāļĒ LAN
āļŠāļēāļĒ LAN
Remote Desktop (vnc)
Remote Login (ssh)
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
āļŠāļēāļĒ RS-232
HDMI
āļĢāļđāļ›āļ—āļĩāđˆ 7.5 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‚āļ­āļ‡ Raspberry Pi
369
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Secure Shell (ssh)
āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļ›āļīāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ ssh (secure shell) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ command line
āļĢāļ°āļĒāļ°āđ„āļāļĨ āļœāđˆāļēāļ™āļ—āļēāļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ ssh āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĄāļĩ
āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo raspi-config
āļĢāļđāļ›āļ—āļĩāđˆ 7.6 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ Raspberry Pi āļœāđˆāļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ raspi-cong
āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ SSH āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ ENABLE āļ–āļąāļ”āđ„āļ›
āļ—āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļĒāļ°āđ„āļāļĨāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āļœāđˆāļēāļ™ ssh client āđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi (IP Ad-
dress: 10.20.4.222 āļ”āđ‰āļ§āļĒāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ pi)
(āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Mac)$ ssh 10.20.4.222 -l pi
370
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļ›āļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļĒāļ°āđ„āļāļĨāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āļœāđˆāļēāļ™ ssh client āđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Putty
āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows
āļĢāļđāļ›āļ—āļĩāđˆ 7.7 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ PuTTY āđƒāļ™āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†
āļ—āļģāļāļēāļĢāđƒāļŠāđˆāđ„āļ­āļžāļĩāđāļ­āļ”āđ€āļ”āļĨāļŠāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry PI āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Open āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē
terminal āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ login : pi āđāļĨāļ° password : raspberry āļ•āđˆāļ­āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŦāļ™āđ‰āļē terminal āļ‚āļ­āļ‡
Raspbian āđ‚āļ”āļĒāļŠāļĄāļšāļđāļĢāļ“āđŒ
āļĢāļđāļ›āļ—āļĩāđˆ 7.8 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Terminal āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš
371
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ VNC (Remote Desktop)
āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VNC server āļŠāļ·āđˆāļ­āļ§āđˆāļē tightvncserver āļĨāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry
Pi āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰
$ sudo apt-get install tightvncserver
āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļšāļĢāļīāļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄ VNC server āļžāļĢāđ‰āļ­āļĄāļĢāļ°āļšāļļāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­ Raspberry Pi
$ vncserver :1 -geometry 1024x786 -depth 16 -pixelformat rgb565
āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VNC viewer (āļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ) āđāļĨāđ‰āļ§
āļĢāļ°āļšāļļ IP āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Raspberry Pi āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
āļĢāļđāļ›āļ—āļĩāđˆ 7.9 āđāļŠāļ”āļ‡āļāļēāļĢ Remote Desktop āđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi
372
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
GPIOs āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry PI
GPIO āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļĄāđ‰āļ§āđˆāļē
āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļĄāļĩāđ„āļĄāđˆāļ„āļĢāļšāđ€āļŦāļĄāļ·āļ­āļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āđāļ•āđˆāļāđ‡āđ€āļžāļĩāļĒāļ‡āļžāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ
āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļ”āđ‰āļĄāļēāļāļĄāļēāļĒ āđ€āļžāļĢāļēāļ°āļ•āļąāļ§āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ­āļ‡āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļšāļ™
āļšāļ­āļĢāđŒāļ”āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ Host āđ€āļĄāļ·āđˆāļ­āļšāļ§āļāļāļąāļšāļāļēāļĢāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ GPIOs āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āļāđ‡āļĒāļīāđˆāļ‡āļ—āļģāđƒāļŦāđ‰
āļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆāļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ
āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ›āđ‡āļ™āļ­āļĩāļāļŦāļ™āļķāđˆāļ‡āļšāļ­āļĢāđŒāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļŠāļđāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 7.10 āļ•āļģāđāļŦāļ™āđˆāļ‡ GPIO āļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi
āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› GPIO (General purpose I/O) āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļˆāļ°āļ­āļĒāļđāđˆāļ•āļĢāļ‡āļŠāđˆāļ§āļ™āļ‚āļē (āļ‚āļē) P1 āļ‹āļķāđˆāļ‡āļĄāļĩ
āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ‚āļē 2x13 āļŦāļĢāļ·āļ­ 26 āļ‚āļē āđ‚āļ”āļĒāļ‚āļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāđāļ„āđˆ GPIO āđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ
SPI, I2C, serial UART, āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 3.3 V, āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 5 V āđāļĨāļ° GND
āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi
-P1 āļĄāļĩāļˆāļģāļ™āļ§āļ™ 26 āļ‚āļē āļĄāļĩāļĢāļ°āļĒāļ°āļŦāđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ‚āļē 2.54 āļĄāļĄ. (100 mil)
-āđ€āļ­āļēāļžāļļāļ•āļ—āđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ‚āļē āļˆāļ°āļ­āļĒāļđāđˆāđƒāļ™āļŠāđˆāļ§āļ‡ 0-3.3V āđāļĨāļ°āļ­āļīāļ™āļžāļļāļ•āđ„āļĄāđˆāļ„āļ§āļĢāļĄāļēāļāļāļ§āđˆāļē 3.3 V āļ–āđ‰āļē
āļĄāļĩāļ­āļīāļ™āļžāļļāļ•āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ 5 V āļ„āļ§āļĢāļœāđˆāļēāļ™āļ§āļ‡āļˆāļĢāļ›āļĢāļąāļšāđāļĢāļ‡āļ”āļąāļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ 3.3V āļāđˆāļ­āļ™āļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļĩāđˆāļ‚āļēāļ­āļīāļ™āļžāļļāļ•
-āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 3.3 V āļŠāļēāļĄāļēāļĢāļ–āļˆāđˆāļēāļĒāļāļĢāļ°āđāļŠāđ„āļ”āđ‰āđ„āļĄāđˆāđ€āļāļīāļ™ 50 mA
-āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 5V āļŠāļēāļĄāļēāļĢāļ–āļˆāđˆāļēāļĒāļāļĢāļ°āđāļŠāđ„āļ”āđ‰āđ„āļĄāđˆāđ€āļāļīāļ™ 100 mA
-āļĄāļĩāļ”āļīāļˆāļīāļ•āļ­āļĨ āļ­āļīāļ™āļžāļļāļ•/āđ€āļ­āļēāļžāļļāļ• 8 āļ‚āļē
-āļĄāļĩ I2C 2 āļ‚āļē
-āļĄāļĩ SPI 5 āļ‚āļē
373
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
-āļĄāļĩ UART 2 āļ‚āļē
-āļĄāļĩāļ‚āļēāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāđƒāļŠāđ‰āļ­āļĩāļāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 6 āļ‚āļē
āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēPython (Python)
āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļžāļąāļ’āļ™āļē GPIO āļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ„āđˆāļēāđƒāļŦāđ‰ GPIO āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™
āļšāļ­āļĢāđŒāļ”āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ‡āļēāļ™āļˆāļēāļāđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ āļŦāļĢāļ·āļ­āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āļŠāļąāđˆāļ‡āļ‡āļēāļ™ āđ‚āļ”āļĒāļ—āļĩāđˆāļŠāđˆāļ§āļ™
āđƒāļŦāļāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Raspbian āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄ
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Python IDE āļžāļĢāđ‰āļ­āļĄāļ—āļąāđ‰āļ‡ Python Cross complier āđāļĨāļ° C/C++ Cross complier āđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§
āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ toolchains āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āļœāđˆāļēāļ™ command line
āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āđƒāļ™āļŠāļīāļ—āļ˜āļīāđŒ super user āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āļē GPIO āđ„āļ”āđ‰
$ sudo su
export GPIO āļ‚āļē āļˆāļēāļāđ„āļŸāļĨāđŒ /sys/class/gpio/export
# echo “4” > /sys/class/gpio/export
āļāļģāļŦāļ™āļ”āļŠāļ™āļīāļ”āļ‚āļ­āļ‡ GPIO4 āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļšāđ€āļ­āļēāļžāļļāļ—
# echo “out” > /sys/class/gpio/gpio4/direction
āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ GPIO4 āļ•āļīāļ”āļŦāļĢāļ·āļ­āļ”āļąāļšāđ„āļ”āđ‰ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡
# echo “1” > /sys/class/gpio/gpio4/value <--- (āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ LED āļ•āļīāļ”)
āļŦāļĢāļ·āļ­
# echo “0” > /sys/class/gpio/gpio4/value <--- (āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ LED āļ”āļąāļš)
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļāđ€āļĨāļīāļāđƒāļŠāđ‰āļ‡āļēāļ™ GPIO āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ unexport āđ„āļŸāļĨāđŒ /sys/class/gpio/unexport
# echo “4” > /sys/class/gpio/unexport
374
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļ‚āļē GPIO āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Push button āļœāđˆāļēāļ™ command line
āļĢāļđāļ›āļ—āļĩāđˆ 7.11 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāļāļ”āļŠāļ§āļīāļ—āļ‹āđŒāļāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi
āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āđƒāļ™āļŠāļīāļ—āļ˜āļīāđŒ super user āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āļē GPIO āđ„āļ”āđ‰
$ sudo su
export GPIO āļ‚āļē āļˆāļēāļāđ„āļŸāļĨāđŒ /sys/class/gpio/export
# echo “4” > /sys/class/gpio/export
āļāļģāļŦāļ™āļ”āļŠāļ™āļīāļ”āļ‚āļ­āļ‡ GPIO4 āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļšāđ€āļ­āļēāļžāļļāļ—
# echo “in” > /sys/class/gpio/gpio4/direction
āļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļīāļ™āļžāļļāļ— āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ cat
# cat /sys/class/gpio/gpio4/value
āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļāđ€āļĨāļīāļāđƒāļŠāđ‰āļ‡āļēāļ™ GPIO āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ unexport āđ„āļŸāļĨāđŒ /sys/class/gpio/unexport
# echo “4” > /sys/class/gpio/unexport
375
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āđ€āļžāļ·āđˆāļ­āļ‚āļąāļš LED
āļĢāļđāļ›āļ—āļĩāđˆ 7.12 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļ„āļ§āļšāļ„āļļāļĄ LED āļ”āđ‰āļ§āļĒāļšāļ­āļĢāđŒāļ” Raspberry Pi
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ gpio_out_LED.py āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āđ‰āļ”āļ”āļąāļ‡āļ™āļĩāđ‰
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
while (1):
GPIO.output(12,GPIO.HIGH)
time.sleep(1)
GPIO.output(12,GPIO.LOW)
time.sleep(1)
āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ™āļąāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļēāļ™āļąāđ‰āļ™ āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āđāļšāļšāļ„āļ·āļ­
āđāļšāļšāļ—āļĩāđˆ 1: GPIO.BOARD āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļē GPIO āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi
āđāļšāļšāļ—āļĩāđˆ 2: GPIO.BCM āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļē GPIO āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Broadcom BCM2835
CPU
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ GPIO.BOARD āđ€āļ—āđˆāļēāļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚ 12 āđāļ•āđˆāļ–āđ‰āļēāđ€āļ›āđ‡āļ™ GPIO.BCM āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļē
āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 18
376
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āđ‚āļ”āļĒāļāļēāļĢāļĢāļąāļšāļˆāļēāļāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ push button
āļĢāļđāļ›āļ—āļĩāđˆ 7.13 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāļāļ”āļŠāļ§āļīāļ—āļ‹āđŒāļœāđˆāļēāļ™āļ‚āļē 18
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ gpio_button.py āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āđ‰āļ”āļ”āļąāļ‡āļ™āļĩāđ‰
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
channel = 12
def check_button():
if(GPIO.input(channel) == GPIO.LOW):
print ('Button Pressed.')
while (1):
check_button()
time.sleep(1)
āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ pull-up āļŦāļĢāļ·āļ­ pull-down āļŠāļēāļĄāļēāļĢāļ–
āđ€āļžāļīāđˆāļĄāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ pull_up_down āđƒāļ™ GPIO.setup āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™
GPIO.setup(12,GPIO.IN, pull_up_down=GPIO.PUD_UP) (āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™ pull-up )
āļŦāļĢāļ·āļ­
GPIO.setup(12,GPIO.IN, pull_up_down=GPIO.PUD_DOWN) (āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™ pull-down )
āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāļ–āļēāļ™āļ° āļ„āļ·āļ­ āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļ•āđˆāļģ (Active Low) āđāļĨāļ°
āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļŠāļđāļ‡ (Active High) āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ python āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļĩāđ‰
377
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
if(GPIO.input(channel) == GPIO.LOW): (āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļ•āđˆāļģ - Active low)
print ('Button Pressed.')
āļŦāļĢāļ·āļ­
if(GPIO.input(channel) == GPIO.HIGH): (āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļŠāļđāļ‡ - Active high)
print ('Button Pressed.')
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ gpio_button.py āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāđ‚āļ”āļĒāļāļēāļĢāļ§āļ™
āļĢāļ­āļšāđ€āļ‚āđ‰āļēāļĄāļēāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ—āļļāļāđ† 1 āļ§āļīāļ™āļēāļ—āļĩāļ”āđ‰āļ§āļĒāđ€āļ—āļ„āļ™āļīāļ„āđ‚āļžāļĨāļĨāļīāđˆāļ‡ (polling technique) āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ­āļēāļˆāļˆāļ°
āđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ­āļēāļˆāļĄāļĩāļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļ­āļ·āđˆāļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđ‰āļ­āļ‡āļ—āļģāļ”āđ‰āļ§āļĒ āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāļ§āļ™āļĢāļ­āļš
āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ™āļģāđ€āļ—āļ„āļ™āļīāļ„āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ (Interrupt technique)
āļ—āļĩāđˆāļ™āļīāļĒāļĄāđ€āļ‚āļĩāļĒāļ™āļāļąāļ™āļšāļ™āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļˆāļķāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄāļĄāļēāļāļāļ§āđˆāļēāđāļšāļšāđ€āļ—āļ„āļ™āļīāļ„āđ‚āļžāļĨāļĨāļīāđˆāļ‡
āļ‹āļķāđˆāļ‡āļ āļēāļĐāļē Python āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ° threaded callback āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāļŠāļąāļāļāļēāļ“āļ‚āļ­āļ‡
āļ­āļīāļ™āļžāļļāļ• āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
def my_callback(channel):
print('Button on press...')
GPIO.add_event_detect(12, GPIO.FALLING, callback=my_callback, bounce-
time=200)
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
channel = 12
def my_callback(channel):
print('Button on press...')
GPIO.add_event_detect(12, GPIO.FALLING, callback=my_callback, bounceti-
me=200)
while (1):
378
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ­āļĢāđŒāļ” Raspberry Pi āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Web Server
āļ™āļ­āļāļˆāļēāļāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āđāļĨāđ‰āļ§ āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āļ‡āļēāļ™ GPIO āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ (Web Browser) āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļ°āļ”āļ§āļāļ•āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļēāļĄāļēāļĢāļ–
āļŠāļąāđˆāļ‡āļ‡āļēāļ™āļŦāļĢāļ·āļ­āđ€āļāđ‰āļēāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ•āđˆāļ­āļāļąāļš GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļˆāļēāļāļĢāļ°āļĒāļ°āđ„āļāļĨāđ„āļ”āđ‰
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļŠāđˆāļ™ āļāļēāļĢāļ™āļģāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ„āļŸāļŸāđ‰āļēāļ āļēāļĒāđƒāļ™āļšāđ‰āļēāļ™ āđāļĨāđ‰āļ§
āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āļ‡āļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļŦāļĢāļ·āļ­āļ”āļđāļŠāļ–āļēāļ™āļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļœāđˆāļēāļ™āļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļˆāļēāļāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web server āļĨāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi
āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāđāļžāđ‡āļāđ€āļāđ‡āļ• (pip) āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ Flask āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ web application frame-
work āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē Python āļĢāļ§āļĄāļāļąāļš Werkzeug WSGI toolkit āđāļĨāļ° Jinja2 engine
$ sudo apt-get install python-pip
$ sudo pip install Flask
āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļ”āļĨāļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Hello world
$ mkdir hello
$ cd hello/
$ nano hello.py
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
return “Hello world!”
if __name__ == “__main__”:
app.run(‘0.0.0.0’)
$ python hello.py
* Running on http://0.0.0.0:5000/
āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāđ‰āļ§āļžāļīāļĄāļžāđŒ raspberrypi:5000 āļŠāđˆāļ­āļ‡ URL
āļĢāļđāļ›āļ—āļĩāđˆ 7.14 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ„āļŸāļĨāđŒ hello.py āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ āļ—āļĩāđˆāļžāļ­āļĢāđŒāļ•āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 5000
379
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ„āļŸāļĨāđŒ HTML āđāļĨāļ° CSS āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ hello.py
āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ â€œtemplates/” āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello/ āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ HTML āļŠāļ·āđˆāļ­āļ§āđˆāļē
home.html āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ home() āļ™āļąāđ‰āļ™āļˆāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ home.html āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ tem-
plates/ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ CSS āļāđ‡āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļ·āđˆāļ­āļ§āđˆāļē static/css/ āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™
āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello/ āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ CSS
$ cd hello/
$ mkdir templates
$ mkdir static
$ mkdir static/css
$ cd static/css
$ nano main.css
body {
  margin: 0;
  padding: 0;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: #444;
}
/*
 * Create dark grey header with a white logo
 */
header {
  background-color: #2B2B2B;
  height: 35px;
  width: 100%;
  opacity: .9;
  margin-bottom: 10px;
}
header h1.logo {
  margin: 0;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  float: left;
}
header h1.logo:hover {
  color: #fff;
  text-decoration: none;
}
/*
 * Center the body content
 */ 
.container {
  width: 940px;
  margin: 0 auto;
}
380
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
div.jumbo {
  padding: 10px 0 30px 0;
  background-color: #eeeeee;
  -webkit-border-radius: 6px;
     -moz-border-radius: 6px;
          border-radius: 6px;
}
h2 {
  font-size: 3em;
  margin-top: 40px;
  text-align: center;
  letter-spacing: -2px;
}
h3 {
  font-size: 1.7em;
  font-weight: 100;
  margin-top: 30px;
  text-align: center;
  letter-spacing: -1px;
  color: #999;
}
āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ layout.html āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāđ€āļ§āđŠāļ›
$ nano layout.html
<!DOCTYPE html>
<html>
  <head>
    <title>Flask</title>   
    <strong><link rel="stylesheet" href="{{ url_for('static',
filename='css/main.css') }}"></strong>
  </head>
  <body>
    <header>
      <div class="container">
        <h1 class="logo">Flask App</h1>
      </div>
     </header>
    
    <div class="container">
      {% block content %}
      {% endblock %}
    </div>
  </body>
</html>
āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ home.html āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāđƒāļ™āđ„āļŸāļĨāđŒ layout.html
381
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
$ nano home.html
{% extends "layout.html" %}
{% block content %}
  <div class="jumbo">
    <h2>Welcome to the Embedded System<h2>
    <h3>This is the home page for the Home Automation<h3>
  </div>
{% endblock %}
āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒ āļ—āļģāļāļēāļĢāļ—āļ”āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡ localhost:5000 āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 7.15 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ” CSS Style āđ„āļ§āđ‰
āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Android āđāļĨāļ° Arduino
Accessory Development Kit (ADK) āļ„āļ·āļ­āļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāđāļ§āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­
āļŠāļĄāļąāļ„āļĢāđ€āļĨāđˆāļ™ āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš
āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļŠāļĢāļīāļĄāļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđāļĨāļ°āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ•āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļ™āļąāļšāđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
āļŠāļģāļ„āļąāļāđƒāļ™āļ§āļ‡āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļāļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™
āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āļ‡āļēāļ™ Google I/O 2011 āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§ ADK āļĢāļļāđˆāļ™āđāļĢāļ āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļšāļĢāļīāļĐāļąāļ—āđƒāļ™
āļāļĩāđˆāļ›āļļāđˆāļ™āļŠāļ·āđˆāļ­ RT Corporation āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ” RT-ADK āļ‹āļķāđˆāļ‡āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ” Arduino
(http://www.arduino.cc) āļ—āļĩāđˆāļ–āļđāļāļœāļĨāļīāļ•āļ­āļ­āļāļĄāļē āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™āđƒāļŠāđ‰āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ ATMega 2560 āļžāļĢāđ‰āļ­āļĄ
āļāļąāļšāļŠāļļāļ”āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ™āļĩāđ‰āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļļāļ”āđ€āļ”āđˆāļ™āļ‚āļ­āļ‡ Arduino āļ„āļ·āļ­āđ„āļ”āđ‰āļ–āļđāļ
āļ­āļ­āļāđāļšāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ‚āļĒāļēāļĒāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ”āđ‚āļĄāļ”āļđāļĨāļ­āļ·āđˆāļ™āđ† āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Shield āđ€āļŠāđˆāļ™āļšāļ­āļĢāđŒāļ” Ethernet
Shield āļšāļ­āļĢāđŒāļ” WIFI Shield āļšāļ­āļĢāđŒāļ” Bluetooth Shield āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
382
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 7.16 āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļœāđˆāļēāļ™ ADK āđāļĨāļ°āļšāļ­āļĢāđŒāļ” RT-ADK āļĢāļļāđˆāļ™āđāļĢāļ
āļĢāļđāļ›āđāļšāļšāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļš Android Open Accessory (AOA Protocol) āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ
āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android Devices) āļœāđˆāļēāļ™āļŠāļēāļĒāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ USB
Android Open Accessory
Android Open Accessory āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš
āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļœāđˆāļēāļ™āļ—āļēāļ‡ USB āđ„āļ›āļĒāļąāļ‡ USB Host āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļ āđāļ•āđˆāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļˆāļ°āđ„āļĄāđˆ
āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđāļŦāļĨāđˆāļ‡āļˆāđˆāļēāļĒāļžāļĨāļąāļ‡āļ‡āļēāļ™
āđ„āļŸāļŸāđ‰āļēāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āđāļĨāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļĢāļ°āļ”āļąāļšāļāļĢāļ°āđāļŠāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 500mA āļ—āļĩāđˆāļ„āļ§āļēāļĄāļ•āđˆāļēāļ‡āļĻāļąāļāļĒāđŒāđ„āļŸāļŸāđ‰āļē 5V āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–
āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰
āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE (www.arduino.cc) āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE (āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨ)
āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE
āļŦāļĨāļąāļāļˆāļēāļāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE āļˆāļēāļ Android ADK āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡
āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ„āļĨāđ‰āļēāļĒ Arduino IDE āđāļ•āđˆāļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ„āļĨāļšāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™ Us-
bAccessory āļ—āļĩāđˆāļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ
āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļāđ‡āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđāļ•āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāđ‰āļ§āļ„āļąāļ”āļĨāļ­āļāđ„āļ›āđƒāļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē libraries
383
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļĢāļđāļ›āļ—āļĩāđˆ 7.17 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE
āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ” Arduino āļ­āļ­āļāļĄāļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļ
āļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āđ€āļ­āļē
āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
āļ•āļēāļĢāļēāļ‡ 7.1 āđāļŠāļ”āļ‡āļĢāļļāđˆāļ™āļ•āđˆāđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Arduino
āļĢāļļāđˆāļ™āļšāļ­āļĢāđŒāļ” ArduinoāļĢāļļāđˆāļ™āļšāļ­āļĢāđŒāļ” Arduino
Arduino Uno Arduino BT w/ ATmega328
Arduino Duemilanove w/ ATmega328 Arduino BT w/ ATmega168
Arduino Diecimila or Duemilanove w/ ATmega 168 LilyPad Arduino USB
Arduino Nano w/ ATmega328 LilyPad Arduino w/ ATmega328
Arduino Nano w/ ATmega168 LilyPad Arduino w/ ATmega168
Arduino Mega 2560 or Mega ADK Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega328
Arduino Mega (ATmega1280) Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega168
Arduino Leonardo Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega328
Arduino Esplora Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168
Arduino Micro Arduino NG or older w/ ATmega168
Arduino Mini w/ ATmega328 Arduino NG or older w/ ATmega8
384
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Arduino Mini w/ ATmega168 Arduino Robot Control
Arduino Ethernet Arduino Robot Motor
Arduino Fio
āļĢāļđāļ›āļ—āļĩāđˆ 7.18 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļšāļ­āļĢāđŒāļ” Arduino āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™
āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Arduino āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļšāļ­āļĢāđŒāļ” Arduino āđ€āļĢāļīāđˆāļĄ
āļ—āļģāļ‡āļēāļ™ āļ‚āļķāđ‰āļ™ āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āļąāđ‰āļ‡āļ„āđˆāļē Setup() āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡
āļ„āđˆāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļšāļ­āļĢāđŒāļ” āđāļĨāļ°āļāļēāļĢāļāļģāļŦāļ™āļ”āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļžāļ­āļĢāđŒāļ•āļ•āđˆāļēāļ‡āđ† āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™
385
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļĨāļđāļ› loop() āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ§āļ™āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ loop()
āļ™āļĩāđ‰āđ„āļ›āđ€āļĢāļ·āđˆāļ­āļĒāđ†āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļĢāļĩāđ€āļ‹āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ (Arduino Reset)
āļĢāļđāļ›āļ—āļĩāđˆ 7.19 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Android āļāļąāļš Arduino āļœāđˆāļēāļ™ ADK
āļ„āļĨāļēāļŠāļŠāļģāļ„āļąāļāļ āļēāļĒāđƒāļ™ ADK2012 IDE āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™ ADK āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđāļĨāļ° Ar-
duino āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āđāļāđˆāļ„āļĨāļēāļŠ AndroidAccessory āļ‹āļķāđˆāļ‡āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰
class AndroidAccessory {
	 private:
	     const char *manufacturer;
	     const char *model;
	     const char *description;
	     const char *version;
	     const char *uri;
	     const char *serial;
...
	     int getProtocol(byte addr);
	     void sendString(byte addr, int index, const char *str);
	     bool switchDevice(byte addr);
	     bool findEndpoints(byte addr, EP_RECORD *inEp, EP_RECORD *outEp);
	     bool configureAndroid(void);
	
	 public:
	     AndroidAccessory(const char *manufacturer,
	                      const char *model,
	                      const char *description,
	                      const char *version,
	                      const char *uri,
	                      const char *serial);
	
	     void powerOn(void);	
386
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
    bool isConnected(void);
	     int read(void *buff, int len, unsigned int nakLimit = USB_NAK_LIMIT);
	     int write(void *buff, int len);
	 };
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ setup() āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ›āļīāļ” Android Accessory āļ„āļ·āļ­ pow-
erOn(), read() āđāļĨāļ° write() āđ‚āļ”āļĒāļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ buff āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļŠāđˆāļ‡āļ­āļ­āļāļŦāļĢāļ·āļ­āļĢāļąāļšāđ€āļ‚āđ‰āļē
āļĄāļēāļˆāļēāļāļāļąāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļœāđˆāļēāļ™āļ—āļēāļ‡ USB āļ•āļēāļĄāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļĒāļēāļ§āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (len) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļąāļš
āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ€āļ•āđ‡āļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ (Full Speed USB) āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ read() āļ™āļąāđ‰āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ„āđˆāļē NAK āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļšāļ­āļ
āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļ™āļąāđ‰āļ™āļĒāļąāļ‡āđ„āļĄāđˆāļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļāļĨāļąāļšāļŦāļĢāļ·āļ­āļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āđƒāļŦāđ‰āđƒāļ™āđ€āļ§āļĨāļēāļ™āļĩāđ‰
āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ–āļđāļāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļąāļšāļ§āđˆāļēāđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āđƒāļŦāđ‰āđāļĨāđ‰āļ§
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āđāļĨāđ‰āļ§āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļĄāļēāļˆāļēāļāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
#include <AndroidAccessory.h>
AndroidAccessory acc("Google, Inc.",
"DemoKit",
"DemoKit Arduino Board",
"1.0",
"http://www.android.com",
"0000000012345678");
void Setup(){
acc.powerOn(); // āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ Android Accessory
}
void loop(){
if (acc.isConnected()) {
// āļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļ Android
int len = acc.read(msg, sizeof(msg), 1);
}
}
āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āđƒāļ™āļāļąāđˆāļ‡āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļ°āđƒāļŠāđ‰āļ„āļĨāļēāļŠāļŦāļĨāļąāļāđ„āļ”āđ‰āđāļāđˆāļ„āļĨāļēāļŠ UsbManager āđāļĨāļ°āļ„āļĨāļēāļŠ UsbAccessory āļ—āļĩāđˆāļāļđāđ€āļāļīāļĨ
āđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‚āļķāđ‰āļ™āļĄāļēāđāļĨāđ‰āļ§
āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ UsbAccessory āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<uses-library android:name="com.android.future.usb.accessory" />
...
387
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
...
...
</application>
āđ‚āļ„āđ‰āļ”āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āļ‚āļ­āđ€āļ›āļīāļ”āđāļĨāļ°āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ USB
// āđ€āļ›āđ‡āļ™āļāļēāļĢāļāđāļēāļŦāļ™āļ” Intent āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļŠāđāļēāļŦāļĢāļąāļšāļāļēāļĢāļ”āļąāļāļ­āļĩāđ€āļ§āđ‰āļ™āļ—āđŒāļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK
private PendingIntent mPermissionIntent;
private static final String ACTION_USB_PERMISSION =
"com.android.example.USB_PERMISSION";
private UsbManager mUsbManager;
private UsbAccessory mAccessory;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUsbManager = UsbManager.getInstance(this);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
// āļāđāļēāļŦāļ™āļ” filter
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
// register āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļš intent āđ„āļ”āđ‰
registerReceiver(mUsbReceiver, filter);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
}
/** Called when the activity is resumed from its paused state and
immediately after onCreate(). */
@Override
public void onResume() {
super.onResume();
if (mInputStream != null && mOutputStream != null) {
return; }
UsbAccessory[] accessories = mUsbManager.getAccessoryList();
UsbAccessory accessory = (accessories == null ? null : accessories[0]);
if (accessory != null) {
// āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Accessory
if (mUsbManager.hasPermission(accessory)) {
openAccessory(accessory); // āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ accessory
} else {
synchronized (mUsbReceiver) {
if (!mPermissionRequestPending) {
mUsbManager.requestPermission(accessory, mPermissionIntent);
mPermissionRequestPending = true;
}
}
}
} else {
388
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Log.d(TAG, "mAccessory is null");
}
}
/** āđ€āļĄāļ·āđˆāļ­ Application āļ–āļđāļāļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āđāļēāļāļēāļĢāļ›āļīāļ” Accessory */
@Override
public void onPause() {
super.onPause();
closeAccessory();
}
/** āđ€āļĄāļ·āđˆāļ­āļ›āļīāļ” Application āļˆāļ°āļ—āđāļēāļāļēāļĢ unregister Intent */
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mUsbReceiver);
}
āļˆāļēāļāđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āđ‚āļŦāļĄāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™ USB āļ‹āļķāđˆāļ‡āļŦāļēāļāļĄāļĩāļāļēāļĢ
āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļĄāļēāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Arduino āļœāđˆāļēāļ™āļŠāļēāļĒ USB āļāđ‡āļˆāļ°āļ—āļģāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ openAccessory(accessory) āđ€āļĄāļ·āđˆāļ­
āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāđ‰āļ§āļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Thread āļ‚āļķāđ‰āļ™āļĄāļē āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļ
āļšāļ­āļĢāđŒāļ” Arduino āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
āļĢāļđāļ›āļ—āļĩāđˆ 7.20 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļšāļ­āļĢāđŒāļ” Arduino āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ• USB
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āđāļĨāļ°āđāļŠāļ”āļ‡āļŠāļąāļāļāļēāļ“āđ„āļŸāļŸāđ‰āļēāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­ (EMG)
āļĢāļđāļ›āļ—āļĩāđˆ 7.21 āđāļŠāļ”āļ‡āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš
āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļ§āļąāļ”āļŠāļąāļāļāļēāļ“āļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļˆāļēāļāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ” Ar-
duino āđāļĨāđ‰āļ§āļ–āļđāļāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļœāđˆāļēāļ™āļŠāļēāļĒ USB āļ”āđ‰āļ§āļĒāļĄāļēāļ•āļĢāļēāļāļēāļ™ AOA Protocol āļŦāļĨāļąāļ‡
āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļķāļ‡āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļĢāļēāļŸāđ€āļŠāđ‰āļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāđˆāļ§āļ™āļ”āļąāļ‡āļ™āļĩāđ‰
389
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļšāļ™āļšāļ­āļĢāđŒāļ” Arduino āđāļĨāļ°āļāļēāļĢāļ•āđˆāļ­āļāļąāļšāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG
āļĢāļđāļ›āļ—āļĩāđˆ 7.22 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino
āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļ„āļ·āļ­āđāļœāđˆāļ™ EMG āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­āļ™āļģāđ„āļŸāļŸāđ‰āļēāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‚āļĒāļąāļšāļĢāđˆāļēāļ‡āļāļēāļĒ
āļˆāļ°āđ€āļāļīāļ”āļŠāļąāļāļāļēāļ“āļ—āļēāļ‡āđ„āļŸāļŸāđ‰āļēāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāđ„āļ›āļ•āļēāļĄāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļ‚āļ­āļ‡āļĢāđˆāļēāļ‡āļāļēāļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđāļœāđˆāļ™ EMG āļˆāļ°āļ—āļģāļāļēāļĢāļ‚āļĒāļēāļĒ
āļŠāļąāļāļāļēāļ“āļ—āļēāļ‡āđ„āļŸāļŸāđ‰āļēāļ™āļąāđ‰āļ™ āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļŠāđˆāļ§āļ‡āļ—āļĩāđˆāļšāļ­āļĢāđŒāļ” Arduino āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļ§āļąāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āđˆāļēāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāļĄāļēāļˆāļ°
āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļĢāļ°āļ”āļąāļšāđāļĢāļ‡āļ”āļąāļ™āļāļĢāļ°āđāļŠāļ•āļĢāļ‡āļ‚āļ™āļēāļ”āļŠāđˆāļ§āļ‡ 0-5 āđ‚āļ§āļĨāļ—āđŒ
āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Arduino āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ āļĄāļĩāļŠāļ­āļ‡āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ„āļ·āļ­ āļŠāđˆāļ§āļ™āđāļĢāļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡
āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē Analog Read Voltage (āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡) āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļŠāļ­āļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ An-
droid āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē Analog āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļœāđˆāļēāļ™ ADK āđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Android āđ€āļžāļ·āđˆāļ­āļ™āļģ
āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ•āđˆāļ­āđ„āļ›
āļĢāļđāļ›āļ—āļĩāđˆ 7.23 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino
āđƒāļ™āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Arduino āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ” accessory mode āđāļĨāđ‰āļ§āļ­āđˆāļēāļ™
āļ„āđˆāļēāđāļĢāļ‡āļ”āļąāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļˆāļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļš â€œE<āļ„āđˆāļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āđ„āļ”āđ‰>” āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡
āļœāđˆāļēāļ™ USB āđ„āļ›āļĒāļąāļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ•āđˆāļ­āđ„āļ› āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰
#include <Wire.h>
#include <Servo.h>
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>
#define LED3_RED 2
390
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
#define LED3_GREEN 4
#define LED3_BLUE 3
#define LED2_RED 5
#define LED2_GREEN 7
#define LED2_BLUE 6
#define LED1_RED 8
#define LED1_GREEN 10
#define LED1_BLUE 9
AndroidAccessory acc("Google, Inc.",
	 	 "DemoKit",
	 	 "DemoKit Arduino Board",
	 	 "1.0",
	 	 "http://www.android.com",
	 	 "0000000012345678");
boolean sendData=false;
void setup();
void loop();
void init_leds()
{
	 digitalWrite(LED1_RED, 1);
	 digitalWrite(LED1_GREEN, 1);
	 digitalWrite(LED1_BLUE, 1);
	 pinMode(LED1_RED, OUTPUT);
	 pinMode(LED1_GREEN, OUTPUT);
	 pinMode(LED1_BLUE, OUTPUT);
	 digitalWrite(LED2_RED, 1);
	 digitalWrite(LED2_GREEN, 1);
	 digitalWrite(LED2_BLUE, 1);
	 pinMode(LED2_RED, OUTPUT);
	 pinMode(LED2_GREEN, OUTPUT);
	 pinMode(LED2_BLUE, OUTPUT);
	 digitalWrite(LED3_RED, 1);
	 digitalWrite(LED3_GREEN, 1);
	 digitalWrite(LED3_BLUE, 1);
	 pinMode(LED3_RED, OUTPUT);
	 pinMode(LED3_GREEN, OUTPUT);
	 pinMode(LED3_BLUE, OUTPUT);
}
byte b1, b2, b3, b4, c;
int value=0;
void setup()
{
pinMode(0, INPUT);
391
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
Serial.begin(115200);
	 Serial.print("rnStart");
	 init_leds();
	 c = 0;
	 acc.powerOn();
}
void loop()
{
	 byte err;
	 byte idle;
	 static byte count = 0;
	 byte msg[5];
	 long touchcount;
	 if (acc.isConnected()) {
value = analogRead(0);
msg[0] = 'E';
msg[1] = value;
acc.write(msg, sizeof(msg));
Serial.println("f");
Serial.println(msg[0]);
Serial.println(msg[1]);	
	 }
}
āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ
āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino
āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ­āļ˜āļīāļšāļēāļĒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ™āļģ
āļĄāļēāđāļŠāļ”āļ‡āļœāļĨāļ—āļąāļ™āļ—āļĩāļ—āļĩāđˆāļĢāļąāļšāđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļšāļ­āļĢāđŒāļ” Arduino āđ‚āļ”āļĒāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē GraphView āļ‹āļķāđˆāļ‡
āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āđāļšāļšāļŠāļ™āļīāļ”āļāļĢāļēāļŸāđ€āļŠāđ‰āļ™ āđāļĨāļ°āļāļĢāļēāļŸāđāļ—āđˆāļ‡
int num = 150; // āļˆāđāļēāļ™āļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ
GraphViewData[] data = new GraphViewData[num];
double v = 0;
for (int i = 0; i < num; i++) {
v += 0.2;
// āļ„āđāļēāļ™āļ§āļ“āļ„āđˆāļēāđƒāļ™āđāļ•āđˆāļĨāļ°āļˆāļļāļ”āļ—āļĩāđˆāļˆāļ°āļ—āđāļēāļāļēāļĢ plot āļāļĢāļēāļŸ
data[i] = new GraphViewData(i, Math.sin(v));
}
GraphView graphView = new LineGraphView(this, "AndroidGraph");
graphView.addSeries(new GraphViewSeries(data));
// āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļāļĢāļēāļŸāđƒāļŦāđˆāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļˆāļļāļ”āļ—āļĩāđˆ 2 āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļ—āđˆāļēāļāļąāļš 40 āļŠāđˆāļ­āļ‡
graphView.setViewPort(2, 40);
// āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ– Scroll āđ„āļ”āđ‰
graphView.setScrollable(true);
392
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
graphView.setScalable(true);
LinearLayout layout = (LinearLayout) findViewById(R.id.lay1);
layout.addView(graphView);
// āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļāļąāļšāđāļāļ™ X
graphView.setHorizontalLabels(new String[] {"2 days ago", "yesterday", "today", "to-
morrow"});
// āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļāļąāļšāđāļāļ™ Y
graphView.setVerticalLabels(new String[] {"high", "middle", "low"});
āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļŠāđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ GrapViewSeries āđƒāļŦāļĄāđˆāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļāļēāļĢ Graph-
View āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļ§āđ‰āđāļĨāđ‰āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāđ€āļŠāđˆāļ™
// draw sin curve
int num = 150;
GraphViewData[] data = new GraphViewData[num];
double v = 0;
for (int i = 0; i < num; i++) {
v += 0.2;
data[i] = new GraphViewData(i, Math.sin(v));
}
GraphViewSeries seriesSin = new GraphViewSeries(data);
// draw cos curve
data = new GraphViewData[num];
v=0;
for (int i=0; i<num; i++) {
v += 0.2;
data[i] = new GraphViewData(i, Math.cos(v));
}
GraphViewSeries seriesCos = new GraphViewSeries( data);
āļˆāļēāļāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩ āđāļ•āđˆāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļāļēāļĢāļ™āļģāļ„āđˆāļē EMG āļĄāļēāđāļŠāļ”āļ‡āļ™āļąāđ‰āļ™
āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (Real-time) āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ§āļ™āļĢāļ­āļš
āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļ—āļąāļ™āļ—āļĩāđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļē āđ‚āļ”āļĒāđƒāļŠāđ‰ Handler āđāļĨāļ° Runnable āļ”āļąāļ‡
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡
// āđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Runnable āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļ—āđāļēāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļķāđ‰āļ™āđ„āļ›āđ€āļžāļ·āđˆāļ­āļ—āđāļēāļāļēāļĢ plot āļāļĢāļēāļŸ
āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰ Handler āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļĨāļđāļ›āđƒāļ™āļāļēāļĢāļ§āļ™āļ—āļļāļ 1 āļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ
Handler mHandler = new Handler();
Runnable mTimer1;
mTimer1 = new Runnable() {
@Override
public void run() {
graph2LastXValue += 1d;
exampleSeries2.appendData(new GraphViewData(graph2LastXValue,
getRandom()), true);
mHandler.postDelayed(this, 1);
}
};
393
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āđ€āļĄāļ·āđˆāļ­āļ–āļķāļ‡āļˆāļļāļ”āļ™āļĩāđ‰āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļāļĢāļēāļŸāļ—āļĩāđˆāļĄāļĩāļāļēāļĢ plot āđāļšāļš Real-time āđ„āļ”āđ‰āļ•āđˆāļ­āļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡
āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļš Async Task āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡ ADK āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡
// āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ ADK āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ InputStream āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
private void openAccessory(UsbAccessory accessory) {
mFileDescriptor = mUsbManager.openAccessory(accessory);
if (mFileDescriptor != null) {
mAccessory = accessory;
FileDescriptor fd = mFileDescriptor.getFileDescriptor();
mInputStream = new FileInputStream(fd);
new receiveData().execute();
enableControls(true);
}
}
public class receiveData extends AsyncTask<Object, Void, Void> {
@Override
protected Void doInBackground(Object... params) {
while (true) {
// āļ—āđāļēāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ array Buffer
ret = mInputStream.read(buffer);
/* āļ—āđāļēāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰ āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ”āļķāļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ™āđāļēāđ„āļ› plot āļāļĢāļēāļŸ */
}
}
}
āļĢāļđāļ›āļ—āļĩāđˆ 7.24 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino
394
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļšāļ—āļŠāļĢāļļāļ›āđāļĨāļ°āļāđ‰āļēāļ§āļ•āđˆāļ­āđ„āļ›...
āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĨāđ‰āļ§āļ™āđāļĨāđ‰āļ§āđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ—āļĩāđˆāļžāļĒāļēāļĒāļēāļĄāđ€āļāđ‡āļšāļĢāļ§āļšāļĢāļ§āļĄ
āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāļŠāļīāļšāļ›āļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāļŦāļ™āļąāļ‡āļŠāļ·āļ­
Textbook āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ Embedded Linux Primer A Practical Real World Approach, Pro
Linux Embedded Systems, Building Embedded Linux Systems, Embedded Android, An-
droid Native Development Kit Cookbook āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļĄāļĩāļ„āļ§āļēāļĄāļ•āļąāđ‰āļ‡āđƒāļˆāļ­āļĒāļēāļāļˆāļ°āļ—āļģāļāļēāļĢāļ–āđˆāļēāļĒāļ—āļ­āļ”āļ­āļ­āļ
āļĄāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ āļēāļĐāļēāđ„āļ—āļĒāđ€āļžāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āđ„āļ—āļĒ āļ‹āļķāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒāļ™āđˆāļēāļˆāļ°āļžāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāļˆāļļāļ”āļ›āļĢāļ°āļāļēāļĒāļ„āļ§āļēāļĄ
āļāļąāļ™āđƒāļŦāđ‰āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ—āļĒāđƒāļŦāđ‰āļŦāļąāļ™āļĄāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāđƒāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđ„āļĄāđˆāļĄāļēāļāļāđ‡āļ™āđ‰āļ­āļĒ
āđ‚āļ”āļĒāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āļĢāļ§āļšāļĢāļ§āļĄāļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē
āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ (C, C++, JAVA, Python) āļĄāļļāļĄāļĄāļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ
āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĨāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”
āđ€āļŠāļīāļ‡āļĨāļķāļāļĄāļēāļāļŠāļąāļāđ€āļ—āđˆāļēāđƒāļ” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļˆāļēāļāļĻāļēāļŠāļ•āļĢāđŒāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđ€āļĢāļĩāļĒāļš
āđ€āļĢāļĩāļĒāļ‡āļ­āļĒāļđāđˆāđ„āļ§āđ‰āđƒāļ™āļšāļ—āđāļ•āđˆāļĨāļ°āļšāļ—āđƒāļŦāđ‰āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāļŠāđˆāļ§āļ™
āđƒāļ”āļšāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ­āđˆāļēāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļāđ‰āļēāļ§āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļš
āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡āđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ—āļąāđ‰āļ‡āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĢāļ°āļšāļš
āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļ„āļļāđ‰āļ™āđ€āļ„āļĒāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™
āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§
āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ­āļĩāļāļĄāļēāļāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™
āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ—āļĩāđˆāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāđ„āļ§āđ‰āļ§āđˆāļēāļˆāļ°
āļžāļĒāļēāļĒāļēāļĄāđ€āļĢāļĩāļĒāļšāđ€āļĢāļĩāļĒāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđƒāļ™āđ€āļĨāđˆāļĄāļ–āļąāļ”āđ†āđ„āļ› āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāļ‚āļąāđ‰āļ™āļŠāļđāļ‡
â€Ē āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Open Sources
â€Ē āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļŠāđˆāļ™ Web Server, File Server āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Linux Kernel Module āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ Native C/C++
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt 5.2 āļŠāļģāļŦāļĢāļąāļšāļ­āļ™āļēāļ„āļ•āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē
â€Ē āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Framework
â€Ē āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļŠāđˆāļ™ Android IPC/Binder
Framework, Android Hardware Abstract Layer (HAL) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK Application
â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļ§āļĒāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļŠāđˆāļ™ BeagleBone, BeagleBoard xM,
iMX53 QSB, PandaBoard ES, AM335x Starter Kit, ODROID-X2, RaspBerry Pi, Intel
Galileo āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™
395
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
āļ›āļĢāļ°āļ§āļąāļ•āļīāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™
āļœāļđāđ‰āļŠāđˆāļ§āļĒāļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ
āļ­āļēāļˆāļēāļĢāļĒāđŒāļ›āļĢāļ°āļˆāļģāļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē
āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē
āļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™
2553 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĢāļ­āļ‡āļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāļžāļąāļ’āļ™āļēāļ™āļīāļŠāļīāļ• āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2553 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļāļĢāļĢāļĄāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ (TESA)
2550 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™
āļŦāļąāļ§āļŦāļ™āđ‰āļēāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļ—āļĪāļĐāļāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđ‰āļ™āļŠāļđāļ‡ (ESTIA)
āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2548 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™
āļĢāļ­āļ‡āļ›āļĢāļ°āļ˜āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ§āļīāļˆāļąāļĒāđ‚āļĨāļˆāļīāļŠāļ•āļīāļāļŠāđŒāđāļĨāļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĄāļ­āļ‡
āļāļĨāļāļąāļ‡āļ•āļąāļ§) BAL-LABS āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2550 - 2551
āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļœāļđāđ‰āļ„āļīāļ”āļ„āđ‰āļ™āļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ„āļĢāđ‰āļŠāļēāļĒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļĢāļ–āđāļĨāļ°āļŠāļ–āļēāļ™āļĩ
RFID Sensor Network āđāļĨāļ°āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŠāļ–āļēāļ™āļĩ RFID Sensor Network
āđāļĨāļ° āļĻāļđāļ™āļĒāđŒāļ„āļ§āļšāļ„āļļāļĄāļāļĨāļēāļ‡
2549 - 2550
āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđƒāļŦāđ‰āļāļąāļšāļšāļĢāļīāļĐāļąāļ— Endemol āļœāļđāđ‰
āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļĢāļēāļĒāļāļēāļĢ Fear Factor, Survivor āđāļĨāļ° 1 versus 100
2549 - 2551 āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2549 - 2552 āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ
2547 - 2548 āļĢāļ­āļ‡āļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāļāļīāļˆāļāļēāļĢāļžāļīāđ€āļĻāļĐ āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2546 - 2547
āļĢāļąāļāļĐāļēāļĢāļēāļŠāļāļēāļĢāđāļ—āļ™āļœāļđāđ‰āļŠāđˆāļ§āļĒāļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļē
āļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2544 - 2546
āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄ Wireless Sensor Network Team āđ‚āļ„āļĢāļ‡āļāļēāļĢ Korea Brain Project, Korea
University, Seoul, Republic of South Korea
396
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
!
āļĢāļēāļ‡āļ§āļąāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļš
2555 āļĢāļēāļ‡āļ§āļąāļĨāļĢāļąāļ•āļ™āļšāļđāļĢāļžāļē āļŠāļēāļ‚āļēāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāđāļĨāļ°āļ›āļĢāļ°āļ”āļīāļĐāļāđŒāļ„āļīāļ”āļ„āđ‰āļ™ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē
2553
āļĢāļēāļ‡āļ§āļąāļĨāļŠāļīāđˆāļ‡āļ›āļĢāļ°āļ”āļīāļĐāļāđŒāļ—āļēāļ‡āļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļĻāļąāļāļĒāļ āļēāļžāļŠāļđāļ‡āđƒāļ™āļāļēāļĢāļĨāļ‡āļ—āļļāļ™ āđ‚āļ”āļĒāļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒ
āđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NSTDA) āļāļĢāļ°āļ—āļĢāļ§āļ‡āļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒ
2552
āļĢāļēāļ‡āļ§āļąāļĨāļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđāļŦāđˆāļ‡āļŠāļēāļ•āļīāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļĻāļĢāļĐāļāļāļīāļˆ āđƒāļ™āļŠāļ·āđˆāļ­ â€œāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒāđ„āļĢāđ‰āļŠāļēāļĒ” āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ
āļ•āļīāļ”āļ•āļēāļĄāļĒāļēāļ™āļžāļēāļŦāļ™āļ°āđāļšāļšāđ€āļĢāļĩāļĒāļĨāđ„āļ—āļĄāđŒ āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NIA)
2552
āļĢāļēāļ‡āļ§āļąāļĨāļŠāļ™āļ°āđ€āļĨāļīāļĻ āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ āļ›āļĢāļ°āđ€āļ āļ— Intel-
ligent Transport System (ITS) and Automotive “Vehicle Identication ITS Solution”
āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ
2549
āļĢāļēāļ‡āļ§āļąāļĨāļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄāđƒāļ™āļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ™āļģāļŠāļ·āđˆāļ­ E-Learning āļĄāļēāđƒāļŠāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļ—āļĩāđˆ TIT
University, āļāļĩāđˆāļ›āļļāđˆāļ™
2545 Best Paper Award in Wireless Sensor Network, Korea University, Seoul, South Korea
2543 Republic of South Korea Government Scholarship Grantee
āļŠāļ–āļēāļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™
āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļ—āļĪāļĐāļāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđ‰āļ™āļŠāļđāļ‡ (ESITA)
āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē
āļ–āļ™āļ™āļĨāļ‡āļŦāļēāļ”āļšāļēāļ‡āđāļŠāļ™ āļ•āđāļēāļšāļĨāđāļŠāļ™āļŠāļļāļ‚ āļ­āđāļēāđ€āļ āļ­āđ€āļĄāļ·āļ­āļ‡āļŠāļĨāļšāļļāļĢāļĩ āļˆāļąāļ‡āļŦāļ§āļąāļ”āļŠāļĨāļšāļļāļĢāļĩ
āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 038-10-2222 āļ•āđˆāļ­ 3380 āđ‚āļ—āļĢāļŠāļēāļĢ 038-74-5806
E-mail wiroon@eng.buu.ac.th
397
Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
EMBEDDED ANDROID
DEVELOPMENT
āļ‚āļ­āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļĒāļīāļ™āļ”āļĩāđƒāļ™āļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­
āđāļĨāđ‰āļ§āļœāļĄāļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ„āļ›āđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­āļĻāļīāļĐāļĒāđŒāđāļĨāļ°āļ•āļ™āđ€āļ­āļ‡...
āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļšāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ­āļ­āļāļĄāļē āđ€āļžāļĢāļēāļ°āļ•āļ­āļ™āļ™āļĩāđ‰āļœāļĄāļāđ‡āļ—āļģāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āļ­āļĒāļđāđˆ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļˆāļ–āđˆāļ­āļ‡āđāļ—āđ‰ āđāļĨāļ°āđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆ
āļ„āđˆāļ­āļĒāļĄāļĩ āļ–āđ‰āļēāđ„āļ”āđ‰āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĄāļēāļ™āļģāļ—āļēāļ‡āđāļĨāļ°āļœāļĄāļāđ‡āļ­āļĒāļēāļāļĄāļēāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ„āļ›āļ–āđˆāļēāļĒāļ—āļ­āļ”āđƒāļŦāđ‰āļ™āđ‰āļ­āļ‡āđ†āđ†āđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš...
āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāļ„āļĢāļąāļš āļœāļĄāđ€āļ›āđ‡āļ™āļ„āļ™āļ™āļ­āļāļŠāļēāļĒāļ‡āļēāļ™āļ”āđ‰āļēāļ™āļ™āļĩāđ‰ (āđ€āļ”āđ‡āļāļŠāđˆāļēāļ‡āļāļĨ) āļ­āļēāļĻāļąāļĒāļĻāļķāļāļĐāļēāļˆāļēāļāļœāļđāđ‰āļĢāļđāđ‰āļĄāļąāđˆāļ‡ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļĄāļąāđˆāļ‡ āļˆāļēāļ google āļĄāļąāđˆāļ‡ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ‚āļ­āļ‡āļ­āļēāļˆāļēāļĢāļĒāđŒāđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļ„āļ‡āļŠāđˆāļ§āļĒ
āđƒāļŦāđ‰āļ„āļ™āļ™āļ­āļāļ§āļ‡āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āļœāļĄāļĄāļĩāđ‚āļ­āļāļēāļĻāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™ āđāļ™āđˆāđ† āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāđ†āļ„āļĢāļąāļš āļ­āļēāļˆāļēāļĢāļĒāđŒ āļ­āļĒāļēāļāđƒāļŦāđ‰āļ›āļĢāļ°āđ€āļ—āļĻāļ™āļĩāđ‰āļĄāļĩāļ„āļ™āđāļšāļšāļ™āļĩāđ‰āđ€āļĒāļ­āļ°āđ†āļ„āļĢāļąāļš
āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš...
āļ­āļĒāļēāļāđƒāļŦāđ‰āļ­āļēāļˆāļēāļĢāļĒāđŒāļ—āļģāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩ āđ† āđāļšāļšāļ™āļĩāđ‰āļ­āļ­āļāļĄāļēāđ€āļĢāļ·āđˆāļ­āļĒ āđ† āļ„āļĢāļąāļš āļˆāļēāļāļ„āļ§āļēāļĄāļ„āļīāļ”āļŦāļ™āļķāđˆāļ‡āļŠāļđāđˆāļ­āļĩāļāļ„āļ§āļēāļĄāļ„āļīāļ”
āļŦāļ™āļķāđˆāļ‡ āļĄāļąāļ™āļˆāļ°āđāļ•āļāļāļīāđˆāļ‡āļ­āļ­āļāđ„āļ›āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ•āđ‰āļ™āđ„āļĄāđ‰...āļŠāļļāļ”āļ—āđ‰āļēāļĒāđāļĨāđ‰āļ§āļ•āđ‰āļ™āđ„āļĄāđ‰āļ•āđ‰āļ™āļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āđƒāļŦāđ‰
āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­ āđ† āđ„āļ› āđāļĨāđ‰āļ§āļœāļĄāļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ„āļ›āđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­āļĻāļīāļĐāļĒāđŒāđāļĨāļ°āļ•āļ™āđ€āļ­āļ‡...
āļ­āļĒāļēāļāđƒāļŦāđ‰āļŦāļĨāļēāļĒāđ† āļ„āļ™āđ€āļ›āđ‡āļ™āđāļšāļšāļ™āļĩāđ‰āļ™āļ°āļ„āđˆāļ° āđāļšāđˆāļ‡āļšāļąāļ™āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļāļēāļĢāļ“āđŒāđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āđāļšāļšāļ—āļ­āļ”āđ†
āļĄāļąāļ™āļ—āļģāđƒāļŦāđ‰āļĢāļđāđ‰āļŠāļķāļāļ§āđˆāļē .. āļ™āļ­āļāļˆāļēāļāļˆāļ°āļ™āđˆāļēāļŠāļ·āđˆāļ™āļŠāļĄāđƒāļ™āļ„āļ§āļēāļĄāđ€āļāđˆāļ‡āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļ‚āļ­āļ‡āđ€āļ„āđ‰āļēāđāļĨāđ‰āļ§
āļĒāļąāļ‡āļĢāļđāđ‰āļŠāļķāļāļ‹āļēāļšāļ‹āļķāđ‰āļ‡āđƒāļˆāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļ„āļ™āļ­āļĩāļāļŦāļĨāļēāļĒāđ† āļ„āļ™āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ™āļąāđ‰āļ™ āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāļ™āļ°āļ„āđˆāļ° ;) ....
āļœāļĄāđ€āļ„āļĒāđ€āļ›āđ‡āļ™āđ€āļ”āđ‡āļāđƒāļ™ HyperCamp āđāļĨāļ° TESATopGun āļ‚āļ­āļŠāļ·āđˆāļ­āļŠāļĄ
āļœāļĨāļ‡āļēāļ™āļ‚āļ­āļ‡ āļ­āļēāļˆāļēāļĢāļĒāđŒ āđāļĨāļ° āļˆāļ°āđ€āļ”āļīāļ™āļŠāļēāļĒ Embedded āļ•āđˆāļ­āļ„āļĢāļąāļš ...
āļœāļĄāļ„āļĨāļąāđˆāļ‡āđ„āļ„āļĨāđ‰āļ­āļēāļˆāļēāļĢāļĒāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļ‚āđˆāļ‡ TopGun āđāļĨāđ‰āļ§āļ„āļĢāļąāļš (āđ‚āļ­āđ€āļ§āļ­āļĢāđŒāļĄāļēāļāđ†āđ† (>.<)) āļ‚āļ­āļšāļ„āļļāļ“
āļ­āļēāļˆāļēāļĢāļĒāđŒāļĄāļēāļāđ†āļ„āļĢāļąāļšāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩāđ†āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļĄāļēāđāļšāđˆāļ‡āļ›āļąāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ­āđˆāļēāļ™āļ„āļĢāļąāļšāļœāļĄ ~(^_^)~ ...
āļœāļĄāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āđāļ•āđˆāļĒāļąāļ‡āļ‚āļēāļ”āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ›āļĢāļ°āļŠāļšāļāļēāļĢāđāļĨāļ°āļ­āđˆāļ­āļ™āđāļ­āđƒāļ™āļ”āđ‰āļēāļ™āļ āļēāļĐāļē
āļ™āļąāļšāđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļ”āļĩāļĄāļēāļāđ€āļĨāļĒāļ„āļĢāļąāļšāļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāđ€āļ›āđ‡āļ™āđ€āļŦāļĄāļ·āļ­āļ™
āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāđ€āļĨāļĒāļ„āļĢāļąāļš āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš :) ...
ã‚ŋã‚Ī詞ãŪ Embedded Android があãĢた、よかãĢた。ïžūïžŋïžū
āļ­āļēāļˆāļēāļĢāļĒāđŒāļˆāļ­āļĄāļ„āļĢāļąāļš āļœāļĄāļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļœāļĒāđāļžāļĢāđˆāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļĄāļēāļĒāļ™āļ°āļ„āļĢāļąāļš āđāļĨāļ°āļœāļĄ
āļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļŦāđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ™āļ°āļ„āļĢāļąāļš ^__^
āļ‚āļ­āđ€āļ›āđ‡āļ™āļāļģāļĨāļąāļ‡āđƒāļˆāđƒāļŦāđ‰āđ€āļœāļĒāđāļžāļĢāđˆāļšāļ—āļ„āļ§āļēāļĄāļŦāļĢāļ·āļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩāđ†āļ•āđˆāļ­āđ„āļ›āļ„āļĢāļąāļš āđ€āļžāļĢāļēāļ°āļ„āļ™āđ€āļĢāļēāđ„āļĄāđˆāļĄāļĩāđƒāļ„āļĢāļĢāļđāđ‰āļ—āļļāļāđ€āļĢāļ·āđˆāļ­āļ‡ āļŠāļīāđˆāļ‡āļ—āļĩāļ„āļļāļ“āļĢāļđāđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļĄāļēāļˆāļēāļāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ•āļĢāļ‡āļˆāļēāļāļāļēāļĢ
āļ—āļģāļ‡āļēāļ™āļŦāļĢāļ·āļ­āļāļēāļĢāļ‚āļ§āļ™āļ‚āļ§āļēāļ™āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ™āļąāđ‰āļ™āļœāļĄāļ„āļīāļ”āļ§āđˆāļēāļĄāļąāļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļāļąāļšāļœāļđāđ‰āļ­āļ·āđˆāļ™āļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™āđ„āļĄāđˆāļĄāļēāļāļāđ‡āļ™āđ‰āļ­āļĒ āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ­āļĒāļēāļāļˆāļ°āļšāļ­āļāļ§āđˆāļēāļ–āđ‰āļēāđ€āļĢāļēāļĒāļīāđˆāļ‡āļ—āļģāļāđ‡āļĒāļīāđˆāļ‡āđ„āļ”āđ‰
āļĒāļīāđˆāļ‡āđƒāļŦāđ‰āļāđ‡āļĒāļīāđˆāļ‡āļĄāļĩ āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš...
āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ„āļļāļ“āļ āļēāļžāļ‚āļ­āļ‡āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ āļœāļĄāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āļ­āļĩāļāļ—āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ„āļ§āļēāļĄāļĢāļđāđ‰
āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĻāļąāļāļĒāļ āļēāļžāļ‚āļ­āļ‡āļ•āļąāļ§āļœāļĄāđ€āļ­āļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ”āļĩāđƒāļ™āļ­āļ™āļēāļ„āļ• āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļ„āļĢāļąāļš...
āļœāļĄāļžāļĒāļēāļĒāļēāļĄāļˆāļ°āļĻāļķāļāļĐāļēāļĄāļēāļ™āļēāļ™ āļ”āđ‰āļ§āļĒāļ­āļēāļĒāļļāđ€āļĒāļ­āļ° āđāļĨāļ°āļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ”āļĩ āļĄāļĩāļŦāļ™āļąāļ‡āļŠāļ·āđˆāļ­āļ āļēāļĐāļēāđ„āļ—āļĒāļĄāļēāđƒāļŦāđ‰āļ­āđˆāļēāļ™āļ™āļąāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļāļĢāļļāļ“āļēāļ•āđˆāļ­āļœāļĄāļĄāļēāļāđ† āļ‚āļ­āđƒāļŦāđ‰
āļ—āđˆāļēāļ™āļœāļđāđ‰āļˆāļąāļ”āļ—āļģāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāđāļ—āļ™āļŠāļīāđˆāļ‡āļ”āļĩāđ† āļˆāļēāļāļžāļĢāļ°āļœāļđāđ‰āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļē...
āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļŦāļĨāļēāļĒāđ†āļāļģāļĨāļąāļ‡āđƒāļˆāļ–āļķāļ‡āļ™āļąāļāđ€āļ‚āļĩāļĒāļ™ āļˆāļēāļāļœāļđāđ‰āļ­āđˆāļēāļ™ 1,500 āļ—āđˆāļēāļ™āđāļĢāļ

More Related Content

PPTX
Edtech (1)
PDF
345635
PDF
āļŦāļĨāļąāļāļŠāļđāļ•āļĢāļ—āļĩāđˆ 1 āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āļāļēāļĢāļšāļĢāļīāļŦāļēāļĢ
PDF
Embedded Android Real-Time Streaming Optimization
PDF
Brillo / Weave Internals
PDF
Scheduling in Android
PDF
Android Things Internals
PDF
Embedded Android Market Development
Edtech (1)
345635
āļŦāļĨāļąāļāļŠāļđāļ•āļĢāļ—āļĩāđˆ 1 āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āļāļēāļĢāļšāļĢāļīāļŦāļēāļĢ
Embedded Android Real-Time Streaming Optimization
Brillo / Weave Internals
Scheduling in Android
Android Things Internals
Embedded Android Market Development

Viewers also liked (20)

PDF
Embedded Android Workshop with Marshmallow
PDF
Embedded Android Workshop with Nougat
PDF
āļ„āļģāļ™āļīāļĒāļĄ āļŦāļ™āļąāļ‡āļŠāļ·āļ­ "āļāļģāđ€āļ™āļīāļ”āļŠāļ›āļĩāļŠāļĩāļŠāđŒ" āđ‚āļ”āļĒ āļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāđ€āļāļĩāļĒāļĢāļ•āļīāļ„āļļāļ“ āļ”āļĢ. āļ§āļīāļŠāļļāļ—āļ˜āļīāđŒ āđƒāļšāđ„āļĄāđ‰
PDF
āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (2)
PDF
9789740333388
PDF
Android Embedded - EinfÞhrung in Android als Embedded-Plattform
PDF
Android porting-on-embedded-platform v2-0633850602027036930
PDF
āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āđ€āļĢāļ·āđˆāļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Flip Album 6.0 pro.
PDF
āļŠāļ­āļ™āđ€āļ”āđ‡āļāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āļ™āļ”āļĩ āļĻ āļ™āļž āļ§āļīāļˆāļēāļĢāļ“āđŒ āļžāļēāļ™āļīāļŠ
PDF
āļ„āļļāļĢāļļāļĄāļļāļ—āļīāļ•āļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĢāļ°āļĨāļķāļāđ€āļ™āļ·āđˆāļ­āļ‡āđƒāļ™āļ‡āļēāļ™āđ€āļāļĐāļĩāļĒāļ“āļ­āļēāļĒāļļāļĢāļēāļŠāļāļēāļĢāļ„āļĢāļđāļĻāļĢāļīāļžāļĢ āļ™āļēāļŦāļ­āļ„āļģ āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™...
PDF
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
PDF
Deep Dive into the AOSP
PDF
Android Internals at Linaro Connect Asia 2013
PDF
010.book scout encyclopedia_2
PDF
The Third Network: LSO, SDN and NFV
 
PPT
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
PDF
Remote Management of Embedded Android Devices
PDF
Memory Management in Android
PPT
Learning AOSP - Android Booting Process
Embedded Android Workshop with Marshmallow
Embedded Android Workshop with Nougat
āļ„āļģāļ™āļīāļĒāļĄ āļŦāļ™āļąāļ‡āļŠāļ·āļ­ "āļāļģāđ€āļ™āļīāļ”āļŠāļ›āļĩāļŠāļĩāļŠāđŒ" āđ‚āļ”āļĒ āļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāđ€āļāļĩāļĒāļĢāļ•āļīāļ„āļļāļ“ āļ”āļĢ. āļ§āļīāļŠāļļāļ—āļ˜āļīāđŒ āđƒāļšāđ„āļĄāđ‰
āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (2)
9789740333388
Android Embedded - EinfÞhrung in Android als Embedded-Plattform
Android porting-on-embedded-platform v2-0633850602027036930
āđ‚āļ„āļĢāļ‡āļ‡āļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āđ€āļĢāļ·āđˆāļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ Flip Album 6.0 pro.
āļŠāļ­āļ™āđ€āļ”āđ‡āļāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āļ™āļ”āļĩ āļĻ āļ™āļž āļ§āļīāļˆāļēāļĢāļ“āđŒ āļžāļēāļ™āļīāļŠ
āļ„āļļāļĢāļļāļĄāļļāļ—āļīāļ•āļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆāļĢāļ°āļĨāļķāļāđ€āļ™āļ·āđˆāļ­āļ‡āđƒāļ™āļ‡āļēāļ™āđ€āļāļĐāļĩāļĒāļ“āļ­āļēāļĒāļļāļĢāļēāļŠāļāļēāļĢāļ„āļĢāļđāļĻāļĢāļīāļžāļĢ āļ™āļēāļŦāļ­āļ„āļģ āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™...
Native Android Userspace part of the Embedded Android Workshop at Linaro Conn...
Deep Dive into the AOSP
Android Internals at Linaro Connect Asia 2013
010.book scout encyclopedia_2
The Third Network: LSO, SDN and NFV
 
āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ āļēāļĐāļēāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ
Remote Management of Embedded Android Devices
Memory Management in Android
Learning AOSP - Android Booting Process
Ad

More from National Science and Technology Development Agency (NSTDA) - Thailand (20)

PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 9 āļ‰āļšāļąāļšāļ—āļĩāđˆ 1 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āđ€āļĄāļĐāļēāļĒāļ™ 2566
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 11 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2566
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 10 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļāļĢāļēāļ„āļĄ 2566
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 9 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 8 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 7 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ•āļļāļĨāļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 6 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 5 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 4 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļĢāļāļŽāļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 3 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 2 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 1 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āđ€āļĄāļĐāļēāļĒāļ™ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 12 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļĩāļ™āļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 11 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 10 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļāļĢāļēāļ„āļĄ 2565
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 9 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2564
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 8 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2564
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 7 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ•āļļāļĨāļēāļ„āļĄ 2564
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 6 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ 2564
PDF
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 5 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ 2564
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 9 āļ‰āļšāļąāļšāļ—āļĩāđˆ 1 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āđ€āļĄāļĐāļēāļĒāļ™ 2566
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 11 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2566
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 10 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļāļĢāļēāļ„āļĄ 2566
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 9 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 8 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 7 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ•āļļāļĨāļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 6 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 5 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 4 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļĢāļāļŽāļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 3 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 2 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 8 āļ‰āļšāļąāļšāļ—āļĩāđˆ 1 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āđ€āļĄāļĐāļēāļĒāļ™ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 12 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļĩāļ™āļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 11 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 10 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļĄāļāļĢāļēāļ„āļĄ 2565
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 9 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2564
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 8 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2564
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 7 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļ•āļļāļĨāļēāļ„āļĄ 2564
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 6 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ 2564
NSTDA Newsletter āļ›āļĩāļ—āļĩāđˆ 7 āļ‰āļšāļąāļšāļ—āļĩāđˆ 5 āļ›āļĢāļ°āļˆāļģāđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ 2564
Ad

Embedded android development (e book)

  • 1. āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ‚āļ”āļĒ āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāļĨāļ‡āļ—āļļāļ™ āđāļĨāļ° āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ—āļĒ EMBEDDED ANDROID DEVELOPMENT āļŠāļđāđˆ āđ€ āļŠāđ‰ āļ™ āļ— āļē āļ‡ āļ™āļą āļ āļžāļą āļ’ āļ™ āļē
  • 2. EMBEDDED ANDROID DEVELOPMENT āļˆāļąāļ”āļ—āļģāđ‚āļ”āļĒ āļœāļĻ. āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ āļ•āļīāļ”āļ•āđˆāļ­ : 169 āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļ–āļ™āļ™āļĨāļ‡āļŦāļēāļ”āļšāļēāļ‡āđāļŠāļ™ āļ•āļģāļšāļĨāđāļŠāļ™āļŠāļļāļ‚ āļ­āļģāđ€āļ āļ­āđ€āļĄāļ·āļ­āļ‡āļŠāļĨāļšāļļāļĢāļĩ āļˆāļąāļ‡āļŦāļ§āļąāļ”āļŠāļĨāļšāļļāļĢāļĩ 20131 āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 0-3810-2222 āļ•āđˆāļ­ 3380-82 āļ•āđˆāļ­ 203 āđ‚āļ—āļĢāļŠāļēāļĢ 0-3874-5806 āļ­āļĩāđ€āļĄāļĨāđŒ wiroon@eng.buu.ac.th āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļēāļ‡āļšāļĢāļĢāļ“āļēāļ™āļļāļāļĢāļĄāļ‚āļ­āļ‡āļŠāļģāļ™āļąāļāļŦāļ­āļŠāļĄāļļāļ”āđāļŦāđˆāļ‡āļŠāļēāļ•āļī : āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ.  Embedded Android Development.-- : āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ, 2557.  397 āļŦāļ™āđ‰āļē.  1. āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§Â 2. āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 3. āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ I. āļŠāļ·āđˆāļ­āđ€āļĢāļ·āđˆāļ­āļ‡. ISBN (e-book) : 978-616-361-117-8 āļˆāļąāļ”āļˆāļģāļŦāļ™āđˆāļēāļĒāđ‚āļ”āļĒ : āļ­āļēāļ„āļēāļĢāļ—āļĩāļ‹āļĩāđ„āļ­āđ€āļ­āļŸ āļ—āļēāļ§āđ€āļ§āļ­āļĢāđŒ āļŠāļąāđ‰āļ™ 19 āđ€āļĨāļ‚āļ—āļĩāđˆ 1858/87-90 āļ–āļ™āļ™āļšāļēāļ‡āļ™āļē-āļ•āļĢāļēāļ” āđāļ‚āļ§āļ‡āļšāļēāļ‡āļ™āļē āđ€āļ‚āļ•āļšāļēāļ‡āļ™āļē āļāļĢāļļāļ‡āđ€āļ—āļžāļŊ 10260 āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 0-2739-8000 āļŦāļ™āļąāļ‡āļŠāļ·āļ­ eBook āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļ•āļēāļĄāļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āļ„āļĢāļĩāđ€āļ­āļ—āļĩāļŸāļ„āļ­āļĄāļĄāļ­āļ™āļŠāđŒ # # # # # # # # āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļē-āđ„āļĄāđˆāļ”āļąāļ”āđāļ›āļĨāļ‡-āđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļē (āđ€āļœāļĒāđāļžāļĢāđˆāļŸāļĢāļĩ) 3.0 āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ
  • 3. āļ„āļģāļ™āļīāļĒāļĄ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Embedded Systems) āļ—āļĩāđˆāđ€āļĢāļēāļžāļšāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļĄāļąāļ āļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āļ—āļĩāđˆāđ€āļ™āđ‰āļ™āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ‡āđˆāļēāļĒāđ† āļ‹āļķāđˆāļ‡ āļ›āļąāļāļŦāļēāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ•āļēāļĄāļĄāļēāļ„āļ·āļ­āļœāļđāđ‰āļŠāļ™āđƒāļˆāļŦāļĢāļ·āļ­āļœāļđāđ‰āļ—āļĩāđˆāļ­āļĒāļēāļāļˆāļ°āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ—āļģāļĢāļ°āļšāļšāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđ„āļ”āđ‰ (āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļˆāļĢāļīāļ‡) āļŦāļĢāļ·āļ­āļāļēāļĢāļ—āļģ User Interface āļāđ‡āļ—āļģāđ„āļ”āđ‰āļĒāļēāļāļĄāļēāļāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļĄāļēāļāđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļĢāļīāđˆāļĄāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āļĒāļ­āļ”āļˆāļēāļāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ€āļžāļ·āđˆāļ­ āļŠāđˆāļ§āļĒāļĨāļ”āđ€āļ§āļĨāļēāļāļēāļĢāļ—āļģāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĨāļ‡ āđ€āļŠāđˆāļ™ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ‹āļ·āđ‰āļ­āļŠāļīāđ‰āļ™āļŠāđˆāļ§āļ™āļĄāļēāļ›āļĢāļ°āļāļ­āļšāđ€āļ­āļ‡āđāļ•āđˆāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ”āļĄāļēāđƒāļŠāđ‰āđ€āļĨāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ āļŸāļąāļ‡āļŠāļąāđˆāļ™āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ•āđˆāļēāļ‡āđ† āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāļ„āļīāļ”āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāđƒāļŦāļĄāđˆāđ†āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļŠāđˆāļ™ Smart Phone āļŦāļĢāļ·āļ­ Tablet āļĄāļĩāļāļēāļĢāļāļĢāļ°āļˆāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļĄāļĩāļ‚āļĩāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļđāļ‡āļĢāļ§āļĄāļ–āļķāļ‡āļĄāļĩāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ•āđˆāļēāļ‡āđ†āļ„āļĢāļšāļ–āđ‰āļ§āļ™ āļˆāļķāļ‡āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāđƒāļŦāđ‰āđ€āļāļīāļ” āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļ”āļĩāđ†āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļĄāļēāļĒ āļŦāļĢāļ·āļ­āļ–āļđāļāļ™āļģāđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāđˆāļ§āļĄāļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ āļ­āļĒāđˆāļēāļ‡āļ”āļĩ Smart Phone āļŦāļĢāļ·āļ­ Tablet āļ—āļĩāđˆāļŠāļąāļ”āļŠāđˆāļ§āļ™āļāļēāļĢāļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡āļ•āļĨāļēāļ”āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™ āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļĄāļĩāļŠāļąāļ”āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļĄāļēāļ“ 56% āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ iOS āļ‹āļķāđˆāļ‡āļĄāļĩāļŠāļąāļ”āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļĄāļēāļ“ 22% āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢ āđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđƒāļŦāđ‰āđ€āļāđˆāļ‡āđāļĨāļ°āļŠāļģāļ™āļēāļāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļĄāļēāļ āļŦāļ™āļąāļ‡āļŠāļ·āļ­ â€œEmbedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē" āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ āļ­.āļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ āļ™āļĩāđ‰āļ™āļąāļšāļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄāđ‚āļ”āļ”āđ€āļ”āđˆāļ™āļĄāļēāļāļ—āļąāđ‰āļ‡āđƒāļ™āđāļ‡āđˆāļ§āļīāļŠāļēāļāļēāļĢ āļ›āļĢāļ°āļ§āļąāļ•āļīāļĻāļēāļŠāļ•āļĢāđŒ āđāļĨāļ°āļāļēāļĢāļ™āļģāđ„āļ›āļ›āļāļīāļšāļąāļ•āļīāļˆāļĢāļīāļ‡ āļŠāļģāļŦāļĢāļąāļš āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĄāļĩāļĢāļēāļāđ€āļ‡āđ‰āļēāļāļēāļĢāļžāļąāļ’āļ™āļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĄāļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĒāļđāļ™āļīāļāļ‹āđŒ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļāđ‡āļšāļĢāļĢāļĒāļēāļĒāļ—āļĩāđˆāļĄāļēāļ—āļĩāđˆāđ„āļ›āđƒāļŦāđ‰āļœāļđāđ‰āļŠāļ™āđƒāļˆāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļ‹āļēāļšāļ‹āļķāđ‰āļ‡ āļāļąāļšāļ›āļĢāļ°āļ§āļąāļ•āļīāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļē āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāđˆāļ§āļĒāļāļĢāļ°āļ•āļļāđ‰āļ™āļ„āļ§āļēāļĄāļ­āļĒāļēāļāđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĄāļļāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāđ€āļ”āļīāļ™āļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡āđ„āļ”āđ‰āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļžāļĩāđˆāđ€āļĨāļĩāđ‰āļĒāļ‡āļ—āļĩāđˆāļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļĄāļēāļ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļ›āļĢāļĩāļĒāļšāđ€āļŦāļĄāļ·āļ­āļ™āļ™āļāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāđ€āļĢāļīāđˆāļĄāļŦāļąāļ”āļšāļīāļ™āļ‹āļķāđˆāļ‡āļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§ āļ™āļāļ—āļļāļāļ•āļąāļ§āļĄāļĩāļ§āļīāļāļāļēāļ“āļ—āļĩāđˆāļˆāļ°āļšāļīāļ™āđ€āļ­āļ‡āđ„āļ”āđ‰ āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ‚āļ­āđƒāļŦāđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļšāļīāļ™ āļœāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļĄāļ­āļšāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āļœāļđāđ‰āļ—āļĩāđˆāļŠāļ™āđƒāļˆ āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļīāđˆāļĄāļšāļīāļ™āđƒāļ™āđ‚āļĨāļāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ­āļīāļŠāļĢāļ°āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāđ†āđ„āļ”āđ‰āļ„āļĢāļąāļš āļ”āļĢ. āļžāļąāļ™āļ˜āđŒāļĻāļąāļāļ”āļīāđŒ āļĻāļīāļĢāļīāļĢāļąāļŠāļ•āļžāļ‡āļĐāđŒ āļœāļđāđ‰āļ­āļģāļ™āļ§āļĒāļāļēāļĢāļĻāļđāļ™āļĒāđŒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NECTEC)
  • 4. FOREWORD I am honoured to be writing the forward for Ajarn Wiroon Sriborrirux’s new book. I have admired Ajarn Wiroon for a long time as one of the leaders and mentors in the embedded systems community in Thailand. He is well known and widely respected in terms of his generousity in sharing his deep technical knowledge, as a teacher, a profes- sional consultant, an advisor to startup companies and as a colleague. It is very tting for him to be writing this book as a way to continue to share his knowledge with our community in order to keep advancing Thailand forward in the technology eld. The topic of this book, “Embedded Android Development”, is incredibly timely, given the newest developments in terms of the Internet of Things (IOT), cyberphysical trend and the move to a “post-PC era”, or what we can call the “embedded systems era” or “device era”. Stage 1 of the “embedded systems era” (2000-2015) was about connectivity. We saw the rise of Ubiquitous Computing or Universal Communicator led by mobile phone and smart phones. By putting a very powerful personal computing and communication device into the hands of a major part of the world’s population, this stage built up an important infrastructure for the IOT. From 2010-2020, we are seeing Stage 2 of this era, with IOT being the keyword of this decade. We will see a rising need to make things “smart”. The challenge is not just in the technology, but rather in creating innovation or value creation that utilises infor- mation or knowledge gathered from connected devices. CISCO predicted that the value created by the use of IOT is expected to reach $14 trillion by 2020 which is only a few years from now. This means tremendous opportunity for the development community. Within this context, Embedded Android has become very popular in all types of devices requiring user interface such as measurement instruments, kiosk, access control, payment, health monitor, wearable devices, and cars. We are now currently only at the beginning of IOT innovation race, and I believe that we’ll be seeing a lot of exciting in- novations utilising Embedded Android in the next few years.
  • 5. I am condent that this book should be very useful for key courses such as Unix Systems Programming or Embedded Systems Development. This book should also serve as a very good reference for students working on senior project related to advance em- bedded systems and device development. These days, students learn a lot of theory but have little practical skills, which makes it difcult for them to meet workforce re- quirements. It is refreshing to see a book with a practical knowledge focus that en- hances development skills. It lls a key gap in this eld, and particularly in Thailand. Assistant Professor Apinetr Unakul President of Thai Embedded Systems Association (TESA)
  • 6. āļ„āļģāļ™āļģ āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Embedded Android Development āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ€āļ‡āļīāļ™āļ—āļļāļ™āļˆāļēāļāļĻāļđāļ™āļĒāđŒ āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NECTEC) āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđāļĨāļ° āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (āļŠāļ§āļ—āļŠ.) āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāļĨāļ‡āļ—āļļāļ™ (BOI) āđāļĨāļ°āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ„āļ—āļĒ (TESA) āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ āļēāļĒāđƒāļ•āđ‰āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļŠāļĢāļīāļĄāļĻāļąāļāļĒāļ āļēāļžāļ§āļīāļŠāļēāļŠāļĩāļž Embedded System āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļ—āļąāđ‰āļ‡āļ—āļąāļāļĐāļ°āļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŦāļĨāļąāļāļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļŦāđ‰āļ™āđˆāļēāļŠāļ™āđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ”āļķāļ‡āļ”āļđāļ”āļ™āļąāļāļĻāļķāļāļĐāļēāđƒāļŦāđ‰āļĻāļķāļāļĐāļēāļ•āđˆāļ­āđƒāļ™āļŠāļēāļ‚āļē Embed- ded System āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ™āļģāđ„āļ›āđ€āļœāļĒāđāļžāļĢāđˆāļĒāļąāļ‡āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļ—āļąāđˆāļ§āļ›āļĢāļ°āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ›āļĢāļ°āļāļ­āļšāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļŦāļĢāļ·āļ­ āļāļēāļĢāļāļķāļāļ­āļšāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāđ€āļ‚āļĩāļĒāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļˆāļēāļāđƒāļˆāļ—āļĩāđˆāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āđāļĨāļ°āļĻāļĢāļąāļ—āļ˜āļēāđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāđāļĨāļ°āļāļĢāļ°āļ•āļļāđ‰āļ™āđƒāļŦāđ‰ āđ€āļāļīāļ”āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ āļēāļĒāđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒ āđ‚āļ”āļĒāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāļ™āļģāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāļŠāļąāđˆāļ‡āļŠāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ§āļ‡āļāļēāļĢāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ° āđ€āļ§āļĨāļēāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 18 āļ›āļĩ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļšāļĢāļ§āļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļ§āļēāļĄāļĢāļđāđ‰āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŦāļēāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļĒāļēāļāđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđ€āļĢāļĩāļĒāļšāđ€āļĢāļĩāļĒāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄ āļāļąāļšāļ™āļīāļŠāļīāļ•āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļ™āđƒāļ™āļ§āļīāļŠāļēāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļđāļ™āļīāļāļ‹āđŒ/āļĨāļĩāļ™āļļāļāļ‹āđŒ āļ§āļīāļŠāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ§āļīāļŠāļēāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļ§āļīāļŠāļēāļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļīāļŠāļīāļ•āļ™āļąāļāļĻāļķāļāļĐāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļēāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄ āđ„āļŸāļŸāđ‰āļēāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļēāļ„āļ§āļšāļ„āļļāļĄ āļ§āļīāļ—āļĒāļēāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļŠāļēāļ‚āļēāļ—āļĩāđˆāđƒāļāļĨāđ‰āđ€āļ„āļĩāļĒāļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āļ—āļĩāđˆāļŠāļ™āđƒāļˆāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡ āđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļĢāļ§āļšāļĢāļ§āļĄāļĻāļēāļŠāļ•āļĢāđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāđƒāļ™āļ­āļ™āļēāļ„āļ•āđ„āļ”āđ‰ āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļ āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļđāļžāļ·āđ‰āļ™āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆ āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ‚āđ‰āļēāđƒāļˆāļĢāļ°āļšāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆ āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++/JAVA/Python āđāļĨāļ°āļāļēāļĢ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđƒāļ™āļšāļ—āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ€āļ›āđ‡āļ™āļāļēāļĢāļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļĢāļ“āļĩāļĻāļķāļāļĐāļēāđāļĨāļ°āđāļ™āļ§āļ„āļīāļ”āļŠāļģāļ„āļąāļāđƒāļ™ āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāđ€āļĢāļīāđˆāļĄ āļ•āđ‰āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļ­āļ™āļēāļ„āļ•
  • 7. āļāļīāļ•āļ•āļīāļāļĢāļĢāļĄāļ›āļĢāļ°āļāļēāļĻ āļŦāļ™āļąāļ‡āļŠāļ·āļ­ Embedded Android Development āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļˆāļ°āļŠāļĄāļšāļđāļĢāļ“āđŒāđ„āļĄāđˆāđ„āļ”āđ‰āļ–āđ‰āļēāļ‚āļēāļ”āļāļēāļĢāļŠāđˆāļ§āļĒāđ€āļ•āļĢāļĩāļĒāļĄāļ‚āđ‰āļ­āļĄāļđāļĨ āļ›āļĢāļ°āļāļ­āļšāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļšāļ—āļˆāļēāļāļĨāļđāļāļĻāļīāļĐāļĒāđŒāļ—āļĩāđˆāļĢāļąāļāđāļĨāļ°āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ›āļĢāļ°āļˆāļģāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨ āļāļąāļ‡āļ•āļąāļ§āļ‚āļ­āļ‡āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļē āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ™āļēāļĒāļŠāļĢāđ„āļāļĢ āđ„āļāļĢāļ›āļļāļĒ āļ™āļēāļĒāļ˜āļīāļ•āļīāļžāļ‡āļĐāđŒ āļŠāļ­āļ™āļˆāļąāļ™āļ—āļĢāđŒ āļ™āļēāļĒāļ āļēāļ™āļļāļ§āļąāļ’āļ™āđŒ āļžāļĢāļŦāļĄāļĻāļīāļĢāļī āļ™āļēāļĒāļ§āļīāļ˜- āļ§āļąāļŠ āļšāļļāļāđāļĒāđ‰āļĄ āļ™āļēāļĒāļ§āļĩāļĢāļ°āđ€āļ”āļŠ āļ‚āļļāļĄāļ—āļ­āļ‡ āļ™āļēāļĒāļ§āļŠāļąāļ™āļ•āđŒ āļ§āļīāļĒāļ°āļĢāļąāļ™āļ”āļĢāđŒ āļ™āļēāļĒāļ›āļĢāļīāļ§āļąāļ’āļ™āđŒ āđ€āļĨāļĩāđˆāļĒāļĄāļŠāļģāļĢāļēāļ āļ™āļēāļĒāļ™āļīāļžāļ™āļ˜āđŒ āļŠāļĄāļŦāļĄāļēāļĒ āļ™āļēāļĒāļˆāđ€āļĢ āļ›āļīāļĒāļ‰āļąāļ•āļĢāļžāļ™āļĄ āļ™āļēāļĒāļ™āļąāļāļžāļ‡āļĐāđŒ āđāļŠāļ‡āļŠāļ‡āđˆāļēāļĻāļĢāļĩ āđāļĨāļ°āļ™āļēāļĒāļāļīāļ•āļ•āļīāļĻāļąāļāļ”āļīāđŒ āļžāļĢāļĄāļĻāļĢāļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āļ™āļĢāđˆāļ§āļĄāļ‡āļēāļ™āļ—āļĩāđˆāļ„āļ­āļĒāđ€āļ›āđ‡āļ™ āļāļģāļĨāļąāļ‡āđƒāļˆ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ”āļĢ.āļ āļēāļ“āļļāļ§āļąāļ’āļ™āđŒ āļ”āđˆāļēāļ™āļāļĨāļēāļ‡ āļĢāļĻ.āļ”āļĢ.āļ“āļāļĢ āļ­āļīāļ™āļ—āļĢāđŒāļžāļĒāļļāļ‡ āđāļĨāļ° āļ”āļĢ.āļ­āļ āļīāļĢāļąāļ āļĨāļīāđˆāļĄāļĄāļ“āļĩ āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļ—āļĩāđˆāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢ āđ€āļ›āļīāļ”āļŠāļēāļ‚āļēāļ§āļīāļŠāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļŦāļĨāļąāļāļŠāļđāļ•āļĢ Embedded Systems Engineering (English Program) āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļ­āļ™āđāļĨāļ°āļ—āļģāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļē āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļ™āļēāļĒāļāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ—āļĒ āļœāļđāđ‰ āļŠāđˆāļ§āļĒāļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāļ­āļ āļīāđ€āļ™āļ•āļĢ āļ­āļđāļ™āļēāļāļđāļĨ āđāļĨāļ° āļœāļđāđ‰āļˆāļąāļ”āļāļēāļĢāļŠāļĄāļēāļ„āļĄāļŊ āļžāļĩāđˆāļ‚āļ™āļīāļĐāļāļē āļ›āļĢāļ°āļŠāļēāļĢāļŠāļļāļ‚ āļ—āļĩāđˆāđ„āļ”āđ‰āđƒāļŦāđ‰āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩ āđ‚āļ­āļāļēāļŠāđ€āļ‚āđ‰āļēāļĄāļēāļĢāđˆāļ§āļĄāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļāļīāļˆāļāļĢāļĢāļĄāļ”āļĩāđ†āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļž.āļĻ. 2548 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āđ‰āļ§āļĒāļāļģāļĨāļąāļ‡āđƒāļˆāļ—āļĩāđˆāđ€āļ›āļĩāđˆāļĒāļĄāļĨāđ‰āļ™āļˆāļēāļāļ„āļĢāļ­āļšāļ„āļĢāļąāļ§āļ—āļĩāđˆāļĢāļąāļāļ‚āļ­āļ‡āļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ€āļ­āļ‡ (āļ™āļēāļ‡āļ“āļąāļāļ“āļīāļŠāļē āļŦāļ™āļđāļ„āļ‡ āđāļĨāļ° āļ”.āļ. āļ›āļ§āļĢāļ™āļąāļ™āļ—āļ™āđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļ—āļĩāđˆāļ„āļ­āļĒāđ€āļ›āđ‡āļ™āļāļģāļĨāļąāļ‡āđƒāļˆāļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāđ€āļ”āļ·āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļ‚āļ­āļšāļžāļĢāļ°āļ„āļļāļ“āļšāļīāļ”āļē (āļ™āļēāļĒāļŠāļēāļĄāļēāļĢāļ– āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļĄāļēāļĢāļ”āļē (āļ™āļēāļ‡āđāļ”āļ‡ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ) āļ—āļĩāđˆāđƒāļŦāđ‰āļŠāļĩāļ§āļīāļ•āļ—āļĩāđˆāļĄāļĩāļ„āđˆāļēāļ™āļĩāđ‰āđāļāđˆāļ‚āđ‰āļēāļžāđ€āļˆāđ‰āļēāđ„āļ”āđ‰āļĄāļĩ āđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļœāļĨāļ‡āļēāļ™ āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļ„āļ™āļŠāļģāļŦāļĢāļąāļšāļ§āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āļŠāļąāļāļ§āļąāļ™āļŦāļ™āļķāđˆāļ‡āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļˆāļ°āđ„āļ”āđ‰āđ€āļŦāđ‡āļ™ āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ—āļĩāđˆāđāļ—āđ‰āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰
  • 8. āļŠāļēāļĢāļšāļąāļ āļšāļ—āļ—āļĩāđˆ 1 āļžāļ·āđ‰āļ™āļāļēāļ™ Unix/Linux āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 13 āļ›āļĢāļ°āļ§āļąāļ•āļīāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix/Linux 13 āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Licenses 18 āļ›āļĢāļąāļāļŠāļē āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 19 āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ 20 āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš 28 āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ 32 āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 33 āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš 33 āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļšāļš 36 āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ 37 āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ 38 āļāļēāļĢāļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļšāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc 43 āļ„āļģāļŠāļąāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ 45 āļ„āļģāļŠāļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļŠāļļāļ” Regular Expressions 48 āļ„āļģāļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ 60 āļšāļ—āļ—āļĩāđˆ 2 āļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 67 Linux Kernel 68 Linux Versioning 69 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļĨāļ°āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡ Linux Kernel 3.2 70 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Custom Kernel 73 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel 74 āļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel 3.x āļŠāļģāļŦāļĢāļąāļš Ubuntu āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆ 81
  • 9. āļāļēāļĢāļžāļąāļ’āļ™āļē Linux Kernel Module 84 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ Linux Module 88 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļš character device 92 āļāļēāļĢāđ€āļžāļīāđˆāļĄ Linux Module āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡ Linux Source Tree 97 āļšāļ—āļ—āļĩāđˆ 3 Embedded Linux Development 100 āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļēāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 100 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 104 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 104 āļāđˆāļ­āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 106 āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux 109 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš Embedded Linux 109 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ° āļšāļ­āļĢāđŒāļ” Target 112 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross Toolchains 116 āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Cross Toolchains 117 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāļ āļēāļĒāđƒāļ™ Cross Toolchains 118 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļšāļ™ Embedded Linux 120 āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host 121 Toolchain Options āļ—āļĩāđˆāļŠāļģāļ„āļąāļ 123 Bootloaders 124 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ Kernel Image āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 126 Linux File Systems 127 Virtual Filesystems 127 āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ 134 Embedded Linux File System 137 āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 139 Memory Technology Devices (MTD) 140
  • 10. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux 142 BusyBox āļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ 147 āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ 152 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C āļšāļ™ QEMU 155 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļš BusyBox āļ āļēāļĒāđƒāļ™ Root Filesystem āļšāļ™ QEMU 157 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ”āđ‰āļ§āļĒāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Buildroot āļšāļ™ QEMU 161 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļšāļ™ QEMU 168 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Friendly ARM āļšāļ™ QEMU 171 āļšāļ—āļ—āļĩāđˆ 4 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āđāļĨāļ° Qt āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 178 āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 178 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Makefile 179 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ 181 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ 184 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ 185 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ 198 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ 210 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQLite 218 āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ 220 āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C++ āļ”āđ‰āļ§āļĒ Qt 227 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Qt āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 227 āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Signal āđāļĨāļ° Slot 232 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ 236 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Multi-threading 240 āļšāļ—āļ—āļĩāđˆ 5 āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē 244 āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 244
  • 11. āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 247 āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android 250 āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android 252 āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host 252 Android Open Source Project (AOSP) 254 āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠ AOSP 254 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™ AOSP 256 Android Kernel 258 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 259 āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļ™ Android Emulator 265 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđƒāļŠāđ‰ Android Debug Bridge (ADB) 267 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš Emulator 271 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš Android Emulator (Goldfish) 271 āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel Module āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 276 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āļāļąāļ‡āļĨāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 280 āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™ Android Emulator 288 āļšāļ—āļ—āļĩāđˆ 6 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāļšāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē302 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Android Studio IDE 303 āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android Studio IDE 304 āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 309 āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ Eclipse IDE āļĄāļēāļŠāļđāđˆ Android Studio 311 Apache Ant āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ 312 Android Activity 313 User Interface 320 Android Adapter 329 Android Intent 332
  • 12. Broadcast Receiver 333 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android Native Development Kit 337 āļžāļ·āđ‰āļ™āļāļēāļ™ Android NDK 337 āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK 340 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Hello World āļ”āđ‰āļ§āļĒ Android NDK 342 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē JAVA Native Interface (JNI) 348 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JNI Methods 352 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK Multi-Threading 359 āļšāļ—āļ—āļĩāđˆ 7 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 366 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi 366 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Android āđāļĨāļ° Arduino 382 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Android āļāļąāļš Arduino āļœāđˆāļēāļ™ ADK 386 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļāļēāļĢāđāļŠāļ”āļ‡āļŠāļąāļāļāļēāļ“āđ„āļŸāļŸāđ‰āļēāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­ (EMG) 389 āļšāļ—āļŠāļĢāļļāļ›āđāļĨāļ°āļāđ‰āļēāļ§āļ•āđˆāļ­āđ„āļ›... 395 āļ›āļĢāļ°āļ§āļąāļ•āļīāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ 396
  • 13. āļšāļ—āļ—āļĩāđˆ 1 āļžāļ·āđ‰āļ™āļāļēāļ™ UNIX/LINUX āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āļ›āļĢāļ°āļ§āļąāļ•āļīāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix/Linux āđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 55 āļ›āļĩ āđ€āļĄāļ·āđˆāļ­āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāđ„āļ›āļ•āļąāđ‰āļ‡āđāļ•āđˆāļāđˆāļ­āļ™āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļēāļāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļˆāļ° āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđƒāļŦāļĄāđˆāļŠāļ·āļīāđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāļ‹āļĩ (C Language) āđ€āļ›āđ‡āļ™āļ āļēāļĐāļē āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āļĄāļē āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŦāļĄāļđāđˆāļ™āļąāļāđ€āļ‚āļĩāļĒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1960 āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāđāļšāļšāđāļšāđˆāļ‡āđ€āļ§āļĨāļē (timesharing) āđ‚āļ”āļĒ Dartmouth College āđāļĨāļ° Massachusetts Institute of Technology (M.I.T.) āļ‹āļķāđˆāļ‡āļĄāļĩāļˆāļļāļ”āđ€āļ”āđˆāļ™āļ„āļ·āļ­ āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļēāļĒāļ„āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ­āļēāļĻāļąāļĒāļāļēāļĢāđāļšāđˆāļ‡ āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āđƒāļŦāđ‰āđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ§āļĩāļĒāļ™āļāļąāļ™āđ„āļ› āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļšāļŠāļīāļ„ (BASIC Language) āđāļ•āđˆāļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāđāļ„āđˆāļŠāđˆāļ§āļ‡āļĢāļ°āļĒāļ°āļŦāļ™āļķāđˆāļ‡ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āļĩāļ āļ•āļąāļ§āļŠāļ·āđˆāļ­ CTSS (MIT's Compatible Time-Sharing System) āļˆāļēāļ M.I.T. āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļ āļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒ āļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļāļĨāļļāđˆāļĄāļ™āļąāļāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™ āļ—āļēāļ‡ M.I.T. āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ— GE (General Electric) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļĢāļīāļĐāļąāļ—āļœāļđāđ‰ āļœāļĨāļīāļ•āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ„āļ”āđ‰āļĢāļ§āļĄāļāļĨāļļāđˆāļĄāļāļąāļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđāļšāđˆāļ‡āđ€āļ§āļĨāļēāļ•āļąāļ§āđƒāļŦāļĄāđˆ āđƒāļŦāđ‰āļĄāļĩ āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļĄāļēāļāļ‚āļķāđ‰āļ™āđāļĨāļ°āļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē MULTICS (MULTiplexed Information and Computing Service) āđāļĄāđ‰āļ§āđˆāļēāļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MULTICS āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļĢāđ‰āļ­āļĒāļ„āļ™ āđāļ•āđˆāđ‚āļ„āļĢāļ‡āļāļēāļĢāļāđ‡āļĒāļąāļ‡āđ€āļāļīāļ” āļ›āļąāļāļŦāļēāļ‚āļķāđ‰āļ™āļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ•āļąāļ§āļ āļēāļĐāļē PL/I āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢ āļžāļąāļ’āļ™āļēāđāļĨāļ°āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĨāđˆāļēāļŠāđ‰āļēāļāļ§āđˆāļēāļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āļĄāļēāļāđāļĨāļ°āļĄāļĩāļ‚āđ‰āļ­āļšāļāļžāļĢāđˆāļ­āļ‡āļĄāļēāļāļĄāļēāļĒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ›āļąāļˆāļˆāļąāļĒāļ­āļ·āđˆāļ™ āļ—āļĩāđˆāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āđ€āļ­āļ‡āļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāļžāļĢāđ‰āļ­āļĄ āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļˆāļķāļ‡āđ„āļ”āđ‰āļ–āļ­āļ™āļ•āļąāļ§āļ­āļ­āļāļˆāļēāļāđ‚āļ„āļĢāļ‡āļāļēāļĢāļŦāļĨāļąāļ‡āļˆāļēāļāļŠāļīāđ‰āļ™ āļŠāļļāļ”āđ‚āļ„āļĢāļ‡āļāļēāļĢāļĢāļ°āļĒāļ°āđāļĢāļ āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­ Ken Thompson āļˆāļķāļ‡āđ€āļĢāļīāđˆāļĄāļŦāļēāđāļ™āļ§āļ—āļēāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļ§āļīāļˆāļąāļĒāļ•āđˆāļ­āđ„āļ› āđ‚āļ”āļĒāļĒāļąāļ‡āļ„āļ‡ āļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MULTICS āļĄāļēāļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļĒāđˆāļ­āļŠāđˆāļ§āļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāđāļ­āļŠ āđ€āļ‹āļĄāļšāļĨāļĩāđ‰ (Assembly Language) āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļļāđˆāļ™ PDP-7 āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āđāļĨāļ°āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđƒāļŦāļĄāđˆāđ‚āļ”āļĒ āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ‚āļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļŠāļ·āđˆāļ­ Brian Kernighan āļ§āđˆāļē UNICS (Uniplexed Information and Computing Service) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāđ‰āļ­āđ€āļĨāļĩāļĒāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢ MULTICS āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­ āđ€āļ›āđ‡āļ™ UNIX āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļĄāļĩāļ™āļąāļāļ§āļīāļˆāļąāļĒāļ„āļ™āļ­āļ·āđˆāļ™āđ†āđƒāļ™āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđ€āļĢāļīāđˆāļĄāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļˆāļ°āļ‚āļ­āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ‚āļ­āļ‡ Ken Thompson āļĄāļēāļāļ‚āļķāđ‰āļ™ āđāļĨāļ°āļ„āļ™āđāļĢāļāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļāđ‡āļ„āļ·āļ­ Dennis Ritchie āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļļāđˆāļ™ PDP-11 āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļĩāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļđāļ‡āļāļ§āđˆāļē 13 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 14. āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™ PDP-7 āđ€āļ”āļīāļĄ āļ•āđˆāļ­āļĄāļēāļ™āļąāļāļ§āļīāļˆāļąāļĒāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļāđ‡āđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢ āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļˆāļ™āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™ PDP-11/45 āđāļĨāļ° PDP-11/70 āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļ•āļĨāļēāļ”āļŠāļđāļ‡āđƒāļ™āļŠāđˆāļ§āļ‡ āļ—āļĻāļ§āļĢāļĢāļĐāļ—āļĩāđˆ 1970 āđ€āļžāļĢāļēāļ°āđ„āļ”āđ‰āđ€āļžāļīāđˆāļĄāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļ‚āļ™āļēāļ” āđƒāļŦāļāđˆ āđāļĨāļ°āļĄāļĩāļāļĨāđ„āļāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ—āļģāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĨāļēāļĒāļ„āļ™āđƒāļ™āđ€āļ§āļĨāļē āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āļĒāļąāļ‡āđ„āļ”āđ‰āļ§āļēāļ‡āđāļœāļ™āļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āļˆāļ°āļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ—āļģāđƒāļŦāđ‰āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļē āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āļĄāļēāļāļžāļ­āļŠāļĄāļ„āļ§āļĢ āļˆāļķāļ‡āđ€āļ›āđ‡āļ™āđ€āļŦāļ•āļļāļœāļĨāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāđˆāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĐāļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđƒāļ™āļ­āļ™āļēāļ„āļ• āđ‚āļ”āļĒāđƒāļ™āļĢāļ°āļĒāļ°āđāļĢāļāļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāđ‰āļ™āļ—āļēāļ‡ Ken Thompson āđ„āļ”āđ‰āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļ āļēāļĐāļēāļšāļĩ (B Language) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āļĄāļēāļˆāļēāļāļ āļēāļĐāļē BCPL (Basic Conbined Programming Lanaguge) āļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ M.I.T. āļ”āļąāļ‡āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢ āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 1.2 āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄ 14 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļđāļ›āļ—āļĩāđˆ 1.1 Ken Thompson āđāļĨāļ° Dennis Ritchie
  • 15. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļ„āđˆāļē 5 Factorials āđ‚āļ”āļĒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē BCPL āđāļĨāļ°āļ āļēāļĐāļēāļšāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē BCPL: GET "LIBHDR" LET START() = VALOF $( FOR I = 1 TO 5 DO WRITEF("%N! = %I4*N", I, FACT(I)) RESULTIS 0 )$ AND FACT(N) = N = 0 -> 1, N * FACT(N - 1) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļšāļĩāļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ—āļĩāđˆ Ken Thompson āđ€āļ›āđ‡āļ™āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ /* The following function will print a non-negative number, n, to the base b, where 2<=b<=10, This routine uses the fact that in the ASCII character set, the digits 0 to 9 have sequential code values. */ printn(n,b) { extrn putchar; auto a; if(a=n/b) /* assignment, not test for equality */ printn(a, b); /* recursive */ putchar(n%b + '0'); } āđāļ•āđˆāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ•āļąāļ§āļ āļēāļĐāļēāļšāļĩāđ€āļ­āļ‡āļ™āļąāđ‰āļ™ āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ āļēāļĒāđƒāļ™āļĒāļąāļ‡āļĄāļĩ āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ­āļĒāļđāđˆāļžāļ­āļŠāļĄāļ„āļ§āļĢ āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđƒāļŠāđ‰āļ āļēāļĐāļēāļšāļĩāļĒāļąāļ‡āđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄ āļŠāļģāđ€āļĢāđ‡āļˆāđ€āļ—āđˆāļēāļ—āļĩāđˆāļ„āļ§āļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡ Dennis Ritchie āļˆāļķāļ‡āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđāļĨāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ āļēāļĐāļēāļšāļĩāđƒāļŦāđ‰āļĄāļĩāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ° āļŠāļĄāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđāļĨāļ°āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē āļ āļēāļĐāļēāļ‹āļĩ (C Language) āļ•āđˆāļ­āļĄāļēāļ—āļēāļ‡ Thompson āđāļĨāļ° Ritchie āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļēāļāļ āļēāļĐāļēāļ‹āļĩāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ—āļģāđƒāļŦāđ‰āļ āļēāļĐāļēāļ‹āļĩāļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŦāļĄāļđāđˆāļ™āļąāļāđ€āļ‚āļĩāļĒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāđˆāļēāļ‡āļĄāļēāļāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ•āđˆāļēāļ‡āđ†āđāļĨāļ° āļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđˆāļēāļĄāļē āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ. 1974 Ritchie āđāļĨāļ° Thompson āđ„āļ”āđ‰āļ•āļĩāļžāļīāļĄāļžāđŒāļœāļĨ āļ‡āļēāļ™āļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰ āļˆāļ™āđ€āļ›āđ‡āļ™āļœāļĨāđƒāļŦāđ‰āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ„āļ”āđ‰āļĢāļąāļšāļĢāļēāļ‡āļ§āļąāļĨ ACM Turing Award āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1984 15 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 16. āļˆāļēāļāļœāļĨāļ‡āļēāļ™āļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ— AT&T āļœāļđāđ‰āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Bell āđāļĨāļ°āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ–āļ·āļ­āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢ UNIX āđ„āļ”āđ‰āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļ•āđˆāļēāļ‡āđ† āđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ‚āļ”āļĒāđ€āļŠāļĩāļĒāļ„āđˆāļēāļ˜āļĢāļĢāļĄāđ€āļ™āļĩāļĒāļĄāđ€āļžāļĩāļĒāļ‡āđ€āļĨāđ‡āļ āļ™āđ‰āļ­āļĒ āđ€āļžāļ·āđˆāļ­āļŦāļ§āļąāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ PDP-11 āļ‹āļķāđˆāļ‡āļĒāļąāļ‡ āļ—āļģāļ‡āļēāļ™āđ„āļĄāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ”āļĩāļžāļ­āđāļĨāļ°āļĒāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™āļĒāļēāļāļ­āļĒāļđāđˆ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢ UNIX āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āđ€āļāļīāļ”āļ•āļąāļ§āđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ BSD UNIX (Berkeley Software Distribution UNIX) āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ University of California (UC Berkeley) āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡ āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđāļĨāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒāđƒāļ™āļŠāļ–āļēāļšāļąāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļ•āđˆāļ­āļĄāļē āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļāļĢāļ°āļ—āļĢāļ§āļ‡āļāļĨāļēāđ‚āļŦāļĄāļ‚āļ­āļ‡āļŠāļŦāļĢāļąāļāļŊ (Defense Advanced Research Projects Agency - DARPA) āļāđ‡āđ„āļ”āđ‰āđƒāļŦāđ‰āļ—āļļāļ™āļāļąāļšāļ—āļēāļ‡ UC Berkeley āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ•āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ Version 4 BSD āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ DARPA āļ—āļĩāđˆāđƒāļŠāđ‰āļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ·āđˆāļ­āļ§āđˆāļē TCP/IP āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ. 1993 āļ—āļēāļ‡ UC Berkley āļāđ‡āđ„āļ”āđ‰āļ­āļ­āļāļ•āļąāļ§ BSD āļĢāļļāđˆāļ™ 4.4 āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ X.25 āđāļ•āđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āđˆāļē āđ€āļŠāļĩāļĒāļ”āļēāļĒāļ—āļĩāđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” UC Berkeley āļāđ‡āđ„āļ”āđ‰āļŦāļĒāļļāļ”āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđƒāļ™āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļē āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™āļžāļąāļ’āļ™āļēāļāļēāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļ‚āļķāđ‰āļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļēāļ„āļē āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļāđ‡āđ€āļĢāļīāđˆāļĄāļ–āļđāļāļĨāļ‡ āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ—āļĩāđˆāđ€āļ„āļĒāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļĄāļīāļ™āļīāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļē āđƒāļŠāđ‰āļšāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨ (Personal Computer) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē “XENIX” āđāļĄāđ‰āđƒāļ™āļĒāļļāļ„āđāļĢāļāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ XENIX āļĒāļąāļ‡āļĄāļĩāđ€āļžāļĩāļĒāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāđāļŠāļ”āļ‡āđāļ•āđˆāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āļŦāļ™āļąāļ‡āļŠāļ·āļ­ (Text Mode) āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļŠāđˆāļ§āļ‡āļāļĨāļēāļ‡āļ—āļĻāļ§āļĢāļĢāļĐ 1980 āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļē X-Window āļ‚āļķāđ‰āļ™āļĄāļēāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ UNIX āļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩ GUI (Graphic User Interface) āđ€āļāļīāļ” āļ‚āļķāđ‰āļ™ āļšāļĢāļīāļĐāļąāļ— AT&T āļĒāļąāļ‡āļ„āļ‡āļœāļĨāļąāļāļ”āļąāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļĢāļļāđˆāļ™ System V Release 4 (SVR4) āļ—āļēāļ‡ AT&T āđ„āļ”āđ‰āļžāļĒāļēāļĒāļēāļĄāļĢāļ§āļĄāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āđāļĨāļ°āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ† āļ‚āļ­āļ‡ BSD UNIX āđāļĨāļ° XENIX 16 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļđāļ›āļ—āļĩāđˆ 1.3 āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix āđƒāļ™āļ§āļēāļĢāļŠāļēāļĢ The Bell System Technical Journal copies of the 1978 and 1984 special Unix issues of the Bell System Technical Journal (Link)
  • 17. āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āđ‰āļ§āļĒāļāļąāļ™ āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™ SVR4 āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ„āļĢāļąāđ‰āļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļāļĨāļļāđˆāļĄāļ™āļąāļāļžāļąāļ’āļ™āļē āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ§āļīāļ•āļāļāļąāļ‡āļ§āļĨāļ§āđˆāļēāļˆāļ°āđ€āļāļīāļ”āļāļēāļĢāļœāļđāļāļ‚āļēāļ”āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļēāļāļšāļĢāļīāļĐāļąāļ— AT&T āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļķāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄāļ•āļąāļ§āļāļąāļ™āļˆāļąāļ”āļ•āļąāđ‰āļ‡āļ­āļ‡āļ„āđŒāļāļĢ Open Software Foundation (OSF) āļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļĢāđˆāļ§āļĄāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļš UNIX āđƒāļ™āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļē āļ™āļ­āļāļˆāļēāļ UC Berkeley āđāļĨāđ‰āļ§ āļāđ‡āļĒāļąāļ‡āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļĢāļēāļĒāļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļ”āđ‰āļēāļ™ āļ˜āļļāļĢāļāļīāļˆ āđ€āļŠāđˆāļ™ āļšāļĢāļīāļĐāļąāļ—āļ‹āļąāļ™āđ„āļĄāđ‚āļ„āļĢāļ‹āļīāļŠāđ€āļ•āđ‡āļĄ (SunOS āđāļĨāļ° Solaris) āļšāļĢāļīāļĐāļąāļ— DEC (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Ultrix āļˆāļ™āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ OSF/1) āļšāļĢāļīāļĐāļąāļ—āđ„āļĄāđ‚āļ„āļĢāļ‹āļ­āļŸāļ•āđŒ (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ XENIX) āļšāļĢāļīāļĐāļąāļ—āđ„āļ­āļšāļĩāđ€āļ­āđ‡āļĄ (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ AIX) āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĒāļķāļ”āđāļ™āļ§āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ­āļ‡ BSD āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļāđ‡ System V āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ™āļąāđ‰āļ™ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļāļēāļĢāļ„āđ‰āļēāļˆāļ”āļ—āļ°āđ€āļšāļĩāļĒāļ™ (Registered Trademark) āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļ·āđˆāļ­ The Open Group āļ‹āļķāđˆāļ‡ āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđāļĨāļ°āļĢāļąāļšāļĢāļ­āļ‡āļĄāļēāļ•āļĢāļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ„āļ§āđ‰ 2 āđāļšāļšāļ„āļ·āļ­ â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļ•āļĢāļāļēāļ™ UNIX āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āļĄāļēāļ•āļĢāļāļēāļ™āļ‚āļ­āļ‡ The Open Group āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļē āđ€āļŠāđˆāļ™ Digital UNIX, SCO UNIX, IBM's OpenEdition MVS â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ„āļĨāđ‰āļēāļĒ UNIX (UNIX Compatible) āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđāļ•āđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļ”āļ—āļ°āđ€āļšāļĩāļĒāļ™āļĢāļąāļšāļĢāļ­āļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™ Sun Solaris, IBM AIX, Linux āđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU (GNU Project) āđ„āļ”āđ‰āļ–āļđāļāļĢāļīāđ€āļĢāļīāđˆāļĄāļˆāļēāļāļ™āļąāļāļ§āļīāļˆāļąāļĒāļˆāļēāļ M.I.T āļŠāļ·āđˆāļ­ Richard Stallman āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āđ„āļĄāđˆāđ„āļ”āđ‰āļŸāļĢāļĩāļ­āļĩāļāļ•āđˆāļ­āđ„āļ›āđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļ„āļ·āļ­āļāļēāļĢāļžāļĒāļēāļĒāļēāļĄāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āļŠāļĢāđ‰āļēāļ‡ C compiler (gcc), make (GNU make), Emacs, C library (glibc), āđāļĨāļ° coreutils (āđ€āļŠāđˆāļ™āļ„āļģāļŠāļąāđˆāļ‡ ls, cp āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļļāļāļ„āļ™āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ‚āļēāļ”āļ•āļąāļ§ āđāļāļ™āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel) āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļĩ āļ„.āļĻ. 1991 āļ™āļąāļāļĻāļķāļāļĐāļē 17 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļđāļ›āļ—āļĩāđˆ 1.4 TimeLine āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī UNIX/LINUX
  • 18. āļŠāļēāļ‚āļēāļ§āļīāļ—āļĒāļēāļāļēāļĢāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ Helsinki āļ›āļĢāļ°āđ€āļ—āļĻāļŸāļīāļ™āđāļĨāļ™āļ”āđŒāļŠāļ·āđˆāļ­ Linus Torvalds āđ„āļ”āđ‰āļĄāļĩāđāļ™āļ§āļ„āļīāļ” āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ”āđāļĨāļ°āļŸāļĢāļĩ āđ‚āļ”āļĒāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļĨāđ‰āļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ āļˆāļēāļāđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ C library, gcc, binutils, leutils, make, emacs āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel āđ‚āļ”āļĒāļžāļĒāļēāļĒāļēāļĄāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™ POSIX āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX āļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Minix āđāļĨāļ°āļ—āļēāļ‡ Linus Torvalds āļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āđ€āļœāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŠāļđāđˆāļŠāļēāļ˜āļēāļĢāļ“āļ° āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļąāđˆāļ§ āđ‚āļĨāļāļŠāđˆāļ§āļĒāļāļąāļ™āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļāđ‰āđ„āļ‚ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ­āļ­āļāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 1.0 (āļ„.āļĻ. 1994) āđāļĨāļ° āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 2.2 (āļ„.āļĻ. 1999) āļ•āļēāļĄ āļĨāļģāļ”āļąāļš āļˆāļ™āđ„āļ”āđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļĨāļĩāļ™āļļāļāļ‹āđŒ (Linux) āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ LICENSES āļˆāļēāļāļāļēāļĢāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ GNU āđ‚āļ”āļĒ Richard Stallman āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļĄāļĩāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒ āđāļ•āđˆāļāđ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ āļēāļĒāđƒāļ•āđ‰āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡āļ•āļēāļĄāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļœāļđāđ‰ āļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ•āļēāļĄāļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ LICENSE āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ GNU General Public License (GPL) āļŦāļēāļāļĄāļĩāļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ āļŦāļĢāļ·āļ­ āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļ„āļĨāļēāļŠ āļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ GPL license āļ•āļīāļ”āđ„āļ›āļ”āđ‰āļ§āļĒ āļ‹āļķāđˆāļ‡āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ• GPL āļĄāļĩāļĨāļąāļāļĐāļ“āļ°Â â€œāđ€āļŠāļĢāļĩ” āļ”āļąāļ‡āļ™āļĩāđ‰ - āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ„āļĄāđˆāļ§āđˆāļēāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļˆāļļāļ”āļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđƒāļ” - āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļĻāļķāļāļĐāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ‚āļ„āđ‰āļ” - āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļˆāļģāļŦāļ™āđˆāļēāļĒāđ‚āļ›āļĢāđāļāļĢāļĄ -āđ€āļŠāļĢāļĩāļ āļēāļžāđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļĨāļ°āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›āđƒāļŠāđ‰āđāļĨāļ°āļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āđ‚āļ”āļĒāļĄāļĩāđ€āļžāļĩāļĒāļ‡āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ§āđˆāļēāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļģāđ„āļ›āļžāļąāļ’āļ™āļēāļ•āđˆāļ­ āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āđ€āļ”āļĩāļĒāļ§āļāļąāļ™Â  GNU Lesser General Public License (LGPL) āļŦāļēāļāļĄāļĩāļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚ āļŦāļĢāļ·āļ­ āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļ„āļĨāļēāļŠ āļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āļ™āļąāđ‰āļ™āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ•āļīāļ” LGPL (Lesser GPL) āđ„āļ›āļ”āđ‰āļ§āļĒ āđāļ•āđˆāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ” āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļļāļ”āđ€āļ”āļīāļĄāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ•āđ‰āļ­āļ‡āļĄāļĩ LGPL āļ•āļīāļ”āđ„āļ›āļ”āđ‰āļ§āļĒ āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™ āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āļ‚āļēāļĒāđ„āļ”āđ‰āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ§āđˆāļēāđ„āļ”āđ‰āļ™āļģ āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđƒāļ”āļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāđ‰āļēāļ‡ 18 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 19. LICENSE āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ Apache License āđƒāļŦāđ‰āđāļŠāļ”āļ‡āđƒāļ™āđ€āļ­āļāļŠāļēāļĢāļ§āđˆāļēāđ„āļ”āđ‰āđƒāļŠāđ‰āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļŦāļĢāļ·āļ­ āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Apache License āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāđ€āļ­āļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļ āđƒāļŠāđ‰ license āđāļšāļšāđ„āļŦāļ™āļāđ‡āđ„āļ”āđ‰ BSD Licenses āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāđāļāđ‰āđ„āļ‚āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ›āļīāļ”āđ€āļœāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļĄāļĩ āđ€āļžāļĩāļĒāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ­āļ™āļļāļāļēāļ•āđ€āļ”āļīāļĄāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđāļŠāļ”āļ‡ Creative Commons Licenses āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āļœāļĨāļ‡āļēāļ™ āđ‚āļ”āļĒāļ­āļēāļˆāđ€āļ›āđ‡āļ™āļœāļĨāļ‡āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ āļĢāļđāļ›āļ āļēāļž āļŦāļĢāļ·āļ­āļāļēāļĢāļ­āļ­āļāđāļšāļš āđ‚āļ”āļĒāđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļœāļĨāļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ„āļ”āđ‰āļ§āđˆāļēāļœāļĨ āļ‡āļēāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļˆāļ°āđƒāļŦāđ‰āļĄāļĩ license āđ€āļ›āđ‡āļ™āđāļšāļšāđ„āļŦāļ™ āđ€āļŠāđˆāļ™ āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļē , āđāļŠāļ”āļ‡ āļ—āļĩāđˆāļĄāļēāđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļē , āđāļŠāļ”āļ‡āļ—āļĩāđˆāļĄāļēāđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļēāđ„āļĄāđˆāļ”āļąāļ”āđāļ›āļĨāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ›āļĢāļąāļŠāļāļē āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđƒāļ™āļ­āļ”āļĩāļ•āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļŦāļĨāļēāļĒāļ„āļ™āļ„āļīāļ”āļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āđāļĨāļ°āļĒāļēāļāļ•āđˆāļ­āļāļēāļĢ āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āđ€āļžāļĢāļēāļ°āļ­āļēāļˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđ€āļŠāļīāļ‡āļĨāļķāļāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĨāļ°āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļžāļ­ āļŠāļĄāļ„āļ§āļĢ āđ€āļŠāđˆāļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļāļēāļĢāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŦāļĢāļ·āļ­ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļĨāđ‰āļ§āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļ§āļēāļĄāļĢāļđāđ‰āđāļĨāļ°āļ—āļąāļāļĐāļ°āļŦāļĨāļēāļĒāļ”āđ‰āļēāļ™āļ›āļĢāļ°āļāļ­āļšāļāļąāļ™āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļĄāļĩāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļ­āļĒāļđāđˆ āļ§āļ‡āļˆāļģāļāļąāļ” āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĻāļđāļ™āļĒāđŒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĄāđˆāļ‚āđˆāļēāļĒ āļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļēāļ‡āļ”āđ‰āļēāļ™ āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđ‚āļ—āļĢāļ„āļĄāļ™āļēāļ„āļĄ āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ āļŦāļĢāļ·āļ­āļŦāļ™āđˆāļ§āļĒāļ§āļīāļˆāļąāļĒāļ āļēāļ„āļĢāļąāļ/āļ āļēāļ„āđ€āļ­āļāļŠāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŦāļĨāļēāļĒāļ„āļ™āļāđ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ›āļāļīāđ€āļŠāļ˜āđ„āļ”āđ‰āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX/LINUX āđ€āļĢāļīāđˆāļĄ āđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āđƒāļ™āļŠāļĩāļ§āļīāļ•āļ›āļĢāļ°āļˆāļģāļ§āļąāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ­āļĩāđ€āļĄāļĨāđŒāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ āđ€āļ§āđŠāļ› āđāļ­āļžāļžāļīāđ€āļ„āļŠāļąāđˆāļ™āļ—āļĩāđˆāđ‚āļ”āđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļēāļ‡āđ† (facebook, google, twitter) āļĨāđ‰āļ§āļ™āđāļĨāđ‰āļ§āđāļ•āđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ UNIX/LINUX āđ€āļāļ·āļ­āļšāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļē āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ™āļīāļ”āļžāļēāļžāļ āļāđ‡āļ–āļđāļāļŠāļąāđˆāļ‡ āļāļēāļĢāļ”āđ‰āļ§āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ­āļąāļ™āļ—āļĢāļ‡āļžāļĨāļąāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡āđƒāļ™āļāļēāļĢāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļ§āļšāļ„āļļāļĄāļ”āļđāđāļĨ āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļœāđˆāļēāļ™ GUI (Graphic User Interface) āđāļĨāļ°āļ—āļģ āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ›āļĒāļąāļ‡āļĻāļđāļ™āļĒāđŒāļāļĨāļēāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļĢāļ°āļ”āļąāļšāđƒāļ”āļŦāļĢāļ·āļ­āļ™āļīāļŠāļīāļ• āļ™āļąāļāļĻāļķāļāļĐāļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļ™āđƒāļ™āļŠāļēāļĒāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ§āļīāļĻāļāļ§āļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ§āļīāļĻāļ§āļāļĢāļĢāļĄ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄ āļ—āļąāđ‰āļ‡āļŦāļĨāļēāļĒ āļˆāļķāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļ āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ 19 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 20. āļ•āđˆāļēāļ‡āđ† āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ‚āļ­āļāļēāļŠāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđ€āļ­āļ‡āđƒāļ™ āļ­āļ™āļēāļ„āļ• āđƒāļ™āļŠāļēāļĒāļ­āļēāļŠāļĩāļžāļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāđƒāļŦāļĄāđˆ āļ™āļąāļāļ§āļīāļˆāļąāļĒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļāļēāļĢāđāļžāļ—āļĒāđŒ āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĩāļ§āļ āļēāļž āļ™āļąāļāļ˜āļļāļĢāļāļīāļˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļšāļĢāļīāļāļēāļĢāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ™āļąāļāļ˜āļļāļĢāļāļīāļˆ āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļŠāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļāđ‰āļēāļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­ āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļģāļ„āļ§āļēāļĄ āđ€āļ‚āđ‰āļēāđƒāļˆāļ›āļĢāļąāļāļŠāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§āļĨāļ‡āļĄāļ·āļ­āļ›āļāļīāļšāļąāļ•āļī āļ”āđ‰āļ§āļĒāļāļēāļĢāļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļ‡āđˆāļēāļĒāđ† āđ„āļ›āļŠāļđāđˆāļĒāļēāļāđāļĨāļ°āļ—āļģāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļœāļĨāļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļķāļāļāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ™āļģāđ„āļ›āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ—āļĩāđˆāļĒāļīāđˆāļ‡āđƒāļŦāļāđˆāđāļĨāļ°āđ€āļ•āđ‡āļĄāđ„āļ›āļ”āđ‰āļ§āļĒ āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļĄāļēāļāļĄāļēāļĒ āļˆāļ°āļžāļšāđ€āļˆāļ­āļāļąāļšāđāļŦāļĨāđˆāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ­āļąāļ™āļĄāļŦāļēāļĻāļēāļĨāļ—āļĩāđˆāļˆāļ°āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāđ†āđƒāļŦāđ‰āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡ āđ€āļŦāļĨāļ·āļ­āđ€āļŠāļ·āđˆāļ­ āļ‹āļķāđˆāļ‡āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ āļēāļĒāđƒāļ™āļšāļ—āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļšāļĢāļ§āļĄāđāļĨāļ°āļŠāļĢāļļāļ›āļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļļāđˆāļ™āđ€āļĒāļēāļ§āđŒāļˆāļ™āļ–āļķāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡ āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļąāļ§āļ‚āđ‰āļ­ āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ - āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ (Shell) āđāļĨāļ° Standard I/O Stream - āļ•āļąāļ§āđāļ›āļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš (Environment Variable) - āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ - āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ - āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļšāļĢāļīāļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļāļ·āļ­āļšāļ—āļļāļāļŠāļīāđˆāļ‡āļ—āļļāļāļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ„āļ·āļ­āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ (Almost Every- thing is File) āđ„āļ”āđ‰āđāļāđˆ â€Ēāđ„āļŸāļĨāđŒāļ›āļāļ•āļīāļ—āļąāđˆāļ§āđ„āļ› (Regular les) āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒāđ€āļ­āļāļŠāļēāļĢ āđ„āļŸāļĨāđŒāļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ â€Ēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (Directories) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāļĢāļēāļĒāļāļēāļĢāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ† â€Ēāđ„āļŸāļĨāđŒāđ€āļŠāļ·āđˆāļ­āļĄāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ (Symbolic links) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒāļ­āļ·āđˆāļ™ â€Ēāđ„āļŸāļĨāđŒāļ­āļļāļ›āļāļĢāļ“āđŒ (Devices and Peripherals) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš â€Ēāđ„āļŸāļĨāđŒāļ—āđˆāļ­āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Pipe) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ„āđˆāļēāļœāļĨāļĨāļąāļžāļ˜āđŒ (output) āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡ āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ™āļģāđ€āļ‚āđ‰āļē (input) āļ‚āļ­āļ‡āļ­āļĩāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡ â€Ēāđ„āļŸāļĨāđŒāļ—āđˆāļ­āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• (Socket) āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļŦāļĢāļ·āļ­āļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ”āđ‰ āđ€āļŠāļĨāļĨāđŒ (Shell) shell āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ (Command Line) āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđāļĨāđ‰āļ§āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ (Command Line Interpreter - CLI) āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē āđ‚āļ”āļĒāļ‚āļšāļ§āļ™āļāļēāļĢāļ āļēāļĒāđƒāļ™āļ•āļąāļ§ shell āļˆāļ°āļ‹āđˆāļ­āļ™āļĢāļēāļĒ āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļąāļ™āļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ­āļēāđ„āļ§āđ‰ āđ‚āļ”āļĒāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āđ„āļĄāđˆāļĢāļđāđ‰āļ§āđˆāļēāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ›āđāļĨāđ‰āļ§āļ āļēāļĒāđƒāļ™āļˆāļ° 20 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 21. āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāđˆāļ™āđ„āļĢāļšāđ‰āļēāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļŦāļĢāļ·āļ­āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļ­āļĒāļđāđˆ āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļĩāļĒāļ‡āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ free/df āļ•āļąāļ§ shell āļāđ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢāđƒāļ™ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđƒāļŦāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•āļąāļ§āđ€āļ­āļ‡āļ§āđˆāļēāļ‚āļ“āļ°āļ™āļĩāđ‰āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆāđāļĨāđ‰āļ§āđāļĨāļ°āđ€āļŦāļĨāļ·āļ­ āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĩāļāđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļ‹āļķāđˆāļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāļ”āļąāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ‹āļķāđˆāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āđāļāļ™āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĢāļ°āļšāļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ‚āļ”āļĒāļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļšāļ—āļ–āļąāļ”āđ†āđ„āļ› āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ shell āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļš āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ„āļ”āđ‰āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļŠāļ„āļĢāļīāļ›āļ—āđŒ (Script) āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒ āđ„āļ”āđ‰ āļ—āļģāđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļĄāļĩ āļ—āļąāļāļĐāļ°āļ­āļĒāļđāđˆāļĢāļ°āļ”āļąāļšāļŦāļ™āļķāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāļŦāļĢāļ·āļ­āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļēāđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒ (Shell script) āļ™āļąāđ‰āļ™ āđāļĨāļ°āļ™āļ­āļāļˆāļēāļ āļ™āļąāđ‰āļ™āļĨāļđāļāđ€āļĨāđˆāļ™āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļĄāļēāļāļ™āđ‰āļ­āļĒāđ€āļžāļĩāļĒāļ‡āđƒāļ”āļāđ‡āļĒāļąāļ‡āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĒāļĩāđˆāļŦāđ‰āļ­āļŦāļĢāļ·āļ­āļĢāļļāđˆāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ shell āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒ āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ shell āļ—āļĩāđˆāļĄāļĩāļ­āļīāļ—āļ˜āļīāļžāļĨāđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­ Bourne shell (āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ Bourne Again shell) āđāļĨāļ° C shell āļŦāļ™āđ‰āļēāļˆāļ­āļĢāļąāļšāļ„āđāļēāļŠāļąāđˆāļ‡ Shell āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ„āđāļēāļŠāļąāđˆāļ‡ āļĢāļąāļ™āļ„āđāļēāļŠāļąāđˆāļ‡āļ­āđˆāļēāļ™āļ„āđāļēāļŠāļąāđˆāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 1.5 āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Shell āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ™āļīāļ”āļ‚āļ­āļ‡ shell āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ shell āļ”āđ‰āļ§āļĒ --version $ echo $SHELL /bin/bash $ bash --version GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 21 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 22. āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ–āļķāļ‡āļĢāļēāļĒāļāļēāļĢāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļāļąāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ bash -c help GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. job_spec [&] history [-c] [-d offset] [n] or hist> (( expression )) if COMMANDS; then COMMANDS; [ elif C> . filename [arguments] jobs [-lnprs] [jobspec ...] or jobs > : kill [-s sigspec | -n signum | -sigs> [ arg... ] let arg [arg ...] [[ expression ]] local [option] name[=value] ... alias [-p] [name[=value] ... ] logout [n] bg [job_spec ...] mapfile [-n count] [-O origin] [-s c> bind [-lpvsPVS] [-m keymap] [-f filen> popd [-n] [+N | -N] break [n] printf [-v var] format [arguments] builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir] caller [expr] pwd [-LP] case WORD in [PATTERN [| PATTERN]...)> read [-ers] [-a array] [-d delim] [-> cd [-L|-P] [dir] readarray [-n count] [-O origin] [-s> command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] or> compgen [-abcdefgjksuv] [-o option] > return [n] complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in WORDS ... ;] do COMM> compopt [-o|+o option] [-DE] [name ..> set [--abefhkmnptuvxBCHP] [-o option> continue [n] shift [n] coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...] declare [-aAfFilrtux] [-p] [name[=val> source filename [arguments] dirs [-clpv] [+N] [-N] suspend [-f] disown [-h] [-ar] [jobspec ...] test [expr] echo [-neE] [arg ...] time [-p] pipeline enable [-a] [-dnps] [-f filename] [na> times eval [arg ...] trap [-lp] [[arg] signal_spec ...] exec [-cl] [-a name] [command [argume> true exit [n] type [-afptP] name [name ...] export [-fn] [name[=value] ...] or ex> typeset [-aAfFilrtux] [-p] name[=val> false ulimit [-SHacdefilmnpqrstuvx] [limit> fc [-e ename] [-lnr] [first] [last] o> umask [-p] [-S] [mode] fg [job_spec] unalias [-a] name [name ...] for NAME [in WORDS ... ] ; do COMMAND> unset [-f] [-v] [name ...] for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done function name { COMMANDS ; } or name > variables - Names and meanings of so> getopts optstring name [arg] wait [id] hash [-lr] [-p pathname] [-dt] [name > while COMMANDS; do COMMANDS; done help [-dms] [pattern ...] { COMMANDS ; } āļŠāļēāļĄāļēāļĢāļ–āļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āđ‚āļ”āļĒāļžāļīāļĄāļžāđŒ help <āļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡> āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ $ help times times: times Display process times. Prints the accumulated user and system times for the shell and all of its child processes. Exit Status: Always succeeds. 22 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 23. Echo Echo āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļ”āđ†āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ–āļđāļāļ›āļĢāļēāļāļāļšāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ echo Welcome to Embedded System Welcome to Embedded System! $ echo Welcome to Embedded System Welcome to Embedded System! $ echo 'Welcome to Embedded System' Welcome to Embedded System! āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āđ„āļĄāđˆāļŠāļ™āđƒāļˆāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļ§āđˆāļēāļˆāļ°āļĄāļĩāļāļĩāđˆāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļˆāļ°āļ–āļđāļāļ•āļąāļ”āļŠāđˆāļ­āļ‡ āļ§āđˆāļēāļ‡āđ€āļŦāļĨāļ·āļ­āđ€āļžāļĩāļĒāļ‡ 1 āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđ€āļŠāļĄāļ­ āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ•āļēāļĄāļĢāļ°āļĒāļ°āļŦāđˆāļēāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ āļ­āļąāļāļ›āļĢāļ°āļāļēāļĻ (‘ -Apostrophe) āļŦāļĢāļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ„āļģāļžāļđāļ” (“ - Quotation Mark) āļ„āļĢāļ­āļš āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ™āļąāđ‰āļ™ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļ™ Bash shell āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰ white space (āđ‚āļ”āļĒāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ space bar) āđƒāļ™āļāļēāļĢāđāļĒāļ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļ­āļāđ€āļ›āđ‡āļ™ token āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ āđāļ•āđˆāļ–āđ‰āļēāļĄāļĩāļāļēāļĢāđƒāļŠāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ„āļĢāļ­āļš āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ€āļŠāđˆāļ™ â€˜Burapha University’ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ token āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ (Option) āļŦāļĨāļēāļĒāđāļšāļš (āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ”āđ‰āđ‚āļ”āļĒ āļžāļīāļĄāļžāđŒ man echo) āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -n āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ” āđƒāļŦāļĄāđˆ (New Line) $ echo -n "My name is Android" My name is Android$ āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđƒāļŦāļĄāđˆāļ•āļēāļĄāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ n (new line) āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -e āļŦāļĨāļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡ echo $ echo -e "My name is nAndroid" My name is Android āļ™āļ­āļāļˆāļēāļāļ­āļąāļāļ‚āļĢāļ° n āđāļĨāđ‰āļ§āļĒāļąāļ‡āļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 1.1 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐ ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” a Alert (bell) b Backspace 23 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 24. ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” c āļŦāļĒāļļāļ”āļāļēāļĢāļ‚āļķāđ‰āļ™āļšāļĢāļĢāļ—āļąāļ”āđƒāļŦāļĄāđˆ (āļĨāļąāļāļĐāļ“āļ°āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ -n) f Form feed n New line r Carriage return t Horizontal tab āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Bash shell āļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āđ€āļ‰āļžāļēāļ°āļĄāļēāļāļĄāļēāļĒāļ—āļĩāđˆāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ”āđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļīāļ™āļžāļļāļ—āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ āđ€āļŠāđˆāļ™ '|', '&', ';', '(', ')', '<', '>' āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļŠāļ”āļ‡āļ­āļąāļāļ‚āļĢāļ°āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđƒāļŦāđ‰āļ›āļĢāļēāļāļāļ­āļĒāļđāđˆāđƒāļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļīāļĄāļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļ™āļģāļŦāļ™āđ‰āļēāļ­āļąāļāļ‚āļĢāļ°āđ€āļŠāļĄāļ­ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļąāļāļ›āļĢāļ°āļāļēāļĻāļ„āļĢāļ­āļšāļ—āļąāđ‰āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āļœāļŠāļĄāļ­āļĒāļđāđˆāļāđ‡āđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļ™āļģāļŦāļ™āđ‰āļēāļ­āļąāļāļ‚āļĢāļ°āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ $ echo I love Linux & Android [1] 30136 I love Linux Android: command not found [1]+ Done echo I love Linux [1]+ Done echo I love Linux $ echo I love Linux & Android I love Linux & Android $ echo 'I love Linux & Android' I love Linux & Android Command Sequences āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ›āđ‰āļ­āļ™āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ›āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄ (Control Opera- tors) āđ„āļ”āđ‰āđāļāđˆ ‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘|’, ‘(‘, ‘)’ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩ āļĄāļēāļāļāļ§āđˆāļē 1 āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āļˆāļ°āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ â€˜;’ āļ­āļąāļ’āļ āļēāļ„ (semicolon) shell āļˆāļ°āļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļ”āļģāđ€āļ™āļīāļ™ āļāļēāļĢāļ—āļĩāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ§āđˆāļēāļŠāļģāđ€āļĢāđ‡āļˆāļŦāļĢāļ·āļ­āļĨāđ‰āļĄ āđ€āļŦāļĨāļ§āļ™āļąāđ‰āļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļ„āļ·āļ­āļ–āđ‰āļēāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ€āļĨāļ‚āļĻāļđāļ™āļĒāđŒāļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āļģāđ€āļ™āļīāļ™ āļāļēāļĢāļŠāļģāđ€āļĢāđ‡āļˆ āđāļ•āđˆāļ–āđ‰āļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚āļ­āļ·āđˆāļ™āđ†āļˆāļ°āļ–āļ·āļ­āļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™āļ—āļģāļ‡āļēāļ™āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļ­āļ­āļāļĄāļēāđ‚āļ”āļĒāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ AND ‘&&’ āđāļĨāļ° OR ‘||’ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ $ ls android ccache Downloads kernel output.txt Templates workspace aosp Desktop error.log Music Pictures test.txt 24 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 25. bin Documents git one.txt Public Videos $ ls test.txt && echo "OK... File exists" test.txt OK... File exists $ ls mail.txt && echo "OK... File exists" ls: cannot access mail.txt: No such file or directory āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ„āļŸāļĨāđŒ test.txt āļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ€āļ›āđ‡āļ™āļĻāļđāļ™āļĒāđŒ āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ›āļˆāļķāļ‡āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āđ„āļ”āđ‰ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ„āļŸāļĨāđŒ mail.txt āđ„āļĄāđˆāđ„āļ”āđ‰āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļŠāļ”āļ‡āļ–āļķāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ āļ—āļģāđƒāļŦāđ‰āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāļ§āļ–āļąāļ”āđ„āļ› āđāļ•āđˆāļŦāļēāļāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€˜||’ āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āļĄāļēāļˆāļ°āļ–āļđāļāļ—āļģāļ‡āļēāļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāļĄāļĩ āļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāđ„āļĄāđˆāđ€āļ—āđˆāļēāļāļąāļšāļĻāļđāļ™āļĒāđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ls test.txt || echo "OK... File exists" test.txt $ ls mail.txt || echo "No File exists" ls: cannot access mail.txt: No such file or directory ON File exists āđāļ•āđˆāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ && āđāļĨāļ° || āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđ€āļŦāļĄāļ·āļ­āļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ if (āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚) ..(āļˆāļĢāļīāļ‡).. else ..(āđ€āļ—āđ‡āļˆ).. āļŦāļĢāļ·āļ­ if (āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚) ? ..(āļˆāļĢāļīāļ‡).. : ..(āđ€āļ—āđ‡āļˆ).. āđƒāļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđˆāļ§āđ„āļ› āļˆāļ°āļĄāļĩāļĢāļđāļ› āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ $ ls test.txt && echo "OK...File exists" || echo "Oh Bad... File not found" test.txt OK...File exists $ ls mail.txt && echo "OK...File exists" || echo "Oh Bad... File not found" ls: cannot access mail.txt: No such file or directory Oh Bad... File not found Standard I/O āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Shell āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļˆāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāļ„āļ·āļ­ āļ§āļīāļ˜āļĩāļāļēāļĢ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļīāđˆāļ‡āđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ­āļ‡āļ āļēāļĒāđƒāļ™āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ (Terminal) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē I/ O āļ‹āļķāđˆāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ I/O āļĄāļēāļ•āļĢāļēāļāļēāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ 3 āļŠāļ™āļīāļ” āđ„āļ”āđ‰āđāļāđˆ 25 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 26. āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āļŦāļ™āđ‰āļēāļˆāļ­ āđ‚āļ›āļĢāđāļāļĢāļĄ Terminal #0 stdin #1 stdout #2 stderr āļĢāļđāļ›āļ—āļĩāđˆ 1.6 Standard I/O āļ•āļēāļĢāļēāļ‡ 1.2 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ Standard I/O STREAM āļĄāļēāļ•āļĢāļēāļāļēāļ™ FD āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” stdin (Standard Input Stream) 0 āļŠāļģāļŦāļĢāļąāļšāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ āļ­āļēāļ—āļīāđ€āļŠāđˆāļ™āļāļēāļĢ āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ„āļģāļŠāļąāđˆāļ‡āļˆāļēāļāļāļēāļĢāļāļ”āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” stdout (Standard Output) 1 āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļĨāļĨāļąāļžāļ˜āđŒāļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āļšāļ™āļˆāļ­āļ āļēāļž stderr (Standard Error) 2 āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨāļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āļ­āļ­āļāļˆāļēāļāļŦāļ™āđ‰āļēāļˆāļ­āļ āļēāļž Redirections āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāļāļĨāđ„āļāļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ—āļīāļĻāļ—āļēāļ‡āļŦāļ™āļķāđˆāļ‡āđ„āļ›āļĒāļąāļ‡āļ­āļĩāļāļ—āļīāļĻāļ—āļēāļ‡āļŦāļ™āļķāđˆāļ‡āļŦāļĢāļ·āļ­āļ­āļ˜āļīāļšāļēāļĒāļ‡āđˆāļēāļĒāđ†āļ„āļ·āļ­āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āļ­āļ­āļāļ•āļąāļ§ standard stream āļ•āļąāļ§āđƒāļ” āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ<” āđāļ—āļ™ stdin (Standard Input) āđāļĨāļ° â€œ>” āđāļ—āļ™ stdout (Standard Output) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ redirection āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 5 āđāļšāļšāļ•āļēāļĄāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™ āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ•āļēāļĢāļēāļ‡ 1.3 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ redirection āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” < āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ << token āđƒāļŠāđ‰āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļˆāļ­ token > āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļ—āļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆ 26 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 27. āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” >> āđ„āļŸāļĨāđŒ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ”āļīāļĄ n>&m āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ‚āļ­āļ‡ File Descriptor (FD) āđ€āļ”āļīāļĄ n āđ„āļ›āļ—āļĩāđˆāđƒāļŦāļĄāđˆ m āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļēāļĢāļŠāđˆāļ‡āļ­āļīāļ™āļžāļļāļ—āļˆāļēāļāđ„āļŸāļĨāđŒ /etc/passwd āđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep āđāļĨāļ°āļāļēāļĢāļŠāđˆāļ‡āļ­āļīāļ™āļžāļļāļ—āļˆāļēāļ āļāļēāļĢāļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ sort āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ grep -i student < /etc/passwd student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash $ sort << END > 55233424 Wiroon Sriborrirux > 55237346 Nayot Kurukitkoson > 55236477 Panuwat Dankhang > END 55233424 Wiroon Sriborrirux 55236477 Panuwat Dankhang 55237346 Nayot Kurukitkoson $ sort -k2 << END > 55233424 Wiroon Sriborrirux > 55237346 Nayot Kurukitkoson > 55236477 Panuwat Dankhang > END 55237346 Nayot Kurukitkoson 55236477 Panuwat Dankhang 55233424 Wiroon Sriborrirux āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ>” āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒ /tmp/results āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āļ­āļ­āļ āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ grep -i student /etc/passwd > /tmp/results $ ls /tmp/ CRX_75DAF8CB7768 orbit-student ssh-pqdoFN1336 vmware-root-2 hsperfdata_student pulse-Xti8iSZ9STOh VMwareDnD vmware-student keyring-27UIsq results vmware-root $ cat /tmp/results student:x:1000:1000:EE-Burapha Student,,,:/home/student:/bin/bash āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āļˆāļ°āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ” (Error message) āļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āļ–āđ‰āļēāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ $ cat one.txt two.txt 2>&1 This is the data inside cat: two.txt: No such file or directory 27 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 28. āļŠāļēāļĄāļēāļĢāļ–āļāļĢāļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļŦāđ‰āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ error.log āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ2>” $ cat one.txt two.txt 2> error.log This is the data inside āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ” āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļŠāđˆāļ‡āđ„āļ›āđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ /dev/null $ cat one.txt two.txt 2> /dev/null This is the data inside āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ€āļžāļīāđˆāļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ error.log āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ2>>” $ cat one.txt two.txt three.txt 2>> error.log This is the data inside $ cat error.log cat: two.txt: No such file or directory cat: two.txt: No such file or directory cat: three.txt: No such file or directory āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ (Environment variables) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡āļ—āļĩāđˆ shell āļŦāļĢāļ·āļ­ āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āļ­āļēāļ—āļī āđ€āļŠāđˆāļ™ āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ shell āļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ›āļĢāļ°āļˆāļģāļ•āļąāļ§āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (Home Di- rectory) āđāļĨāļ°āļĒāļąāļ‡āļĄāļĩāļ•āļąāļ§āđāļ›āļĢāļ•āđˆāļēāļ‡āđ† āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒāļ—āļĩāđˆ shell āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ shell āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ bash shell āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ„āļŸāļĨāđŒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ­āļĒāļđāđˆ 2 āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđāļāđˆ āđ„āļŸāļĨāđŒ .prole āđāļĨāļ°āđ„āļŸāļĨāđŒ .bashrc $ cat .profile <---- āđƒāļ™āļāļĢāļ“āļĩ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 13.04 āļ‚āļķāđ‰āļ™āđ„āļ› # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs export USE_CCACHE=0 export CCACHE_DIR=~/ccache export JAVA_HOME=/usr/lib/jvm/jdk export ANT_HOME=~/android/ant export ANDROID_SDK_HOME=~/android/sdk export ANDROID_NDK_HOME=~/android/ndk export AOSP_HOME=~/aosp export PATH=$HOME/bin:$JAVA_HOME/bin:$ANT_HOME/bin:$ANDROID_SDK_HOME/tools:$ANDROID_ SDK_HOME/platform-tools:$ANDROID_NDK_HOME:$PATH $ cat .bashrc # .bashrc # User specific aliases and functions HISTSIZE=1000 28 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 29. HISTFILESIZE=2000 # some more ls aliases alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš Login āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāļ‹āļķāđˆāļ‡āļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļē tty (Teletype- writer) āđ€āļĄāļ·āđˆāļ­āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāđ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļāļĢāļ­āļāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ (username) āđāļĨāļ°āļĢāļŦāļąāļŠāļœāđˆāļēāļ™ (password) āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢ āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ shell āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš (system environ- ments) āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļŠāļĢāđ‰āļēāļ‡ tty āđƒāļŦāļĄāđˆāđƒāļŦāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļŦāļĨāļąāļāđƒāļ™ /etc/ prole āļŦāļĢāļ·āļ­ /etc/bashrc āđ‚āļ›āļĢāđāļāļĢāļĄ agetty āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļē login āļšāļ™ tty āđ‚āļ›āļĢāđāļāļĢāļĄ agetty āđ€āļĢāļĩāļĒāļāļ„āđāļēāļŠāļąāđˆāļ‡ /bin/login āđ‚āļ›āļĢāđāļāļĢāļĄ login āđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™āļšāļ™ shell āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™ ~/.bashrc āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ login āļ—āļĩāđˆāļāđāļēāļŦāļ™āļ”āļ­āļĒāļđāđˆāđƒāļ™ āđ„āļŸāļĨāđŒ /etc/motd Terminal Login Shell āļœāļđāđ‰āđƒāļŠāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 1.7 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļœāđˆāļēāļ™āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĢāļ°āļšāļšāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļžāļšāđ€āļˆāļ­āļšāđˆāļ­āļĒāđ„āļ”āđ‰āđāļāđˆ 29 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 30. āļ•āļēāļĢāļēāļ‡ 1.4 āđāļŠāļ”āļ‡āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™ āļŠāļ·āđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ USER āđ€āļĢāļĩāļĒāļāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš UID āđ€āļĢāļĩāļĒāļāļĢāļŦāļąāļŠāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš HOME āđ€āļĢāļĩāļĒāļ Home Directory PWD āđ€āļĢāļĩāļĒāļ Directory āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™ SHELL āđ€āļĢāļĩāļĒāļāļŠāļ·āđˆāļ­ shell āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™ $ āđ€āļĢāļĩāļĒāļ process id āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļ‡āļēāļ™ PPID āđ€āļĢāļĩāļĒāļ process id āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ·āļšāļ—āļ­āļ”āļĄāļē ? The exit code of the last command āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ echo āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš $ echo $SHELL /bin/bash $ echo -e " My Home directory is $HOMEn My username is $USERn My current directory is $PWD" My Home directory is /home/student My username is student My current directory is /home/student $ echo $PPID 1927 $ ps -aux | grep 1927 student 1927 0.0 0.5 192052 11236 ? Sl 08:15 0:33 gnome-terminal env āđāļĨāļ° export āļ„āļģāļŠāļąāđˆāļ‡ export āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āđ€āļ­āļ‡ āđ‚āļ”āļĒāļāļēāļĢāļĢāļ°āļšāļļāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ āđ„āļŸāļĨāđŒ .bashrc āļŦāļĢāļ·āļ­āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āđƒāļ™ terminal āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ export my_project_codes=/home/student/embedded/sourcecode/ $ echo $my_project_codes /home/student/embedded/sourcecode/ āļŦāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ env āļŦāļĢāļ·āļ­ export -p āļ”āļąāļ‡āļ™āļĩāđ‰ $ env ORBIT_SOCKETDIR=/tmp/orbit-student SSH_AGENT_PID=1383 TERM=xterm 30 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 31. SHELL=/bin/bash ... USER=student PATH=/home/student/bin:/usr/lib/jvm/jdk/bin:/home/student/android/ant/bin:/home/stud ent/android/sdk/tools:/home/student/android/sdk/platform-tools:/home/student/android /ndk:/home/student/bin:/home/student/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/u sr/bin:/sbin:/bin:/usr/games ANDROID_SDK_HOME=/home/student/android/sdk PWD=/home/student JAVA_HOME=/usr/lib/jvm/jdk GDM_KEYBOARD_LAYOUT=us LANG=en_US.utf8 GDM_LANG=en_US.utf8 MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path GDMSESSION=gnome SHLVL=1 HOME=/home/student GNOME_DESKTOP_SESSION_ID=this-is-deprecated LOGNAME=student DISPLAY=:0.0 AOSP_HOME=/home/student/aosp LESSCLOSE=/usr/bin/lesspipe %s %s COLORTERM=gnome-terminal XAUTHORITY=/var/run/gdm/auth-for-student-9wtySF/database _=/usr/bin/env $ export -p declare -x ANDROID_NDK_HOME="/home/student/android/ndk" declare -x ANDROID_SDK_HOME="/home/student/android/sdk" declare -x ANT_HOME="/home/student/android/ant" ... declare -x USER="student" declare -x USERNAME="student" declare -x USE_CCACHE="0" declare -x WINDOWID="14722574" declare -x XAUTHORITY="/var/run/gdm/auth-for-student-9wtySF/database" declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-gnome:/etc/xdg" declare -x XDG_DATA_DIRS="/usr/share/gnome:/usr/local/share/:/usr/share/" Exec exec āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđāļ—āļ™āļ—āļĩāđˆ shell āđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ exec āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ bash shell āļ‚āļķāđ‰āļ™āļĄāļēāļ­āļĩāļāļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ (PID 30779) āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ bash shell āļŦāļĨāļąāļāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ (PID 19907) āļˆāļēāļāļ™āļąāđ‰āļ™āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļ āđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāđˆāļąāļ‡ exec sh āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ•āļąāļ§ sh shell āļ‚āļķāđ‰āļ™āļĄāļēāđāļ—āļ™āļ—āļĩāđˆ bash shell āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ„āļ”āđ‰āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ (PID 19907) āļ–āđ‰āļēāļŦāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļ­āļāļˆāļēāļ shell āļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ āļ‚āļķāđ‰āļ™āļĄāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ exit āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļˆāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (PID 30779) āļ—āļĩāđˆāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē $ ps PID TTY TIME CMD 19907 pts/1 00:00:00 bash <---- āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ 30777 pts/1 00:00:00 ps $ bash 31 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 32. $ ps PID TTY TIME CMD 19907 pts/1 00:00:00 bash 30779 pts/1 00:00:00 bash <---- āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ 30796 pts/1 00:00:00 ps $ exec sh $ ps PID TTY TIME CMD 19907 pts/1 00:00:00 bash 30779 pts/1 00:00:00 sh 30800 pts/1 00:00:00 ps $ exit $ ps PID TTY TIME CMD 19907 pts/1 00:00:00 bash 30802 pts/1 00:00:00 ps āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ€āļŠāļĨāļĨāđŒ āđāļĨāļ°āļ āļēāļĒāļ™āļ­āļāđ€āļŠāļĨāļĨāđŒ āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ āļēāļĒāđƒāļ™ shell āđ€āļ­āļ‡āļ™āļąāđ‰āļ™āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļŦāļĨāļąāļāđ†āđ€āļžāļĩāļĒāļ‡āđ„āļĄāđˆāļāļĩāđˆāļ„āļģāļŠāļąāđˆāļ‡āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ āļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĢāļĢāļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāļ™āļ­āļ shell (External Command) āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāļ™āļ­āļ shell āļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš āđ„āļŸāļĨāđŒ (root lesystem) āđ€āļŠāđˆāļ™ /usr/bin āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĢāļđāđ‰ āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ shell āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš (Environment Variables) āļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē $PATH āđ‚āļ”āļĒāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™ shell āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđāļĢāļāļˆāļ™āļ–āļķāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļļāļ”āļ—āđ‰āļēāļĒ (āđ‚āļ”āļĒāļĄāļĩ ‘:’ āļ„āļąāđˆāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ) āļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ PATH āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ§āđˆāļēāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰ āļ™āļąāđ‰āļ™āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ” āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ which āļ”āļąāļ‡āļ™āļĩāđ‰ $ which ls cat date ifconfig uname whoami ps find grep echo set /bin/ls /bin/cat /bin/date /sbin/ifconfig /bin/uname /usr/bin/whoami /bin/ps /usr/bin/find /bin/grep /bin/echo āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ shell āļŦāļĢāļ·āļ­ āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļ āļāļēāļĢāļ—āļģ alias (āļāļēāļĢāļ—āļģāļ™āļēāļĄāđāļāļ‡āđƒāļŦāđ‰āļāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļģāļĒāļēāļ āļŦāļĢāļ·āļ­āļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļĢāļēāļˆāļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āļŦāļĢāļ·āļ­ 32 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 33. āđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļŠāļąāđ‰āļ™āđ† āđ€āļŠāđˆāļ™ alias ls=`ls -al --color=auto`) āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ type āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļĩāđ‰ $ type ls cat date ifconfig uname whoami ps find grep echo set ls is aliased to `ls -al --color=auto' cat is hashed (/bin/cat) date is /bin/date ifconfig is /sbin/ifconfig uname is /bin/uname whoami is /usr/bin/whoami ps is hashed (/bin/ps) find is /usr/bin/find grep is aliased to `grep --color=auto' echo is a shell builtin set is a shell builtin āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ PATH āļˆāļ°āļĨāļ‡āļ—āđ‰āļēāļĒāļ”āđ‰āļ§āļĒ bin āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļāļēāļĢāļ§āļēāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļš āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđƒāļŦāđ‰āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /bin āđāļĨāļ° /usr/bin āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļ—āļĢāļąāļžāļĒāļēāļāļĢāļˆāļģāļāļąāļ” āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ™āļąāļāļžāļąāļ’āļ™āļē āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĻāļķāļāļĐāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ– āļ›āļĢāļ°āđ€āļĄāļīāļ™āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ–āļđāļāđƒāļŠāđ‰āļĄāļēāļāđ€āļāļīāļ™āđ„āļ›āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļš āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļžāļŠāļđāļ‡āļŠāļļāļ” top āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāđ†āļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āļˆāļąāļ āđ€āļžāļĢāļēāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡ āļŠāļ–āļēāļ™āļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļāļēāļĢ āļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢ āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš virtual lesystem (VFS) āđ„āļŸāļĨāđŒ /proc/loadavg āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡ 33 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 34. āļĢāļđāļ›āļ—āļĩāđˆ 1.8 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ„āļģāļŠāļąāđˆāļ‡ top āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāļģāļ„āļąāļ āđ„āļ”āđ‰āđāļāđˆ Uptime āļŦāļĄāļēāļĒāļ–āļķāļ‡ āđ€āļ§āļĨāļēāļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļĢāļ§āļĄāļ—āļĩāđˆāļĢāļ°āļšāļšāļ–āļđāļāđ€āļ›āļīāļ” āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš load average āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļāļąāļšāļ„āļ§āļēāļĄ āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ‚āļ”āļĒāđāļŠāļ”āļ‡āļ­āļ­āļāļĄāļē 3 āļ„āđˆāļē āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āļ„āđˆāļē 0.10 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 1 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē, āļ„āđˆāļē 0.11 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 5 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē āđāļĨāļ° āļ„āđˆāļē 0.04 āļ“ āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļē 15 āļ™āļēāļ—āļĩāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ uptime āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļ„āđˆāļēāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° (uptime āđāļĨāļ° load average) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ uptime 01:24:59 up 17:18, 4 users, load average: 0.08, 0.08, 0.02 $ watch -n 1 uptime <--- āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ uptime āļ—āļļāļāđ† 1 āļ§āļīāļ™āļēāļ—āļĩ Every 1.0s: uptime Tue Aug 20 01:26:37 2013 01:26:37 up 17:19, 4 users, load average: 0.01, 0.05, 0.01 34 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 35. āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāļēāļĢāļ•āļĩāļ„āļ§āļēāļĄāļ„āđˆāļē load average āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāļ™āļ§āļ™āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļˆāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒāļ—āļĩāđˆāđāļ—āđ‰ āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āļ„āđˆāļēāļ™āļĩāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ„āļ”āđ‰āđ„āļĄāđˆāđƒāļŠāđˆāļˆāļģāļ™āļ§āļ™āđ€āļ›āļ­āļĢāđŒāđ€āļ‹āđ‡āļ™āļ•āđŒ āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđ€āļĨāļ‚āļāđ‡āđ€āļāļīāļ™ 1.0 āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ āļēāļž āļ™āļąāļāļžāļąāļ’āļ™āļēāļĨāļ­āļ‡āļ—āļģāļāļēāļĢāļˆāļīāļ™āļ•āļ™āļēāļāļēāļĢāļ•āļēāļĄāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āđāļšāļšāļ„āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§ (single-core CPU) āđ€āļ›āļĢāļĩāļĒāļšāđ„āļ”āđ‰āļāļąāļšāļ–āļ™āļ™āđ€āļ”āļīāļ™āļĢāļ–āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ (one-way lane) āļšāļ™āļŠāļ°āļžāļēāļ™āļ‚āđ‰āļēāļĄāđāļĄāđˆāļ™āđ‰āļģ āđāļĨāļ°āļŠāļĄāļĄāļ•āļīāđƒāļŦāđ‰āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļ•āļģāļĢāļ§āļˆāļˆāļĢāļēāļˆāļĢāļ„āļ­āļĒāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļ”āļīāļ™āļĢāļ–āļšāļ™āļŠāļ°āļžāļēāļ™āđāļŦāđˆāļ‡āļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđƒāļ™āļšāļēāļ‡āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° āļ§āļąāļ™āļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āļ—āļĩāđˆāļ§āļīāđˆāļ‡āļ‚āļķāđ‰āļ™āļŠāļ°āļžāļēāļ™āļ­āļēāļˆāļˆāļ°āļĄāļēāļāļ™āđ‰āļ­āļĒāđ„āļĄāđˆāđ€āļ—āđˆāļēāļāļąāļ™āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāđ€āļĢāđˆāļ‡āļ”āđˆāļ§āļ™ (rush hour) āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āļ•āļģāļĢāļ§āļˆāļˆāļĢāļēāļˆāļĢāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļŠāļ āļēāļžāļāļēāļĢāļˆāļĢāļēāļˆāļĢāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ•āļąāļ§āđ€āļĨāļ‚ (numbering sys- tem) āđ€āļŠāđˆāļ™ â€Ē0.00 āļŦāļĄāļēāļĒāļ–āļķāļ‡ āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļˆāļĢāļēāļˆāļĢāļšāļ™āļ–āļ™āļ™ â€Ē0.50 āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļāļēāļĢāļˆāļĢāļēāļˆāļĢāļ„āļĨāđˆāļ­āļ‡āļ•āļąāļ§ â€Ē1.00 āļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāļˆāļĢāļēāļˆāļĢāļŦāļ™āļēāđāļ™āđˆāļ™āđāļ•āđˆāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ•āļąāļ§āđ„āļ”āđ‰ â€Ēāļ–āđ‰āļē 2.00 āļ­āļēāļˆāļŦāļĄāļēāļĒāļ–āļķāļ‡ āļĢāļ–āđ€āļ•āđ‡āļĄāļ•āļĨāļ­āļ”āļ–āļ™āļ™āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĄāļĩāļˆāļģāļ™āļ§āļ™āļĢāļ–āļ—āļĩāđˆāļ›āļĢāļīāļĄāļēāļ“āđ€āļ—āđˆāļēāļāļąāļ™āļĢāļ­āļ­āļĒāļđāđˆāļ•āđ‰āļ™ āļŠāļ°āļžāļēāļ™ â€Ēāļ–āđ‰āļē 3.00 āļ­āļēāļˆāļŦāļĄāļēāļĒāļ–āļķāļ‡ āļĢāļ–āđ€āļ•āđ‡āļĄāļ•āļĨāļ­āļ”āļ–āļ™āļ™āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĄāļĩāļˆāļģāļ™āļ§āļ™āļĢāļ–āļ—āļĩāđˆāļ›āļĢāļīāļĄāļēāļ“ 2 āđ€āļ—āđˆāļē āļĢāļ­āļ­āļĒāļđāđˆāļ•āđ‰āļ™ āļŠāļ°āļžāļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āļšāļ™āļ–āļ™āļ™āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļšāļ™āļŠāļ°āļžāļēāļ™ āđāļĨāļ°āļĢāļ–āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĢāļ­āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ•āđ‰āļ™āļŠāļ°āļžāļēāļ™ load āđ€āļ—āđˆāļēāļāļąāļš 1.00 load āđ€āļ—āđˆāļēāļāļąāļš 0.50 load āđ€āļ—āđˆāļēāļāļąāļš 1.50 āļĢāļđāļ›āļ—āļĩāđˆ 1.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ āļēāļžāļˆāļĢāļēāļˆāļĢāļāļąāļš Load āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļ–āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāļ‚āđ‰āļēāļĄāļŠāļ°āļžāļēāļ™ āļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āļāļĨāļēāļ‡āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰ (slice of CPU time) āļŦāļĢāļ·āļ­āļāļēāļĢāļĢāļ­āļ„āļīāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āđ‚āļ”āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļˆāļ°āļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ–āļķāļ‡āļ„āļ§āļēāļĄāļĒāļēāļ§āļ‚āļ­āļ‡āļ„āļīāļ§ (run-queue length) āļ‹āļķāđˆāļ‡āļĄāļēāļˆāļēāļāļœāļĨāļĢāļ§āļĄāļ‚āļ­āļ‡āļˆāļģāļ™āļ§āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ āļšāļ§āļāļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļĢāļ­āļ„āļīāļ§ āļ‹āļķāđˆāļ‡āļ„āđˆāļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļļāļ”āļĄāļ„āļ•āļīāļ—āļĩāđˆāļ”āļĩāļŠāļļāļ”āļ„āļ·āļ­ 1.00 āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡āļŠāļ°āļžāļēāļ™āļŠāļēāļĄāļēāļĢāļ– āļĢāļąāļšāļ›āļĢāļīāļĄāļēāļ“āļĢāļ–āđ„āļ”āđ‰āđ€āļ•āđ‡āļĄāļ—āļĩāđˆ āđāļĨāļ°āļĒāļąāļ‡āļ„āļ‡āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ•āļąāļ§āđ„āļ”āđ‰āļ”āļĩ āđ€āļ›āļĢāļĩāļĒāļšāđ„āļ”āđ‰āļāļąāļš āļˆāļģāļ™āļ§āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļĢāļ­āļ­āļĒāļđāđˆāđ€āļ•āđ‡āļĄāļ„āļīāļ§āļžāļ­āļ”āļĩ āđāļĨāļ°āļŦāļ™āđˆāļ§āļĒ āļ›āļĢāļ°āļĄāļ§āļ“āļœāļĨāļāļĨāļēāļ‡āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļˆāļ°āđ€āļĢāļĩāļĒāļāļ„āđˆāļēāļ™āļĩāđ‰āļ§āđˆāļē āļ„āđˆāļē “Utilization” 35 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 36. āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ›āļĢāļ°āđ€āļĄāļīāļ™āļŠāļ āļēāļžāļ āļēāļĢāļ°āđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒ (load average) āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļŦāļĨāļąāļ āļāļēāļĢāļ—āļąāđˆāļ§āđ„āļ› (Rule of Thumb) āđāļĨāđ‰āļ§ āļ„āļ§āļĢāđ„āļĄāđˆāđ€āļāļīāļ™ 0.70 āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļĩāļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ āļēāļĢāļ°āđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒāđƒāļ™ āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļāļīāļ™ 0.70 āļ—āļĩāđˆāđ€āļāļīāļ”āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļĄāļēāļŠāļąāļāļĢāļ°āļĒāļ°āļ™āļķāļ‡ āđ€āļžāļĢāļēāļ°āļ­āļēāļˆāļˆāļ°āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļŦāļāđˆāļ•āļēāļĄāļĄāļēāđ„āļ”āđ‰ āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĢāļ°āļšāļš free, pmap āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory) āđ€āļ›āđ‡āļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŠāļģāļ„āļąāļāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļĄāļēāļāļ™āđ‰āļ­āļĒāđ€āļžāļĩāļĒāļ‡āđƒāļ”āļˆāļķāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļŠāļđāļ‡ āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ™āļąāđ‰āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ free āļ‹āļķāđˆāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš virtual lesystem (VFS) āđ„āļŸāļĨāđŒ /proc/meminfo āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ‚āļ”āļĒ āļāļēāļĢāđƒāļŠāđˆāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āđ‚āļ”āļĒāļ—āļĩāđˆ -k āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļīāđ‚āļĨāđ„āļšāļ•āđŒ , -m āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļšāđ€āļĄāļāļē āđ„āļšāļ•āđŒ, -g āđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļīāļāļēāđ„āļšāļ•āđŒ $ free -m -t total used free shared buffers cached Mem: 2001 1649 351 0 193 1145 -/+ buffers/cache: 311 1690 Swap: 16381 93 16288 Total: 18383 1743 16640 āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļˆāļąāļšāļˆāļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļąāļšāđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđ‚āļ›āļĢ āđ€āļ‹āļŠ āļāđ‡āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļđāđ‰āļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢāđ€āļĄāļ·āđˆāļ­āļ–āļđāļ āđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ pmap āļˆāļķāļ‡āļ–āļđāļāļ™āļģāļĄāļēāļŠāđˆāļ§āļĒāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđ„āļ”āđ‰āļ”āļĩ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ hello.c āđ‚āļ”āļĒāļĄāļĩāđ‚āļ„āđ‰āļ”āļ āļēāļĐāļēāļ‹āļĩāļ”āļąāļ‡āļ™āļĩāđ‰ $ cat hello.c #include <stdio.h> int main() { printf("Hello World!n"); while (1) { } return 0; } $ gcc -o hello hello.c $ ./hello & [1] 11958 36 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 37. Hello World! $ pmap 11958 11958: ./hello 0000000000400000 4K r-x-- /home/student/hello 0000000000600000 4K r---- /home/student/hello 0000000000601000 4K rw--- /home/student/hello 00007f34087ca000 1512K r-x-- /lib/libc-2.11.1.so 00007f3408944000 2044K ----- /lib/libc-2.11.1.so 00007f3408b43000 16K r---- /lib/libc-2.11.1.so 00007f3408b47000 4K rw--- /lib/libc-2.11.1.so 00007f3408b48000 20K rw--- [ anon ] 00007f3408b4d000 128K r-x-- /lib/ld-2.11.1.so 00007f3408d52000 12K rw--- [ anon ] 00007f3408d69000 12K rw--- [ anon ] 00007f3408d6c000 4K r---- /lib/ld-2.11.1.so 00007f3408d6d000 4K rw--- /lib/ld-2.11.1.so 00007f3408d6e000 4K rw--- [ anon ] 00007fff77ad1000 84K rw--- [ stack ] 00007fff77bff000 4K r-x-- [ anon ] ffffffffff600000 4K r-x-- [ anon ] total 3864K āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ df, du āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļĄāļĩāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āđāļ•āđˆāļˆāļ°āđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āđāļŸāļĨāļŠāđāļ—āļ™ āđ€āļŠāđˆāļ™ NAND Flash, USB Storage āļŦāļĢāļ·āļ­ MMC/SD Card āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ™āđ‰āļ­āļĒāļĄāļēāļāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđ€āļāđ‰āļēāļ•āļĢāļ§āļˆāļŠāļ­āļšāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ āļ‡āļēāļ™āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļœāļĨāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļˆāļģāļ™āļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ› āđāļĨāđ‰āļ§āđƒāļ™āļĢāļ°āļšāļš āđāļĨāļ°āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ āđ„āļ”āđ‰āđāļāđˆāļ„āļģāļŠāļąāđˆāļ‡ df (disk free) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 99G 62G 37G 63% / none 997M 276K 997M 1% /dev none 1001M 92K 1001M 1% /dev/shm none 1001M 88K 1001M 1% /var/run none 1001M 0 1001M 0% /var/lock none 1001M 0 1001M 0% /lib/init/rw āļ„āļģāļŠāļąāđˆāļ‡ du (disk usage) āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ™āļēāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļŠāļĩāđ‰āļ­āļĒāļđāđˆ (mount point) āļĢāļ§āļĄāļ–āļķāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ†āļĨāļ‡āđ„āļ›āļˆāļēāļāļ•āļģāđāļŦāļ™āđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āđāļĨāļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ du āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒ 37 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 38. āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ df āļ™āļąāđˆāļ™āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡ du āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ•āļīāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -h āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļ›āļĨāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ—āļĩāđˆāļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ $ du -h busybox-1.21.0/ 44K busybox-1.21.0/libpwdgrp 108K busybox-1.21.0/findutils 536K busybox-1.21.0/miscutils 24K busybox-1.21.0/coreutils/libcoreutils 684K busybox-1.21.0/coreutils . . . 116K busybox-1.21.0/archival/libarchive/unxz 484K busybox-1.21.0/archival/libarchive 824K busybox-1.21.0/archival 16M busybox-1.21.0/ āļ™āļ­āļāļˆāļēāļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -h āđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ­āļĩāļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ„āļ·āļ­ -s āļ‹āļķāđˆāļ‡āļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĢāļ§āļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ•āđˆāļēāļ‡āđ† āđ€āļ‚āđ‰āļēāļĄāļē āļ­āļĒāļđāđˆāđƒāļ™āļšāļĢāļĢāļ—āļąāļ”āđ€āļ”āļĩāļĒāļ§ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ du -sh busybox-1.21.0/ 16M busybox-1.21.0/ āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ āđƒāļ™āļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ āļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļĨāļģāļ”āļąāļšāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļˆāļēāļāđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļļāļ āļ•āļąāļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ›āļĢāļ°āļˆāļģāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡ āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļāļģāļŦāļ™āļ”āļĄāļēāđƒāļŦāđ‰āļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ­āļ‡ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē PID (process id) āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ„āļ§āļšāļ„āļļāļĄāđāļĨāļ°āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļ āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ”āđ‰āļ§āļĒāļ•āļąāļ§āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļ­āļ‡ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĒāļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāđ„āļ”āđ‰āđāļāđˆ â€ĒāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ‚āļ”āļĒāļĢāļ§āļĄāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ jobs â€Ēāđ€āļĨāļ·āļ­āļāļ”āļđāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāļ°āļ„āđˆāļēāļ•āđˆāļēāļ‡āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ â€ĒāļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ (signals) āđāļšāļšāļ•āđˆāļēāļ‡āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ jobs, ps āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ‚āļ”āļĒāļĢāļ§āļĄāļ™āļąāđ‰āļ™ āļŦāļĨāļąāļāļĄāļĩāļ­āļĒāļđāđˆ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ„āļ·āļ­ jobs āđāļĨāļ° ps (process snapshot) āđ‚āļ”āļĒāļ„āļģāļŠāļąāđˆāļ‡ jobs āļ™āļąāđ‰āļ™āļˆāļ°āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āļ‡āļēāļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāļ‚āļķāđ‰āļ™āļĄāļēāļ•āļēāļĄāļĨāļģāļ”āļąāļš āđāļĨāļ°āļĄāļĩ āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ (PID) āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļˆāļ°āļšāļ­āļāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļšāđ‰āļēāļ‡ āđ€āļŠāđˆāļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™ (running) āļ–āļđāļāļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (stopped) āļ–āļđāļāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (killed) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 38 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 39. $ jobs -l [1] 11958 Running ./hello & [2]- 12458 Stopped emulator & (wd: ~/aosp) [3]+ 12794 Killed gcalctool āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ ps āļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ–āđ‰āļēāļĢāļąāļšāļĢāļēāļĒāļāļēāļĢ PID āļĄāļēāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ jobs āļ—āļĩāđˆāļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -p (āļāļēāļĢāļĨāļģāļ”āļąāļš process group leader) āļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢ āđ€āļ‹āļŠāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ jobs -p 11958 12458 12818 $ ps $(jobs -p) PID TTY STAT TIME COMMAND 11958 pts/0 R 63:41 ./hello 12458 pts/0 Sl 2:25 /home/student/android/sdk/tools/emulator64-x86 12818 pts/0 S 0:00 gcalctool āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļ–āļķāļ‡āļŠāļ–āļēāļ™āļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļš āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡ āļĄāļĩāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -ef āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ ps āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™ āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug19 ? 00:00:01 /sbin/init root 2 0 0 Aug19 ? 00:00:00 [kthreadd] root 3 2 0 Aug19 ? 00:00:01 [migration/0] root 4 2 0 Aug19 ? 00:00:08 [ksoftirqd/0] root 5 2 0 Aug19 ? 00:00:00 [watchdog/0] root 6 2 0 Aug19 ? 00:00:01 [migration/1] root 7 2 0 Aug19 ? 00:00:08 [ksoftirqd/1] root 8 2 0 Aug19 ? 00:00:00 [watchdog/1] root 10 2 0 Aug19 ? 00:00:01 [events/1] root 11 2 0 Aug19 ? 00:00:00 [cpuset] root 12 2 0 Aug19 ? 00:00:00 [khelper] root 13 2 0 Aug19 ? 00:00:00 [netns] root 14 2 0 Aug19 ? 00:00:00 [async/mgr] root 18 2 0 Aug19 ? 00:00:00 [bdi-default] root 19 2 0 Aug19 ? 00:00:00 [kintegrityd/0] root 20 2 0 Aug19 ? 00:00:00 [kintegrityd/1] root 21 2 0 Aug19 ? 00:00:01 [kblockd/0] root 306 2 0 Aug19 ? 00:00:05 [jbd2/sda1-8] root 1268 1 0 Aug19 tty3 00:00:00 /sbin/getty -8 38400 tty3 root 1272 1 0 Aug19 tty6 00:00:00 /sbin/getty -8 38400 tty6 root 1275 1 0 Aug19 ? 00:00:07 /usr/sbin/irqbalance student 11825 11824 0 05:21 ? 00:00:00 gnome-pty-helper student 11826 11824 0 05:21 pts/0 00:00:00 bash student 11958 11826 99 05:22 pts/0 01:24:29 ./hello student 12458 11826 5 05:42 pts/0 00:03:43 /home/student/android/sdk/tools/ student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool 39 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 40. root 12856 2 0 06:32 ? 00:00:00 [flush-8:0] student 12929 11826 0 06:47 pts/0 00:00:00 ps -ef āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļĢāļēāļšāđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāđ‚āļ›āļĢāđ€āļ‹āļŠāđ„āļŦāļ™āļšāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ„āļ™āđƒāļ” (UID) āļĄāļĩ āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ°āđ„āļĢ (PID) āđāļĨāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ” (PPID) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡ āļ­āļ˜āļīāļšāļēāļĒāđƒāļ™āļ•āļēāļĢāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 1.5 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ps āļ„āļ­āļĨāļąāļĄāļ™āđŒ āļ„āļ§āļēāļĄāļŦāļĄāļēāļĒ UID āđāļŠāļ”āļ‡ user āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ PID āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process ID) PPID āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļĨāļąāļāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ·āļšāļ—āļ­āļ”āļĄāļē (Parent Process ID) C āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ CPU STIME āđāļŠāļ”āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ TTY āđāļŠāļ”āļ‡āļĢāļŦāļąāļŠāđ€āļ—āļ­āļĄāļīāļ™āļ­āļĨāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ TIME āđ€āļ§āļĨāļēāđ‚āļ”āļĒāļĢāļ§āļĄāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™ CPU CMD āļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ‚āļķāđ‰āļ™āļĄāļē āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™ bash shell āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āđ€āļŠāđˆāļ™ -f (full), -j (jobs), -l (long), --forest, --sort āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ps PID TTY TIME CMD 11826 pts/0 00:00:00 bash 11958 pts/0 01:19:16 hello 12458 pts/0 00:03:31 emulator64-x86 12515 pts/0 00:00:00 adb 12818 pts/0 00:00:00 gcalctool 12905 pts/0 00:00:00 ps $ ps -f UID PID PPID C STIME TTY TIME CMD student 11826 11824 0 05:21 pts/0 00:00:00 bash student 11958 11826 99 05:22 pts/0 01:19:17 ./hello student 12458 11826 5 05:42 pts/0 00:03:31 /home/student/android/sdk/ tools/ student 12515 1 0 05:43 pts/0 00:00:00 adb fork-server server student 12818 11826 0 06:26 pts/0 00:00:00 gcalctool student 12906 11826 0 06:42 pts/0 00:00:00 ps -f $ ps -j --forest PID PGID SID TTY TIME CMD 40 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 41. 11826 11826 11826 pts/0 00:00:00 bash 11958 11958 11826 pts/0 01:19:31 _ hello 12458 12458 11826 pts/0 00:03:31 _ emulator64-x86 12818 12818 11826 pts/0 00:00:00 _ gcalctool 12908 12908 11826 pts/0 00:00:00 _ ps 12515 12514 11826 pts/0 00:00:00 adb $ ps -aj --sort sid,comm PID PGID SID TTY TIME CMD 12515 12514 11826 pts/0 00:00:00 adb 12458 12458 11826 pts/0 00:04:26 emulator64-x86 12818 12818 11826 pts/0 00:00:00 gcalctool 11958 11958 11826 pts/0 01:42:27 hello 13020 13020 11826 pts/0 00:00:00 ps āļāļēāļĢāļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process Killing) āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡ (low-level system message) āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē āļŠāļąāļāļāļēāļ“ (Signal) āđ‚āļ”āļĒāļŠāļąāļāļāļēāļ“āļˆāļ° āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āļ‚āļąāļ”āļˆāļąāļ‡āļŦāļ§āļ°āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļžāļ·āđˆāļ­āļšāļ­āļāļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ™āļąāđ‰āļ™ āļ‹āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļīāļāļēāļĢ āļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ­āļĒāļđāđˆāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 64 āļŠāļ™āļīāļ” āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ kill -l āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGCONT 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļšāđˆāļ­āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ 41 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 42. â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 1 (SIGHUP) āļ„āļ·āļ­ Hang Up Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāđ„āļ›āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ terminal āļ–āļđāļāļ›āļīāļ”āļĨāļ‡āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāļ āļēāļĒāđƒāļ•āđ‰ terminal āļ–āļđāļāļ›āļīāļ”āļĨāļ‡āļ•āļēāļĄāļ”āđ‰āļ§āļĒ â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 3 (SIGQUIT) āļ„āļ·āļ­ Quit Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļĄāļĩ āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰ āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ›āļīāļ”āļ•āļąāļ§āļĨāļ‡ â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 6 (SIGABRT) āļ„āļ·āļ­ Abort Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āđ€āļ­āļ‡āļĨāļ‡ â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 9 (SIGKILL) āļ„āļ·āļ­ Kill Signal āļĨāļąāļāļĐāļ“āļ°āļŠāļ­āļ‡ signal āļ›āļĢāļ°āđ€āļ āļ—āļ™āļĩāđ‰āļˆāļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļšāļāļēāļĢāļ”āļķāļ‡ āļŠāļēāļĒāđ„āļŸāļ­āļ­āļāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ›āļīāļ”āļ•āļąāļ§āļĨāļ‡āļ—āļąāļ™āļ—āļĩāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļ—āļģāļ‡āļēāļ™āļ­āļ°āđ„āļĢ āļ­āļĒāļđāđˆāļāđ‡āļ•āļēāļĄ â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 18 (SIGCONT) āļ„āļ·āļ­ Continue Signal āđ€āļ›āđ‡āļ™āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļāļĨāļąāļšāļĄāļē āļ—āļģāļ‡āļēāļ™āļ›āļāļ•āļīāđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļāļĨāļąāļšāļĄāļēāļ—āļģāļ‡āļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļē (foreground) â€ĒāļŠāļąāļāļāļēāļ“āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 20 (SIGTSTP) āļ„āļ·āļ­ āļāļēāļĢāļŠāđˆāļ‡ Stop Signal āļ”āđ‰āļ§āļĒ Keyboard (Ctrl+Z) āđ€āļ›āđ‡āļ™ āļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ–āļđāļāļ—āļģāđƒāļŦāđ‰āđ„āļ›āļ—āļģāļ‡āļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ (background) āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ Ctrl+Z āļšāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļœāđˆāļēāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļšāļ™āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ Ctrl-C āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ INT (SIGINT) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļĒāļļāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļąāļ™āļ—āļĩ Ctrl-Z āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ TSTP (SIGTSTP) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļŦāđ‰āļŦāļĒāļļāļ”āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ Ctrl- āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ ABRT (SIGABRT) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļŦāđ‰āļĒāļļāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ—āļąāļ™āļ—āļĩ āđ€āļŦāļĄāļ·āļ­āļ™ Ctrl-C āđāļ•āđˆāđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļēāļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰ $ jobs -l [1] 11958 Running ./hello & [2]- 12458 Running emulator & (wd: ~/aosp) [3]+ 12818 Running gcalctool & $ kill -s SIGTSTP 12818 $ jobs -l [1] 11958 Running ./hello & [2]- 12458 Running emulator & (wd: ~/aosp) [3]+ 12818 Stopped gcalctool $ kill -s SIGCONT 12818 $ jobs -l [1] 11958 Running ./hello & [2]- 12458 Running emulator & (wd: ~/aosp) 42 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 43. [3]+ 12818 Running gcalctool & $ kill -s SIGKILL 12818 $ jobs -l [1] 11958 Running ./hello & [2]- 12458 Running emulator & (wd: ~/aosp) [3]+ 12818 Killed gcalctool $ kill -s SIGTERM 11958 $ jobs -l [1] 11958 Terminated ./hello [2]- 12458 Running emulator & (wd: ~/aosp) āļāļēāļĢāļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļšāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /PROC āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Windows) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļŠāļĄāļ·āļ­āļ™ (virtual lesystem) āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļ™ āļĢāļ°āļ”āļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āđāļĨāļ°āļŠāļ–āļēāļ™āļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ‚āļ”āļĒāļ„āđˆāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ls /proc āļˆāļ°āļžāļšāļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļˆāļģāļ™āļ§āļ™āļĄāļēāļ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ‚ āļ‹āļķāđˆāļ‡ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ„āļ·āļ­āļŠāļ–āļēāļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđāļĨāļ°āļ–āļđāļāļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹ āļŠāļ™āļąāđˆāļ™āđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđāļĨāđ‰āļ§āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āļĒāļąāļ‡āļĄāļĩāđ„āļŸāļĨāđŒāļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāđāļ—āļ™āļŪāļēāļĢāđŒāđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļš āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 1.6 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āđ„āļŸāļĨāđŒ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ /proc/modules dynamically loaded modules /proc/devices registered character and block major numbers /proc/iomem on-system physical RAM and bus device addresses /proc/ioports on-system I/O port addresses (especially for x86 systems) /proc/interrupts registered interrupt request numbers /proc/softirqs registered soft IRQs /proc/kallsyms running kernel symbols, including from loaded modules /proc/partitions currently connected block devices and their partitions /proc/lesystems currently active lesystem drivers /proc/swaps currently active swaps /proc/cpuinfo information about the CPU(s) on the system /proc/meminfo information about the memory on the system, viz., RAM, swap 43 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 44. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļˆāļēāļāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc/ $ cat /proc/partitions major minor #blocks name 8 0 104857600 sda 8 1 104855552 sda1 8 16 16777216 sdb 8 17 16775168 sdb1 $ cat /proc/interrupts CPU0 CPU1 0: 286 0 IO-APIC-edge timer 1: 14606 732 IO-APIC-edge i8042 3: 1 0 IO-APIC-edge 4: 32225 881 IO-APIC-edge 6: 3 0 IO-APIC-edge floppy ... TRM: 0 0 Thermal event interrupts THR: 0 0 Threshold APIC interrupts MCE: 0 0 Machine check exceptions MCP: 259 259 Machine check polls $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz stepping : 9 cpu MHz : 2293.993 cache size : 6144 KB fpu : yes fpu_exception : yes cpuid level : 13 wp : yes ... processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz stepping : 9 cpu MHz : 2293.993 cache size : 6144 KB fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm con- stant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm ida arat tpr_shadow vnmi ept vpid bogomips : 4587.98 clflush size : 64 cache_alignment : 64 44 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 45. address sizes : 40 bits physical, 48 bits virtual power management: āļ„āļģāļŠāļąāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ Cat, less, od, āđāļĨāļ° split āļ„āļģāļŠāļąāđˆāļ‡ cat āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđƒāļ™āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļāđ‡ āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļŦāļĨāļēāļĒāđ„āļŸāļĨāđŒāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļĩ āļ„āļ§āļēāļĄāļĒāļēāļ§āļĄāļēāļ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš log āļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ–āđ‰āļēāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ log āļĒāđˆāļ­āļĄāđ„āļĄāđˆāđ€āļ›āđ‡āļ™āļœāļĨāļ”āļĩāļāļąāļš āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ­āļ‡āđ€āļžāļĢāļēāļ°āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ­āļāļĄāļēāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđ€āļāļīāļ™āļāļ§āđˆāļēāļˆāļ°āļˆāļąāļšāđƒāļˆāļ„āļ§āļēāļĄāļ—āļąāļ™āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļķāļ‡āđ€āļ›āđ‡āļ™ āļ„āļģāļŠāļąāđˆāļ‡āļĒāļ­āļ”āļ™āļīāļĒāļĄāļ­āļĩāļāļ„āļģāļŠāļąāđˆāļ‡āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ™āļīāļĒāļĄāļ™āļģāļĄāļēāđƒāļŠāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļąāļ™āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāđāļŠāļ”āļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļķāđ‰āļ™āļĨāļ‡āđ„āļ”āđ‰āļŦāļĢāļ·āļ­āđāļĄāđ‰āļāļĢāļ°āļ—āļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ„āļģāđ„āļ”āđ‰āļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļš āļāļēāļĢāđƒāļŠāđ‰ text editor āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ less āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļĨāļđāļāļĻāļĢāļ‚āļķāđ‰āļ™āļĨāļ‡āļŦāļĢāļ·āļ­āļāļēāļĢāđƒāļŠāđ‰āļ›āļļāđˆāļĄ PageUp PageDown āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄ āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ™āļąāđ‰āļ™āļˆāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ / āđāļĨāđ‰āļ§āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđāļŠāļ”āļ‡āļ„āļģāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ­āļ­āļ āļĄāļē āļ–āđ‰āļēāļŦāļēāļāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ–āļąāļ”āđ„āļ› āļ„āļģāļŠāļąāđˆāļ‡ less āđ„āļ”āđ‰āđ‰āļ­āļ­āļāđāļšāļšāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļāļ”āđāļ›āđ‰āļ™āļžāļīāļĄāļžāđŒ n āđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āđˆāļ­āļ™āđ„āļ› āļĒāļąāļ‡āļ„āļģāļ–āļąāļ”āđ„āļ› āļ™āļ­āļāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļĨāđ‰āļ§āļ™āļąāđ‰āļ™āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ less āļĒāļąāļ‡ āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ—āļĩāđˆāļšāļĢāļĢāļ—āļąāļ”āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ„āļ”āđ‰ āđ‚āļ”āļĒāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ F āđ€āļŠāđˆāļ™āļāļĢāļ“āļĩāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ log āļ—āļĩāđˆāļˆāļ° āļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļēāļĄāļēāļ•āļĨāļ­āļ”āđ€āļ§āļĨāļē less āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆ āđāļĄāđ‰āđ„āļŸāļĨāđŒ log āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđ€āļ›āđ‡āļ™ .gz āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ less āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cat Departments.txt <---- āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ 1 Electrical 2 Computer 3 Telecommunication $ cat >Universities.txt <---- āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆ āđāļĨāļ°āļ›āđ‰āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļŸāļĨāđŒāļ—āļąāļ™āļ—āļĩ Burapha University Prince of Songkhla University Thammasat University āļāļ” Ctrl+D <---- āļāļ”āļ›āļļāđˆāļĄ Ctrl+D āđ€āļžāļ·āđˆāļ­āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨ $ cat Departments.txt Universities.txt > All.txt $ cat All.txt 1 Electrical 2 Computer 3 Telecommunication Burapha University Prince of Songkhla University Thammasat University 45 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 46. $ less /var/log/syslog āļĢāļđāļ›āļ—āļĩāđˆ 1.10 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ /var/log/syslog āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ less āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđ€āļ™āđ‰āļ™āļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (text le) āļ—āļąāđˆāļ§āđ„āļ› āđāļĨāđ‰āļ§āđāļŠāļ”āļ‡āļœāļĨāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ›āļāļ•āļī āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĄāļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ­āļ·āđˆāļ™ āđ€āļŠāđˆāļ™ āđāļ›āļĨāļ‡ āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” āļāļēāļ™āļŠāļīāļš āļŦāļĢāļ·āļ­ āļāļēāļ™āļŠāļīāļšāļŦāļ āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļāļąāļ™āļ—āļąāđˆāļ§āđ„āļ›āļ„āļ·āļ­ od (Octal Dump) āļ‹āļķāđˆāļ‡āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -A āļ—āļĩāđˆāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļĢāļēāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ (Radix) āđāļĨāļ° -t āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļļāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļš āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļšāļŦāļ āļŦāļĢāļ·āļ­ āļĢāļŦāļąāļŠāđāļ­āļŠāļāļĩāđ‰ āļ”āđ‰āļ§āļĒ āļ„āđˆāļē o, d, x, c āļ•āļēāļĄāļĨāļģāļ”āļąāļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ od Departments.txt 0000000 020061 066105 061545 071164 061551 066141 031012 041440 0000020 066557 072560 062564 005162 020063 062524 062554 067543 0000040 066555 067165 061551 072141 067551 005156 0000054 $ od -t x Departments.txt 0000000 6c452031 72746365 6c616369 4320320a 0000020 75706d6f 0a726574 65542033 6f63656c 0000040 6e756d6d 74616369 0a6e6f69 0000054 $ od -A d -t c Departments.txt 0000000 1 E l e c t r i c a l n 2 C 0000016 o m p u t e r n 3 T e l e c o 0000032 m m u n i c a t i o n n 0000044 46 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 47. āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ­āļēāļˆāļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ—āļĩāđˆāļĄāļĩāđ„āļŸāļĨāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāđāļĒāļ āļ­āļ­āļ (split) āļĄāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļīāđ‰āļ™āđ€āļĨāđ‡āļāđ†āļ—āļĩāđˆāļŠāļ°āļ”āļ§āļāļ•āđˆāļ­āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļ›āļ—āļĩāļĨāļ°āļāđ‰āļ­āļ™ āļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ­āļĩāđ€āļĄāļĨāđŒāđƒāļ™āļ‚āļ™āļēāļ”āļ—āļĩāđˆāļžāļ­āđ€āļŦāļĄāļēāļ°āļ•āđˆāļ­āļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āļŠāđˆāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ„āļŸāļĨāđŒ āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāļīāđ‰āļ™āđ„āļ”āđ‰āļ„āļ·āļ­ āļ„āļģāļŠāļąāđˆāļ‡ split āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļĨāļ·āļ­āļāđāļĒāļāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļīāđ‰āļ™āđ€āļĨāđ‡āļāđ†āļ•āļēāļĄāļ‚āļ™āļēāļ”āđ„āļšāļ—āđŒ (Byte) āļŦāļĢāļ·āļ­ āļšāļĢāļĢāļ—āļąāļ” (line) āļ—āļĩāđˆāļŦāļąāđˆāļ™āļˆāļēāļāļ•āļąāļ§āđ„āļŸāļĨāđŒāļ•āđ‰āļ™āļ‰āļšāļąāļš āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāđ„āļŸāļĨāđŒāļĒāđˆāļ­āļĒāļ—āļĩāđˆāļ–āļđāļāđāļšāđˆāļ‡āļ­āļ­āļāļĄāļē āļāļĨāļąāļšāļĄāļēāļĢāļ§āļĄāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ āđ€āļŦāļĄāļ·āļ­āļ™āļ•āļąāļ™āļ‰āļšāļąāļšāļ”āļąāļ‡āđ€āļ”āļīāļĄ āļāđ‡āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ split -l 1 Departments.txt <---- āđāļšāđˆāļ‡āļ­āļ­āļāļ—āļĩāļĨāļ°āļšāļĢāļĢāļ—āļąāļ” $ ls x* xaa xab xac $ cat xaa xab xac <---- āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļžāļĢāđ‰āļ­āļĄāļāļąāļ™ 1 Electrical 2 Computer 3 Telecommunication $ cat xaa xab xac > Departments_copies.txt <---- āļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļĩāļĒāļ§ $ cat Departments_copies.txt 1 Electrical 2 Computer 3 Telecommunication āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ md5sum āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļ‚āļ™āļēāļ”āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļŦāļĢāļ·āļ­ āđ„āļĄāđˆ $ md5sum Departments.txt c4eef8b561262f39d7ae748566100fe5 Departments.txt $ md5sum Departments_copies.txt c4eef8b561262f39d7ae748566100fe5 Departments_copies.txt Wc, head, and tail āļ„āļģāļŠāļąāđˆāļ‡ wc (Word Count) āļˆāļ°āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ§āđˆāļēāļĄāļĩāļ‚āļ™āļēāļ” āđƒāļŦāļāđˆāđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļĄāļĩāļšāļĢāļĢāļ—āļąāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļģāļ™āļ§āļ™āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļˆāļģāļ™āļ§āļ™āļ„āļģāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļ—āđˆāļēāđ„āļŦāļĢāđˆ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ° āļŠāļĄāđƒāļ™āļāļēāļĢāļ”āļđāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđāļ•āđˆāļˆāļ°āđ€āļ™āđ‰āļ™āļ”āļđāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļŠāđˆāļ§āļ™āļŦāļąāļ§āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ head āđāļĨāļ°āļŠāđˆāļ§āļ™āļ—āđ‰āļēāļĒ āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ tail āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ option -n <āļšāļĢāļĢāļ—āļąāļ”> āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļˆāļģāļ™āļ§āļ™āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ wc -l /var/log/dmesg 1386 /var/log/dmesg $ head -n 5 /var/log/dmesg [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 2.6.32-42-server (buildd@batsu) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) ) #96-Ubuntu SMP Wed Aug 15 19:52:20 UTC 2012 (Ubuntu 2.6.32-42.96-server 2.6.32.59+drm33.24) 47 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 48. [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-2.6.32-42-server root=UUID=4fb97098-124c-489b-a0d1-3eb8846d2f67 ro quiet [ 0.000000] KERNEL supported cpus: $ tail -n 5 /var/log/dmesg [ 18.896413] acpiphp_glue: Slot 262 already registered by another hotplug driver [ 18.896434] acpiphp_glue: Slot 263 already registered by another hotplug driver [ 19.031705] ENS1371 0000:02:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 [ 19.602812] vmmemctl: started kernel thread pid=907 [ 19.602826] VMware memory control driver initialized āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‰āļēāļ”āļđāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ§āđˆāļēāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļē āļĄāļēāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -f āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ tail āđ€āļžāļ·āđˆāļ­āđ€āļāđ‰āļēāļ”āļđāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ”āļąāļ‡āļĢāļđāļ› āļĢāļđāļ›āļ—āļĩāđˆ 1.11 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ tail āļ„āļģāļŠāļąāđˆāļ‡āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļŠāļļāļ” REGULAR EXPRESSIONS nd, grep āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļ„āļ·āļ­āļ„āļģ āļŠāļąāđˆāļ‡ ïŽnd āđ€āļžāļĢāļēāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđāļ•āđˆāļĨāļ°āļŠāļ™āļīāļ”āļ”āļąāļ‡āļ•āļēāļĢāļēāļ‡āđāļŠāļ”āļ‡āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ (parameter) āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļĢāļ°āļšāļļāļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ•āļēāļĢāļēāļ‡ 1.7 āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļšāļ­āļāļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ f āđ„āļŸāļĨāđŒāļ—āļąāđˆāļ§āđ„āļ› d āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ b block c character 48 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 49. āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒ āļŠāļ™āļīāļ”āđ„āļŸāļĨāđŒ p pipe l Symbolic link s Socket āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāđƒāļŦāđ‰āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āđ„āļŸāļĨāđŒāļ—āļąāđˆāļ§āđ„āļ› (f) āļŦāļĢāļ·āļ­ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (d) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -type āđ€āļžāļ·āđˆāļ­ āļĢāļ°āļšāļļāļ›āļĢāļ°āđ€āļ āļ—āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ls -l total 28 -rw-r--r-- 1 student student 53 2013-08-21 05:16 error.log -rwxr-xr-x 1 student student 8497 2013-08-21 06:05 hello -rw-r--r-- 1 student student 92 2013-08-21 06:05 hello.c drwxr-xr-x 2 student student 4096 2013-09-17 18:03 out -rw-r--r-- 1 student student 57 2013-08-21 05:16 result.txt $ find . -type f ./error.log ./result.txt ./.my_hidden_file ./hello ./hello.c $ find . -type d . ./.my_hidden_directory ./out āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļŦāļĢāļ·āļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ‹āđˆāļ­āļ™āļ­āļĒāļđāđˆ $ find . -type f -name ".*" ./.my_hidden_file āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļš case sensitive (āļŠāļ™āđƒāļˆāļ•āļąāļ§āļžāļīāļĄāļžāđŒāđ€āļĨāđ‡āļ- āļžāļīāļĄāļžāđŒāđƒāļŦāļāđˆ) āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļāļĨāđ‰āđ€āļ„āļĩāļĒāļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ‚āļ”āļĒāđ„āļĄāđˆāļŠāļ™āđƒāļˆāļāļĢāļ“āļĩ case sensitive āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđ‚āļ”āļĒ āļāļēāļĢāđƒāļŠāđ‰ -iname āđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ find -iname "MyProgram.c" ./myprogram.c ./unix/myprogram.c ./programming/MyProgram.c ./MyProgram.c 49 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 50. āļāļēāļĢāļĢāļ°āļšāļļāļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļĨāļķāļāļ‚āļ­āļ‡āļŠāļąāđ‰āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ -mindepth [level] āđāļĨāļ° -maxdepth [level] āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ root (level 1) āđāļĨāļ°āļĨāļķāļāļĨāļ‡āđ„āļ›āļ­āļĩāļ 2 āļŠāļąāđ‰āļ™ (level 2 - level 3) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ find / -maxdepth 3 -name shadow /etc/bash_completion.d/shadow /etc/shadow āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ§āđˆāļēāđƒāļŦāđ‰āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāđ€āļ‰āļžāļēāļ°āļĢāļ°āļ”āļąāļšāļ„āļ§āļēāļĄāļĨāļķāļāļ—āļĩāđˆ 2 āļ–āļķāļ‡ 4 (level 2 - level 4) $ find / -mindepth 2 -maxdepth 4 -name shadow /etc/bash_completion.d/shadow āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ ïŽnd āđāļ•āđˆāļĨāļ°āļ„āļĢāļąāđ‰āļ‡ āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļžāļīāđ€āļĻāļĐāļŦāļĨāļąāļ‡āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -exec āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļˆāļ­āđ„āļŸāļĨāđŒāļ•āļēāļĄ āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļŠāđ‡āļ„āļ„āđˆāļē checksum āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļˆāļ­āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ md5sum $ find -iname "MyProgram.c" -exec md5sum {} ; ed832d42670ee3af4041e4a50f851755 ./myprogram.c ed832d42670ee3af4041e4a50f851755 ./unix/myprogram.c 7562d93e8b9a19dc80959d4eb7e2c7ca ./programming/MyProgram.c ae96bf65a87976abba3fdc57f47a55a2 ./MyProgram.c āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļēāļĄāļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™ (le permission) āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -perm āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡ $ find . -perm -g=r -type f -exec ls -l {} ; -rw-r--r-- 1 student student 53 2013-08-21 05:16 ./error.log ----r----- 1 student student 57 2013-08-21 05:16 ./result.txt -rw-r--r-- 1 student student 0 2013-09-17 18:04 ./.my_hidden_file -rwxr-xr-x 1 student student 8497 2013-08-21 06:05 ./hello -rw-r--r-- 1 student student 92 2013-08-21 06:05 ./hello.c $ find . -perm g=r -type f -exec ls -l {} ; ----r----- 1 student student 57 2013-08-21 05:16 ./result.txt āļŦāļĢāļ·āļ­āļĢāļ°āļšāļļāđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āđāļ›āļ” (Octal) $ find . -perm 040 -type f -exec ls -l {} ; ----r----- 1 student student 57 2013-08-21 05:16 ./result.txt āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļžāļ·āđ‰āļ™āļ—āļĩāđˆ āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļĩāļ‚āļ™āļēāļ”āļˆāļģāļāļąāļ” āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ™āļģāļ„āļģāļŠāļąāđˆāļ‡ ïŽnd āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ•āļēāļĄāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļķāļ‡ āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ 50 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 51. āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļ $ find . -type f -exec ls -s {} ; | sort -n -r | head -5 80 ./testing/ktest/ktest.pl 64 ./perf/util/trace-event-parse.c 64 ./perf/util/symbol.c 60 ./lguest/lguest.c 56 ./perf/util/header.c āļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļŠāļļāļ” 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļ āđāļ•āđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļĻāļđāļ™āļĒāđŒāđ„āļšāļ•āđŒ (Empty le) $ find . -not -empty -type f -exec ls -s {} ; | sort -n | head -5 4 ./firewire/list.h 4 ./firewire/Makefile 4 ./firewire/nosy-dump.h 4 ./include/tools/be_byteshift.h 4 ./include/tools/le_byteshift.h āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ (byte) āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -size [byte] āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ find . -size +200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļĄāļēāļāļāļ§āđˆāļē 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ $ find . -size -200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ $ find . -size 200M <------ āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ” 200 āđ€āļĄāļāļ°āđ„āļšāļ•āđŒ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ‰āļžāļēāļ°āļ”āđ‰āļ§āļĒ alias āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ‚āļ™āļēāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļžāļ·āđˆāļ­āļĨāļš āļ—āļīāđ‰āļ‡ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ alias rm50m="find / -type f -name *.tar -size +50M -exec rm -i {} ;" $ alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} ;" $ alias rm3g="find / -type f -name *.tar -size +3G -exec rm -i {} ;" $ alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} ;" āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđ‚āļ”āļĒāļ”āļđāļˆāļēāļāđ€āļ§āļĨāļēāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (Access time) āļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™ (Modication time) āļŦāļĢāļ·āļ­ āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ­āđ‚āļŦāļ™āļ”/āļŠāļ–āļēāļ™āļ° (Change time) āļŠāļēāļĄāļēāļĢāļ– āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ•āļēāļĢāļēāļ‡ 1.8 āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ïŽnd āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ ---Access Time --- amin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ atime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ --- Modication Time --- mmin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™ 51 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 52. āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ mtime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ āļēāļĒāđƒāļ™ --- Change Time --- cmin m āđ€āļ§āļĨāļē m āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļŦāļĢāļ·āļ­āļ„āđˆāļēāđ„āļ­āđ‚āļŦāļ™āļ” ctime d āđ€āļ§āļĨāļē d*24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļ—āļĩāđˆāđ„āļŸāļĨāđŒāļ–āļđāļāļŠāļ–āļēāļ™āļ°āļŦāļĢāļ·āļ­āļ„āđˆāļēāđ„āļ­āđ‚āļŦāļ™āļ” $ cd unix/ $ vim hello.c <------ āđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ hello.c $ chmod 755 result.txt <------ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļīāļ—āļ˜āļīāđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ result.txt āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ unix āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ–āļđāļāđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āđ€āļĄāļ·āđˆāļ­ 10 āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē $ find ~/unix/ -mmin -10 /home/student/unix/ /home/student/unix/hello.c āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ unix āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļīāļ—āļ˜āļīāđŒāđ„āļŸāļĨāđŒāđ€āļĄāļ·āđˆāļ­ 10 āļ™āļēāļ—āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē $ find ~/unix/ -cmin -10 /home/student/unix/ /home/student/unix/result.txt /home/student/unix/hello.c āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āļœāļĨāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļ‹āđˆāļ­āļ™ (hidden le) āđƒāļ™āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ -regex āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ find ~/unix/ -amin -10 ( ! -regex ".*/..*" ) /home/student/unix/ /home/student/unix/hello.c āđƒāļ™āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđāļĒāļāđ€āļ›āđ‡āļ™ 2 āļŠāđˆāļ§āļ™āļ„āļ·āļ­ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒ āđāļĨāļ° āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒ āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ find / ( -perm -4000 -fprintf ~/unix/suid.txt '%#m %u %pn' ) , ( -size +100M -fprintf ~/unix/big.txt '%-10s %pn' ) $ cat big.txt 510743705 /home/student/aosp/out/host/linux-x86/bin/clang 357304855 /home/student/aosp/out/host/linux-x86/bin/llvm-rs-cc 52 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 53. 138665118 /home/student/aosp/out/host/linux-x86/obj/STATIC_LIBRARIES/libclangSema_inter mediates/libclangSema.a 138104274 /home/student/aosp/out/host/linux-x86/obj/STATIC_LIBRARIES/libclangStaticAnal yzerCheckers_intermediates/libclangStaticAnalyzerCheckers.a 160314665 /home/student/aosp/out/host/linux-x86/obj/lib/libbcc.so ... $ cat suid.txt 04755 root /bin/ping6 04755 root /bin/su 04755 root /bin/fusermount 04755 root /bin/umount 04755 root /bin/mount 04755 root /bin/ping 04755 root /usr/bin/chfn 06755 daemon /usr/bin/at 04755 root /usr/bin/lppasswd 04755 root /usr/bin/sudoedit 04755 root /usr/bin/arping 04755 root /usr/bin/gpasswd ... grep āļ„āļģāļŠāļąāđˆāļ‡ grep (Generalized Regular Expression Parser) āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆ āļĢāļ°āļ”āļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđ‚āļ•āđŠāļ°āļˆāļ™āđ„āļ›āļ–āļķāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ‚āļ­āļ‡ āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļ„āļ·āļ­āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ $ grep ".*passwd" suid.txt 04755 root /usr/bin/lppasswd 04755 root /usr/bin/gpasswd 04755 root /usr/bin/passwd 04755 student /home/student/Downloads/poky-dylan-9.0.0/build/tmp/work/i586-poky-linux/shado w/4.1.4.3-r13/package/usr/bin/passwd.shadow ... āļ•āļēāļĢāļēāļ‡ 1.9 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ ? āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 1 āļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ° * āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 0 āļŦāļĢāļ·āļ­ āļĄāļēāļāļāļ§āđˆāļēāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ° + āđ€āļˆāļ­āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 1 āļŦāļĢāļ·āļ­ āļĄāļēāļāļāļ§āđˆāļēāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ° ^ āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āļ‚āļķāđ‰āļ™āļ•āđ‰āļ™āļšāļĢāļĢāļ—āļąāļ” 53 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 54. āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ $ āļ„āđ‰āļ™āļŦāļēāđ€āļ‰āļžāļēāļ°āļ—āđ‰āļēāļĒāļšāļĢāļĢāļ—āļąāļ” [ ] āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āļ­āļąāļ‚āļĢāļ°āđƒāļ”āļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ [ ] {n} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™ n āļ„āļĢāļąāđ‰āļ‡ {n,} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆ n āļ„āļĢāļąāđ‰āļ‡ āļŦāļĢāļ·āļ­āļĄāļēāļāļāļ§āđˆāļē {n,m} āđ€āļˆāļ­āļ‹āđ‰āļģāđ€āļ›āđ‡āļ™āļˆāļģāļ™āļ§āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆ n āļ„āļĢāļąāđ‰āļ‡āļˆāļ™āļ–āļķāļ‡ m āļ„āļĢāļąāđ‰āđ‰āļ‡ char āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ° char -E ‘pattern1 .* pattern2’ āļ„āđ‰āļ™āļŦāļē pattern1 āđāļĨāļ° pattern2 -E ‘pattern1 | pattern2’ āļ„āđ‰āļ™āļŦāļē pattern1 āļŦāļĢāļ·āļ­ pattern2 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ grep āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāļ„āļģāļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡ ls -al $ ls -al total 61 drwxr-xr-x 4 student student 4096 2013-09-20 05:09 . drwxr-xr-x 37 student student 4096 2013-09-11 20:53 .. -rw-r--r-- 1 student student 5160 2013-09-18 00:04 big.txt -rw-r--r-- 1 student student 53 2013-08-21 05:16 error.log -rwxr-xr-x 1 student student 8497 2013-08-21 06:05 hello -rw-r--r-- 1 student student 93 2013-09-17 19:16 hello.c drwxr-xr-x 2 student student 4096 2013-09-17 18:04 .my_hidden_directory -rw-r--r-- 1 student student 0 2013-09-17 18:04 .my_hidden_file -rw-r--r-- 1 student student 0 2013-09-20 05:09 mytest.txt -rw-r--r-- 1 student student 72 2013-09-20 05:09 number -rw-r--r-- 1 student student 0 2013-09-20 04:48 test1.txt -rw-r--r-- 1 student student 0 2013-09-20 04:48 test.txt $ ls -al | grep test?.txt -rw-r--r-- 1 student student 0 2013-09-20 04:48 test1.txt āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ â€œ+” āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ grep āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ egrep (Extended Grep) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ls -al | egrep test+.txt -rw-r--r-- 1 student student 0 2013-09-20 05:09 mytest.txt -rw-r--r-- 1 student student 0 2013-09-20 04:48 test.txt āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āđ€āļĨāļ‚āļ•āļēāļĄāļˆāļģāļ™āļ§āļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ [ ] āđāļĨāļ° {n} āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cat numbers ID 3710166 Telephone No. 0891234122 54 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 55. City Code 20131 Phone No. 038191772 $ grep "[0-9]{5}$" numbers City Code 20131 āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ—āļĩāđˆāļĄāļĩāļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 7 āļŦāļĨāļąāļāļ‚āļķāđ‰āļ™āđ„āļ›āļˆāļ°āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ {m, } āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ grep "[0-9]{7,}$" numbers ID 3710166 Telephone No. 0891234122 Phone No. 038191772 āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ log āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ -E ‘pat- tern1 | pattern2’ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ log āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ cat data.log 1 Station01 Temp_Sensor 35.4 2 Station02 Flow_Sensor 12.4 3 Station03 Light_Sensor 55 4 Station04 Motion_Sensor ON 5 Station05 Current_Sensor 1.42 āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ grep āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļ”āđ‰ 4 āļĢāļđāļ›āđāļšāļš āđ„āļ”āđ‰āđāļāđˆ (āđāļšāļšāļ—āļĩāđˆ 1) $ grep -i 'station01|station03' data.log 1 Station01 Temp_Sensor 35.4 3 Station03 Light_Sensor 55 (āđāļšāļšāļ—āļĩāđˆ 2) $ grep -i -E 'station01|station03' data.log 1 Station01 Temp_Sensor 35.4 3 Station03 Light_Sensor 55 (āđāļšāļšāļ—āļĩāđˆ 3) $ grep -i -e station01 -e station03 data.log 1 Station01 Temp_Sensor 35.4 3 Station03 Light_Sensor 55 (āđāļšāļšāļ—āļĩāđˆ 4) $ egrep -i 'station01|station03' data.log 1 Station01 Temp_Sensor 35.4 3 Station03 Light_Sensor 55 āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡āļ•āđ‰āļ™āļšāļĢāļĢāļ—āļąāļ” āļˆāļ°āđƒāļŠāđ‰ “^” āļ™āļģāļŦāļ™āđ‰āļēāļ„āļģāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļŦāļĢāļ·āļ­āļ„āļģāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡ āļ›āļĨāļēāļĒāļšāļĢāļĢāļ—āļąāļ” āļˆāļ°āđƒāļŠāđ‰ “$” āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļ„āļģāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ grep "^Sep 11" messages.1 Sep 11 21:16:58 EE-Burapha rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="691" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'. Sep 11 21:44:29 EE-Burapha kernel: [ 3077.192891] e1000: eth0 NIC Link is Down Sep 11 21:45:17 EE-Burapha kernel: [ 3125.462088] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None 55 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 56. Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down Sep 11 21:47:04 EE-Burapha kernel: [ 3227.275574] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None ... $ grep "Link is Down$" messages.1 Sep 11 21:44:29 EE-Burapha kernel: [ 3077.192891] e1000: eth0 NIC Link is Down Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down Sep 11 21:47:07 EE-Burapha kernel: [ 3230.682704] e1000: eth0 NIC Link is Down Sep 11 21:53:34 EE-Burapha kernel: [ 3310.165309] e1000: eth0 NIC Link is Down Sep 11 21:54:02 EE-Burapha kernel: [ 3338.102673] e1000: eth0 NIC Link is Down ... āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ„āļģāļ—āļĩāđˆāļĄāļĩāļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ āļ™āļģāļŦāļ™āđ‰āļēāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āļžāļīāđ€āļĻāļĐāđ€āļŠāļĄāļ­ āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ grep "255.255.255.255" syslog.1 Sep 18 11:36:12 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 Sep 18 11:36:13 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to 255.255.255.255 port 67 Sep 18 19:54:11 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3 Sep 18 19:54:12 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to 255.255.255.255 port 67 Sep 20 04:50:05 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5 Sep 20 04:50:06 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to 255.255.255.255 port 67 āļ•āļēāļĢāļēāļ‡ 1.10 āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡ grep OPERATOR DESCRIPTION [:digit:] āđ€āļ‰āļžāļēāļ°āļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 0 āļ–āļķāļ‡ 9 [:alnum:] āļ—āļąāđ‰āļ‡āļ•āļąāļ§āļ­āļąāļāļĐāļĢ A āļ–āļķāļ‡ Z āļŦāļĢāļ·āļ­ a āļ–āļķāļ‡ z āđāļĨāļ°āļ•āļąāļ§āđ€āļĨāļ‚āļ•āļąāđ‰āļ‡āđāļ•āđˆ 0 āļ–āļķāļ‡ 9 [:alpha:] āļ•āļąāļ§āļ­āļąāļāļĐāļĢ A āļ–āļķāļ‡ Z āļŦāļĢāļ·āļ­ a āļ–āļķāļ‡ z [:blank:] āđ€āļ‰āļžāļēāļ°āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡ (Space) āđāļĨāļ°āđāļ—āđŠāļ› (TAB) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļˆāļēāļāļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ•āļąāļ§āļ­āļąāļāļ‚āļĢāļ°āđƒāļ™āđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļāļ‚āļķāđ‰āļ™ āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ $ grep "anacron[[[:digit:]]+]" /var/log/syslog.1 Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.daily' terminated Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.weekly' started Sep 18 08:50:17 EE-Burapha anacron[27530]: Updated timestamp for job `cron.weekly' to 2013-09-18 Sep 18 08:50:18 EE-Burapha anacron[27155]: Job `cron.weekly' terminated ... 56 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 57. āļāļēāļĢāļĢāļ§āļĄāļ„āļģāļŠāļąāđˆāļ‡āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āļ”āđ‰āļ§āļĒāļŠāļąāļāļāļĨāļąāļāļĐāļ“āđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Pipe (|) āđ‚āļ”āļĒāđ€āļ­āļēāļ—āđŒāļžāļļāļ•āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļĢāļāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ• āļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļŠāļđāđˆāļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ $ ls <āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ> | grep <āļ„āļģāļ„āđ‰āļ™āļŦāļē> $ ls -al | grep "^d" drwxr-xr-x 4 student student 4096 2013-09-21 02:21 . drwxr-xr-x 37 student student 4096 2013-09-11 20:53 .. drwxr-xr-x 2 student student 4096 2013-09-17 18:04 .hidden_directory drwxr-xr-x 2 student student 4096 2013-09-17 18:03 out awk Awk āļĒāđˆāļ­āļĄāļēāļˆāļēāļāļ•āļąāļ§āļ­āļąāļāļĐāļĢāđāļĢāļāļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļ„āļ™āđ„āļ”āđ‰āđāļāđˆ Aho, Weinberger, āđāļĨāļ° Kernighan āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ™āļīāļ”āļŦāļ™āļķāđˆāļ‡āļ‹āļķāđˆāļ‡āļĄāļĩāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļ›āđ‡āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ (structured data) āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļĢāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰ āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡ awk āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ â€Ē awk āļˆāļ°āļĄāļ­āļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩ āđ€āļĢāļ„āļ­āļĢāđŒāļ” (record) āđāļĨāļ° āļŸāļīāļĨāļ”āđŒ (eld) â€Ē awk āļˆāļ°āļĄāļĩāļ•āļąāļ§āđāļ›āļĢ (variables) āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ (conditional statement) āđāļĨāļ°āļŠāļļāļ”āļ„āļģ āļŠāļąāđˆāļ‡āļ—āļģ āļ‹āđ‰āļģ (loop statement) āđ€āļŦāļĄāļ·āļ­āļ™āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđˆāļ§āđ„āļ› â€Ē awk āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļĨāļ‚āļ„āļ“āļīāļ• (arithmetic) āđāļĨāļ°āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (string) â€Ē awk āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļĢāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰ āļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ awk '/search pattern1/ {Actions} /search pattern2/ {Actions}' file āđ‚āļ”āļĒāļ—āļĩāđˆ search pattern āļāđ‡āļ„āļ·āļ­āļŠāļļāļ” regular expression āļŠāđˆāļ§āļ™ Actions āļāđ‡āļ„āļ·āļ­āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāļīāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cat data.log 1 Station01 Temp_Sensor 35.4 2 Station02 Flow_Sensor 12.4 3 Station03 Light_Sensor 55 4 Station04 Motion_Sensor ON 5 Station05 Current_Sensor 1.42 $ awk '/Station01/ > /Station02/' data.log 1 Station01 Temp_Sensor 35.4 2 Station02 Flow_Sensor 12.4 57 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 58. awk āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ€āļĢāļ„āļ„āļ­āļĢāđŒāļ”āđƒāļ™āđāļ•āđˆāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļ„āļąāđˆāļ™āļ”āđ‰āļ§āļĒāļ­āļąāļāļ‚āļĢāļ°āļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļŸāļīāļĨāļ”āđŒāļĒāđˆāļ­āļĒāđ†āđāļĨāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰ āđƒāļ™āļ•āļąāļ§āđāļ›āļĢ $n āđ‚āļ”āļĒāļ—āļĩāđˆ n āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™āđ€āļĨāļ‚āļŸāļīāļĨāļ”āđŒ āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆ $0 āļˆāļ°āđāļ—āļ™āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āļšāļĢāļĢāļ—āļąāļ”āļ™āļąāđ‰āļ™āđ† āļŠāđˆāļ§āļ™ $1 āļˆāļ™āļ–āļķāļ‡ $n āļ™āļąāđ‰āļ™āļˆāļ°āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļ–āļđāļāđāļĒāļāļ”āđ‰āļ§āļĒāļŠāđˆāļ­āļ‡āļ§āđˆāļēāļ‡āđāļ•āđˆāļĨāļ°āļ„āļ­āļĨāļąāļĄāļ™āđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ awk '{print $2,$4;}' data.log Station01 35.4 Station02 12.4 Station03 55 Station04 ON Station05 1.42 āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ $NF āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ„āđˆāļēāļŸāļīāļĨāļ”āđŒāļ•āļąāļ§āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ awk '{print $2,$NF;}' data.log Station01 35.4 Station02 12.4 Station03 55 Station04 ON Station05 1.42 āļ„āļģāļŠāļąāđˆāļ‡ awk āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļŠāļģāļ„āļąāļāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļĢāļ°āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļ­āļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ (Initialization) āļāđˆāļ­āļ™āļ—āļĩāđˆāđˆāļˆāļ° āđ€āļĢāļīāđˆāļĄāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļ•āđˆāļĨāļ°āļšāļĢāļĢāļ—āļąāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āđāļĨāļ°āļˆāļ°āļāļĢāļ°āļ—āļģāļ„āļģāļŠāļąāđˆāļ‡āļ•āļ­āļ™āļŠāļīāđ‰āļ™āļŠāļļāļ” (Final) āļŦāļĨāļąāļ‡āļˆāļēāļāļšāļĢāļĢāļ—āļąāļ” āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰ BEGIN āđāļĨāļ° END āļ”āļąāļ‡āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ BEGIN { Actions } {Action} # Action for every lines in a file END { Actions } # is for comments in Awk āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ awk āđāļšāļšāđ€āļ•āđ‡āļĄāļĢāļđāļ› $ awk 'BEGIN {print "Station NametSensor TypetttValue";} > {print $2,"t",$3,"ttt",$NF;} > END{print "Report Generatedn--------------"; > }' data.log Station Name! Sensor Type!! ! Value Station01 ! ! Temp_Sensor ! ! ! 35.4 Station02 ! ! Flow_Sensor ! ! ! 12.4 Station03 ! ! Light_Sensor ! ! ! 55 Station04 ! ! Motion_Sensor ! ! ! ON Station05 ! ! Voltage_Sensor ! ! ! 1.42 Report Generated -------------- 58 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 59. āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ„āļģāļŠāļąāđˆāļ‡āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒ datalog.script āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļŠāđˆāļ™ $ cat datalog.script BEGIN { ! print "Station NametSensor TypetttValue"; } { ! print $2,"t",$3,"ttt",$NF; } END { ! print "Report Generatedn--------------"; } $ awk -f datalog.script data.log Station Name! Sensor Type!! ! Value Station01 ! ! Temp_Sensor ! ! ! 35.4 Station02 ! ! Flow_Sensor ! ! ! 12.4 Station03 ! ! Light_Sensor ! ! ! 55 Station04 ! ! Motion_Sensor ! ! ! ON Station05 ! ! Voltage_Sensor ! ! ! 1.42 Report Generated -------------- āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļāļēāļĢāļ”āļđāļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ†āļ™āļąāđ‰āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļēāļˆāļˆāļ°āļĄāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āđƒāļŦāđ‰āļĄāļĩāļšāļĢāļīāļāļēāļĢ Web Server āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļĄāļēāļ”āļđāļŠāļ–āļēāļ™āļ°āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ§āđŠ āļ›āļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāđāļ—āđŠāļ HTML (HTML Tag) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ awk āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ”āļēāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cat datalog_html.script BEGIN{ title="Sensor Station"; print "<html>n<title>"title"</title><body bgcolor="#ffffff">n<table bor- der=1><th colspan=2 align=centre>Station Details</th>"; } { station_name=$2; sensor=$3; value=$NF; print "<tr><td>"station_name"</td><td>"sensor"</td><td>"value"</td></tr>"; } END { print "</table></body>n</html>"; } āļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ script āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē (datalog_html.script) āđāļĨāļ°āđ€āļāđ‡āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāđāļ—āđ‡āļ HTML āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ sensor.html āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ awk -f datalog_html.script data.log > sensor.html 59 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 60. $ cat sensor.html <html> <title>Sensor Station</title><body bgcolor="#ffffff"> <table border=1><th colspan=2 align=centre>Station Details</th> <tr><td>Station01</td><td>Temp_Sensor</td><td>35.4</td></tr> <tr><td>Station02</td><td>Flow_Sensor</td><td>12.4</td></tr> <tr><td>Station03</td><td>Light_Sensor</td><td>55</td></tr> <tr><td>Station04</td><td>Motion_Sensor</td><td>ON</td></tr> <tr><td>Station05</td><td>Voltage_Sensor</td><td>1.42</td></tr> </table></body> </html> āļ—āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ sensor.html āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāđ€āļžāļ·āđˆāļ­āļ”āļđāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āļĢāļđāļ›āļ—āļĩāđˆ 1.12 āđāļŠāļ”āļ‡āļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļš HTML āļ„āļģāļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ iptables iptables āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļ„āļąāļāļ­āļĩāļāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­ āļ‚āđˆāļēāļĒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒ (rewall) āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ­āļ­āļāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™ āļœāļđāđ‰ āļ”āļđāđāļĨāļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļĢāđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ iptables āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļ āļēāļĒāđƒāļ™ iptables āļ™āļąāđ‰āļ™āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ•āļēāļĢāļēāļ‡ (tables) āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ•āļēāļĢāļēāļ‡āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļēāļĒ āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē chain (āļ—āļĩāđˆ iptables āđ€āļ•āļĢāļĩāļĒāļĄāļĄāļēāđƒāļŦāđ‰āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡) āđāļĨāļ°āļ āļēāļĒāđƒāļ™āđāļ•āđˆāļĨāļ° chain āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļ‚āđ‰āļēāļ­āļ­āļāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē rule āļ”āļąāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ› āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 60 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 61. Rule 1 Rule 2 Rule 3 Chain 1 Rule 1 Rule 2 Rule 3 Chain 2 Rule 1 Rule 2 Rule 3 Chain 1 Rule 1 Rule 2 Rule 3 Chain 2 Table 1 Table 2 āļĢāļđāļ›āļ—āļĩāđˆ 1.13 āļ•āļēāļĢāļēāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļāļāļ‚āļ­āļ‡ iptables iptables āļˆāļ°āļ–āļđāļāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļēāļĢāļēāļ‡āđƒāļŦāđ‰āđāļĨāđ‰āļ§ 4 āļ•āļēāļĢāļēāļ‡ (4 built-in tables) āđ„āļ”āđ‰āđāļāđˆ 1. Filter Table 2. NAT Table 3. Mangle Table 4. Raw Table āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡ iptables āļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļ 3 āļŠāđˆāļ§āļ™āđ„āļ”āđ‰āđāļāđˆ â€Ē INPUT  āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļŠāļđāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ â€Ē OUTPUT āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļ­āļāļˆāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ â€Ē FORWARD āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļŠāđˆāļ‡āļ•āđˆāļ­āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāđƒāļ™āļŠāļđāđˆāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāļ™āļ­āļ āļ‹āļķāđˆāļ‡āļāļēāļĢāļšāļĨāđ‡āļ­āļ āļžāļ­āļĢāđŒāļ•āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ Routing Decision Forward Input Output Incoming Outgoing Local Process āļĢāļđāļ›āļ—āļĩāđˆ 1.14 āđ‚āļŸāļĨāļ§āđŒāļŠāļēāļĢāđŒāļ•āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ 61 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 62. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡āļ āļēāļĒāđƒāļ™ iptables $ sudo iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination āđ‚āļ”āļĒāļ—āļĩāđˆ â€Ē ACCEPT āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļĒāļ­āļĄāđƒāļŦāđ‰āđāļžāđ‡āļāđ€āļāđ‡āļ• (packet) āļœāđˆāļēāļ™āđ„āļ›āļĒāļąāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡āđ„āļ”āđ‰ â€Ē DROP āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļ—āļīāđ‰āļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļąāļ™āļ—āļĩ āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđāļˆāđ‰āļ‡āļœāļđāđ‰āļŠāđˆāļ‡āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļŠāđˆāļ‡āđ„āļĄāđˆāļŠāļģāđ€āļĢāđ‡āļˆ â€Ē REJECT āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļ—āļīāđ‰āļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļąāļ™āļ—āļĩ āđāļĨāļ°āļœāļđāđ‰āļŠāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļœāđˆāļēāļ™ ICMP āļ•āļ­āļšāļāļĨāļąāļšāļ–āļķāļ‡ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļŠāđˆāļ‡ āđ„āļĄāđˆāļŠāļģāđ€āļĢāđ‡āļˆ â€Ē QUEUE āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđāļžāđ‡āļāđ€āļāđ‡āļ• āđ„āļ›āļĒāļąāļ‡āļŠāđˆāļ§āļ™āļĢāļ°āļšāļšāļšāļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (userspace) â€Ē RETURN āļ„āļ·āļ­āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒāļˆāļ°āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ chain āđāļĨāđ‰āļ§āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡ Chain āđ€āļ”āļīāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāđˆāļ­āļ™āļŦāļ™āđ‰āļē āļ™āļĩāđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ iptables āđ‚āļ”āļĒāļŦāļĨāļąāļāļāļēāļĢāļŠāļģāļ„āļąāļāļ„āļ·āļ­ āļ„āļ§āļĢāļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđˆāļ­āļ™āđāļĨāđ‰āļ§āļˆāļķāļ‡ āļ„āđˆāļ­āļĒāđ€āļĨāļ·āļ­āļāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļĩāļĨāļ°āļžāļ­āļĢāđŒāļ•āļˆāļ°āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļŠāļļāļ” $ IPTABLES -P FORWARD DROP      #CLOSE PORT ALL $ IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT $ IPTABLES -A FORWARD -p tcp --dport 53 -j ACCEPT    #DNS $ IPTABLES -A FORWARD -p udp --dport 53 -j ACCEPT #DNS $ IPTABLES -A FORWARD -p udp --dport 67 -j ACCEPT #DHCP $ IPTABLES -A FORWARD -p udp --dport 69 -j ACCEPT #TFTP $ IPTABLES -A FORWARD -p udp --dport 111 -j ACCEPT  #NFS $ IPTABLES -A FORWARD -p udp --dport 2049 -j ACCEPT  #NFS $ IPTABLES -A FORWARD -p udp --dport 32700 -j ACCEPT #NFS $ IPTABLES -A FORWARD -p tcp --dport 80 -j ACCEPT #HTTP $ IPTABLES -A FORWARD -p tcp --dport 8080 -j ACCEPT  #HTTP $ IPTABLES -A FORWARD -p tcp --dport 443 -j ACCEPT  #HTTPS $ IPTABLES -A FORWARD -p tcp --dport 8443 -j ACCEPT  #HTTPS $ IPTABLES -A FORWARD -p tcp --dport 20 -j ACCEPT #FTP $ IPTABLES -A FORWARD -p udp --dport 20 -j ACCEPT #FTP $ IPTABLES -A FORWARD -p tcp --dport 21 -j ACCEPT #FTP $ IPTABLES -A FORWARD -p udp --dport 21 -j ACCEPT #FTP $ IPTABLES -A FORWARD -p tcp --dport 22 -j ACCEPT #SSH $ IPTABLES -A FORWARD -p tcp --dport 23 -j ACCEPT #TELNET 62 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 63. āļžāļ­āļĢāđŒāļ•āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļ›āļīāļ”āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ bootload- er,āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ° āđ€āļĢāļĩāļĒāļ root lesystem āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 4 āļ–āļķāļ‡ 5 āļžāļ­āļĢāđŒāļ• āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 1.11 āļĢāļēāļĒāļāļēāļĢ services āļ—āļĩāđˆāļ–āļđāļāđ€āļ›āļīāļ”āđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ SERVICE PORT NAME PORT NO. TCP/IP PROTOCOL DHCP bootps 67 UDP TFTP tftp 69 UDP NFS sunrpc 111 UDP NFS nfs 2049 UDPNFS mountd 32700 āļŦāļĢāļ·āļ­ 32772 UDP āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ„āļŸāļĢāđŒāļ§āļ­āļĨāļĨāđŒ āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāļĢāļ°āļšāļšāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ $ sudo /etc/init.d/iptables off TCP UDP IP Ethernet, Token-Right, FDDI, X.25, Wireless,ATM,SNA... HTTP Kerb Xwin SMTP Telnet FTP DNS TFTP RPC NFS NCS SNMP PING Trace Route ICMP ARP RARP MIME āļĢāļđāļ›āļ—āļĩāđˆ 1.15 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ TCP/IP TFTP āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Trivial File Transfer Protocol (TFTP) āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ āļĢāļ°āļšāļš āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļĢāļđāđ‰āļˆāļąāļ FTP āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰ āļŠāļēāļĄāļēāļĢāļ–āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ­āļąāļžāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāđ„āļ”āđ‰ āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļš TFTP āļ™āļąāđ‰āļ™ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļ™āđ‰āļ­āļĒāļāļ§āđˆāļē FTP āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ•āļąāļ§āļ•āļ™ (authentication) āđāļĨāļ° āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ UDP āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ TFTP āļāđ‡āļĒāļąāļ‡āļ–āļđāļāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđƒāļ™āļāļēāļĢ āļŠāđˆāļ‡āđ„āļŸāļĨāđŒ conguration āļ•āđˆāļēāļ‡āđ†āļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ TFTP āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ host āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ image āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ āļ‚āđˆāļēāļĒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ› āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install xinetd tftp-hpa tftpd-hpa 63 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 64. āđāļ•āđˆāļ–āđ‰āļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 11.10 āļĨāļ‡āļĄāļē āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install xinetd tftp tftpd $ sudo mkdir /tftpboot āļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ tftpboot āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ /etc/xinetd.conf āđāļĨāļ°āđāļāđ‰āđ„āļ‚āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ TFTP_DIRECTORY āļ—āļĩāđˆāļ–āļđāļāļĢāļ°āļšāļļāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒ /etc/ default/tftpd-hpa (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ›) $ sudo vim /etc/xinetd.conf service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no } $ sudo vim /etc/default/tftpd-hpa (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 12.04 āļ‚āļķāđ‰āļ™āđ„āļ›) TFTP_USERNAME="tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure" TFTP_DIRECTORY="/home/training/tftpboot" āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļšāļĢāļīāļāļēāļĢ xinetd āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ sudo /etc/init.d/xinetd restart āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ•āđ‰āļ™āļ‰āļšāļąāļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /tftpboot/ āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host $ sudo echo ‘This is a data’ > /tftpboot/myfile āļœāļđāđ‰āđƒāļŠāđ‰āđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāđ‚āļ”āļĒāļāļēāļĢāļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡ TFTP server āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ tftp <Host IP> <----- āļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ TFTP server tftp> get myfile Received 16 bytes in 0.1 seconds tftp> quit  64 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 65. DHCP āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđƒāļ™āļŦāļĨāļēāļĒāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāđ‰āļ­āļ‡āļ‚āļ­āļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Address āđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āļĄāļąāļ™āđ€āļ­āļ‡ āļŦāļĢāļ·āļ­āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļˆāļ°āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļˆāđˆāļēāļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Address āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ DHCP āđƒāļŦāđ‰āļāļąāļšāļĨāļđāļāļ‚āđˆāļēāļĒāļŦāļĢāļ·āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (target board) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ° āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ DHCP server āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ­āļ‡ āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install isc-dhcp-server āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ /etc/dhcp/dhcpd.conf āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļ›āđ‡āļ™ DHCP Server āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄ āļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ $ sudo vim /etc/dhcp/dhcpd.conf subnet 192.168.0.0 netmask 255.255.255.0 { host targetboard { fixed-address 192.168.0.2; ! server-name "192.168.0.1"; option router "192.168.0.1"; hardware ethernet 12:34:56:78:9a:bc; option root-path "/rootfs"; filename uImage; } } āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ dhcpd.conf āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ DHCP server āļˆāļ°āļˆāđˆāļēāļĒ IP Address āđƒāļŦāđ‰āļāļąāļšāļšāļ­āļĢāđŒāļ” āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩ MAC address āđ€āļ›āđ‡āļ™ 12:34:56:78:9a:bc āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāļ„āđˆāļē MAC address āļšāļ™ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļŦāđ‰āļ•āļĢāļ‡āļ•āļēāļĄāļ„āđˆāļē MAC Address āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ DHCP Server āļĢāļđāđ‰āļˆāļąāļāđƒāļŦāđ‰āļ•āļĢāļ‡āļāļąāļ™ NFS nfs āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļžāļ·āđˆāļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆ āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļŦāđˆāļēāļ‡āļ­āļ­āļāđ„āļ›āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļŠāļĄāļ·āļ­āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ­āļ‡ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāđ‰āļ§āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ nfs āļĄāļĩāļœāļĨāļ—āļģāđƒāļŦāđ‰āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŦāļĢāļ·āļ­āļāļēāļĢ āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļĨāđˆāļ­āļ‡āļ•āļąāļ§āđāļĨāļ°āļŠāļ°āļ”āļ§āļāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™āđāļĨāļ°āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ‚āļ™āļēāļ” āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāđ„āļŸāļĨāđŒ root le system (RFS) āđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ”āđ€āļĢāļ­ āļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ NFS āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļŠāļĢāđ‡āļˆ āđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāļ‡ āđ€āļ‚āđ‰āļēāđ„āļ› root le system āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāļāđ‡āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđƒāļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļŠāđˆāļ™ Flash Memory āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 65 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 66. āļšāļ­āļĢāđŒāļ” Target āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host DHCP TFTP NFS mount NFS rootFS āļ•āļąāđ‰āļ‡āļ„āđˆāļē IP Kernel image āļĢāļ°āļšāļšāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļšāļ­āļĢāđŒāļ” Target Makele NFS Server āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļ āđāļŠāļĢāđŒ NFS Cient āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļ āđāļŠāļĢāđŒ āļĢāļđāļ›āļ—āļĩāđˆ 1.16 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ mount āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ NFS āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ‚āđ‰āļēāļāļąāļš Network File System āļ™āļąāđ‰āļ™ āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ nfs-kernel-server āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ /etc/exports āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install rpcbind nfs-kernel-server $ sudo mkdir /rootfs $ sudo vim /etc/exports /rootfs 192.168.0.2(rw,sync,no_subtree_check,no_root_squash) /rootfs localhost(rw,sync,no_subtree_check,no_root_squash) āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļ service āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ sudo service xinetd restart $ sudo service tftpd-hpa restart $ sudo service isc-dhcp-server restart $ sudo service rpcbind-boot stop $ sudo service nfs-kernel-server stop $ sudo service rpcbind-boot start $ sudo service nfs-kernel-server start āđ„āļŸāļĨāđŒ /etc/exports āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ§āđˆāļēāļˆāļ°āđƒāļŦāđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđƒāļ”āđƒāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļāļ‚āđˆāļēāļĒāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ„āļ”āđ‰ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ mount –t nfs nfs_server_Address:/rootfs/ /mnt/rfs *āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ shell script āļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ tftp & nfs āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ http://goo.gl/XuB1EZ 66 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 67. āļšāļ—āļ—āļĩāđˆ 2 āļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel) āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ­āļ­āļāļĄāļēāđ„āļ”āđ‰ 3 āļ›āļĢāļ°āđ€āļ āļ— āđ„āļ”āđ‰āđāļāđˆ â€ĒMonolithic kernel āđ€āļŠāđˆāļ™ Linux Kernel, MS-DOS, Microsoft Windows 9x Series â€ĒMicro kernel āđ€āļŠāđˆāļ™ AIX, AmigaOS, Android OS, Haiku, L4 microkernel family āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€ĒHybrid kernel āđ€āļŠāđˆāļ™ BeOS kernel, NetWare kernel, ReactOS kernel, NT kernel Windows NT kernel (Windows 2000/Windows XP/Windows 2003/Windows Vista), 8.XNU kernel (āđƒāļŠāđ‰āđƒāļ™ Mac OS X) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ—āļĢāļēāļšāļāļąāļ™āļ”āļĩāļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” monolithic kernel āļ‹āļķāđˆāļ‡āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŦāļĨāļąāļāđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Kernel āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ User mode Application Kernel mode System Operating sytem VFS, System call IPC, File System Scheduler, Virtual Memory Device Drivers, Dispatcher... Hardware āļĢāļđāļ›āļ—āļĩāđˆ 2.1 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Monolithic Kernel āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļ Micro Kernel āļ—āļĩāđˆāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļąāļ‡āļ„āļ‡āļ—āļģāđƒāļ™ Kernel āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡ āđ‚āļ›āļĢāđ€āļ‹āļŠ (inter-process communication) āļāļēāļĢāļˆāļąāļ”āļĨāļģāļ”āļąāļšāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāļ™āļžāļļāļ•/āđ€āļ­āļēāļ—āđŒāļžāļļāļ• (basic input/output scheduling) āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (memory management) āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ­āļ·āđˆāļ™āđ†āļˆāļ° āļ—āļģāļ āļēāļĒāļ™āļ­āļ Kernel āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ drivers, network stack, le systems 67 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 68. Kernel mode User mode Application Application IPC Hardware UNIX Server Device Driver File Server IPC, Virtual Memory, Scheduling Kernel mode Kernel mode User mode āļĢāļđāļ›āļ—āļĩāđˆ 2.2 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Micro Kernel Linux Kernel āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ° āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđ‚āļ”āļĒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļāļēāļĢāđŒāļ”āđāļŠāļ”āļ‡āļœāļĨ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāļ™āļžāļļāļ•āđāļĨāļ° āđ€āļ­āļēāļ—āđŒāļžāļļāļ• āđ€āļĄāļēāļŠāđŒ āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ‹āļ­āļŸāđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™ Kernel āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļ„āļ·āļ­ Kernel Module āđāļĨāļ° Device Driver āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āđˆāļ­āđ„āļ› āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđƒāļŠāđ‰ āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļš C Library āđ‚āļ›āļĢāđāļāļĢāļĄ A āđ‚āļ›āļĢāđāļāļĢāļĄ Bāđ„āļĨāļšāļĢāļēāļĢāļĩ A Linux Kernel Hardware āđ€āļĢāļĩāļĒāļ Kernel module āđāļˆāđ‰āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āđāļĨāļ° āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ† āļˆāļąāļ”āļāļēāļĢāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđāļˆāđ‰āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒ āļĢāļđāļ›āļ—āļĩāđˆ 2.3 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ 68 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 69. āļˆāļļāļ”āđ€āļ”āđˆāļ™āļŠāļģāļ„āļąāļāļ­āļĩāļāļˆāļļāļ”āļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ•āļąāđ‰āļ‡āđāļ•āđˆāđƒāļ™āļ­āļ”āļĩāļ•āļˆāļ™āļ–āļķāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļŠāļ·āđˆāļ­āđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /arch āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰ 2 āđāļšāļšāļ„āļ·āļ­āđāļšāļš 32 āļšāļīāļ• āđ€āļŠāđˆāļ™ arm, avr32, blackn, m68k, microblaze, mips, score, sparc, um, x86, powerpc āđāļĨāļ°āļāļĨāļļāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļšāļš 64 āļšāļīāļ• āđ€āļŠāđˆāļ™ alpha, arm64, ia64, sparc64, tile, x86_64, powerpc āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/<arch>/Kconfig, arch/<arch>/README āļŦ āļĢ āļ· āļ­ āđƒ āļ™ āđ„ āļ” āđ€ āļĢ āļ āļ— āļ­ āļĢ āļĩ Documentation/<arch>/ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĒāļąāļ‡āļ–āļđāļāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™ āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢ āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ†āđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļˆāļēāļāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ—āļĩāđˆāļ”āļđāđāļĨāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļˆāļēāļ āļ—āļąāđˆāļ§āđ‚āļĨāļāđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđƒāļ„āļĢāđāļ­āļšāļ‹āđˆāļ­āļ™āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ„āļĄāđˆāļžāļķāļ‡āļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāđ„āļĄāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļŦāđ‰āļāļąāļšāļĢāļ°āļšāļšāđ‚āļ”āļĒāļĢāļ§āļĄ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āļšāļēāļ‡āļ•āļąāļ§āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļēāļ‡āļ•āļąāļ§āļ—āļĩāđˆ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰ LINUX VERSIONING āđ‚āļ”āļĒāļ›āļāļ•āļīāļ—āļļāļ 2-3 āļ›āļĩ āļˆāļ°āļĄāļĩāļāļēāļĢāļ­āļ­āļāļĢāļļāđˆāļ™āđ€āļŠāļ–āļĩāļĒāļĢ (stable) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļ„āļđāđˆ āđ€āļŠāđˆāļ™ 1.0.x, 2.0.x, 2.2.x, 2.4.x, 2.6.x, 3.0.x āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™āđƒāļŦāļĄāđˆāđ†āđ€āļ‚āđ‰āļēāđ„āļ›āđāļĨāļ°āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ‚āļ„āđ‰āļ”āļŠāļļāļ” āđƒāļŦāļāđˆ āļāđ‡āļˆāļ°āļ­āļ­āļāđ€āļĨāļ‚āļĢāļļāđˆāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļ„āļĩāđˆ āđ€āļŠāđˆāļ™ 2.1.x, 2.3.x, 2.5.x āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđƒāļ™ āļĢāļ°āļ”āļąāļšāđ€āļĨāđ‡āļāļĨāļ‡āļĄāļē (Minor release) āļˆāļ°āđƒāļŠāđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļĨāļ‚āļĢāļļāđˆāļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļŠāļēāļĄ āđ€āļŠāđˆāļ™ 2.5.12, 2.6.39                                                       2.4.22.4.12.4.0 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.5.0 2.5.1 2.5.2 2.5.3 2.6.0 2.6.1 Stable Development Stable āļĢāļđāļ›āļ—āļĩāđˆ 2.4 āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļ­āļāđ€āļĨāļ‚āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ‚āļ­āļ‡ Linux Kernel āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2003 āļ–āļķāļ‡ āļ„.āļĻ. 2011 āļĢāļļāđˆāļ™ 2.6.x āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļĒāļ°āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĒāļēāļ§āļ™āļēāļ™āļĄāļēāļāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āļ­āļēāļˆāđ€āļ™āļ·āđˆāļ­āļ‡ āļĄāļēāļˆāļēāļāļŠāđˆāļ§āļ‡āļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļĒāļļāļ„āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™ 69 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 70. āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļ­āļžāđˆāļ§āļ‡āļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļļāļ™āđāļĢāļ‡āđāļĨāļ°āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āļĒāļļāļ„āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļ™āļīāļ”āļžāļāļžāļē āđ€āļŠāđˆāļ™ Laptop, Netbook, Mobile Internet Device, Smart Phone, Tablet āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 3.0 āļāđ‡āđ€āļĢāļīāđˆāļĄāļ›āļĢāļ°āļāļēāļĻāđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢāđƒāļ™āđ€āļ”āļ·āļ­āļ™ āļāļĢāļāļāļēāļ„āļĄ āļ›āļĩāļ„.āļĻ. 2011 āļ‹āļķāđˆāļ‡ āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āļĒāļąāļšāļ•āļąāļ§āđ€āļĨāļ‚āļˆāļēāļ 2.6 āđ„āļ›āļŠāļđāđˆ 3.0 āļ—āļĩāđˆāļĒāļēāļ§āļ™āļēāļ™āđāļ•āđˆāļāļĨāļąāļšāđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļāđ‰āđ„āļ‚āđƒāļ™āļĢāļ°āļ”āļąāļšāđ‚āļ„āđ‰āļ”āļĄāļēāļāđāļ•āđˆ āļ­āļĒāđˆāļēāļ‡āđƒāļ” āļ‚āļ™āļēāļ”āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.x āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđ‚āļ”āļĒāļĢāļ§āļĄāļ­āļĒāļđāđˆāļ›āļĢāļ°āļĄāļēāļ“ 434 MB āļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āđ„āļŸāļĨāđŒāļ–āļķāļ‡ 39,400 āļāļ§āđˆāļēāđ„āļŸāļĨāđŒ (āļĄāļēāļāļāļ§āđˆāļē 14,800,000 āļšāļĢāļĢāļ—āļąāļ”) āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ—āļģāļāļēāļĢāļšāļĩāļšāļ­āļąāļ”āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ” āļ„āļ§āļĢāļˆāļ°āđ€āļ›āđ‡āļ™āļ™āļēāļĄāļŠāļāļļāļĨ .xz (āļĨāļ”āļĨāļ‡āđ„āļ›āđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“ 85.7%) āļāļĢāļ“āļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ”āļ”āđ‰āļ§āļĒāļ‚āļ™āļēāļ”āđ€āļžāļĩāļĒāļ‡ 1.3 MB āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđāļĨāļ°āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.2 arch/<arch> char mm drivers fs block net include mtd/ide net pci serial usb ... linux asm-<arch> init kernel ipc lib scripts tools crypto rmware security sound ... linux āļĢāļđāļ›āļ—āļĩāđˆ 2.5 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ 70 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 71. āļĢāļđāļ›āļ—āļĩāđˆ 2.6 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļĢāļđāļ›āļ—āļĩāđˆ 2.7 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āļ™āļēāļ”āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 2.2 āļ–āļķāļ‡ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.3 drivers/ 54% arch/ 21% fs/ 7% sound/ 5% net/ 4% include/ 4% firmware/ 1% kernel/ 1% other 3% 71 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 72. āļ•āļēāļĢāļēāļ‡ 2.1 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ Kernel code āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” arch/<architecture> Architecture specic code arch/<architecture>/include/asm Architecture and machine dependent headers arch/<architecture>/mach- <machine> Machine/board specic code block Block layer code COPYING Linux copyright conditions (GNU GPL) CREDITS Linux main contributors crypto/ Cryptographic libraries Documentation/ Kernel Documentation. Don’t miss! drivers/ All device drivers expect sound ones (usb, pci..) fs/ Filesystems (fs/ext3/, etc.) include/ Kernel headers include/linux Linux kernel core headers init/ Linux initialization (including main.c) ipc/ Code used for process communication Kbuild Part of the kernel build system Kernel/ Linux kernel core (very small!) lib/ Misc library routines MAINTAINERS Maintain of each kernel part. Very Useful! Makele Top Linux Makele (Set arch and version) mm/ Memory Management code net/ Network support codes (not drivers) README Overview and Build Instructions REPORTING-BUGS Bug report instruction samples/ Sample codes (markers, kprobes, kobjects) scripts/ Scripts for internal or external uses security/ Security Model Implementation (SELinux...) sound/ Sound support codes and drivers usr/ Code to generate an initramfs cpio archive. 72 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 73. āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Custom Kernel āđƒāļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĢāļ·āļ­āļ­āļąāļžāđ€āļ”āļ—āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļ™āļąāļ āļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāđˆāļ­āļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ uname āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ uname -a Linux EE-Burapha 2.6.32-42-server #96-Ubuntu SMP Wed Aug 15 19:52:20 UTC 2012 x86_64 GNU/Linux āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™: â€ĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ„āļ·āļ­ Linux āđƒāļŠāđ‰ Ubuntu Linux distro â€ĒāļĢāļļāđˆāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ„āļ·āļ­ 2.6.32 â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86_64 (64 āļšāļīāļ•) â€ĒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­ āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāđāļĨāļ°āđ€āļ§āļĨāļēāļ—āļĩāđˆ Kernel āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļēāļĄāļĨāļģāļ”āļąāļš āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĒāļĩāđˆāļŦāđ‰āļ­ Ubuntu, Fedora āļŦāļĢāļ·āļ­ FreeBSD āļœāļđāđ‰āđƒāļŠāđ‰āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ­āļ°āđ„āļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆ āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ—āļŦāļĢāļ·āļ­āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ–āļđāļāđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āļ­āļąāļžāđ€āļāļĢāļ” āļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļĄāļĩ āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 2.8 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Update Manager 73 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 74. āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ‹āļ­āļĢāđŒāļŠāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ€āļžāļ·āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡ āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļ āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļš āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Linux Module āļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡ â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄ device driver āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āļąāļ§āđƒāļŦāļĄāđˆ āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ â€Ē āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļŦāļĢāļ·āļ­ āļ”āļĩāļšāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ­āļĒāđˆāļēāļ‡āļĨāļ°āđ€āļ­āļĩāļĒāļ” 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ LINUX KERNEL āļāđˆāļ­āļ™āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļœāļđāđ‰ āđ€āļ‚āļĩāļĒāļ™āļˆāļ°āļ‚āļ­āļ­āļ˜āļīāļšāļēāļĒ 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļˆāļ° āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡āļšāļ—āļ–āļąāļ”āđ†āđ„āļ›āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļˆāļ°āļ™āļģāđ„āļ›āļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 - āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđ€āļŠāļ–āļĩāļĒāļĢāļ•āļąāļ§āļĨāđˆāļēāļŠāļļāļ” (Latest Stable Linux Kernel) āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāļĄāđˆāđ†āļ—āļĩāđˆāļ–āļđāļāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ–āļđāļāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āļ”āļĩāļ‚āļķāđ‰āļ™ āđ„āļ”āđ‰ āļˆāļēāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļŦāļĨāļąāļ http://www.kernel.org āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo su # cd /usr/src/ # wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.3.tar.xz # tar -xvJf linux-3.9.3.tar.xz āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 - āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Conguration) āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ‰āļĄāļēāļāļāļ§āđˆāļē 3,000 āļĢāļēāļĒāļāļēāļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļĨāļĩāļ™āļļāļāļ‹āđŒ āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļĄāļēāļāļĄāļēāļĒāđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļ”āļąāļšāđƒāļŦāđ‰āđ„āļ”āđ‰āļāļ§āđ‰āļēāļ‡āļ—āļĩāđˆāļŠāļļāļ”āđāļĨāļ°āļĢāļ­āļ‡āļĢāļąāļš āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļąāđ‰āļ‡āđƒāļ™āļ­āļ”āļĩāļ•āđāļĨāļ°āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āđ€āļŠāđˆāļ™āļāļąāļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļ­āļ‡āļāđ‡āļŠāļēāļĄāļēāļĢāļ– āļžāļąāļ’āļ™āļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāđ†āļ‚āļ­āļ‡āļ•āļ™āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ” āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ āđ„āļĨāļšāļĢāļēāļĢāļĩ libncurses āđāļĨāļ° libncurses-devel āļĨāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ•āļ™āđƒāļŠāđ‰āļ­āļĒāļđāđˆāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđ€āļŠāļĩāļĒāļāđˆāļ­āļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ sudo apt-get install libncurses libncurses-devel āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ€āļĄāļ™āļđ āđāļĨāđ‰āļ§āļˆāļķāļ‡āļšāļąāļ™āļ—āļķāļāļ„āđˆāļē congure āļ•āđˆāļēāļ‡āđ†āļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē “.cong” āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āđˆāļ­āđ„āļ› 74 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 75. āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĄāļĩāļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāđāļšāļšāđ€āļŠāđˆāļ™āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make cong, make menucong, make xcong āđāļĨāļ° make oldcong āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ›āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđˆāļ­ āđ„āļ›āļ™āļĩāđ‰ â€Ē make config āļ„āļ·āļ­āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™ āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļĢāļļāđˆāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļĢāļļāđˆāļ™āđāļĢāļāđ† āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāļāļēāļĢ āļ•āļąāđ‰āļ‡āļ„āđˆāļē option āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļ­āļšāļ„āļģāļ–āļēāļĄāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđƒāļ™āļĨāļąāļāļĐāļ“āļ° (y/n) â€Ē make menuconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāđƒāļŦāđ‰āđƒāļŠāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 1.3 āđāļĨāļ°āļĢāļļāđˆāļ™ 2.0 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āļ‹āļķāđˆāļ‡ āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ„āļĨāđ‰āļēāļĒāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āđāļšāļš Text mode āđāļĨāļ°āļĄāļĩ āļāļēāļĢāļˆāļąāļ”āļāļĨāļļāđˆāļĄāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļ­āļāđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ€āļ āļ—āđ† 75 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 76. â€Ē make xconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāđƒāļŦāđ‰āđƒāļŠāđ‰āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 1.3 āđāļĨāļ°āļĢāļļāđˆāļ™ 2.0 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ›āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ„āļģāļŠāļąāđˆāļ‡ make menucong āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ€āļĄāļ™āļđāđƒāļ™āļĢāļđāļ›āđāļšāļš Graphic mode āļšāļ™ x-window āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡ qt āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĢāļ°āļšāļšāđ€āļŠāļĩāļĒāļāđˆāļ­āļ™ â€Ē make oldconfig āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāđ„āļŸāļĨāđŒ .cong āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļŦāļĢāļ·āļ­āļ™āļģāļĄāļēāļˆāļēāļāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļāļēāļĢ āļ•āļąāđ‰āļ‡āļ„āđˆāļē default āļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļĩāđˆāļĄāļĩāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ System-on- Chip (SoC) āļˆāļēāļāļŦāļĨāļēāļĒāđ†āļ„āđˆāļēāļĒāļ—āļĩāđˆāļ–āļđāļāļšāļĢāļĢāļˆāļļāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ <linux>/arch/x86/configs/ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 āļĢāļļāđˆāļ™ i386 āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Intel āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make i386_defconfig āļŠāļēāļĄāļēāļĢāļ–āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ defcong āļ—āļĩāđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .cong āļ•āđ‰āļ™āđāļšāļšāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ° āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ # find ./arch -name "*_defconfig" -type f ./arch/x86/configs/x86_64_defconfig ./arch/x86/configs/i386_defconfig ./arch/x86/configs/goldfish_defconfig ./arch/xtensa/configs/iss_defconfig ./arch/xtensa/configs/s6105_defconfig ./arch/xtensa/configs/common_defconfig ./arch/cris/configs/etrax-100lx_defconfig ... # cd linux-3.9.3 # make menuconfig āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ â€œ.cong” āļ­āļ­āļāļĄāļēāļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ§āđˆāļē āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ”āļšāđ‰āļēāļ‡ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ† 76 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 77.                     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 - āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Linux Kernel āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđāļšāļšāļŦāļĨāļēāļĒāđāļāļ™ āļ—āļĩāđˆāļ™āļīāļĒāļĄ āđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Multi-core CPU āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđāļĨāļ° āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļ•āļēāļĄāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -j āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļˆāļģāļ™āļ§āļ™āđāļāļ™ āļ„āļđāļ“āļŠāļ­āļ‡ (cores x 2) āđ€āļŠāđˆāļ™ make -j8 āđ‚āļ”āļĒāļ—āļĩāđˆāļ•āļąāļ§āđ€āļĨāļ‚ 8 āļŦāļĄāļēāļĒāļ–āļķāļ‡āļˆāļģāļ™āļ§āļ™āđāļāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļąāđ‰āļ™ (4-core) āļ„āļđāļ“āļŠāļ­āļ‡ āļ‹āļķāđˆāļ‡āļĄāļĩ 3 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļĒāđˆāļ­āļĒāļ”āļąāļ‡āļ™āļĩāđ‰ # make -j8 āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Kernel Image āđ€āļ­āļēāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļđāļ•āđ€āļ‚āđ‰āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļĄāļēāđ€āļ›āđ‡āļ™ bzImage (āļŠāļģāļŦāļĢāļąāļš x86) āļŦāļĢāļ·āļ­ zImage (āļŠāļģāļŦāļĢāļąāļš ARM) āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/<āļŠāļ·āđˆāļ­āļŠāļ–āļēāļ›āļąāļ•āļāļĢāļĢāļĄ>/ boot/*Image # make modules 77 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 78. āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Kernel modules āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ‚āļŦāļĨāļ” device drivers āļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āđ‚āļĄāļ”āļđāļĨāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ•āđˆāļēāļ‡āđ† āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ .ko # make modules_install āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Kernel modules āļ—āļĩāđˆāļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ­āļ­āļāļĄāļē (.ko) āđ€āļžāļ·āđˆāļ­āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/3.9.3/ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 - āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļĨāļĩ āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot āļŦāļĨāļąāļ‡āļˆāļēāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ # make install āļĢāļēāļĒāļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰ arch/arm/kernel/head.o arch/arm/kernel/init-atask.o init usr/built-in.o arch/arm/kernel arch/arm/mm arch/arm/common arch/arm/mach-ixp4xx arch/arm/nwfpe kernel mm fs ipc security lib/lib.a arch/arm/lib lib drivers net vmlinux 78 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē â€Ē vmlinuz-3.9.3 (actual kernel) â€Ē System.map-3.9.3 (symbols exported by the kernel) â€Ē initrd.img-3.9.3 (initrd image is temporary RFS used during boot process) â€Ē config-3.9.3 (kernel configuration file) â€Ē vmlinuz-3.9.3 (actual kernel) āļĢāļđāļ›āļ—āļĩāđˆ 2.9 āļĢāļđāļ›āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ vmlinux
  • 79. āļ•āļēāļĢāļēāļ‡ 2.2 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ vmlinux COMPONENT DESCRIPTION arch/arm/kernel/head.o Kernel architecture-specific startup code. init_task.o Initial thread and task structs required by kernel. init/built-in.o Main kernel-initialization code. usr/built-in.o Built-in initramfs image. arch/arm/kernel/built-in.o Architecture-specific kernel code. arch/arm/mm/built-in.o Architecture-specific memory-management code. arch/arm/common/built-in.o Architecture-specific generic code. Varies by architecture. arch/arm/mach-ixp4xx/built- in.o Machine-specific code, usually initialization. arch/arm/nwfpe/built-in.o Architecture-specific floating point- emulation code. kernel/built-in.o Common components of the kernel itself. mm/built-in.o Common components of memory- management code. ipc/built-in.o Interprocess communications, such as SysV IPC. security/built-in.o Linux security components. lib/lib.a Archive of miscellaneous helper functions. arch/arm/lib/lib.a Architecture-specific common facilities. Var- ies by architecture. lib/built-in.o Common kernel helper functions. drivers/built-in.o All the built-in drivers not loadable modules. sound/built-in.o Sound drivers. net/built-in.o Linux networking. .tmp_kallsyms2.o Symbol table. 79 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 80. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5 - āļāļēāļĢāļšāļđāļ—āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļđāđˆāļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāļĨāļ‡āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļĄāļ™āļđāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ grub.cfg āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļšāđāļĨāđ‰āļ§ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļāđ‡āđ€āļžāļĩāļĒāļ‡āļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĩāļ āļ„āļĢāļąāđ‰āļ‡āđ‚āļ”āļĒāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ # reboot āļŦāļĢāļ·āļ­ shutdown -r now āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āļ•āļąāļ§āđƒāļŦāļĄāđˆāđ„āļ”āđ‰āđ‚āļ”āļĒāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ $ uname -r 3.9.3 āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ: āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļžāļ·āđˆāļ­āļĨāļšāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļ­āļ â€Ē make clean āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē (./congure) āđāļĨāļ°āļ–āļđāļ āļ„āļ­āļĄāđ„āļžāļĨāđŒ (make) āđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāđ€āļāļ·āļ­āļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ” â€Ē make mrproper āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļĢāļ§āļĄ āļ—āļąāđ‰āļ‡āļĨāļšāđ„āļŸāļĨāđŒ .cong â€Ē make distclean āļ„āļ·āļ­āļāļēāļĢāļĨāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē (./congure) āđāļĨāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒ (make) āđ€āļ›āđ‡āļ™āđ„āļšāļ™āļēāļĢāļĩāļ—āļąāđ‰āļ‡āļŦāļĄāļ” 80 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 81. āļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ 3.X āļŠāļģāļŦāļĢāļąāļš UBUNTU āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāļđāđˆ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Linux distro āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ubuntu āđ‚āļ”āļĒāļ›āļāļ•āļīāđāļĨāđ‰āļ§āļ•āļąāļ§ Ubuntu āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļļāđˆāļ™ 10.x āļ‚āļķāđ‰āļ™āđ„āļ›āļˆāļ°āđƒāļŠāđ‰āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 2.6.32 āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™ 3.9.3, 3.8, 3.7, 3.4.6, 3.3, 3.2, 3.1 āļŦāļĢāļ·āļ­ 3.0.x āđāļ™āļ°āļ™āļģāđƒāļŦāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļĢāļļāđˆāļ™ 3.0 āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Kernel āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļ—āļĩāđˆāļ”āļĩāļžāļ­āđ€āļžāļĢāļēāļ°āļ–āđ‰āļēāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļēāļˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰ āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļ­āļĩāļ āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļĢāļīāđˆāļĄāļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļĄāļēāļāļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļ™āļķāļ‡āđāļĨāđ‰āļ§āļāđ‡āļ„āđˆāļ­āļĒ āļ—āļģāļāļēāļĢ patch āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™āļŠāļđāļ‡āļ‚āļķāđ‰āļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļĢāļļāđˆāļ™ 3.0.0 āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ āđāļĨāļ° āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ (āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ ubuntu 12.04) $ sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev linux-source qt3-dev-tools libqt3-mt-dev libncurses5 libncurses5-dev fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge kernel-package āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļēāļ kernel.org āđāļĨāđ‰āļ§āđāļ•āļāđ„āļŸāļĨāđŒāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /usr/src/ $ sudo su # cd /usr/src/ # wget https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.tar.xz # tar -xvJf linux-3.0.0.tar.xz āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļĄāļĩāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļĒāļđāđˆ āļžāļ­āļŠāļĄāļ„āļ§āļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ™āļąāļ āļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļŸāļĨāđŒ .cong āđ€āļ”āļīāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļēāđƒāļŠāđ‰āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ # cp -vi /boot/config-`uname -r` .config āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāđ„āļŸāļĨāđŒ .cong āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļīāļĄ āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Linux Kernel Modules āđ€āļ”āļīāļĄāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļļāđˆāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ”āđ‰āļ§āļĒ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ # make oldconfig āđƒāļŦāđ‰āļāļ” Enter āđ„āļ›āđ€āļĢāļ·āđˆāļ­āļĒāđ†āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āđˆāļē defaults āļ‚āļ­āļ‡ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ # make localmodconfig āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ‚āļ­āļ‡ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ (3.0.0) āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ 81 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 82. # make menuconfig āļŦāļĢāļ·āļ­ make xconfig āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ•āļąāļ§āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđāļĒāļāđāļĒāļ°āļ­āļ­āļāđ„āļ”āđ‰āļˆāļēāļāļ•āļąāļ§āļŦāļĨāļąāļāļ—āļĩāđˆāļĄāļĩāđƒāļ™āļĢāļ°āļšāļšāđ€āļ”āļīāļĄ āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļ local version āļ•āđˆāļ­āļ—āđ‰āļēāļĒāļˆāļēāļāđ€āļĨāļ‚āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđ€āļŠāđˆāļ™ āļ„āļģāļ§āđˆāļē “-burapha” āđ‚āļ”āļĒāļāļģāļŦāļ™āļ”āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ€āļĄāļ™āļđ General Setup āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ â€œLocal version” āđ€āļžāļ·āđˆāļ­āđƒāļŠāđˆāļŠāļ·āđˆāļ­āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļ â€œAutomatically append version info” āđāļĨāļ°āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ le system āđ€āļ›āđ‡āļ™ ext4 āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ “File systems” āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļ§āļĄāļ–āļķāļ‡ Kernel Modules āļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļĨāļ·āļ­āļāđ„āļ§āđ‰āļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ # make -j4 82 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 83. # make modules_install <----- āļ•āļīāļ”āļ•āļąāđ‰āļ‡ modules āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/ # update-initramfs -u -k 3.0.0-burapha # make install <----- āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļŸāļĨāđŒāļŦāļĨāļąāļāļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot/ āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļĩāđ‰ â€Ēvmlinuz-3.0.0-burapha â€ĒSystem.map-3.0.0-burapha â€Ēinitrd.img-3.0.0-burapha â€Ēconfig-3.0.0-burapha āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļĢāļĩāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āļąāļžāđ€āļ”āļ—āđ„āļŸāļĨāđŒ grub.cfg āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /boot/grub/ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ # update-grub Generating grub.cfg ... Found linux image: /boot/vmlinuz-3.0.0-burapha Found initrd image: /boot/initrd.img-3.0.0-burapha Found linux image: /boot/vmlinuz-3.0.0-burapha.old Found initrd image: /boot/initrd.img-3.0.0-burapha Found linux image: /boot/vmlinuz-2.6.32-42-server Found initrd image: /boot/initrd.img-2.6.32-42-server Found memtest86+ image: /boot/memtest86+.bin done āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļąāļ§āđƒāļŦāļĄāđˆāđāļĨāđ‰āļ§ āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļąāļžāđ€āļāļĢāļ”āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ uname -r 3.0.0-burapha $ uname -a Linux EE-Burapha 3.0.0-burapha #2 SMP Sun Aug 4 03:32:15 PDT 2013 x86_64 GNU/ Linux 83 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 84. āļāļēāļĢāļžāļąāļ’āļ™āļē Linux Kernel Module āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” monolithic kernel āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ āļēāļĒāđƒāļ™ Kernel āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Linux kernel modules (LKMs) āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ™āļģāđ€āļ‚āđ‰āļē-āļ­āļ­āļāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ‚āļ”āļĒāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ āđ„āļŸāļĨāđŒ LKM (āļŠāļģāļŦāļĢāļąāļš kernel 2.6) āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("EE - Burapha University"); MODULE_DESCRIPTION("hello world test driver"); static int __init module_start(void) { printk(KERN_INFO "Hello world ! module is loadedn"); return 0; } static void __exit module_unload(void) { printk(KERN_INFO "Goodbye world ! module is removedn"); } module_init(module_start); module_exit(module_unload); Module macros Module Constructor/ Destructor Exit macros āļĢāļđāļ›āļ—āļĩāđˆ 2.10 āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ Linux Kernel Module LKM āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāļ”āļđāđāļĨāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļ āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ›āļšāļĢāļīāļŦāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļš āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ āļ”āđ‰āļēāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory Management) āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Inter- processing Communication - IPC) āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļĨāļģāļ”āļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠ (Scheduling) āđ‚āļ”āļĒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ° āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ LKM āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āļŦāļĢāļ·āļ­ mod- probe 84 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 85. Linux KernelModule register_capability()module_init() Kernel functions module_exit() unregister_capability() capabilities[] Module functions Function call Function pointer Data pointer insmod rmmod āļĢāļđāļ›āļ—āļĩāđˆ 2.11 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ Kernel āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļ‚āļšāļ§āļ™āļāļēāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ LKM āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 2.6.x āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™ āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ‚āļŦāļĨāļ” LKM āļˆāļēāļāļĢāļ°āļ”āļąāļšāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod (insert module) āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ module_init() āļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ (register) āļāļąāļšāļ•āļąāļ§āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāđˆāļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™ āļŠāļ·āđˆāļ­āļ§āđˆāļē register_capability() āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļ•āļąāļ§āļŠāļĩāđ‰ (pointer) āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āļ•āļąāļ§āđāļ›āļĢāļ­āļēāđ€āļĢāļĒāđŒāļŠāļ·āđˆāļ­ â€œcapabili- ties” āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļāļģāļŦāļ™āļ”āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļē āļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ capabilities āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™ Kernel āļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļ—āļēāļ‡ system calls āđ„āļ”āđ‰āļ•āđˆāļ­āđ„āļ›āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ rmmod (remove module) āļˆāļēāļāļĢāļ°āļ”āļąāļšāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ module_exit() āļāđ‡āļˆāļ°āļŠāļąāđˆāļ‡āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāđ‰āļ§āļ–āļ­āļ™āļ•āļąāļ§ LKM āļ™āļąāđ‰āļ™āļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļāļēāļĢāļ§āļēāļ‡āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user- space) āđāļĨāļ°āļ āļēāļĒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (kernel-space) User-spaceKernel-space rmmodinsmod init_module delete_module sys_init_module sys_delete_module . . . . . . Utilities System Calls Kernel Functions āļĢāļđāļ›āļ—āļĩāđˆ 2.12 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļš Linux Kernel Module 85 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 86. āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ (driver) āļ­āļēāļˆāļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĢāļ§āļĄāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ§āļāļĄāļąāļ™āļāđ‡āļˆāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāļšāļđāļ—āļ—āļąāļ™āļ—āļĩ (Boot Processes) āđ€āļĢāļēāļˆāļ°āđ€āļĢāļĩāļĒāļāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ§āđˆāļē Static Module āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļšāļēāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđāļšāļš LKM āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ–āļđāļāļ™āļģāļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļĄāļ·āđˆāļ­āđƒāļ”āļāđ‡āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ§āđˆāļē Dy- namic Module Application le_open = write("/dev/foo", buffer, count); data buffer Character device driver dev_write { copy_data_buffer_from_app(); } fops chrdevs File descriptor syscall Table major:251 minor:5 major:251 minor:5 User-space Kernel-space āļĢāļđāļ›āļ—āļĩāđˆ 2.13 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (write op- eration) āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ write() āļāđ‡āļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ (INT instruction) āļ—āļĩāđˆ āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (write operation) āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ•āļēāļĢāļēāļ‡ system call (syscall[ ] table) āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ ïŽeldes āļˆāļ°āļšāļĢāļĢāļˆāļļāļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļļāļ›āļāļĢāļ“āđŒāļŦāļĨāļąāļ (major device number) āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ write āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļĨāļĩ āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āļˆāļ°āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ buffer āļˆāļēāļāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļĢāļ°āļ”āļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āļĄāļēāļĒāļąāļ‡āļŠāđˆāļ§āļ™ āļ‚āļ­āļ‡āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (kernel-space) āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļšāļąāļ™āļ—āļķāļāļĨāļ‡āđƒāļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļ­āđ„āļ› āđƒāļ™āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļˆāļ°āđ€āļ›āđ‡āļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Dynamic Kernel module āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļŠāļđāļ‡āđāļĨāļ°āļˆāļ°āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒ LKM āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļ āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/$(uname -r) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™ āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™ āļĨāđˆāļēāļ‡ $ ls /lib/modules/$(uname -r) build modules.dep modules.pcimap kernel modules.dep.bin modules.seriomap modules.alias modules.ieee1394map modules.symbols modules.alias.bin modules.inputmap modules.symbols.bin 86 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 87. modules.builtin modules.isapnpmap modules.usbmap modules.builtin.bin modules.ofmap source modules.ccwmap modules.order āļŠāđˆāļ§āļ™āđ„āļŸāļĨāđŒāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib/modules/$(uname -r)/ kernel/drivers/ āļĨāļ‡āđ„āļ›āļ­āļĩāļāļŠāļąāđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™ āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ $ ls /lib/modules/$(uname -r)/kernel/drivers/ acpi edac infiniband mmc rtc video ata firewire input mtd scsi virtio atm firmware isdn net serial w1 auxdisplay gpio leds parport spi watchdog block gpu md pci ssb xen bluetooth hid media pcmcia staging char hwmon memstick platform telephony crypto i2c message power uio dca idle mfd pps usb dma ieee1394 misc regulator uwb āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ modprobe āđāļĨāļ° modinfo āđƒāļ™āļāļēāļĢāļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļāļąāļš kernel module $ sudo su # modinfo lp.ko filename: lp.ko license: GPL alias: char-major-6-* srcversion: 84EA21D13BD2C67171AC994 depends: parport vermagic: 3.0.0-burapha SMP mod_unload modversions parm: parport:array of charp parm: reset:bool āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ„āļģāļŠāļąāđˆāļ‡ lsmod āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ LKM āļ—āļĩāđˆ āļāļģāļĨāļąāļ‡āļ–āļđāļāđ‚āļŦāļĨāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ“ āļ‚āļ“āļ°āļ™āļĩāđ‰ $ lsmod Module Size Used by binfmt_misc 7568 1 acpiphp 17958 0 snd_ens1371 22663 2 gameport 9869 1 snd_ens1371 snd_ac97_codec 125146 1 snd_ens1371 btusb 13027 0 ac97_bus 1450 1 snd_ac97_codec snd_pcm_oss 39673 0 snd_mixer_oss 15604 1 snd_pcm_oss snd_pcm 87151 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss snd_seq_dummy 1750 0 snd_seq_device 6594 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq 87 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 88. bluetooth 94536 1 btusb snd 70476 14 snd_ens1371,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_seq_oss,snd_ rawmidi,snd_seq,snd_timer,snd_seq_device intel_agp 11978 1 ppdev 6504 0 lp 9893 0 parport_pc 29880 1 serio_raw 4720 0 intel_gtt 16812 1 intel_agp i2c_piix4 8879 0 soundcore 7860 1 snd snd_page_alloc 8500 1 snd_pcm joydev 10705 0 shpchp 28186 0 parport 37333 3 ppdev,lp,parport_pc usbhid 39022 0 hid 87524 1 usbhid floppy 63772 0 e1000 103861 0 vmw_pvscsi 15397 0 mptspi 16441 2 mptscsih 34985 1 mptspi mptbase 93915 2 mptspi,mptscsih vmxnet3 39295 0 āļ„āļģāļŠāļąāđˆāļ‡ modprobe (āļŦāļĢāļ·āļ­ insmod) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļŦāļĨāļ” LKM āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļĨāļ° modprobe -r (āļŦāļĢāļ·āļ­ rmmod) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ–āļ­āļ™ LKM āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ•āļēāļĄāļĨāļģāļ”āļąāļš $ modprobe ppdev āļŦāļĢāļ·āļ­ insmod ppdev.ko $ modprobe -r ppdev āļŦāļĢāļ·āļ­ rmmod ppdev.ko āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ LINUX MODULE āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Linux Module āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄ āļĢāļ°āļšāļšāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ™āļ­āļāđ€āļŦāļ™āļ·āļ­āļˆāļēāļāļ•āļąāļ§āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āļīāļ”āļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļ•āļąāļ§ Ubuntu āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ‚āļ›āļĢāđāļāļĢāļĄ āļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļĨāļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļąāļ” āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĨāļĩ āļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āđˆāļ‡āđ„āļŸāļĨāđŒāđ€āļŪāļ”āđ€āļ”āļ­āļĢāđŒ (linux header) āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļāđˆāļ­āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ API (Application Programming Interface) āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ—āļģāļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ„āđ‰āļ™āļŦāļēāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ•āļĢāļ‡āļāļąāļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Ubuntu āļ—āļĩāđˆāđƒāļŠāđ‰ $ apt-cache search linux-source* linux-source - Linux kernel source with Ubuntu patches linux-source-2.6.32 - Linux kernel source for version 2.6.32 with Ubuntu patches $ apt-cache search linux-headers-$(uname -r) 88 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 89. linux-headers-2.6.32-42-server - Linux kernel headers for version 2.6.32 on x86_64 āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install linux-headers-$(uname -r) linux-source-2.6.37 $ cd /usr/src/ $ ls linux-headers-2.6.32-42-server.tar.bz2 linux-source-2.6.32.tar.bz2 $ tar -xjvf linux-headers-2.6.32-42-server.tar.bz2 linux- source-2.6.32.tar.bz2 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Kernel Module “Hello world” āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ kernel module āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ hello-driver.c āđāļĨāđ‰āļ§ āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/kernel_module/ $ mkdir ~/kernel_module $ vim hello-driver.c /* * hello-driver.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ static int __init module_start(void) { printk(KERN_INFO "Hello world ! module is loadedn"); /* * A non 0 return means init_module failed; module can't be loaded. */ return 0; } static void __exit module_unload(void) { printk(KERN_INFO "Goodbye world ! module is removedn"); } module_init(module_start); module_exit(module_unload); MODULE_LICENSE("GPL"); MODULE_AUTHOR("EE - Burapha University"); /* Who wrote this module? */ MODULE_DESCRIPTION("hello world test driver"); /* What does this module do */ 89 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 90. āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ hello-driver.c $ vim Makefile obj-­‐m    =  hello-­‐driver.o all:     make  -­‐C  /lib/modules/$(shell  uname  -­‐r)/build  M=$(PWD)  modules   clean:     make  -­‐C  /lib/modules/$(shell  uname  -­‐r)/build  M=$(PWD)  clean āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make āđƒāļ™āļāļēāļ™āļ°āļŠāļīāļ—āļ˜āļīāđŒ root āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨ $sudo su # make make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server' CC [M] /home/student/kernel_module/hello-driver.o Building modules, stage 2. MODPOST 1 modules CC /home/student/kernel_module/hello-driver.mod.o LD [M] /home/student/kernel_module/hello-driver.ko make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server' # ls hello-driver.c hello-driver.mod.c hello-driver.o modules.order hello-driver.ko hello-driver.mod.o Makefile Module.symvers āļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āļ•āļąāļ§āđ‚āļĄāļ”āļđāļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ dmesg (debug kernel message) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ # insmod hello-driver.ko # dmesg | tail -n1 [68587.257467] Hello world ! module is loaded āļ–āļ­āļ™āđ‚āļĄāļ”āļđāļĨāļ­āļ­āļāļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ rrmod # rmmod hello-driver.ko # dmesg | tail -n1 [68621.602044] Goodbye world ! module is removed 90 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 91. āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡ Linux kernel module āļˆāļēāļāļĢāļđāļ›āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļšāđˆāļ‡āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 5 āļŠāđˆāļ§āļ™ āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļāļˆāļ°āļ­āļĒāļđāđˆāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāđˆāļ™ init āđāļĨāļ° exit āđāļĨāļ°āļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđ‡āļ•āđˆāļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ‚āļŦāļĨāļ”āļŦāļĢāļ·āļ­āļ–āļ­āļ™ LKM āļ āļēāļĒāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("EE - Burapha University"); MODULE_DESCRIPTION("hello world test driver"); void my_procedure(void) { printk(KERN_INFO "Here is procedure...n"); } static int __init module_start(void) { printk(KERN_INFO "Hello world ! module is loadedn"); my_procedure(); return 0; } static void __exit module_unload(void) { printk(KERN_INFO "Goodbye world ! module is removedn"); } module_init(module_start); module_exit(module_unload); Module macros Module Constructor/ Destructor Exit macros C Headers Procedure module āļĢāļđāļ›āļ—āļĩāđˆ 2.14 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļšāļšāđ€āļ•āđ‡āļĄāļ‚āļ­āļ‡ Linux Kernel Module āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļŠāđˆāļ§āļ™āļšāļ™āļŠāļļāļ”āļ„āļ·āļ­āļŠāđˆāļ§āļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ (C Headers) āđ‚āļ”āļĒāļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĨāļąāļāđ†āļ­āļĒāđˆāļēāļ‡ āļ™āđ‰āļ­āļĒāļŠāļ­āļ‡āļ•āļąāļ§āļ„āļ·āļ­ linux/module.h   āđāļĨāļ° linux/kernel.h   āļŠāđˆāļ§āļ™āļ–āļąāļ”āļĄāļēāļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļĒāđˆāļ­āļĒ (Procedure Program) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļĒāđˆāļ­āļĒāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļ āđāļĨāļ°āļŠāđˆāļ§āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ„āļ·āļ­āļŠāđˆāļ§āļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨ (modules description) āļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļ˜āļīāļšāļēāļĒāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļ āđāļŠāļ”āļ‡āļ­āļ­āļāļĄāļēāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ modinfo āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ MODULE_LICENSE("GPL"); MODULE_AUTHOR("EE  -­‐  Burapha  University");      /*  Who  wrote  this  module?  */ MODULE_DESCRIPTION("hello  world  test  driver");  /*  What  does  this  module  do  */ $ modinfo hello-driver.ko filename: hello-driver.ko description: hello world test driver author: EE - Burapha University license: GPL srcversion: E36F5E4D3F232F0A1C18AEF depends: vermagic: 2.6.32-42-server SMP mod_unload modversions 91 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 92. āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļš CHARACTER DEVICE āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļˆāļ°āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļēāļĄāļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ° āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāđˆāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒ (device) āļ­āļ­āļ āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ— āđ„āļ”āđ‰āđāļāđˆ 1. Character device āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āđ‰āļ­āļĄāļļāļđāļĨāđāļšāļšāļŠāļ•āļĢāļĩāļĄ (stream) āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ—āļĩāļĨāļ°āđ€āļžāļĩāļĒāļ‡ 1 āđ‚āļ›āļĢ āđ€āļ‹āļŠāđ€āļŠāļĄāļ·āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļ›āļāļ•āļīāļ—āļąāđˆāļ§āđ„āļ› 2. Block device āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āđāļšāļšāļāļąāļ­āļ™ (block) āđƒāļŠāđ‰āļāļĢāļ“āļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļĒāđ‰āļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĢāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļŠāđˆāļ™ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ Application Virtual Filesystem Hardware Device Driver User-space Kernel-space /dev/ttyUSB0 Device le major:116 minor:7 major:116 minor:7 ... ... Read/Write āļĢāļđāļ›āļ—āļĩāđˆ 2.15 āđāļŠāļ”āļ‡āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ„āđˆāļē major āđāļĨāļ° minor āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒ /dev/ttyUSB0 āļ—āļĩāđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆ āļāļąāļšāļžāļ­āļĢāđŒāļ• USB āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ­āļ™āļļāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ āļŦāļĄāļēāļĒāđ€āļĨāļ‚ (major āđāļĨāļ° minor) āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļ›āļĢāļ°āđ€āļ āļ—āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŦāļĨāļąāļāđāļĨāļ°āļ•āļąāļ§āļĒāđˆāļ­āļĒāļĨāļ‡āđ„āļ›āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ° āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ chardev.c āļˆāļ°āđāļŠāļ”āļ‡āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđ„āļŸāļĨāđŒ device āļŠāļ·āđˆāļ­ /dev/ chardev āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē /* * chardev.c: Creates a read-only char device that says how many times * you've read from the dev file */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <asm/uaccess.h> /* for put_user */ 92 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 93. /* * Prototypes - this would normally go in a .h file */ int init_module(void); void cleanup_module(void); static int device_open(struct inode *, struct file *); static int device_release(struct inode *, struct file *); static ssize_t device_read(struct file *, char *, size_t, loff_t *); static ssize_t device_write(struct file *, const char *, size_t, loff_t *); #define SUCCESS 0 #define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */ #define BUF_LEN 80 /* Max length of the message from the device */ /* * Global variables are declared as static, so are global within the file. */ static int Major; /* Major number assigned to our device driver */ static int Device_Open = 0; /* Is device open? * Used to prevent multiple access to device */ static char msg[BUF_LEN]; /* The msg the device will give when asked */ static char *msg_Ptr; static char msg_data[BUF_LEN] ="NONE n" ; /*initial msg for write mode */ static struct file_operations fops = { .read = device_read, .write = device_write, .open = device_open, .release = device_release }; /* * This function is called when the module is loaded */ int init_module(void) { Major = register_chrdev(0, DEVICE_NAME, &fops); if (Major < 0) { printk(KERN_ALERT "Registering char device failed with %dn", Major); return Major; } printk(KERN_INFO "I was assigned major number %d. To talk ton", Major); printk(KERN_INFO "the driver, create a dev file withn"); printk(KERN_INFO "'mknod /dev/%s c %d 0'.n", DEVICE_NAME, Major); printk(KERN_INFO "Try various minor numbers. Try to cat and echo ton"); printk(KERN_INFO "the device file.n"); printk(KERN_INFO "Remove the device file and module when done.n"); return SUCCESS; 93 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 94. } /* * This function is called when the module is unloaded */ void cleanup_module(void) { /* * Unregister the device */ unregister_chrdev(Major, DEVICE_NAME); printk(KERN_ALERT "Error in unregister_chrdev:n"); } /* * Methods */ /* * Called when a process tries to open the device file, like * "cat /dev/mycharfile" */ static int device_open(struct inode *inode, struct file *file) { static int counter = 0; if (Device_Open) return -EBUSY; Device_Open++; sprintf(msg, "I already told you %d times . Data in device is %s n", coun- ter++,msg_data); msg_Ptr = msg; try_module_get(THIS_MODULE); return SUCCESS; } /* * Called when a process closes the device file. */ static int device_release(struct inode *inode, struct file *file) { Device_Open--; /* We're now ready for our next caller */ /* * Decrement the usage count, or else once you opened the file, you'll * never get get rid of the module. */ module_put(THIS_MODULE); return 0; } 94 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 95. /* * Called when a process, which already opened the dev file, attempts to * read from it. */ static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */ char *buffer, /* buffer to fill with data */ size_t length, /* length of the buffer */ loff_t * offset) { /* * Number of bytes actually written to the buffer */ int bytes_read = 0; /* * If we're at the end of the message, * return 0 signifying end of file */ if (*msg_Ptr == 0) return 0; /* * Actually put the data into the buffer */ while (length && *msg_Ptr) { /* * The buffer is in the user data segment, not the kernel * segment so "*" assignment won't work. We have to use * put_user which copies data from the kernel data segment to * the user data segment. */ put_user(*(msg_Ptr++), buffer++); length--; bytes_read++; } /* * Most read functions return the number of bytes put into the buffer */ return bytes_read; } /* * Called when a process writes to dev file: echo "hi" > /dev/hello */ static ssize_t device_write(struct file *filp, const char *buff, size_t length, loff_t * off){ int bytes_write ; for (bytes_write = 0; bytes_write < length && bytes_write < BUF_LEN; bytes_write++){ get_user(msg_data[bytes_write], buff + bytes_write); } 95 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 96. return bytes_write ; } āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ chardev.c # cat Makefile obj-m = chardev.o all: ! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: ! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ„āļ”āđ‰āđ„āļŸāļĨāđŒ chardev.ko āļ­āļ­āļāļĄāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ # make make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server' CC [M] /home/student/kernel_module/chardev.o Building modules, stage 2. MODPOST 1 modules CC /home/student/kernel_module/chardev.mod.o LD [M] /home/student/kernel_module/chardev.ko make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server' # ls chardev.c chardev.mod.o hello-driver.ko hello-driver.o modules.order chardev.ko chardev.o hello-driver.mod.c Makefile Module.symvers chardev.mod.c hello-driver.c hello-driver.mod.o Makefile_hello āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ insmod āđāļĨāļ°āļ„āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ dmesg āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ # insmod chardev.ko # dmesg| tail -n6 [70707.121856] I was assigned major number 250. To talk to [70707.121858] the driver, create a dev file with [70707.121860] 'mknod /dev/chardev c 250 0'. [70707.121861] Try various minor numbers. Try to cat and echo to [70707.121862] the device file. [70707.121863] Remove the device file and module when done. 96 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 97. āļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ•āļīāļ”āļ•āđˆāļ­āđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāļ•āļąāļ§āļ™āļĩāđ‰āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđāļ—āļ™āđ„āļŸāļĨāđŒāđ€āļ”āļīāļĄ (/dev/chardev) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒ chardev.ko āđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļĨāļšāļ­āļ­āļāđ„āļ›āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ”āđ‰āļ§āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ­āļļāļ›āļāļĢāļ“āđŒ āļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ /dev/my_chardev āđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđƒāļŦāđ‰āđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚ major āđāļĨāļ° minor āđ€āļ”āļīāļĄ (major:250 āđāļĨāļ° minor:0) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ # mknod /dev/my_chardev c 250 0 # ls -al /dev/my_chardev crw-r--r-- 1 root root 250, 0 2013-09-23 22:22 /dev/my_chardev āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ cat āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļ /dev/my_chardev # cat /dev/my_chardev I already told you 0 times . Data in device is NONE āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāļđāđˆāđƒāļ™ device āđ€āļĨāļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļĨāļ­āļ‡āļ—āļ”āļŠāļ­āļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒ / dev/my_chardev āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ echo āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ # echo "Hi...My device" > /dev/my_chardev # cat /dev/my_chardev I already told you 2 times . Data in device is Hi...My device āļāļēāļĢāđ€āļžāļīāđˆāļĄ LINUX MODULE āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡ LINUX SOURCE TREE āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļŦāļĢāļ·āļ­ LKM āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ§āļĄāđ‚āļ„āđ‰āļ” āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļ•āļ™āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŦāļĨāļąāļāđ€āļ”āļĩāļĒāļ§āļāļąāļšāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āļ­āļ·āđˆāļ™āđ† āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ make menucong āđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰āļŠāļ°āļ”āļ§āļ āļ‚āļķāđ‰āļ™ āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāđ‚āļ›āļĢāđāļāļĢāļĄ LKM āļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāļ™āļĩāđ‰āđ„āļ›āđ€āļāđ‡āļšāđ„āļ§āđ‰āļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ drivers/misc āļ‚āļ­āļ‡ āļ‹āļ­āļĢāđŒāļŠāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ‚āļ­āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ hello-driver.c $ cp ~/kernel_module/hello-driver.c /usr/src/linux-source-$(uname -r) āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ› āđƒāļŦāđ‰āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ drivers/misc/Kcong āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāđ€āļĄāļ™āļđāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ™āļĩāđ‰ config HELLO_WORLD_MODULE     tristate "hello world module"     depends on X86 <----- āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđ‚āļĄāļ”āļđāļĨāļ•āļąāļ§āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļžāļīāđˆāļĄ āđ€āļŠāđˆāļ™ ARM     default m if X86 <----- āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ m āļŦāļĢāļ·āļ­ y āđ„āļ”āđ‰ āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰     help 97 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 98.       hello world module. āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ drivers/misc/Makele āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ LKM āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ obj-­‐$(CONFIG_HELLO_WORLD_MODULE)+=  hello-­‐driver.o āđāļĨāļ°āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ€āļĄāļ™āļđāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ make menucong āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ€āļĄāļ™āļđ Device Drivers āđ€āļĨāļ·āļ­āļāđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ 98 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 99. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļĄāļ”āļđāļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļĄāļ”āļđāļĨāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ root le system āļ•āļąāļ§āđƒāļŦāļĄāđˆ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ make modules $ make modules_install INSTALL_MOD_PATH=$ROOTFS 99 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 100. āļšāļ—āļ—āļĩāđˆ 3 EMBEDDED LINUX DEVELOPMENT āļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļĄāļēāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĒāļļāļ„āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1930 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ—āļĩāļĨāļ°āļ‡āļēāļ™ (single task) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āđ€āļ§āļĨāļēāļœāđˆāļēāļ™āđ„āļ›āļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāļ°āļ§āļīāļ§āļąāļ’āļ™āļēāļāļēāļĢāļ‚āļ­āļ‡ āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āļŠāļīāļŸāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāļ āļēāļĒāđƒāļ™āđ€āļĨāđ‡āļāļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1940 āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļĄāļĩāļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļēāļ„āļ§āļšāļ„āļļāļĄāļ‚āļĩāļ›āļ™āļēāļ§āļļāļ˜āļ™āļģāļ§āļīāļ–āļĩ (Missile) āļŠāļģāļŦāļĢāļąāļšāļāļ­āļ‡āļ—āļąāļžāļ—āļŦāļēāļĢ āļ‹āļķāđˆāļ‡ āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļąāļ™āļŠāļĄāļąāļĒāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļĒāļļāļ„āļ™āļąāđ‰āļ™āļāđ‡āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ "Apollo Guidance Computer" āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡ āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Charles Stark Draper āļ“ āđāļĨāđ‡āļ› MIT Instrumentation āđāļ•āđˆāđ‚āļ›āļĢāđ€āļˆāļ„āļ•āļąāļ§āļ™āļĩāđ‰āļĒāļąāļ‡āļ–āļđāļāļĄāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļ„āļ§āļēāļĄ āđ€āļŠāļĩāđˆāļĒāļ‡āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ•āđ‰āļ­āļ‡āļ™āļģāļ§āļ‡āļˆāļĢāļ—āļĩāđˆāđ€āļ„āļĒāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĄāļēāļāļĄāļēāļĒāđˆāļ­āđƒāļŦāđ‰āđ€āļĨāđ‡āļāļĨāļ‡āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ™āđ‰āļģāļŦāļ™āļąāļāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļšāļēāļĨāļ‡ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āļāļąāļ‡āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰ āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļœāļĨāļ‡āļēāļ™āļŠāļīāđ‰āļ™āđāļĢāļāļˆāļēāļāđāļĨāđŠāļ› MIT āļāđ‡āļ–āļđāļ āļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļˆāļ™āļŠāļģāđ€āļĢāđ‡āļˆāđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē Autonetics D-17 guidance computer āđāļĨāļ°āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ› āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ—āļŦāļēāļĢāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­ Minute missile āļ•āļąāđ‰āļ‡āđāļ•āđˆāļŠāđˆāļ§āļ‡āļ›āļĩ āļ„.āļĻ. 1961 āļˆāļ™āļ–āļķāļ‡āļ›āļĩ āļ„.āļĻ. 1966 āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļ‚āļ­āļ‡āļ§āļ‡āļˆāļĢāļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļąāļ§ āļ—āļĢāļēāļ™āļ‹āļīāļŠāđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāđāļĨāļ°āđƒāļŠāđ‰āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ āļēāļĒāļ™āļ­āļāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļĄāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāļ™āļģāļŠāļīāļŸāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāđƒāļŦāļĄāđˆ āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ—āļ™āļ—āļĩāđˆāļ•āļąāļ§āļ—āļĢāļēāļ™āļ‹āļīāļŠāđ€āļ•āļ­āļĢāđŒāđ€āļ”āļīāļĄāļˆāļ™āļ—āļģāđƒāļŦāđ‰āđ„āļ”āđ‰āļ§āļ‡āļˆāļĢāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļĨāļ‡āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļˆāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē Minuteman II āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđāļĨāļ°āļĢāļēāļ„āļēāļ—āļĩāđˆāļĨāļ”āļĨāļ‡āđāļ•āđˆāļĒāļąāļ‡ āļ„āļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļ‚āļķāđ‰āļ™ āļĄāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1971 āļāđ‡āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĒāļļāļ„āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāļĒāļļāļ„āđāļĢāļāļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄ āļ•āļąāļ§āļ”āđ‰āļ§āļĒāļāļēāļĢāđ€āļ›āļīāļ”āļ•āļąāļ§āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Intel 4004 āļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļ‚āļķāđ‰āļ™āļĄāļēāļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļĨāļēāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļīāļ”āđ€āļĨāļ‚ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ„āļ‡āđƒāļŠāđ‰āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ āļēāļĒāļ™āļ­āļāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ•āđˆāļēāļ‡āļ­āļĒāļđāđˆ āļˆāļ™āļĄāļēāļ–āļķāļ‡āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1980 āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļœāļ™āļ§āļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļąāļšāļ•āļąāļ§āļŠāļīāļ›āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆāļ‹āļķāđˆāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆ āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļ•āļąāļ§āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ•āļąāļ§āđāļĢāļāļ‚āļ­āļ‡āđ‚āļĨāļāļ„āļ·āļ­ Intel 8048 āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāđƒāļ™āļ›āļĩ āļ„.āļĻ. 1980 āļāđ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļŦāļ™āļķāđˆāļ‡ āđ€āļĄāļ·āđˆāļ­ Intel āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§ Intel 8051 āļ—āļĩāđˆāļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (software develop- ments tools) āļˆāļ™āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāļāļēāļĢāļœāļđāđ‰āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ—āļąāđ‰āļ‡āđƒāļ™āļĢāļ°āļ”āļąāļšāļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒ āļšāļĢāļīāļĐāļąāļ—āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļĢāļēāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āđ„āļ›āđƒāļ™āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ (PROMs) āđāļ•āđˆāļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ„āļĄāđˆāļ™āļēāļ™āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāđ€āļžāļīāđˆāļĄāļĄāļēāļ­āļĩāļāļ‚āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĨāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āđāļĨāđ‰āļ§āļšāļąāļ™āļ—āļķāļāđ„āļ”āđ‰āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ EPROM āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĨāļšāļ”āđ‰āļ§āļĒāđāļŠāļ‡āļĒāļđāļ§āļĩ (UV) āđāļĨāļ°āļ•āđˆāļ­āļĄāļē āļ āļēāļĒāļŦāļĨāļąāļ‡āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ™āļīāļ”āļāļĨāđˆāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ‡ UV āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ EPROM āđ‚āļ”āļĒ āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ›āļĢāļ°āļĄāļēāļ“ 5-10 āļ™āļēāļ—āļĩāļˆāļ™āļāļĢāļ°āļ—āļąāđ‰āļ‡āļ›āļĩ āļ„.āļĻ. 1993 āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļˆāļēāļ EPROM āļĄāļēāđ€āļ›āđ‡āļ™ EEPROM āļ—āļĩāđˆ 100 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 101. āļŠāļēāļĄāļēāļĢāļ–āļĨāļšāļŦāļĢāļ·āļ­āđāļāđ‰āđ„āļ‚āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ­āļēāļ­āļ­āļāļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļŦāļĄāļ·āļ­āļ™ EPROM āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ EEPROM āļˆāļ°āļ•āđ‰āļ­āļ‡āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡ āļ‹āļķāđˆāļ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ­āļĒāļđāđˆāļ—āļĩāđˆāļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡ āļāļēāļĢāļĨāļšāļŦāļĢāļ·āļ­āđāļāđ‰āđ„āļ‚ āļ•āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1992 āļ—āļąāđ‰āļ‡ 12 āļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļāđ‡āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļˆāļąāļ”āļ•āļąāđ‰āļ‡ āļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 Consortium āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āđāļ™āļ§āļ—āļēāļ‡āđƒāļ™āļāļēāļĢāļ™āļģāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļĄāļē āļ›āļĢāļąāļšāđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ€āļĄāļ™āļšāļ­āļĢāđŒāļ”āđāļĨāļ°āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡ āļāļĨāđˆāļ­āļ‡āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļāļĢāļ°āļ—āļąāļ”āļĢāļąāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ§āļēāļ‡āļ‹āđ‰āļ­āļ™āļāļąāļ™āđ€āļ›āđ‡āļ™āļŠāļąāđ‰āļ™āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ‚āļ™āļēāļ”āļāļ§āđ‰āļēāļ‡āļĒāļēāļ§āđ€āļžāļĩāļĒāļ‡ 4 āļ™āļīāđ‰āļ§ āđāļĨāļ°āļĄāļĩ āļ„āļ§āļēāļĄāļŦāļ™āļēāđ€āļžāļĩāļĒāļ‡ 1 āļ™āļīāđ‰āļ§ āļ”āđ‰āļ§āļĒāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āļ‚āļ­āļ‡āļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 āļ—āļģāđƒāļŦāđ‰āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāļˆāļēāļāļ āļēāļ„āļĢāļąāļāđāļĨāļ° āļ āļēāļ„āđ€āļ­āļāļŠāļ™āļ­āļĒāđˆāļēāļ‡āļ„āļēāļ”āđ„āļĄāđˆāļ–āļķāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļĨāļļāđˆāļĄāļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ—āļŦāļēāļĢāđāļĨāļ°āļāļēāļĢāđāļžāļ—āļĒāđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāđāļĢāļāļ—āļĩāđˆāđ„āļ”āđ‰āļ™āļģ āđāļ™āļ§āļ„āļīāļ”āđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡ āđāļĨāļ°āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļ‚āļ­āļ‡āļ•āļąāļ§ āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ āļēāļĒāđƒāļ™āđ€āļ­āļ‡āļāđ‡āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āļˆāļķāļ‡āđ€āļĢāļīāđˆāļĄāļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļŠāļ·āđˆāļ­āļĄāļąāļĨāļ•āļīāļĄāļīāđ€āļ”āļĩāļĒāđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄ āļ•āđ‰āļ™āļˆāļēāļāļāļēāļĢāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļ•āļđāđ‰ PC/104-based Kiosk āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļĢāļ āļˆāļ™āļ–āļķāļ‡āļ§āļąāļ™āļ™āļĩāđ‰āđ„āļ”āđ‰āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļĄāļēāļāļāļ§āđˆāļē 100 āđāļŦāđˆāļ‡āļ—āļĩāđˆ āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļāļĨāļļāđˆāļĄāļŠāļĄāļēāļ„āļĄ PC/104 Embedded Consortium āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ethernet card, FireWire, hard drives, RAM drives, video cards, audio cards, general I/O, ash cards, modems, GPS, cellular telephone, wireless Internet āđāļĨāļ°āļ­āļĩāļ āļĄāļēāļāļĄāļēāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļ›āļąāļˆāļˆāļąāļĒāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļāļĢāļ°āļ•āļļāđ‰āļ™āļāļĨāļļāđˆāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļœāļđāđ‰āļŠāļ™āđƒāļˆāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ·āļ­ āļāļēāļĢāļ­āļ­āļāļ™āļīāļ•āļĒāļŠāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āđ€āļĢāļīāđˆāļĄāļ­āļ­āļāļŠāļđāđˆāļŠāļēāļĒāļ•āļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 1988 āđƒāļ™āļŠāļ·āđˆāļ­ āļ§āđˆāļē “Embedded Systems Programming” āđāļĨāļ°āđ€āļžāļīāđˆāļ‡āļĄāļēāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ â€œEmbedded Systems De- sign” āđ€āļĄāļ·āđˆāļ­āļ›āļĩ āļ„.āļĻ. 2005 āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ–āļķāļ‡āļ›āļąāļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 3.1 āļ™āļīāļ•āļĒāļŠāļēāļĢ Embedded System Design āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāļļāļ›āļ™āļīāļĒāļēāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ§āđˆāļē āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™ āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđ€āļ‰āļžāļēāļ°āļ”āđ‰āļēāļ™āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļąāđˆāļ§āđ„āļ› āđ€āļžāļĢāļēāļ°āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļ°āļ–āļđāļ āļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡ āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļ”āđ‰āđāļāđˆ     - āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āđƒāļ”āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļķāđˆāļ‡ āđ‚āļ”āļĒāļˆāļ°āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰     - āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđāļšāļšāļ„āļĢāļąāđ‰āļ‡āļĨāļ°āļ‡āļēāļ™ (Single Task) 101 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 102.     - āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļ•āđˆāđ„āļ”āđ‰āļ—āļĩāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļˆāļ™āļŠāļģāđ€āļĢāđ‡āļˆāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ Â Â Â  - āļĢāļēāļ„āļēāļ–āļđāļ Â Â Â  - āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ Â Â Â  - āļĄāļĩāļˆāļļāļ”āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ™āđ‰āļ­āļĒ āđƒāļŠāđ‰āļ‡āļēāļ™āļ‡āđˆāļēāļĒ Â Â Â  - āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļžāļĩāļĒāļ‡āļžāļ­āđāļĨāļ°āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ Â Â Â  - āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ•āđˆāļģ     - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļąāđˆāļ‡āļ‡āļēāļ™āļˆāļēāļāļ āļēāļĒāļ™āļ­āļ Â Â Â  - āļŠāļēāļĄāļēāļĢāļ–āļ„āļģāļ™āļ§āļ“āđ„āļ”āđ‰āđāļĄāđˆāļ™āļĒāļģāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨāđāļšāļš real-time āļ‹āļķāđˆāļ‡āđƒāļ™āļ‡āļēāļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ™āļąāļāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āļˆāļ°āđƒāļŠāđ‰āđ€āļžāļĩāļĒāļ‡āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđ€āļ”āļĩāđˆāļĒāļ§āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ āļ„āļ§āļšāļ„āļļāļĄāļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāļ™āļīāļ”āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļē ROM (Read-only Memory) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (Operating System) āļāļąāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļžāļ·āđˆāļ­āļ„āļ­āļĒāļˆāļąāļ”āļāļēāļĢāļ‡āļēāļ™āđāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļ•āļąāļ§āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļŠāļļāļ”āđƒāļ™āļāļĨāļļāđˆāļĄāļ™āļąāļ āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āđ‰āļ§āļĒāđ€āļŦāļ•āļļāļœāļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđāļĨāļ°āļĄāļĩ āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 30 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļĢāļđāđ‰āļāļąāļ™āļ”āļĩāļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ™āļąāđ‰āļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļ‹āļĩāđāļĨāļ°āđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āļšāļēāļ‡āļŠāđˆāļ§āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđāļĨāļ°āļ™āļģāđ„āļ› āđƒāļŠāđ‰āđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļ”āđ‰āļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āļ„āļ§āļēāļĄāđ„āļ”āđ‰āđ€āļ›āļĢāļĩāļĒāļšāļ‚āļ­āļ‡āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āđƒāļ™ āļ•āļĨāļēāļ”āļāđ‡āđ„āļĄāđˆāļ—āļģāļ˜āļĢāļĢāļĄāļ”āļēāđ€āļžāļĢāļēāļ°āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2005 āļˆāļģāļ™āļ§āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļāđ‡āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļˆāļēāļāđ€āļ”āļīāļĄāđ€āļāļ·āļ­āļš āļŠāļēāļĄāđ€āļ—āđˆāļēāļ•āļąāļ§āđ‚āļ”āļĒāļ—āļļāļāđ†āļ§āļąāļ™āļˆāļ°āļĄāļĩāđ‚āļ„āđ‰āļ”āđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ‚āļ”āļĒāđ€āļ‰āļĨāļĩāđˆāļĒ 10,000 āļšāļĢāļĢāļ—āļąāļ” āđāļĨāļ°āļ—āļļāļāđ†āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļˆāļ°āļĄāļĩāļ›āļĢāļ°āļĄāļēāļ“ 5.45 patch les āļ—āļĩāđˆāļ–āļđāļāļ­āļąāļžāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (āļ­āđ‰āļēāļ‡āļ­āļīāļ‡: Linux Foundation Analysis) āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļœāļđāđ‰āļœāļĨāļīāļ• āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļēāļĒāđƒāļŦāļāđˆāđ†āđāļĨāļ°āļœāļđāđ‰āļˆāļģāļŦāļ™āđˆāļēāļĒāļ‹āļ­āļŸāđāļ§āļĢāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™ (ISV: Independent Software Vendors) āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļāđ‡āļĒāļąāļ‡āļŦāļąāļ™āļĄāļēāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡ āđāļĨāļ°āļ—āļĩāđˆāļŠāļģāļ„āļąāļ GNU GPL (General Public License) āļĒāļąāļ‡āđƒāļŦāđ‰āļŠāļīāļ—āļ˜āļīāđŒāđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ­āļīāļŠāļĢāļ°āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāđāļāđ‰āđ„āļ‚āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ„āļąāļ” āļĨāļ­āļāđāļˆāļāļˆāđˆāļēāļĒāđƒāļŦāđ‰āļœāļđāđ‰āļ­āļ·āđˆāļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĄāđˆāļĄāļĩāļˆāļģāļ™āļ§āļ™āļˆāļģāļāļąāļ”āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļĄāļĩāļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđƒāļ™āļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āļ•āđˆāļ­āļ›āļĩāļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āļŠāļģāļ„āļąāļāđƒāļ™ āļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2002 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļē āđ‚āļ”āļĒāđƒāļ™āļŠāđˆāļ§āļ‡āđāļĢāļ āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2001 āļ–āļķāļ‡ āļ„.āļĻ. 2002 āļœāļĨāļāļēāļĢāļŠāļģāļĢāļ§āļˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™ smart gadgets āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ (15.5%) āļ‹āļķāđˆāļ‡āđ€āļ­āļēāļŠāļ™āļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ WinCE/WinCE.Net (6%) āđāļĨāļ° XPe (5%) āļˆāļēāļāļ„āđˆāļēāļĒ Microsoft āđāļĨāļ° VxWorks (10.3%) āļˆāļēāļāļ„āđˆāļēāļĒ Wind River āđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ•āđˆāļ­āļĄāļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2003 āļ–āļķāļ‡ āļ„.āļĻ.2005 āļœāļĨāļāļēāļĢāļŠāļģāļĢāļ§āļˆāļžāļšāļ§āđˆāļēāļˆāļģāļ™āļ§āļ™āļœāļđāđ‰āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ āļēāļĒāđƒāļ™āļšāļĢāļīāļĐāļąāļ—āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒ āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 49-52% āđāļĨāļ°āļŦāļĨāļąāļ‡āļˆāļēāļāļ›āļĩ āļ„.āļĻ. 2006 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡ āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āļ‚āļ­āļ‡āļŠāļīāļžāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđ€āļŠāđˆāļ™ ARM, x86, PowerPC, MIPS, Coldre, DSP āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļŠāđˆāļ™ OpenZaurus, 102 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 103. ÅngstrÃķm distribution, Familiar Linux, webOS from Palm, Inc., Maemo based on Debian āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ„āļļāđ‰āļ™āļŦāļđāļāļąāļ™āļ”āļĩāđƒāļ™āļ§āļ‡āļāļēāļĢāļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ—āļĒ āļ—āļĩāđˆāļāļąāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ PDA, Pocket PC, Smart Phone, Netbook āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ AirOS (Ubiquiti Network), CatOS/Cisco IOS/IOS-XR (Cisco Systems), DD-WRT (NewMedia-NET), JunOS (Juniper Networks), OpenWRT (LinkSys), Palm OS (Palm Inc.), Symbian OS (Nokia), Windows CE/Mobile (Microsoft), iPhone (Apple), OpenZaurus (Sharp), Maemo (Nokia), Qtopia/Qt Embedded (TrollTech), Openmoko (based on ÅngstrÃķm), Mobilinux (Monta- vista), Android (Google), Moblin (Intel), Ubuntu Mobile āđāļĨāļ° Meego (Maemo+Moblin) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāļœāļđāđ‰āļˆāļąāļ”āļˆāļģāļŦāļ™āđˆāļēāļĒāļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ‚āļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđāļāđˆ Monta- Vista, Koan, Sysgo, Denx, Metrowerks, FSMLabs, LynuxWorks, Wind River, āđāļĨāļ° TimeSys āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāđƒāļ™āļ•āļĨāļēāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĨāļąāļāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡ āļāļĨāļļāđˆāļĄāļ•āļĨāļēāļ”āļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē āļāļĨāļļāđˆāļĄāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļĒāļēāļ™āļĒāļ™āļ•āđŒ (Automotive) āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ āļēāļĒāđƒāļ™āļĒāļēāļ™āļžāļēāļŦāļ™āļ° (ECU- Electronic Control Unit) āļĢāļ°āļšāļšāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ āļēāļĒāđƒāļ™ â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļĢāļ§āļĄāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top-Box āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļœāđˆāļēāļ™āļĢāļ°āļšāļš āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ• â€Ē āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ (Industrial Automation) āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļ‚āļšāļ§āļ™āļāļēāļĢāļœāļĨāļīāļ•āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāļŦāļļāđˆāļ™āļĒāļ™āļ•āđŒāđƒāļ™āļŠāļēāļĒāļāļēāļĢāļœāļĨāļīāļ• āļĢāļ§āļĄāđ„āļ›āļ–āļķāļ‡āļĢāļ°āļšāļšāļ„āļ§āļšāļ„āļļāļĄāđ„āļŸāļŸāđ‰āļēāļāļģāļĨāļąāļ‡āļŠāļđāļ‡ (HVAC System) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļžāļ—āļĒāđŒ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāđ€āļāđ‰āļēāļ•āļīāļ”āļ•āļēāļĄāļ­āļēāļāļēāļĢāļœāļđāđ‰āļ›āđˆāļ§āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļĢāļ°āļšāļšāļšāļģāļšāļąāļ”āļ­āļēāļāļēāļĢāļ›āđˆāļ§āļĒ āļĢāļ°āļšāļšāļ•āļĢāļ§āļˆ āļŠāļ­āļšāđāļĨāļ°āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļœāļĨ āļĢāļ°āļšāļšāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļœāđˆāļēāļ•āļąāļ” āđāļĨāļ°āļĢāļ°āļšāļšāļ•āļĢāļ§āļˆāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ”āđ‰āļ§āļĒāđ€āļŠāļĩāļĒāļ‡āđāļĨāļ°āļ āļēāļž āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆ āđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļ™āļīāļ”āļžāļāļžāļē â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļēāļ‡āļ—āļŦāļēāļĢāđāļĨāļ°āļ­āļ§āļāļēāļĻ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāļ™āļģāļĢāđˆāļ­āļ‡āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļšāļīāļ™ āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļ”āļēāļ§āđ€āļ—āļĩāļĒāļĄ â€Ē āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļ™āļąāļāļ‡āļēāļ™ āđ„āļ”āđ‰āđāļāđˆ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ–āđˆāļēāļĒāđ€āļ­āļāļŠāļēāļĢ āđāļŸāļāļ‹āđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļžāļīāļĄāļžāđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļŠāļāļ™ āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ VoIP āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļŠāļēāļĒāđāļĨāļ°āđ„āļĢāđ‰āļŠāļēāļĒ āđ„āļ”āđ‰āđāļāđˆ āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļš LAN, MAN āđāļĨāļ° WAN āļˆāļēāļāļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļđāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ›āļĒāļąāļ‡āļ•āļĨāļēāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āļĄāļēāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļāļīāļ”āļˆāļēāļāļ›āļąāļˆāļˆāļąāļĒ āļŠāļģāļ„āļąāļāđ„āļ”āđ‰āđāļāđˆ â€Ē āļāļēāļĢāđ€āļžāļīāđˆāļĄāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāđāļ§āļĢāđŒāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļŠāļđāļ‡āļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ™āļąāļāļžāļąāļ’āļ™āļēāļ‹āļ­āļŸāđāļ§āļĢāđŒ 103 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 104. â€Ē āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđ€āļ”āļīāļĄāļ›āļĢāļ°āļĄāļēāļ“āļŠāļ­āļ‡āļžāļąāļ™āļĨāđ‰āļēāļ™āļ•āļąāļ§āđāļĨāļ°āļĄāļĩāđāļ™āļ§āđ‚āļ™āđ‰āļĄāļˆāļ°āđ€āļžāļīāđˆāļĄāđ„āļ”āđ‰āļ–āļķāļ‡ āļŠāļ­āļ‡āđāļŠāļ™āļĨāđ‰āļēāļ™āļ•āļąāļ§āļ āļēāļĒāđƒāļ™āļ›āļĩ āļ„.āļĻ. 2013 â€Ē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļĢāļąāļšāđāļĨāļ°āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩāļˆāļēāļāļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ Sony, Motorola, Philips, Panasonic, Google, Samsung āđāļĨāļ° Siemens āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āļ āļēāļĐāļēāļ‹āļĩāļĒāļąāļ‡āļ„āļ‡āļ–āļđāļāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (Device Programming) āļ•āļēāļĄāļĄāļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē Assembly, C++ āđāļĨāļ° embedded C++ āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļĄāļēāļˆāļēāļ: http://www.ecti-thailand.org/emagazine/views/66 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĢāļđāļ›āļ—āļĩāđˆ 3.2 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ Photo from: http://free-electrons.com āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒāđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļ­āļ­āļāļĄāļēāđƒāļ™āļ•āļĨāļēāļ”āđƒāļŦāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ āļēāļĒāđƒāļ™ āđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ°āļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /arch  āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒ āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ„āļĄāđˆāļ•āđˆāļģāļāļ§āđˆāļē 30 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, AVR32, Intel x86, Intel x86_64, MIPS, Motorola 68000 (M68K) , PowerPC, āđāļĨāļ° Super-H āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ°āļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ›āļ—āļĩāđˆ āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ 104 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 105. â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 and x86-64 āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļē āļ­āļļāļ›āļāļĢāļ“āđŒāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ (Mobile Internet Device) āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ (Set-top-Box, DVD Player) āļŦāļĢāļ·āļ­ āļ­āļļāļ›āļāļĢāļ“āđŒāļ„āļ§āļšāļ„āļļāļĄāđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļāļēāļĢāļœāļĨāļīāļ• āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ PowerPC āļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļĄāļēāļāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ‚āļ—āļĢāļ„āļĄāļ™āļēāļ„āļĄ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (real-time) â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ MIPS āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ SuperH āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— Hitachi (1990s) āđƒāļ™āļŠāļĄāļąāļĒāļāđˆāļ­āļ™āļˆāļ°āļžāļšāđ€āļŦāđ‡āļ™āļšāđˆāļ­āļĒāđƒāļ™ āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āđ€āļŠāđˆāļ™ āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top-box āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ— Renesus āļāđ‡āļĒāļąāļ‡āļ„āļ‡āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļ™āļģāļ—āļēāļ‡ āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļžāļīāļĄāļžāđŒ āđāļĨāļ°āļāļĨāđ‰āļ­āļ‡āļ–āđˆāļēāļĒāļĢāļđāļ› â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Blackn āļ–āļđāļāļžāļąāļ’āļ™āļēāđāļĨāļ°āļ—āļģāļ•āļĨāļēāļ”āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— Analog Devices āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļ™āđ‰āļ™āđ„āļ›āđƒāļ™āļ‡āļēāļ™ āļ”āđ‰āļēāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļŠāļąāļāļāļēāļ“āļ”āļīāļˆāļīāļ•āļ­āļĨ (Signal Processing) āļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ—āļģāđƒāļŦāđ‰āļ•āļąāļ§ Blackn CPU āđ€āļ­āļ‡āļĄāļĩāļĢāļēāļ„āļēāļ–āļđāļ â€ĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Motorola 68000 āļˆāļ°āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĩ 1980s - 1990s āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨ āđ€āļŠāđˆāļ™ Apple Macintosh, Commodore Amiga, Atari ST āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļđāđˆāđāļ‚āđˆāļ‡ āļŠāļģāļ„āļąāļāļāļąāļšāļšāļĢāļīāļĐāļąāļ— Intel āļ•āļēāļĢāļēāļ‡ 3.1 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ O P T I O N X 8 6 A R M P P C M I P S S H M 6 8 K Parallel Port support X X X IEEE 1394 support X X X X IrDA support X X X X USB support X X X X Bluetooth support X X X āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļŠāļļāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ āļēāļĒāđƒāļ•āđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ‚āļ™āļēāļ”āđ€āļžāļĩāļĒāļ‡ 8 MB āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļ”āđ‰āļ”āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļŠāđ‰āļēāļĄāļēāļāđ€āļāļīāļ™ āđ„āļ›āļāđ‡āļ„āļ§āļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 32 MB āļŠāđˆāļ§āļ™āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (Storage) āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļŠāļļāļ”āļ­āļĒāļđāđˆāļ—āļĩāđˆāļ‚āļ™āļēāļ” 4 MB āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļŦāļĢāļ·āļ­āļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™ āļāđ‡āļ­āļēāļˆāļˆāļ° āđ€āļžāļīāđˆāļĄāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ—āđāļŸāļĨāļŠ (Flash storage) āđ€āļŠāđˆāļ™ NAND/NOR Flash āļŦāļĢāļ·āļ­ āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ— āļšāļĨāđ‡āļ­āļ„ (Block storage) āđ€āļŠāđˆāļ™ SD/MMC card āđāļĨāļ° eMMC āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 105 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 106. āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡ āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļšāļąāļŠāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ€āļ­āļ‡āđ€āļŠāđˆāļ™ I2C, SPI, CAN, 1-wire, SDIO, UART āđāļĨāļ° USB āļĢāļ°āļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļ”āļąāļšāļŠāļđāļ‡āđ€āļŠāđˆāļ™ Ethernet, Wi, Bluetooth, āđāļĨāļ° CAN āļĢāļ§āļĄāļ–āļķāļ‡ āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (TCP/IP) āļāđ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđŒāđ€āļ§āļ­āļĢāđŒāļžāļĢāđ‰āļ­āļĄāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ­āļ‡ āļāđˆāļ­āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ­āļ­āļāļĄāļēāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āļŦāļĨāļēāļĒāļĒāļĩāđˆāļŦāđ‰āļ­ āļ—āļąāđ‰āļ‡āđƒāļ™āļĢāļēāļ„āļēāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āļœāļđāđ‰āđƒāļŠāđ‰ āļ—āļąāđˆāļ§āđ„āļ›āļŠāļēāļĄāļēāļĢāļ–āļŦāļēāļ‹āļ·āđ‰āļ­āđ„āļ”āđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™ BeagleBoard, PandaBoard, BeagleBone, ODROID, Raspberry Pi, Freescale i.MX53, AM335x Sitara, Friendly ARM āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āļˆāļēāļāļœāļđāđ‰āļœāļĨāļīāļ•āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ Texas Instrument, Samsung, Qualcomm, Nvidia āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđāļĨāđ‰āļ§āļˆāļ°āđƒāļŠāđ‰ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āļĢāļđāļ›āļ—āļĩāđˆ 3.3 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļšāļ­āļĢāđŒāļ”āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āļāļ§āđˆāļēāļˆāļ°āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāļ•āđ‰āļ­āļ‡āļŦāļēāļŠāļīāļŸāļ•āđˆāļēāļ‡āđ†āļĄāļēāđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļāļ­āļšāđ€āļ›āđ‡āļ™ āļšāļ­āļĢāđŒāļ”āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ•āđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ– āļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļŠāļļāļ” Instruction set, āļāđāļēāļŦāļ™āļ”āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļš MMU, āļ­āļīāļ™ āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ āđ€āļ™āđ‰āļ™āļāļēāļĢāļāđāļēāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ° (specication) ARM Core āļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļāļąāļš āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļāđāļēāļŦāļ™āļ”āđ„āļ§āđ‰ āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡ netlist āļŦāļĢāļ·āļ­ āđ‚āļ„āđ‰āļ” Verilog āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ‹āļ·āđ‰āļ­āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ System-on-Chip āļāļēāļĢāļĢāļ§āļĄāļ­āļļāļ›āļāļĢāļ“āđŒ/āļŠāļīāļžāļ•āđˆāļēāļ‡āđ†āđ€āļ‚āđ‰āļēāđ„āļ› āđ€āļžāļ·āđˆāļ­ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ āļēāļĒāđƒāļ™ ARM Core āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ† āļ‚āļēāļĒāļ­āļ­āļāļĄāļēāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļŠāļīāļžāļĢāļļāđˆāļ™āļ—āļĩāđˆ āļšāļĢāļīāļĐāļąāļ—āļˆāļąāļ”āļˆāđāļēāļŦāļ™āđˆāļēāļĒ (SoC Brand) āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļšāļ­āļĢāđŒāļ”āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļ§āļĄ SoC āđāļĨāļ°āļžāļ­āļĢāđŒāļ•āļŠāđāļēāļŦāļĢāļąāļšāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒ āļ āļēāļĒāļ™āļ­āļ āļ‚āļēāļĒāļ­āļ­āļāļĄāļēāđƒāļ™āļĢāļđāļ›āđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡ āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđāļēāđ€āļĢāđ‡āļˆāļĢāļđāļ› āļĢāļđāļ›āļ—āļĩāđˆ 3.4 āđāļŠāļ”āļ‡āļĨāļģāļ”āļąāļšāļ•āļąāđ‰āļ‡āđāļ•āđˆāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ 106 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 107. āļŦāļąāļ§āđƒāļˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļ•āļąāļ§ System-on-Chip (SoC) āļ‹āļĩāļžāļĩāļĒāļđāļ‹āļķāđˆāļ‡āļĄāļĩ ARM Core āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āļ—āļĩāđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ”āđ‰āļ§āļĒāļŠāļīāļžāđ€āļ‹āđ‡āļ—āļ•āđˆāļēāļ‡āđ† (Chipset) āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ•āļąāļ§āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđ„āļ”āđ‰āļŦāļĨāļēāļ āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Ethernet, AUX, USB, SATA, LCD, HDMI āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢ āļ•āļąāđ‰āļ‡āđāļ•āđˆāđˆāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ™āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™ System-on-Chip āļ—āļĩāđˆāļšāļĢāļīāļĐāļąāļ—āđāļĨāļ°āđ€āļŦāļĨāđˆāļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļē āļ­āļ­āļāđāļšāļšāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” ARMv6 ARMv7 ARM1176JZF-S ARM Cortex-A8 ARM Cortex-A15 Marvell PJ48 BCM2835 TI AM335x Samsung Exynos 5 Marvell Armada XP Raspberry Pi BeagleBone Arndale PlatHome OpenBlocks AX3-4 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM ARM Core System-on-Chip āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļĢāļđāļ›āļ—āļĩāđˆ 3.5 āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ SoC āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™ SoC āļšāļĢāļīāļĐāļąāļ— ARM āđ„āļĄāđˆāđ„āļ”āđ‰āļ—āļģāļ•āļąāļ§āđ€āļ­āļ‡āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļœāļĨāļīāļ•āđ„āļĄāđ‚āļ„āļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ‹āļ­āļĢāđŒ āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļāļģāļŦāļ™āļ”āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđ€āļŠāđˆāļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ Instruction Set, āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (MMU) āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļŠāļąāļāļāļēāļ“āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ•āđˆāļēāļ‡āđ† (Interrupts) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļēāļĒāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ (Li- cense fee) āļāļēāļĢāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļāđˆāļšāļĢāļīāļĐāļąāļ—āļĢāđˆāļ§āļĄāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆ (Business Partner) āļ—āļĩāđˆāļˆāļ°āļĢāđˆāļ§āļĄāļ­āļ­āļāđāļšāļšāļāļąāļšāļ—āļēāļ‡ āļšāļĢāļīāļĐāļąāļ— ARM āļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™ ARM Core āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™ āđāļĨāļ°āļˆāļ°āļ—āļģāļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Chipset āļ āļēāļĒāđƒāļ™ 107 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 108. āļ•āđˆāļēāļ‡āđ† āļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™ System-on-Chip āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ TI OMAP, TI AM335x, Samsung Exy- nos, Rockchip, FreeScale i.Mx53 āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ—āļĢāđˆāļ§āļĄāļ˜āļļāļĢāļāļīāļˆāļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāđˆāļēāļĒāļ„āđˆāļē Royalty fee āđƒāļŦāđ‰āļāļąāļšāļšāļĢāļīāļĐāļąāļ— ARM āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ™āļģāđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļŠāļīāļ™āļ„āđ‰āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļĨāļ°āļŠāļīāļ™āļ„āđ‰āļē āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­ (Smart Phone), āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ• (Tablet), āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļŦāļĢāļ·āļ­ āļĢāļ°āļšāļšāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāļ āļēāļĒāđƒāļ™āļĒāļēāļ™āļžāļēāļŦāļ™āļ° āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđ‚āļĄāđ€āļ”āļĨāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— ARM āđāļĨāļ°āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļ§āļīāļˆāļąāļĒāļžāļąāļ’āļ™āļēāļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļēāđ€āļ›āđ‡āļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļ™āļ•āļĨāļēāļ”āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” 20+ āļ›āļĩ āļŠāļĢāđ‰āļēāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđāļēāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļ”āđāļēāđ€āļ™āļīāļ™āļ˜āļļāļĢāļāļīāļˆ 3-4 āļ›āļĩ āļšāļĢāļīāļĐāļąāļ—āļŦāļļāđ‰āļ™āļŠāđˆāļ§āļ™āļ™āđāļēāđ„āļ›āļžāļąāļ’āļ™āļēāđ€āļ›āđ‡āļ™ SoC 2-3 āļ›āļĩ āļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļē ARM Core āđ€āļ‡āļīāļ™āļĨāļ‡āļ—āļļāļ™ āļĢāļđāļ›āđāļšāļšāļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡ ARM āļˆāđˆāļēāļĒāļ„āđˆāļēāļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒ (Royalty Fee) āļˆāđˆāļēāļĒāļ„āđˆāļēāđƒāļšāļ­āļ™āļļāļāļēāļ• (Upfront License Fee) SoC āļĢāļđāļ›āļ—āļĩāđˆ 3.6 āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ˜āļļāļĢāļāļīāļˆāļ‚āļ­āļ‡ ARM 108 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 109. āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļđāđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ–āļđāļāļāļąāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļš āļāļąāļ‡āļ•āļąāļ§ (Embedding Linux) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āļīāļ˜āļĩāļāļēāļĢāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļ—āļąāļšāļĻāļąāļžāļ—āđŒāļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐ āļ§āđˆāļēāļāļēāļĢ â€œPorting” āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļāđ‡āļĄāļĩāļšāļĢāļīāļĐāļąāļ—āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļ—āļĩāđˆāļ‚āļēāļĒāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āđāļĨāļ°āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāļāļĨāļļāđˆāļĄāļšāļĢāļīāļĐāļąāļ—āļ—āļĩāđˆāļ—āļģāļ˜āļļāļĢāļāļīāļˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđāļšāļšāļ­āļ‡āļ„āđŒāļĢāļ§āļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļžāļīāđ€āļĻāļĐ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļāļēāļĢ āļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ† (Cross-development tools) āđāļĨāļ° āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (Real time extensions) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāļĢāļ°āļšāļšāļ›āļŽāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļĄāļĩāļŠāļļāļ” āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ„āļĢāļšāļ–āđ‰āļ§āļ™āđ€āļžāļĩāļĒāļ‡āļžāļ­āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš EMBEDDED LINUX āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āļœāļđāđ‰āļŠāļ™āđƒāļˆāļ”āđ‰āļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ”āļąāļ‡āđāļŠāļ”āļ‡ āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ•āļēāļĢāļēāļ‡ 3.2 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļš āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” BSP (Board Support Package) āļ āļēāļĒāđƒāļ™āļšāļĢāļĢāļˆāļļāļ•āļąāļ§ bootloader āđāļĨāļ° Kernel āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāđāļĨāļ°āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļĢāļļāđˆāļ™ āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ Cross Toolchains āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļ›āļĨāļ‡āļĢāļŦāļąāļŠāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ‚āđ‰āļēāļĄāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ„āļ”āđ‰ Third-party components āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļīāđ€āļĻāļĐāļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļ āļēāļĒāļ™āļ­āļ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļĄāļĩ āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™ GPLv3, Apache, MIT āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 109 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 110. āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļš āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” Hardware āđāļĨāļ° Accessories - āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ„āļ·āļ­ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŠāļģāļŦāļĢāļąāļšāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” target - āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Target āļ„āļ·āļ­ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļŠāđˆāļ™ Beagleboard, Versatile Express, Pandaboard, ODROID, FriendlyARM āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ - āļŠāļēāļĒ Cable āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ LAN Cable, Serial Cable, USB-to-Serial āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ - MMC/SD Card āļŠāļģāļŦāļĢāļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 4 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļāļ„āļ·āļ­ āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩ bootloader āļ—āļĩāđˆāļĄāļĩāļāļēāļĢ āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡ Kernel Image, root le system āđāļĨāļ°āļ„āđˆāļēāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ” āļŠāļēāļĄāļēāļĢāļ–āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰ āļŠāļĄāļšāļđāļĢāļ“āđŒāđāļšāļš āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļšāļ­āļĢāđŒāļ”āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļš Ethernet LAN āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļœāđˆāļēāļ™ telnet āļŦāļĢāļ·āļ­ ssh āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰ āđāļ•āđˆ āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāđƒāļŠāđ‰ serial con- sole āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļĢāļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āļāļĢāļ“āļĩāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļ­ LAN āđ„āļ”āđ‰ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Linux kernel: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļ–āļķāļ‡āđāļĄāđ‰āļˆāļ°āļĄāļĩ āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āđāļ•āđˆāļāđ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āļ­āļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™ āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļĨāļąāļ‡āļ‡āļēāļ™āļ—āļĩāđˆāļˆāļģāļāļąāļ” āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‡āļēāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ—āļģāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļāđˆāļ­āļ™āļˆāļ° Porting āđ€āļ‚āđ‰āļēāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Root File System: āļ āļēāļĒāđƒāļ™ root le system āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ° āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ†āđ„āļ”āđ‰ āļ–āđ‰āļēāļ›āļĢāļēāļĻāļˆāļēāļ root le system āđāļĨāđ‰āļ§āļˆāļ°āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ “Kernel panic” āđāļĨāļ°āļŦāļĒāļļāļ”āļ—āļģāļ‡āļēāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” āļ‹āļķāđˆāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ§āļēāļ‡ root le system āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 2 āđāļšāļšāļ„āļ·āļ­āđ€āļāđ‡āļšāđ„āļ§āđ‰ āđƒāļ™ Flash Storage āđ€āļŠāđˆāļ™ MMC, SDCard āđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ NFS āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ: āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļšāļ­āļĢāđŒāļ” āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āļ”āđ‰āļ§āļĒāļ•āļąāļ§ āđ€āļ­āļ‡āđ„āļ”āđ‰ āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ° āđ€āļ›āđ‡āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢ āļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē Cross Toolchain āļŦāļĢāļ·āļ­āļāļēāļĢ āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡ āļ•āļąāļ§āļ”āđ‰āļ§āļĒ gdb āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āļˆāļ°āđ„āļĄāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļĄāļēāļāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļšāļāļąāļšāļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 110 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 111. System call interface āđ‚āļ›āļĢāđāļāļĢāļĄ #1 āđ‚āļ›āļĢāđāļāļĢāļĄ #2 āđ‚āļ›āļĢāđāļāļĢāļĄ #3 āđ‚āļ›āļĢāđāļāļĢāļĄ #N C library āļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒ āļ„āļ§āļēāļĄāļˆāđāļē āļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ›āļāļĢāļ“āđŒ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ† āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļšāļš āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļŠāļ™āļīāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ Block device drivers Network device drivers Character device drivers CPU/MMU support code CPU support code User-space Kernel-space Hardware āļĢāļđāļ›āļ—āļĩāđˆ 3.7 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ 1. Hardware Layer - āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āļ™āļēāļ” 32 āļšāļīāļ• āļ‚āļķāđ‰āļ™āđ„āļ› āļŦāļ™āđˆāļ§āļĒāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (MMU - Memory Management Unit) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ™āļēāļ” āđ€āļĨāđ‡āļ (RAM) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ (ROM) āļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ›āļĢāļ°āđ€āļ āļ—āđāļŸāļĨāļŠ āđ€āļŠāđˆāļ™ MMC/SD Card āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 2. Linux Kernel Layer (Kernel-space) - āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļˆāļąāļ”āļ„āļīāļ§āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđˆāļēāļ‡āđ† āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļ„āļąāļ (System Calls) āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ† āđ„āļ”āđ‰āđāļāđˆ â€ĒLow-level interfaces: - āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ” APIs (Application Programming Interface) āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđāļšāļšāļ—āļĩāđˆāđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ - āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ”āļđāđāļĨāđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđ€āļŠāđˆāļ™ āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļŠāļ·āđˆāļ­āļŠāļēāļĢ āđāļĨāļ° I/O Devices āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē High-level abstractions: - āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļēāļĄāļēāļĢāļ–āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ„āļ”āđ‰ āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđāļšāļš multi-tasking āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ IPC, Threading, Socket, Signalling āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ - āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ•āđˆāļ­āđ„āļ”āđ‰āđ€āļāļ·āļ­āļšāļ—āļļāļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ â€Ē Filesystems: - āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš ïŽlesystems āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 40 āļŠāļ™āļīāļ” 111 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 112. - āļˆāļ°āļĄāļĩ Virtual Filesystem layer āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ lesystems āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļ‡āđˆāļēāļĒ āđāļĨāļ°āļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđƒāļŦāļĄāđˆ â€Ē Networking protocols - āļĢāļ­āļ‡āļĢāļąāļšāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļ™āļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 50 āļŠāļ™āļīāļ” - āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Socket APIs āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļāļģāļŦāļ™āļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđƒāļ™āđāļ•āđˆāļĨāļ°āđāļšāļšāļ‚āļ­āļ‡āļĢāļ°āļšāļš āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ™āļąāđ‰āļ™āđ† 3. Libraries (User-space) - āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡ user space āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĄāļēāļāļāļ§āđˆāļēāļ—āļĩāđˆāļĄāļĩ āļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļīāļˆāļīāļ•āļ­āļĨ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠ/āļ–āļ­āļ”āļĢāļŦāļąāļŠ āđāļĨāļ° āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ—āļĩāđˆāļĄāļēāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ° āđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē glibc (āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļĒāđˆāļ­āļĒāļ„āļ·āļ­ uClibc āđāļĨāļ° eglibc) āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāđāļĨāļ°āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST āđāļĨāļ° āļšāļ­āļĢāđŒāļ” TARGET āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ 2 āļŠāđˆāļ§āļ™āļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āđāļāđˆ 1.āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ â€œHost” (āļ‹āļķāđˆāļ‡āļāđ‡āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™ āļšāļļāļ„āļ„āļĨāļ—āļąāđˆāļ§āđ„āļ›) 2.āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļšāļ­āļĢāđŒāļ” â€œTarget” āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 3 āđāļšāļšāļ„āļ·āļ­ â€ĒāļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ RS-232 (RS-232 Serial Cable) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļšāļđāļ—āļ‚āļ­āļ‡ āļšāļ­āļĢāđŒāļ” āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ€āļĢāļīāđˆāļĄāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āđˆāļēāđƒāļ™āļĢāļ°āļ”āļąāļš low level āļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ Kernel āđāļĨāļ°āļāļēāļĢāđ‚āļŦāļĨāļ”āļ•āļąāļ§ root le system āđ€āļĢāļĩāļĒāļāļŦāļ™āđ‰āļēāļˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļ™āļĩāđ‰āļ§āđˆāļē “Console” â€ĒāļŠāļēāļĒ LAN (Ethernet LAN Cable) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ§āļēāļ‡ Kernel Image āđāļĨāļ° Root le system āđ„āļ§āđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļœāđˆāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ bootp, tftp āļŦāļĢāļ·āļ­ NFS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđƒāļ™ āļāļĢāļ“āļĩāļ—āļĩāđˆāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ (Embedded Linux) āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđ„āļ”āđ‰āđāļĨāđ‰āļ§ āļ–āđ‰āļēāđ„āļĄāđˆ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļđāļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­ Console āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđāļšāļšāļĢāļ°āļĒāļ°āđ„āļāļĨ (Remote Login) āļœāđˆāļēāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ telnet āļŦāļĢāļ·āļ­ ssh āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ â€ĒāļŠāļēāļĒ JTAG (JTAG Cable) āđƒāļŠāđ‰āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ„āđˆāļēāļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 112 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 113. āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host Ethernet Hub āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target) āļŠāļēāļĒ RS-232 āļŠāļēāļĒ LAN ARM, PowerPC, MIPS (Linux OS) x86, x86_64 (Desktp OS) āļŠāļēāļĒ LAN āļĢāļđāļ›āļ—āļĩāđˆ 3.8 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āđˆāļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļˆāļ°āļĄāļĩ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ (āđ€āļŠāđˆāļ™ Ubuntu, Red Hat, Fedora, SuSE āļŦāļĢāļ·āļ­ Debian āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ āļŦāļĢāļ·āļ­āđ‚āļ›āļĢ āđāļāļĢāļĄāļ­āļąāļ•āļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ (āđ€āļŠāđˆāļ™ Serial Console Software, Cross Toolchain, Network shar- ing Software) āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™āļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ (RS- 232 Cable) āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŦāļĢāļ·āļ­āđ‚āļ™āđ‡āļ•āļšāļļāđŠāļ„āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ„āļĄāđˆāļĄāļĩāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāđƒāļŦāđ‰ āļ­āļĩāļāđāļĨāđ‰āļ§ āđāļ•āđˆāļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļžāļ­āļĢāđŒāļ• USB āļĄāļēāđƒāļŦāđ‰āđāļ—āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āļŦāļēāļŠāļēāļĒ USB-to-Serial āļĄāļē āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļāļąāļšāļšāļ­āļĢāđŒāļ” Target āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ āļēāļĒāđƒāļ™āđ€āļ‚āđ‰āļēāļāļąāļš āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ Ethernet Hub āļŦāļĢāļ·āļ­ Switch Hub āļāđˆāļ­āļ™āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āđ€āļŦāđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ•āđˆāļēāļ‡āđ†āļœāđˆāļēāļ™āļŦāļ™āđ‰āļē Serial Console āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ Serial Console āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Minicom, Picocom, Gtkterm, Putty, Cutecom āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ (Serial Port) āļŦāļĢāļ·āļ­āļžāļ­āļĢāđŒāļ• USB āđ‚āļ”āļĒāļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āđ€āļ›āđ‡āļ™ /dev/ttySx āļŦāļĢāļ·āļ­ /dev/ttyUSBx āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ mini- com āđāļĨāļ° Gtkterm āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ minicom -b 115200 /dev/ttyS0 āļŦāļĢāļ·āļ­ $ minicom -b 115200 /dev/ttyUSB0 113 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 114. āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Gtkterm āđ€āļžāļ·āđˆāļ­āđ€āļ›āļīāļ” Serial Console āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 114 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 115. 115 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 116. āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross Toolchains āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ„āļ§āđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē “Native Toolchain” āļ‹āļķāđˆāļ‡āļ•āļąāļ§ native toolchain āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļŦāļąāļŠāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŦāđ‰ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļšāļ™āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āđ† (āđ€āļŠāđˆāļ™ x86 Platform) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢ āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™ āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ native toolchain āļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāđ„āļ”āđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ‚āļ™āļēāļ”āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļĨāļ°āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļŠāđ‰āļēāļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļŠāđˆāļ§āļ™āļšāļļāļ„āļ„āļĨāđāļĨāļ°āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļŦāđ‰āļ­āļĒāļđāđˆ āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļ›āļĨāļ‡āļĢāļŦāļąāļŠāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‚āđ‰āļēāļĄāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāđ„āļ”āđ‰āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļ āļ§āđˆāļē “Cross-compiling Toolchain” āļŦāļĢāļ·āļ­ â€œCross Toolchains” āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ§āđˆāļē cross-compiling toolchain āļˆāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļ™āļąāđ‰āļ™āđ† (āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM) āļ•āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āļāđˆāļ­āļ™āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ export ARCH=ARM $ export CROSS_COMPILE=arm-linux-gnueabi- $ make āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Native toolchain Cross-compiling toolchain ARM binaryx86 binary āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86) āļšāļ­āļĢāđŒāļ” Target (ARM)āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86) āļĢāļđāļ›āļ—āļĩāđˆ 3.9 āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄāļ—āļąāđ‰āļ‡ 2 āđāļšāļš 116 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 117. āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ CROSS TOOLCHAINS āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ cross toochains āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ‡āļēāļ™āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāļ•āļąāļ§ āđ‚āļ”āļĒāļ­āļēāļˆāđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļāļĨāļļāđˆāļĄāđƒāļŦāļāđˆāđ† āđ„āļ”āđ‰āđāļāđˆ 1. Toolchains āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ› â€ĒCodeSourcery (http://www.codesourcery.com/) CodeSourcery āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ—āļĩāđˆāļ­āļ­āļāđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļāļąāļš Sourcery G++ āđāļĨāļ° Eclipse IDE āļ—āļĩāđˆ āļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļāļąāļš GNU Toolchain (gcc, gdb āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, Coldre, MIPS, SuperH āđāļĨāļ° PowerPC â€ĒLinaro (http://linaro.org/) Linaro āđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļāļĢāļ—āļĩāđˆāđ„āļĄāđˆāđāļŠāļ§āļ‡āļŦāļēāļāļģāđ„āļĢ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļĄāļ•āļąāļ§āļāļąāļ™āļ‚āļ­āļ‡āđ€āļŦāļĨāđˆāļēāļ§āļīāļĻāļ§āļāļĢāļĄāļ·āļ­āļ”āļĩ āđ€āļžāļ·āđˆāļ­āļĢāđˆāļ§āļĄāļāļąāļ™āļŠāļĢāđ‰āļēāļ‡ āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ open source āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļēāļ‡ Linaro āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļˆāđ‰āļēāļ‡āļ„āļ™ āļ—āļĩāđˆāļžāļąāļ’āļ™āļē CodeSourcery āđ€āļžāļ·āđˆāļ­āđ€āļ™āđ‰āļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđƒāļŦāđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ” â€ĒDENX ELDK (http://www.denx.de/) DENX Embedded Linux Development Kit (ELDK) āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (real-time) āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM, PowerPC āđāļĨāļ° MIPS āļŠāļļāļ” āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰āļŸāļĢāļĩāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ GPL āđāļĨāļ° Free Software Licenses āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ Cross Development Tools (Compiler, Assembler, Linker āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™), Native Tools (Shell, commands āđāļĨāļ° libraries), U-Boot, Linux kernel āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ, Xenomai (RTOS Emulation framework) āđāļĨāļ° SELF (Simple Embedded Linux Framework) â€ĒScratchbox (http://www.scratchbox.org/) Scratchbox āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē Maemo (Nokia 770, N800, N810 Internet Tab- lets āđāļĨāļ° Nokia N900) āļ‹āļķāđˆāļ‡āđ€āļ™āđ‰āļ™āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđāļĨāļ° x86 2. Toolchain āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ­āļ‡ â€ĒBuildroot (http://buildroot.uclibc.org/) Buildroot āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ—āļĩāđˆāļ™āļīāļĒāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđāļĨāļ° āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡ RFS image (Root File System Image) āļ—āļĩāđˆ āļžāļĢāđ‰āļ­āļĄāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđāļŸāļĨāļŠ (ash) āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ open 117 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 118. source āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ RFS Image āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ•āļąāļ§ buildroot āļ™āļĩāđ‰āļˆāļ°āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļžāļĩāļĒāļ‡ uClibc āđāļ•āđˆāđ„āļĄāđˆ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ glibc â€ĒCrosstool-NG (http://crosstool-ng.org/) Crosstool-NG āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ„āļĄāđˆāđāļžāđ‰āļ•āļąāļ§ buildroot āđ‚āļ”āļĒāļĄāļĩāļĢāļđāļ›āđāļšāļšāđƒāļ™āļāļēāļĢ āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļœāđˆāļēāļ™ make menucong āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļ•āļąāļ§ buildroot āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡ uClibc āđāļĨāļ° glibc āđāļĨāļ°āļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļŠāđˆāļ™ gdb, strace, dmalloc â€ĒBitbake Bitbake āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļļāļ”āđāļžāļāđ€āļāđ‡āļ• āļ‹āļķāđˆāļ‡āļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢ OpenEm- bedded āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ” Ã…ngstrÃķm āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļ: http://www.wikipedia.com āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāļ āļēāļĒāđƒāļ™ CROSS TOOLCHAINS āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ cross toolchains āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļąāļ§ āļ‹āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (āđ€āļŠāđˆāļ™ BusyBox, Openssh, Di- rectFB āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āđˆāļēāļ‡āđ† āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ â€ĒBinutils - āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđ€āļ­āļēāđ„āļ§āđ‰āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāđ„āļšāļ™āļēāļĢāļĩāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ° āļāļąāļšāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ†āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ as (Assembler), ld (Linker), ar, ranlib (āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļšāļš static), objdump, readelf, size, nm, strings, strip āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€ĒGCC Compiler - āļŠāļļāļ” GNU C Compiler āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāļļāļ”āļ—āļĩāđˆāđāļˆāļāļŸāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ āļēāļĐāļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ C, C++, Ada, Fortran, Java, Objective-C, Objective-C++ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđ€āļŠāđˆāļ™ ARM, AVR, Blackn, CRIS, FRV, M32, MIPS, MN10300, PowerPC, SH, v850, i386, x86_64, IA64, Xtensa āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€ĒC/C++ Libraries - āđ€āļ›āđ‡āļ™āļŠāļļāļ”āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ•āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļ‹āļķāđˆāļ‡āļ—āļģ āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ C Libraries āļĄāļĩāļ­āļĒāļđāđˆāļŦāļĨāļēāļĒāđāļšāļšāđ€āļŠāđˆāļ™ glibc, uClibc, eglibc, dietlibc, newlib āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€ĒGDB Debugger - GDB āđ€āļĢāļīāđˆāļĄāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļ™āļēāļĒāļĢāļīāļŠāļēāļĢāđŒāļ” āļŠāļ•āļ­āļĨāđāļĄāļ™ āđ€āļĄāļ·āđˆāļ­ āļž.āļĻ. 2529 āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡ āļ‚āļ­āļ‡āļĢāļ°āļšāļš GNU āļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāđ€āļ‚āļēāļžāļąāļ’āļ™āļē GNU Emacs āļˆāļ™āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāđƒāļ™āļĢāļ°āļ”āļąāļšāļ—āļĩāđˆāļ™āđˆāļēāļžāļ­āđƒāļˆ āļ‹āļķāđˆāļ‡āđāļ™āļ§ āļ„āļ§āļēāļĄāļ„āļīāļ”āļ‚āļ­āļ‡ GDB āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļĄāļēāļˆāļēāļ Dbx āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļĩāļšāļąāđŠāļāđ€āļāļ­āļĢāđŒāļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Unix BSD āđāļĨāļ°āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ GDB āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļ”āļđāđāļĨāđ‚āļ”āļĒ GDB Steering Committee āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļ—āļĩāđˆāļ–āļđāļ āļ•āļąāđ‰āļ‡āđ‚āļ”āļĒāļĄāļđāļĨāļ™āļīāļ˜āļīāļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđ€āļŠāļĢāļĩ (FSF) āđ‚āļ”āļĒ GDB āļˆāļ°āļ—āļģāļ‡āļēāļ™āđƒāļ™āđāļšāļšāļāļēāļĢāļžāļīāļĄāļžāđŒāļ„āļģāļŠāļąāđˆāļ‡ (command line) 118 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 119. āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­ Console āđāļ•āđˆāļ–āđ‰āļēāļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļĢāļēāļŸāļŸāļīāļ (GUI) āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļ§āđˆāļē DDD āđāļ—āļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ‚āļ­āļ‡ GDB āļ­āļĩāļāļ•āđˆāļ­āļŦāļ™āļķāđˆāļ‡ āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ™āļģāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Buildroot āļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ›āļĢāļ°āļāļ­āļšāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āļāļąāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ—āļĩāđˆāļĄāļĩāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āļšāļ­āļĢāđŒāļ” Target (ARM) Pre-compiled Toolchain Openssh source BusyBox source DirectFB source specic Library source Kernel source gcc binutils gdb Libc Target File System Openssh BusyBox Specic Library DirectFB Application Kernel Image āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host (x86) Toolchain Openssh headers & lib DirectFB headers & lib Specic Library headers & lib gcc gdb binutils Libc Host's utilities āđ€āļŠāđˆāļ™ pkg-cong.. Buildroot InputOutput āļĢāļđāļ›āļ—āļĩāđˆ 3.10 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒ Buildroot 119 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 120. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļšāļ™ Embedded Linux āđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ„āļ›āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target āļ āļēāļĒāđƒāļ•āđ‰ Embedded Linux āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host) Tools āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target) Compiler Debugger IDE āđ‚āļ›āļĢāđāļāļĢāļĄ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ Kernel āđ‚āļ›āļĢāđāļāļĢāļĄ Bootloader āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ„āļĨāļšāļĢāļēāļĢāļĩ āļĢāļđāļ›āļ—āļĩāđˆ 3.11 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŠāļģāļ„āļąāļāļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Target 1) āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Cross-compiling toolchains āđ€āļžāļ·āđˆāļ­āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆ āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 2) āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Bootloader āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāđˆāļēāļĒāđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡āđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļ•āļąāļ§ bootloader āļˆāļ°āđ‚āļŦāļĨāļ”āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļŠāļ–āļēāļ™āļ° āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āđāļĨāđ‰āļ§āļˆāļķāļ‡āļˆāļ°āđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļĨāļģāļ”āļąāļšāļ•āđˆāļ­āđ„āļ› 3) āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰ āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ‚āļ”āļĒāđ„āļ”āđ‰āļšāļĢāļĢāļˆāļļāļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ device drivers āđāļĨāļ°āļšāļĢāļīāļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ 4) Filesystem āļŦāļĢāļ·āļ­āļ­āļēāļˆāđƒāļŠāđ‰āļ„āļģāļ§āđˆāļē Root le system āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ° āļ„āļģāļŠāļąāđˆāļ‡āļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨ 120 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 121. āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļŠāđˆāļ™āļ•āļąāļ§ Ubuntu āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđƒāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē Ubuntu āļˆāļ°āļĄāļĩāļāļēāļĢ āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļāđˆāļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļ”āļąāļšāļ­āļĒāļđāđˆāļšāđ‰āļēāļ‡āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄāļ—āļĩ āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļžāļąāļ’āļ™āļē āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ•āđ‰āļ­āļ‡āļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļ·āđˆāļ™āđ† āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ‚āđ‰āļēāđ„āļ› āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ auto- conf automake libtool libncurses5-dev ncurses-dev bison flex patch curl cvs texinfo build-essential subversion python-dev texi2html nfs-kernel-server tftp minicom gtkcom āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ™āļąāđ‰āļ™āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđˆāļŠāļīāļ—āļ˜āļīāđŒ super user (āļŦāļĢāļ·āļ­ root) āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē (Conguration) āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ (Make) āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļāļĢāļ“āļĩāļāđ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļ™āļ° root āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ device node āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™ root le systems (āļ„āļģāļŠāļąāđˆāļ‡ mknode) āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļžāļīāđˆāļĄ āđ€āļ•āļīāļĄāļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ APT āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļšāļĢāļīāļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (/etc/init.d/nfs-kernel-server, /etc/init.d/networking)āļŦāļĢāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ/āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāļ™āļ­āļ (make in- stall) āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļŠāļīāļ—āļ˜āļīāđŒ root āļ™āļąāđ‰āļ™āļāđ‡āđ€āļĢāļīāđˆāļĄāļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļ™āđ‰āļ­āļĒāļĨāļ‡āđ€āļĢāļ·āđˆāļ­āļĒāđ† āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļĢāļīāđˆāļĄāļĄāļĩāļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāđˆāļ§āļĒ āļ­āļģāļ™āļ§āļĒāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļšāļšāļāļķāđˆāļ‡āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›āđƒāļŦāđ‰āđƒāļŠāđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Buil- droot, CodeSourcery (Sourcery G++ Lite), Linaro, crossTool NG āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ›āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđƒāļŦāđ‰āļāļąāļš Ubuntu $ sudo apt-get install autoconf automake libtool libncurses5-dev ncurses-dev bison flex patch curl cvs texinfo build-essential subver- sion python-dev g++ gcc texi2html nfs-kernel-server tftp minicom gtkterm āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ”āđ‰āļ§āļĒ Buildroot āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ wget http://buildroot.uclibc.org/downloads/buildroot-2013.05.tar.gz $ tar -xzvf buildroot-2013.05.tar.gz $ cd buildroot-2013.05/ $ make menuconfig 121 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 122. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļ·āđˆāļ­āļ§āđˆāļē Sourcery G++ Lite āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6490/public/ar m-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi.bin $ chmod 755 arm-2010q1-202-arm-none-linux-gnueabi.bin $ ./arm-2010q1-202-arm-none-linux-gnueabi.bin āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ”āđ‰āļ§āļĒ Croostool-NG āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ mkdir -p ctool-ng $ cd ctool-ng/ 122 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 123. $ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.18.0.tar.bz2 $ tar -xjvf crosstool-ng-1.18.0.tar.bz2 $ cd crosstool-ng-1.18.0/ $ ./configure $ make $ sudo make install $ ct-ng list-samples $ ct-ng arm-unknown-linux-gnueabi $ ct-ng menuconfig TOOLCHAIN OPTIONS āļ—āļĩāđˆāļŠāļģāļ„āļąāļ āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ toolchain āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļŠāļģāļ„āļąāļāļ„āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē ABI (Application Binary Interface) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— ARM āļĢāđˆāļ§āļĄāļāļąāļš āļšāļĢāļīāļĐāļąāļ—āļžāļąāļ™āļ˜āļĄāļīāļ•āļĢ āđ‚āļ”āļĒāļ—āļĩāđˆ ABI āļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĢāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļāļąāļ™āđ€āļ­āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļŸāļĨāđŒ āļāļēāļĢāļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§ āđ€āļĄāđ‰āļ™āļ•āđŒ/āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļŠāļ•āđ‡āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļŠāļ™āļīāļ” ABI āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļˆāļ°āļ™āļīāļĒāļĄāđƒāļŠāđ‰ ABI āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē EABI (Embedded Application Binary Interface) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Floating Point āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļšāļēāļ‡ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļš ïŽ‚oating point āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļ•āđˆāļšāļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļēāļˆāļˆāļ° 123 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 124. āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ­āļ‡āļĢāļąāļš (āđ„āļĄāđˆāļĄāļĩ Floating Point Unit - FPU) āđāļ•āđˆāļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđƒāļŠāđ‰āļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“ ïŽ‚oating point āđƒāļ™āļĢāļ°āļ”āļąāļšāļ‹āļ­āļŸāļ—āđŒāđāļ§āļĢāđŒāđāļ—āļ™ āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARMv4 āđāļĨāļ° āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARMv5 āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļē āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļš ïŽ‚oating point āļ•āļąāļ§ toolchain āđ€āļ­āļ‡āļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ hard oat code āđ€āļžāļ·āđˆāļ­ āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ ïŽ‚oating point āđƒāļŦāđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļ”āđ‰āļ§āļĒāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ -mfloat-abi=hard āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩ FPU āļāđ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļ›āđ‡āļ™ -mfloat-abi=softfp āđāļ—āļ™āđāļĨāļ°āļŠāļļāļ”āļ—āđ‰āļēāļĒāđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļāđ‡ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡āļāļąāļšāļĢāļļāđˆāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ† āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļļāđˆāļ™ ARM Core āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰ -march=armv7 -mcpu=cortex-a8 Bootloaders bootloader āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāđƒāļŦāđ‰ āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™ (Hardware Initialization) āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (DRAM) āđāļĨāļ° MMC Controller āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āļĄāļēāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” Kernel image (bzImage, zImage) āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđāļĨāļ°āđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (āđ€āļŠāđˆāļ™ MMC/SD card, NAND Flash, USB Storage āļŦāļĢāļ·āļ­āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ tftp NFS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡ āļˆāļ°āļ—āļģāļāļēāļĢāđāļ•āļāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļšāļ™āļēāļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Kernel image āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ āđ€āļžāļ·āđˆāļ­āļ™āļģāđ„āļ›āđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™ āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™ (RAM) āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļ·āđˆāļ™āđ† āđ€āļŠāđˆāļ™ āļžāļ­āļĢāđŒāļ• Ethernet āļŦāļĢāļ·āļ­ āļžāļ­āļĢāđŒāļ• USB āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Bootloader āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ„āļ­āļ™āđ‚āļ‹āļĨ (console) āđ€āļžāļ·āđˆāļ­ āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰ āđ€āļŠāđˆāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļŦāļĢāļ·āļ­āļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ āļēāļĒāđƒāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āđ€āļŦāđ‡āļ™āļ āļēāļžāļĄāļēāļāļ‚āļķāđ‰āļ™āļˆāļķāļ‡āļ‚āļ­āļŠāļĢāļļāļ›āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ bootloader āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļē āļĢāļ°āļšāļšāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ (āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ—āļĩāđˆ 3.12 āđāļĨāļ° 3.13) 1.āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ­āđˆāļēāļ™āļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ ROM āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđāļĨāļ° āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ—āļģāļ•āļēāļĄāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ 2.āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļ āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļŦāļ™āđˆāļ§āļĒ āļ„āļ§āļēāļĄāļˆāļģ (SDRAM Controller) āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ (MMC Controller) āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄ āļ­āļīāļ™āļžāļļāļ—/āđ€āļ­āļēāļ—āđŒāļžāļļāļ— (I/O Controllers) āđāļĨāļ° āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ (Graphics Controllers) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 3.āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđ‚āļ”āļĒāļāļēāļĢāļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđƒāļŦāđ‰āļāļąāļš āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļ„āļ§āļšāļ„āļļāļĄāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™ āđāļĨāļ°āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆ āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ 124 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 125. 4.āđ€āļĄāļ·āđˆāļ­āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđāļĨāđ‰āļ§ āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ° āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļŠāđˆāļ§āļ™āļ—āļĩāđˆāđ€āļŦāļĨāļ·āļ­āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆ āđ€āļŦāļĨāļ·āļ­āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē root le system āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļŠāļ„āļĢāļīāļ›āļ—āđŒ āđ„āļĨāļšāļĢāļēāļĢāļĩ āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ€āļ­āļēāđ„āļ§āđ‰ 5.āđ€āļĄāļ·āđˆāļ­ root le system āļ–āļđāļāđ‚āļŦāļĨāļ”āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļāđ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ (le system) āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ (process) āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāļĨāļģāļ”āļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (process scheduling) āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļšāļŠāļģāļŦāļĢāļąāļš āļœāļđāđ‰āđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē Flash SDRAM āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ ROM āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡ 1 st Boot: (ROM boot) - āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡, āļ•āđāļēāđāļŦāļ™āđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ- āļˆāđāļēāļ•āđˆāļēāļ‡āđ† āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ - āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē Flash āđ„āļ›āļĒāļąāļ‡ SDRAM - āđ€āļĢāļĩāļĒāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ SDRAM 2 nd Boot: (Boot loader) - āļ—āđāļēāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡, āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļšāļąāļŠ, āļ‚āļ™āļēāļ”āļšāļąāļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ - āļ„āđ‰āļ™āļŦāļēāđ€āļžāļ·āđˆāļ­āļ•āļąāđ‰āļ‡āļ„āđˆāļē āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡ - āļĢāļąāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāļāļēāļĢāļšāļđāļ• (boot script) āđāļĨāļ°āļĢāļąāļ™āļ„āļ­āļ™āđ‚āļ‹āļĨ āļĢāļđāļ›āļ—āļĩāđˆ 3.12 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļšāļđāļ—āļĢāļ°āļšāļš āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Kernel Initialisation) Bootloader āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļš āļĨāđˆāļēāļ‡ (āļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ) āđāļĨāđ‰āļ§ āļ—āđāļēāļāļēāļĢāđ‚āļŦāļĨāļ” Kernel āļ‚āļķāđ‰āļ™ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļē āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡ Kernel init process āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢ āđ€āļ‹āļŠāļĢāļ°āļšāļš āđāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™ āļĢāļ°āļ”āļąāļš user-space āļĢāļđāļ›āļ—āļĩāđˆ 3.13 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡ Linux Kernel āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡ bootloader āļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰ OMAP3 SoC āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— TI āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 125 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 126. ROM Code āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ ROM (āļ āļēāļĒāđƒāļ™ CPU) X-Loader āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND āļŦāļĢāļ·āļ­ MMC āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ” āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM U-Boot āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND āļŦāļĢāļ·āļ­ MMC āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ” āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM Linux Kernel āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ NAND, MMC āļŦāļĢāļ·āļ­ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­ āļ‚āđˆāļēāļĒ āđāļĨāļ°āļ–āļđāļāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āļˆāļēāļ SDRAM ROM Code: āđ€āļāđ‡āļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļ āđāļĨāļ°āļ„āđ‰āļ™āļŦāļē bootstrap image āļˆāļēāļāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ† āđ€āļžāļ·āđˆāļ­ āđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđ‚āļ”āļĒāļ‚āļ™āļēāļ”āđ‚āļ„āđ‰āļ” āļˆāļ°āđ„āļĄāđˆāđ€āļāļīāļ™ 64 KB X-Loader: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ MLO āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ āđ‚āļŦāļĨāļ” bootloader āđ€āļ‚āđ‰āļēāļĄāļēāđƒāļ™ SDRAM āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē āļĢāļ°āļšāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† U-boot: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ u-boot.bin āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ USB, Ethernet āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ‚āļŦāļĨāļ” Kernel image āļˆāļēāļāļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­ āļˆāļēāļāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ‚āļķāđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆ shell āļ‚āļ­āļ‡ bootloader Linux Kernel: āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ zImage āļ–āļđāļāļĢāļąāļ™āļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ‹āļķāđˆāļ‡āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ bootloader āļ­āļĩāļāļ•āđˆāļ­āđ„āļ› āļĢāļđāļ›āļ—āļĩāđˆ 3.14 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ bootloader āļšāļ™ OMAP3 SoC āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ KERNEL IMAGE āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āđāļāđˆ Kernel image (āđ€āļŠāđˆāļ™ bzImage, zImage) āđāļĨāļ° root le system (RFS) āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒ Kernel image āļˆāļ°āļ–āļđāļāļ™āļģāļĄāļēāļšāļĢāļĢāļˆāļļāļĨāļ‡āļ­āļĒāļđāđˆāđƒāļ™ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđ€āļžāļ·āđˆāļ­āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāđ„āļ›āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āđāļ•āđˆāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ Kernel image āđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāļ›āļĢāļ°āļāļ­āļšāļĄāļēāļˆāļēāļāđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ <linux version>/ arch/arm/boot/compressed/ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļœāļĨāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ buildroot āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ—āļĩāđˆāđƒāļŠāđ‰ SoC āļĢāļļāđˆāļ™ Versatile $ ls ~/buildroot/output/build/linux-3.9.4/arch/arm/boot/compressed ashldi3.o head-shark.S misc.c piggy.xzkern.S ashldi3.S head-sharpsl.S misc.o sdhi-sh7372.c atags_to_fdt.c head-shmobile.S mmcif-sh7372.c sdhi-shmobile.c big-endian.S head-xscale.S ofw-shark.c sdhi-shmobile.h decompress.c lib1funcs.o piggy.gzip string.c decompress.o lib1funcs.S piggy.gzip.o string.o head.o libfdt_env.h piggy.gzip.S vmlinux head.S ll_char_wr.S piggy.lzma.S vmlinux.lds head-sa1100.S Makefile piggy.lzo.S vmlinux.lds.in 126 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 127. āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļ›āļĢāļ°āļāļ­āļšāđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļ—āļĩāđˆāļĄāļĩāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āđ‚āļ”āļĒāļ™āļģāļ„āļģāļŠāļąāđˆāļ‡āļ‚āļ­āļ‡āļŠāļļāļ” āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Binutils āļĄāļēāđƒāļŠāđ‰āļ›āļĢāļ°āļāļ­āļšāđƒāļ™āđāļ•āđˆāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļˆāļ™āđ„āļ”āđ‰āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ Kernel image āļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđƒāļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē zImage āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ” vmlinux Image piggy.gz piggy.gzip.S piggy.gzip.o head.o misc.o head-cpu.o decompress.o libfuncs.o vmlinux zImage objcopy gzip as ld objcopy Raw kernel executable (ELF object) Stripped kernel binary (binary object) Compressed kernel binary asm wrapper + bootstrap code composite kernel image (ELF object) kernel image for bootloader (binary object) āļĢāļđāļ›āļ—āļĩāđˆ 3.15 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Kernel Image Linux File Systems VIRTUAL FILESYSTEMS āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļŠāļĄāļ·āļ­āļ™āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļ§āđˆāļē Virtual Filesystem Switch (VFS) āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļŦāļĢāļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāļ°āļšāļš (System Call Interface) āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļœāļđāđ‰āđƒāļŠāđ‰ (user-space) āđāļĨāļ°āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļžāļĒāļēāļĒāļēāļĄ āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āđ€āļŠāļīāļ‡āļĨāļķāļāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āļ™āļąāđ‰āļ™āđ† (āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ Ext3 āđƒāļ™āļŪāļēāļĢāđŒāļ”āļīāļŠāļāđŒ āļŦāļĢāļ·āļ­ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ISO 9660 āđƒāļ™āļ‹āļĩāļ”āļĩāļĢāļ­āļĄ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļ‹āļķāđˆāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš āđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāļ‹āļąāļš āļ‹āđ‰āļ­āļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāļŦāļĨāļēāļāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ‡āđˆāļēāļĒāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ (abstrac- tion layer) āļ‹āļķāđˆāļ‡āļˆāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄ uniform interface āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ”āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ ext3 NTFS (āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ) CDFS (āļ‹āļĩāļ”āļĩāļĢāļ­āļĄ) NFS/CIFS (Network Interface Card) āđāļĨāļ° USBFS (USB Storage) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 127 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 128. āļœāļđāđ‰āđƒāļŠāđ‰ Block layer / Device drivers Abstraction layer ext3 NTFS CDFS NFS/ CIFS USBFS āļĢāļđāļ›āļ—āļĩāđˆ 3.16 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļŠāļąāđ‰āļ™ Virtual Filesystem āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™ (system call functions) āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ read() āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļšāļ•āđŒāļˆāļēāļāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ„āļĄāđˆ āļ•āđ‰āļ­āļ‡āļŠāļ™āđƒāļˆāļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™āđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āđƒāļ” āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļ”āļąāļš kernel-space āđ€āļ­āļ‡āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ§āđˆāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™/āđ€āļ‚āļĩāļĒāļ™āļ­āļĒāđˆāļēāļ‡āđ„āļĢ āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļĄāļēāļ•āļĢāļēāļāļēāļ™āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ™āļąāđ‰āļ™āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ Linux Kernel Virtual File System (VFS) Filesystem drivers Block device drivers āđ‚āļ›āļĢāđāļāļĢāļĄ GNU C Library User-space Kernel-space read() syscall(SYS_read) āļĢāļđāļ›āļ—āļĩāđˆ 3.17 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (system call) āļ‚āļ­āļ‡ Virtual Filesystem āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ (partition) āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆ āļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āļ–āļđāļāđāļšāđˆāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŠāļĄāļ·āļ­āļ™ (logical disk) āļ­āļĒāļđāđˆāļšāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ (physical disk) āđ€āļŠāđˆāļ™ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļŦāļĢāļ·āļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash memory āļ‹āļķāđˆāļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē le system āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 128 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 129. Partition File System Metadata File System Data Flash Memory āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ Partition āļĢāļđāļ›āļ—āļĩāđˆ 3.18 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļŸāļĨāļŠ āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĢāļēāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļšāđˆāļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļĩāđˆāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđƒāļ” āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ āļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‹āļķāđˆāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 90 āļŠāļ™āļīāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ sudo fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000c74 Device Boot Start End Blocks Id System /dev/sda1 * 1 13055 104855552 83 Linux Disk /dev/sdb: 17.2 GB, 17179869184 bytes 255 heads, 63 sectors/track, 2088 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0001e836 Device Boot Start End Blocks Id System /dev/sdb1 1 2089 16775168 82 Linux swap / Solaris āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ„āđˆāļēāļˆāļģāļ™āļ§āļ™ heads āļ—āļĩāđˆ 255 āļšāđˆāļ‡āļ–āļķāļ‡āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļˆāļēāļ™ platters āļŦāļĢāļ·āļ­ disks āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° disk āđ€āļ›āđ‡āļ™ D1, D2, ... D255 āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđāļœāđˆāļ™āļˆāļ°āļĄāļĩ track āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ§āļ‡āļāļĨāļĄāđāļĨāļ°āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ™āļąāļšāļˆāļēāļ āļ§āļ‡āļ™āļ­āļāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ§āļ‡āđƒāļ™āļŠāļļāļ”āļ‹āļķāđˆāļ‡āļĄāļĩāļˆāļģāļ™āļ§āļ™āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 13,054 tracks/disk āđ‚āļ”āļĒāļˆāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđāļ•āđˆāļĨāļ° track āļ§āđˆāļēāđ€āļ›āđ‡āļ™ T1, T2, ...T13054 āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ° track āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ disk āļˆāļ°āļ–āļđāļāđāļšāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ†āđ€āļĢāļĩāļĒāļāļ§āđˆāļē cylinder āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™ āļ•āļģāđāļŦāļ™āđˆāļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ tracks āļ—āļĩāđˆ T2 āļ‚āļ­āļ‡āđāļœāđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ D1, D2, āļ–āļķāļ‡ D255 āļˆāļ°āļĢāļ§āļĄāļāļąāļ™āđ€āļ›āđ‡āļ™ 129 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 130. cylinder C2 āļˆāļēāļāļœāļĨāļĨāļąāļžāļžāļ˜āđŒāļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđāļ•āđˆāļĨāļ° track āļˆāļ°āļĄāļĩ logical sectors āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļ„āļ·āļ­āļĄāļĩāļ„āđˆāļē āđ€āļ—āđˆāļēāļāļąāļš 63 sectors āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āđ€āļ›āđ‡āļ™ S1, S2, ... S63 āļ•āļēāļĄāļĨāļģāļ”āļąāļšāđ‚āļ”āļĒāđāļ•āđˆāļĨāļ° sector āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļ āđ€āļ—āđˆāļēāļāļąāļš 512 bytes       āļĢāļđāļ›āļ—āļĩāđˆ 3.19 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļˆāļēāļ™āđāļĄāđˆāđ€āļŦāļĨāđ‡āļ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰āļ”āđ‰āļ§āļĒāļŠāļđāļ•āļĢāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļˆāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ€āļ—āđˆāļēāļāļąāļš āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ (Byte) = (āļˆāļģāļ™āļ§āļ™ heads āļŦāļĢāļ·āļ­ disks) * (āļˆāļģāļ™āļ§āļ™ tracks āļ•āđˆāļ­ disk) * (āļˆāļģāļ™āļ§āļ™ sectors āļ•āđˆāļ­ track) * (āļˆāļģāļ™āļ§āļ™ bytes āļ•āđˆāļ­ sector āļŦāļĢāļ·āļ­ sector size) āļ•āļąāļ§āļ­āļĒāđˆāđˆāļēāļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ = 255 * 13054 * 63 * 512 = 107,372,805,120 bytes āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ: āļ„āđˆāļēāļ—āļĩāđˆāļ„āļģāļ™āļ§āļ“āļˆāļēāļāļŠāļđāļ•āļĢāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āđ€āļĨāđ‡āļāļ™āđ‰āļ­āļĒāļˆāļēāļāļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļˆāļĢāļīāļ‡ (107,374,182,400 bytes) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļđāļ•āļĢāđ„āļĄāđˆāđ„āļ”āđ‰āļŠāļ™āđƒāļˆāļˆāļģāļ™āļ§āļ™āđ„āļšāļ•āđŒāđƒāļ™āļŠāđˆāļ§āļ™āļ—āđ‰āļēāļĒāļŠāļļāļ”āļ‚āļ­āļ‡ cylinder āļŦāļĢāļ·āļ­āļ„āļ§āļēāļĄāđ„āļĄāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āļŠāđˆāļ§āļ™ cylinder āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ partition_info.c āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>   130 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 131. #define SECTOR_SIZE 512 #define MBR_SIZE SECTOR_SIZE #define MBR_DISK_SIGNATURE_OFFSET 440 #define MBR_DISK_SIGNATURE_SIZE 4 #define PARTITION_TABLE_OFFSET 446 #define PARTITION_ENTRY_SIZE 16 // sizeof(PartEntry) #define PARTITION_TABLE_SIZE 64 // sizeof(PartTable) #define MBR_SIGNATURE_OFFSET 510 #define MBR_SIGNATURE_SIZE 2 #define MBR_SIGNATURE 0xAA55 #define BR_SIZE SECTOR_SIZE #define BR_SIGNATURE_OFFSET 510 #define BR_SIGNATURE_SIZE 2 #define BR_SIGNATURE 0xAA55   typedef struct {     unsigned char boot_type; // 0x00 - Inactive; 0x80 - Active (Bootable)     unsigned char start_head;     unsigned char start_sec:6;     unsigned char start_cyl_hi:2;     unsigned char start_cyl;     unsigned char part_type;     unsigned char end_head;     unsigned char end_sec:6;     unsigned char end_cyl_hi:2;     unsigned char end_cyl;     unsigned long abs_start_sec;     unsigned long sec_in_part; } PartEntry;   typedef struct {     unsigned char boot_code[MBR_DISK_SIGNATURE_OFFSET];     unsigned long disk_signature;     unsigned short pad;     unsigned char pt[PARTITION_TABLE_SIZE];     unsigned short signature; } MBR;   void print_computed(unsigned long sector) {     unsigned long heads, cyls, tracks, sectors;       sectors = sector % 63 + 1 /* As indexed from 1 */;     tracks = sector / 63;     cyls = tracks / 255 + 1 /* As indexed from 1 */;     heads = tracks % 255;     printf("(%3d/%5d/%1d)", heads, cyls, sectors); }   int main(int argc, char *argv[]) {     char *dev_file = "/dev/sda";     int fd, i, rd_val;     MBR m; 131 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 132.     PartEntry *p = (PartEntry *)(m.pt);     if (argc == 2) {         dev_file = argv[1];     }     if ((fd = open(dev_file, O_RDONLY)) == -1) {         fprintf(stderr, "Failed opening %s: ", dev_file);         perror("");         return 1;     }     if ((rd_val = read(fd, &m, sizeof(m))) != sizeof(m)) {         fprintf(stderr, "Failed reading %s: ", dev_file);         perror("");         close(fd);         return 2;     }     close(fd);     printf("nDOS type Partition Table of %s:n", dev_file);     printf("  B Start (H/C/S)   End (H/C/S) Type  StartSec    TotSecn");     for (i = 0; i < 4; i++) {         printf("%d:%d (%3d/%4d/%2d) (%3d/%4d/%2d)  %02X %10d %9dn",             i + 1, !!(p[i].boot_type & 0x80),             p[i].start_head,             1 + ((p[i].start_cyl_hi << 8) | p[i].start_cyl),             p[i].start_sec,             p[i].end_head,             1 + ((p[i].end_cyl_hi << 8) | p[i].end_cyl),             p[i].end_sec,             p[i].part_type,             p[i].abs_start_sec, p[i].sec_in_part);     }     printf("nRe-computed Partition Table of %s:n", dev_file);     printf("  B Start (H/C/S)   End (H/C/S) Type  StartSec    TotSecn");     for (i = 0; i < 4; i++) {         printf("%d:%d ", i + 1, !!(p[i].boot_type & 0x80));         print_computed(p[i].abs_start_sec);         printf(" ");         print_computed(p[i].abs_start_sec + p[i].sec_in_part - 1);         printf(" %02X %10d %9dn", p[i].part_type,             p[i].abs_start_sec, p[i].sec_in_part);     }     printf("n");     return 0; } āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ„āļģāļŠāļąāđˆāļ‡ fdisk āļ—āļĩāđˆāđƒāļŠāđ‰āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāđ‰āļ§ āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ­āļ·āđˆāļ™āđ†āđ€āļŠāđˆāļ™ āļ„āļģāļŠāļąāđˆāļ‡ parted āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđƒāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ parted -l Model: VMware, VMware Virtual S (scsi) 132 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 133. Disk /dev/sda: 107GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 107GB 107GB primary ext4 boot Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 17.2GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 17.2GB 17.2GB primary linux-swap(v1) $ cat /etc/fstab # /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc nodev,noexec,nosuid 0 0 /dev/sda1 / ext4 errors=remount-ro 0 1 /dev/sdb1 none swap sw 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāđ‰āļ§ āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļēāļāļąāļ™āļ„āļ·āļ­ Root le system (RFS) āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļŠāļļāļ” āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āđ‚āļ”āļĒ RFS āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāļšāļąāļ™āļ—āļķāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ” āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļ–āļđāļāļˆāđˆāļēāļĒāđ„āļŸāđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āļ•āļąāļ§āđ€āļ­āļ‡āļ‚āļķāđ‰āļ™āļ•āļąāļ§ bootloader āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ ROM āļāđ‡āļˆāļ° āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ Kernel image āļ‚āļķāđ‰āļ™āļŠāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM) āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ Kernel āļˆāļ°āļ—āļģāļāļēāļĢ āđ‚āļŦāļĨāļ” RFS āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļšāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš āļ‹āļķāđˆāļ‡āļ•āļąāļ§ āļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ­āļĒāļđāđˆāļŦāļĨāļąāļāđ† 2 āđāļšāļšāļ„āļ·āļ­ āđāļšāļš Block āđāļĨāļ° āđāļšāļš Flash āđāļšāļš Block āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļĨāļ‡āđ„āļ›āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĨāļšāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļāļēāļĢ āđ€āļ‚āļĩāļĒāļ™āļ‹āđ‰āļģ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļšāļš Block āđ„āļ”āđ‰āđāļāđˆ āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠ āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđāļšāļšāļ­āđˆāļ­āļ™ (oppy disk) āđāļĨāļ° āļ”āļīāļŠāļāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM disk) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Flash āļ—āļĩāđˆāđƒāļŠāđ‰āļ§āļīāļ˜āļĩ āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Block āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Compact Flash, Smart Media, Memory Stick, Multimedia Card , Flash Drive, MMC/SD card āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš Flash āđ€āļŠāđˆāļ™ NOR ash āļŦāļĢāļ·āļ­ NAND ash āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ”āļīāļĄāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› āđ‚āļ”āļĒāļ•āļąāļ§ NOR ash āļ™āļąāđ‰āļ™āļˆāļ°āļ—āļ™āļ•āđˆāļ­āļāļēāļĢāļĨāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“ 10,000 āļ„āļĢāļąāđ‰āļ‡ āļ‹āļķāđˆāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ 133 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 134. āļˆāļ°āđ€āļĢāđ‡āļ§ āđāļ•āđˆāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđāļĨāļ°āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļŠāđ‰āļē āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļķāļ‡āđ€āļŦāļĄāļēāļ°āļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāđƒāļŠāđ‰āđāļ—āļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ āļˆāļģ ROM āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āļŦāļĢāļ·āļ­āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļšāđˆāļ­āļĒāđ† āđ€āļŠāđˆāļ™ BIOS (Basic Input/Output System) āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ, āđ€āļāđ‡āļšāđ€āļŸāļīāļĢāđŒāļĄāđāļ§āļĢāđŒ (rmware) āļšāļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āđāļĨāļ°āđ€āļāđ‡āļš bootloader āļ āļēāļĒāđƒāļ™ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ NAND ash āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ—āđ‚āļ•āļŠāļīāļšāļē āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1989 āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĨāļšāđāļĨāļ° āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āļāļ§āđˆāļē āļŠāļīāļžāļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļāļ§āđˆāļē āļ„āļ§āļēāļĄāļˆāļļāļŠāļđāļ‡āļāļ§āđˆāļēāđāļĨāļ°āļĄāļĩāļĢāļēāļ„āļēāļ•āđˆāļģāļāļ§āđˆāļēāļ•āļąāļ§ NOR ash āļ™āļ­āļāļˆāļēāļ āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āļāļ§āđˆāļēāļ–āļķāļ‡āļŠāļīāļšāđ€āļ—āđˆāļē āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāđ‰āļēāļāļ§āđˆāļēāđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ•āđˆāļĨāļ°āđ„āļšāļ•āđŒāđƒāļ™āļĢāļđāļ›āđāļšāļš āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš (random access) āđāļĨāļ°āļ­āļēāļˆāļĄāļĩāđ‚āļ­āļāļēāļŠāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļĢāļ°āļ”āļąāļšāļšāļīāļ•āļŠāļđāļ‡āļāļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒ NOR Flash āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļ•āđˆāļĨāļ°āļŠāļ™āļīāļ”āļˆāļ°āļĄāļĩāļ§āļīāļ˜āļĩāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļŠāļđāļāļŦāļēāļĒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļĄāļąāļĒāļāđˆāļ­āļ™ (Traditional BLock Filesystems) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļāļīāļ”āļāļēāļĢāļœāļīāļ”āļžāļĨāļēāļ”āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđāļšāļš āļāļĢāļ°āļ—āļąāļ™āļŦāļąāļ™ āļĢāļ°āļšāļšāļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (State) āļ‚āļ“āļ°āļāđˆāļ­āļ™āļ›āļīāļ”āļĢāļ°āļšāļšāđ„āļ”āđ‰ āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ‹āđˆāļ­āļĄāđāļ‹āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ ext2 (Linux lesystem), vfat (Windows lesystem) āļ•āđˆāļēāļ‡āđ† āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ‹āđˆāļ­āļĄāđāļ‹āļĄāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđ„āļ”āđ‰āđāļāđˆāļ„āļģāļŠāļąāđˆāļ‡ fsck.ext2 āļŦāļĢāļ·āļ­ fsck.vat āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđāļ•āđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ‰āļĨāļēāļ”āļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” Journaled Filesystems āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāļ–āļđāļ āļ•āđ‰āļ­āļ‡āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđāļšāļšāļāļĢāļ°āļ—āļąāļ™āļŦāļąāļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ§āļīāļ˜āļĩāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļŠāļ–āļēāļ™āļ° āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĨāļ‡āđƒāļ™ Journal āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨ entry āļĨāļ‡āđƒāļ™ journal āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļŸāļĨāđŒ āļĨāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ entry āļ āļēāļĒāđƒāļ™ journal āđ‚āļ›āļĢāđāļāļĢāļĄ User-space Kernel-space āļĢāļđāļ›āļ—āļĩāđˆ 3.20 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡ journal 134 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 135. āđ€āļĄāļ·āđˆāļ­āļĢāļ°āļšāļšāļāļĨāļąāļšāļĄāļēāļ—āļģāļ‡āļēāļ™āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš Journal āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš journal āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļŸāļĨāđŒāļāđˆāļ­āļ™ āļ—āļĩāđˆāļĢāļ° āļšāļšāļ›āļīāļ”āļ—āļģāļ‡āļēāļ™āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰āļ§āđˆāļēāļĄāļĩāļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ–āđ‰āļēāļĄāļĩāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļāļđāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļŠāļĩāļĒāļŦāļēāļĒāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āļāļĨāļąāļšāļ„āļ·āļ™āļĄāļēāļ”āđ‰āļ§āļĒ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡ āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļĩāļŠāļ•āļēāļĢāđŒāļ— āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Journal āļ§āđˆāļēāļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆ? āļĨāļ°āļ—āļīāđ‰āļ‡āļŠāđˆāļ§āļ™ journal entries āļ—āļĩāđˆāđ„āļĄāđˆāļŠāļĄāļšāļđāļĢāļ“āđŒ āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ journal Filesystem OK No Yes āļĢāļđāļ›āļ—āļĩāđˆ 3.21 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ journal āđƒāļ™āļ‚āļ“āļ°āļšāļđāļ—āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ‹āļķāđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĄāļēāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš ext3 āđāļĨāļ° ext4 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđāļšāļš journal āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļāļˆāļēāļ ext2 āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš journal āđāļĨāļ° āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļˆāļļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļđāļ‡āļ‚āļķāđ‰āļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ° āļ‹āđˆāļ­āļĄāđāļ‹āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ•āļąāļ§āđ€āļ­āļ‡āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ e2fsck āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ sudo e2fsck /dev/sda1 e2fsck 1.41.11 (14-Mar-2010) /dev/sda1 is mounted. WARNING!!! The filesystem is mounted. If you continue you ***WILL*** cause ***SEVERE*** filesystem damage. Do you really want to continue (y/n)? āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļ›āļīāļ”āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext3 āđāļĨāļ° ext4 āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2008 āļ™āļēāļĒ Theodore Ts'o āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext2 ext3 āđāļĨāļ° ext4 āđ„āļ”āđ‰āđƒāļŦāđ‰āļ„āļ§āļēāļĄāđ€āļŦāđ‡āļ™āļ§āđˆāļēāđƒāļ™āļ­āļ™āļēāļ„āļ• āļ­āļąāļ™āđƒāļāļĨāđ‰āļ™āļĩāđ‰āļ­āļēāļˆāļˆāļ°āļĄāļĩāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ•āļąāļ§āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļ”āđāļ—āļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē Btrfs (B-tree lesystem) āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļšāļĢāļīāļĐāļąāļ— Oracle āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļąāđ‰āļ‡ ext3 āđāļĨāļ° ext4 āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļāđˆāļēāļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ­āļ™āļēāļ„āļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž (reliability) āļ„āļ§āļēāļĄ āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ‚āļĒāļēāļĒāļ•āļąāļ§ (scalability) āđāļĨāļ°āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢ 135 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 136. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ext2, ext3, ext4 āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ mkfs.ext<āļŦāļĄāļēāļĒāđ€āļĨāļ‚> āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ empty lesystem $ mkfs.ext2 /dev/hda3 $ mkfs.ext3 /dev/sda2 $ mkfs.ext4 /dev/sda3 āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļģāļŦāļĢāļąāļšāđ„āļŸāļĨāđŒ image āđ€āļ”āļīāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ $ mkfs.ext2 disk.img āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļđāļ›āđāļšāļšāđ„āļŸāļĨāđŒ image āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ # dd if=/dev/zero of=rootfs.image bs=1MB count=1024 1024+0 records in 1024+0 records out 1024000000 bytes (1.0 GB) copied, 15.3415 s, 66.7 MB/s # mkfs.ext3 rootfs.image mke2fs 1.41.11 (14-Mar-2010) rootfs.image is not a block special device. Proceed anyway? (y,n) y Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 62592 inodes, 250000 blocks 12500 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=260046848 8 block groups 32768 blocks per group, 32768 fragments per group 7824 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 25 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. # mkdir /mnt/rootfs # mount rootfs.image /mnt/rootfs/ -o loop # rsync -a ~/busybox/_install/ /mnt/rootfs/ # chown -R root:root /mnt/rootfs/ # sync # umount /mnt/rootfs 136 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 137. āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ /mnt/rootfs/ āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™ rootfs.image āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ­āļĒāļēāļāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļāļ­āļšāđ€āļ›āđ‡āļ™ rootfs āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩ āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ rootfs āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩāđāļĨāđ‰āļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” device āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ rootfs āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ mkdir ~/rootfs $ cd ~/rootfs $ mkdir bin dev etc lib proc sbin tmp usr var $ chmod 1777 tmp $ mkdir usr/{bin,lib,sbin} $ mkdir var/{lib,lock,log,run,tmp} $ chmod 1777 var/tmp # cd dev/ # mknod -m 600 mem c 1 1 // Physical memory access # mknod -m 666 null c 1 3 // Null device # mknod -m 666 zero c 1 5 // Null byte source # mknod -m 644 random c 1 8 // Nondeterministic rnd nbr # mknod -m 600 tty0 c 4 0 // Current virtual console # mknod -m 600 tty1 c 4 1 // First virtual console # mknod -m 600 ttyS0 c 4 64 // First UART serial port # mknod -m 666 tty c 5 0 // Current TTY device # mknod -m 600 console c 5 1 // System console $ ln -s /proc/self/fd fd $ ln -s /proc/self/fd/0 stdin $ ln -s /proc/self/fd/1 stdout $ ln -s /proc/self/fd/2 stderr Embedded Linux File System āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļˆāļģāļ™āļ§āļ™āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļš ïŽle system āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ‚āļ”āļĒ āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļšāļš Flash āļ‹āļķāđˆāļ‡āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļ™āļīāļ” NOR Flash āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ device driver āļˆāļ°āļ–āļđāļāļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļœāđˆāļēāļ™āļ•āļąāļ§ MTD Drivers 137 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 138. Root File System JFFS2 CRAMFS RAMFS MTD Drivers NOR Flash RAM User-space Kernel-space Hardware āļĢāļđāļ›āļ—āļĩāđˆ 3.22 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ MTD driver āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ°āđ€āļˆāļ­āļāļąāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē initrd (initial RAM disk) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļšāļĩāļšāļ­āļąāļ” (compressed lesystem) āđ‚āļ”āļĒāđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āļ­āļ‡āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ initrd āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļ”āđ‰āļ§āļĒāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļēāļĢāđƒāļ™āļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļĒāđˆāļ­āđƒāļŦāđ‰ āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļ™āļģāđ„āļ›āļšāļĢāļĢāļˆāļļāļĨāļ‡āđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđāļšāļšāļ­āđˆāļ­āļ™ (oppy disk) āđ„āļ”āđ‰āđāļĨāļ°āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļšāļđāļ—āđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āđ€āļ•āđ‡āļĄāļĨāļ‡āđƒāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ‹āļķāđˆāļ‡āļŦāļĨāļąāļ‡āļˆāļēāļāļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 2.6 āđ„āļ”āđ‰āļ–āļđāļāļ›āļĨāđˆāļ­āļĒ āļ­āļ­āļāļĄāļē āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ initrd āļāđ‡āđ„āļ”āđ‰āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļ™āļŠāļ·āđˆāļ­āđƒāļŦāļĄāđˆāļ§āđˆāļē “initramfs” (Initial RAM FileSystem) āļ‹āļķāđˆāļ‡āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļˆāļ°āļžāļšāđ€āļŦāđ‡āļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđāļœāđˆāļ™ Live CD (āđ€āļŠāđˆāļ™ Knoppix āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļˆāļ™āļ–āļķāļ‡āļāļēāļĢāļ—āļģ Live USB āļāļąāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡ Live CD āļŦāļĢāļ·āļ­ Live USB āļ™āļąāđ‰āļ™āđ‚āļ”āļĒāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļĒāđˆāļ­āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ‚āļŦāļĨāļ”āļ‚āļķāđ‰āļ™āļĄāļē āļ­āļĒāļđāđˆāļšāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (DDRAM) āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđƒāļ”āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĨāļ‡āđƒāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāļœāđˆāļēāļ™āđ€āļĄāļ™āļđāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ 138 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 139. āļĢāļđāļ›āļ—āļĩāđˆ 3.23 āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļāļēāļĢāļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļāļēāļĢāđƒāļŠāđ‰ Live CD āļ™āļąāđ‰āļ™āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļŦāļĨāļēāļĒāļ­āļĒāđˆāļēāļ‡āļāļĨāđˆāļēāļ§āļ„āļ·āļ­āļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡ initramfs āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļ‚āļ™āļēāļ”āđ„āļĄāđˆāđ€āļāļīāļ™ āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āđāļœāđˆāļ™ CD-ROM āļ—āļąāđˆāļ§āđ„āļ›āļ‹āļķāđˆāļ‡āļĄāļĩāļ‚āļ™āļēāļ” 700 MB āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ” āđƒāļŦāļāđˆāļ‚āļķāđ‰āļ™ Live USB āļˆāļķāļ‡āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļŠāļļāļ”āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŦāļĢāļ·āļ­āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” cramfs cramfs āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđ€āļ­āļēāđ„āļ§āđ‰ āđāļĨāļ°āļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Linus Torvalds āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļāđ‡āđ„āļ”āđ‰āļ–āļđāļāļšāļĢāļĢāļˆāļļāļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ° āđāļĒāļāđ€āļ›āđ‡āļ™ āđ€āļžāļˆ (page) āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ„āļĄāđˆāđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļš (random access) āļ‚āđ‰āļ­āļ”āļĩ āļ‚āļ­āļ‡āļāļēāļĢāļ—āļģāđƒāļŦāđ‰āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ‚āļ­āļ‡ cramfs āļ™āļąāđ‰āļ™āļ„āļ·āļ­āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļ™āđˆāļēāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āļ‚āļ­āļ‡āļĢāļ°āļšāļš āđ€āļžāļĢāļēāļ°āļˆāļ°āđ„āļĄāđˆāļĄāļĩāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāđ„āļŸāļĨāđŒāļĢāļ°āļšāļšāđ€āļŠāļĩāļĒāļŦāļēāļĒāļŦāļĢāļ·āļ­āļŠāļđāļāļŦāļēāļĒāļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™ 139 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 140. āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ramfs ramfs āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒ Linus Torvalds āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļķāđ‰āļ™āđ„āļ§āđ‰āđƒāļ™ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (RAM) āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āļ­āļĒāļđāđˆāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash āđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰ āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” initrd āļŦāļĢāļ·āļ­ initramfs āļ—āļĩāđˆāļ–āļđāļāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ•āļēāļĒāļ•āļąāļ§āđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” jffs2 jffs2 āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļĒāļ­āļ”āļ™āļīāļĒāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™/āļ­āđˆāļēāļ™ āđāļĨāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđƒāļ™āļĢāļđāļ›āđāļšāļš journalling ash lesystem āđ‚āļ”āļĒāļ•āļąāļ§ jffs2 āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” Flash memory āļĄāļēāļāļāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” RAM āđ€āļžāļĢāļēāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” ramfs āđāļ•āđˆāļˆāļ°āļĄāļĩāļ‚āđ‰āļ­āļ”āļĩāļ—āļĩāđˆāļŠāļģāļ„āļąāļ āļ­āļĩāļāļ­āļĒāđˆāļēāļ‡āļ„āļ·āļ­āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ jffs2 āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļāļđāđ‰āļ„āļ·āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ‚āļ“āļ°āđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™ ext2/ext3 āļ•āļēāļĢāļēāļ‡ 3.3 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ FILE SYSTEM WRITE PERSISTENT POWER DOWN RE- LIABILITY COMPRES- SION LIVES IN RAM CRAMFS No No N/A Yes No JFFS2 Yes Yes Yes Yes No RAMFS Yes Yes Yes No Yes YAFFS2 Yes Yes Yes No No Ext2 over NFTL Yes Yes No No No Ext3 over NFTS Yes Yes Yes No No Ext2 over RAM disk Yes No No No Yes MEMORY TECHNOLOGY DEVICES (MTD) MTD āđ€āļ›āđ‡āļ™āļŠāļīāļŸāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļš ïŽ‚ash āļ—āļĩāđˆāļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļēāļ NAND/NOR ash āļ—āļĩāđˆāļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļš āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ–āļđāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļšāđˆāļ­āļĒ (non-volatile data) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđ„āļŸāļĨāđŒ boot image āđāļĨāļ°āđ€āļāđ‡āļšāļ„āđˆāļē cong āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ bootloader āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ” ïŽ‚ash āđāļ•āđˆāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ” ïŽ‚ash āđ€āļŠāđˆāļ™ USB sticks, MMC/SD cards āđ€āļžāļĢāļēāļ°āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđāļšāđˆāļ‡āđ€āļ›āđ‡āļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ„āļ”āđ‰ āđ€āļŦāļĄāļ·āļ­āļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āđāļ•āđˆāļāđ‡āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒāđāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (RAM) āđƒāļ™āļŦāļĨāļēāļĒāđ†āļ”āđ‰āļēāļ™āļ‹āļķāđˆāļ‡ āļˆāļļāļ”āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒ āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ–āļđāļāļĨāļšāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļ› (āļ—āļĩāđˆāļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļāļąāļ™āļ§āđˆāļē erase-block) 140 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 141. āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļģāļ™āļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļāđ‡āļˆāļģāļāļąāļ”āļˆāļģāļ™āļ§āļ™āļ„āļĢāļąāđ‰āļ‡āđ€āļžāļĩāļĒāļ‡ 1,000 āļ–āļķāļ‡ 10,000 āļ„āļĢāļąāđ‰āļ‡ āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļāđ‡āļĒāļąāļ‡āļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āļŦāļĨāļąāļāđ†āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļš bootloaders āđāļĨāļ° Kernel image āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ‚āļ”āļĒāļ­āđˆāļēāļ™āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ /proc/mtd $ cat /proc/mtd dev:  size    erasesize name mtd0: 000a0000 00020000 "misc" mtd1: 00420000 00020000 "recovery" mtd2: 002c0000 00020000 "boot" mtd3: 0fa00000 00020000 "system" mtd4: 02800000 00020000 "cache" mtd5: 0af20000 00020000 "userdata" āļĢāļđāļ›āđāļŠāļ”āļ‡āļāļēāļĢāđāļšāđˆāļ‡āđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD Partition Partition Partition Partition sector sector sector sector āļĢāļđāļ›āļ—āļĩāđˆ 3.24 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ sector āļ āļēāļĒāđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ āļˆāļēāļāļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļ§āđˆāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĨāļšāļāđˆāļ­āļ™āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđƒāļŦāļĄāđˆāļĨāļ‡āđ„āļ› āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ old data new data 1 new data 2 old data new data 1 erased sector old data new data 2 temp buf āļĢāļđāļ›āļ—āļĩāđˆ 3.25 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD 141 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 142. āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđ„āļ›āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļŠāļąāļ‡āđ€āļāļ•āļˆāļēāļāļ”āđ‰āļēāļ™āļ‹āđ‰āļēāļĒāļˆāļ°āļžāļšāļ§āđˆāļēāļŦāļĨāļąāļ‡āļˆāļēāļ āļāļēāļĢāļĨāļšāļ„āļĢāļąāđ‰āļ‡āļĨāđˆāļēāļŠāļļāļ”āļāđ‡āđ€āļĢāļīāđˆāļĄāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ•āļąāļ§āđāļĢāļ (new data 1) āļĨāļ‡āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡ offset āļ—āļĩāđˆāļĻāļđāļ™āļĒāđŒ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ āļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāļ•āļąāļ§āļ–āļąāļ”āļĄāļē (new data 2) āļĨāļ‡āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āđ€āļ”āļīāļĄāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđāļĢāļ āļ•āļąāļ§āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļˆāļ°āļ•āđ‰āļ­āļ‡āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāđˆāļēāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļŠāļļāļ”āđ„āļ›āļžāļąāļāđ„āļ§āđ‰āđƒāļ™āļšāļąāļŸāđ€āļŸāļ­āļĢāđŒāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļāđˆāļ­āļ™ (temp buf) āđāļĨāđ‰āļ§āļˆāļķāļ‡āļŠāļēāļĄāļēāļĢāļ– āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļĨāļšāđ€āļ‹āļāđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ„āđˆāļ­āļĒāļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāđˆāļē (temp buf) āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ (new data 2) āļĄāļēāđ€āļāđ‡āļšāļ•āļēāļĄāļĨāļģāļ”āļąāļš āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđƒāļ™āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡ ïŽ‚ash translation layer (FTL) āđ€āļžāļ·āđˆāļ­āļĨāļ”āļ„āļ§āļēāļĄāļĒāļļāđˆāļ‡āļĒāļēāļāđƒāļ™ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļœāđ‰āļđāđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļ™āļĩāđ‰āđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āđ€āļŠāđˆāļ™ JFFS2 āđāļĨāļ° YAFFS āđ‚āļ”āļĒ āļ—āļąāđ‰āļ‡ JFFS2 āđāļĨāļ° YAFFS le systems āļ™āļąāđ‰āļ™āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™ loopback device āđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ āļ—āļģāļāļēāļĢ mount āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ„āļ”āđ‰ (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ -o loop) āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš linux lesystem āļ—āļąāđˆāļ§āđ„āļ› āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆ āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļšāļš block āļ”āļąāļ‡āļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāđ„āļ›āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āļļāļ›āļāļĢāļ“āđŒ MTF āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ mount āļ•āļąāļ§āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ•āļąāļ§āđ„āļ”āđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” MTD Driver āļŠāļ·āđˆāļ­āļ§āđˆāļē mtdram module āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™ āđ‚āļ”āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ™āļĩāđ‰āļˆāļ°āļ—āļģāļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ‚āļķāđ‰āļ™āļĄāļēāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ™āļĩāđ‰ # modprobe mtdram total_size=65536 erase_size=128 āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ—āļĩāđˆāļ–āļđāļāļˆāļģāļĨāļ­āļ‡āļ‚āļķāđ‰āļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ # cat /proc/mtd dev: size erasesize name mtd0: 04000000 00020000 "mtdram test device" āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ dd āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ jffs2 le system āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ mtdblock0 # dd if=rootfs.jffs2 of=/dev/mtdblock0 mount āļ•āļąāļ§ jffs2 lesystem āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ # mount -t jffs2 /dev/mtd0 ~/rootfs āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ MTD #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> 142 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 143. #include <mtd/mtd-user.h>   int main() {     mtd_info_t mtd_info;     int fd = open("/dev/mtd5", O_RDWR); ioctl(fd, MEMGETINFO, &mtd_info);       printf("MTD type: %un", mtd_info.type);     printf("MTD total size : %u bytesn", mtd_info.size);     printf("MTD erase size : %u bytesn", mtd_info.erasesize);       return 0; } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ MTD unsigned char buf[64]; unsigned char data[7] = { ‘B’, ‘U’, ‘R’, ‘A’ , ‘P’ , ‘H’ , ‘A’ }; /* read something from last sector */ lseek(fd, -mtd_info.erasesize, SEEK_END); read(fd, buf, sizeof(buf)); /* write something to last sector */ lseek(fd, -mtd_info.erasesize, SEEK_END); write(fd, data, sizeof(data)); āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ MTD āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ device āļŠāļ·āđˆāļ­ /dev/mtd0 #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #include <mtd/mtd-user.h> int main() { mtd_info_t mtd_info; // the MTD structure erase_info_t ei; // the erase block structure int i; unsigned char data[20] = { 0xDE, 0xAD, 0xBE, 0xEF, // our data to write 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF }; unsigned char read_buf[20] = { 0x00 }; // empty array for reading int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and // writing. Note you want mtd0 not mtdblock0 // also you probably need to open permissions // to the dev (sudo chmod 777 /dev/mtd0) ioctl(fd, MEMGETINFO, &mtd_info); // get the device info 143 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 144. // dump it for a sanity check, should match what's in /proc/mtd printf("MTD Type: %xnMTD total size: %x bytesnMTD erase size: %x bytesn", mtd_info.type, mtd_info.size, mtd_info.erasesize); ei.length = mtd_info.erasesize; //set the erase block size for (ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length) { ioctl(fd, MEMUNLOCK, &ei); // printf("Eraseing Block %#xn", ei.start); // show the blocks erasing // warning, this prints a lot! ioctl(fd, MEMERASE, &ei); } lseek(fd, 0, SEEK_SET); // go to the first block read(fd, read_buf, sizeof(read_buf)); // read 20 bytes // sanity check, should be all 0xFF if erase worked for (i = 0; i < 20; i++) printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]); lseek(fd, 0, SEEK_SET); // go back to first block's start write(fd, data, sizeof(data)); // write our message lseek(fd, 0, SEEK_SET); // go back to first block's start read(fd, read_buf, sizeof(read_buf)); // read the data // sanity check, now you see the message we wrote! for (i = 0; i < 20; i++) printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]); close(fd); return 0; } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢ EMBEDDED LINUX āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļģāļ‡āļēāļ™āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒāļŦāļĨāļąāļāđ†āđ„āļ”āđ‰āđāļāđˆāđ„āļŸāļĨāđŒ Kernel Image (initrd, vmlinux, bzImage, zImage āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāļ°āđ„āļŸāļĨāđŒ Root le system (ext2/3/4, cramfs, jffs2, hfffs āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āđāļĨāđ‰āļ§āļ™āļģāđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™āļŪāļēāļĢāđŒāļ”āļ”āļīāļŠāļāđŒ āļŦāļĢāļ·āļ­ USB Storage â€Ģ root=/dev/sdXY āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŠāļ·āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ° Y āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™ root=/dev/sdb2 (āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 2 āļ‚āļ­āļ‡āļ”āļīāļŠāļāđŒāļ—āļĩāđˆ 2) â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ MMC/SD Card â€Ģ root=/dev/mmcblkXpY āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ° Y āđāļ—āļ™āļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒ āļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™ root=/dev/mmcblk0p2 (āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 2 āļ‚āļ­āļ‡āļ”āļīāļŠāļāđŒāđāļĢāļ) 144 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 145. â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ NAND ash â€Ģ root=/dev/mtdblockX āļ—āļĩāđˆāļ‹āļķāđˆāļ‡ X āđāļ—āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™ āđ€āļŠāđˆāļ™ root=/dev/mtdblock3 (āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ—āļĩāđˆ 4) â€ĒāļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļšāļ™ NFS āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ â€ĒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ āļēāļĒāđƒāļ™ (ROM) āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš (RAM) āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāļ āļēāļ§āļ°āļāđˆāļ­āļ™āļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āļŠāļ āļēāļ§āļ°āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ” Kernel image āđāļĨāļ° root lesystem āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆ āļ āļēāļĒāđƒāļ™ ROM āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Compressed Kernel RootFS image Bootloader āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļēāļĢāļ°āļšāļš RootFS image Bootloader Kernel RootFS User Memory ROM RAM RAM ROM āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāđāļēāļĢāļ°āļšāļš (āļĢāļ°āļšāļšāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™) Compressed Kernel āļĢāļđāļ›āļ—āļĩāđˆ 3.26 āđāļŠāļ”āļ‡āļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđāļĨāļ° RootFS āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđ‚āļŦāļĨāļ” Kernel image āđāļĨāļ° root lesystem āļ—āļĩāđˆāļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™ āļ—āļĩāđˆāļ­āļĒāļđāđˆ āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ 145 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 146. āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ Bootloader RAM ROM āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host/āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Server DHCP Server /tftproot/ - Compressed Kernel (zImage) TFTP Server /nfsroot/ - Root Filesystem directory NFS Server Kernel āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (Ethernet/Internet) Target IP: 192.168.0.5 Server IP: 192.168.0.1 Kernel: zImage NFS mount: /nfsroot/ āļĢāļđāļ›āļ—āļĩāđˆ 3.27 āđāļŠāļ”āļ‡āļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ° RootFS āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ server āļ•āļēāļĢāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ ïŽlesystem āļ—āļĩāđˆāļ™āļīāļĒāļĄāļŠāļđāļ‡āļŠāļļāļ”āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ 5 āļ­āļąāļ™āļ”āļąāļšāđāļĢāļāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĒāļ­āļ”āļ™āļīāļĒāļĄāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļ•āļēāļĢāļēāļ‡ 3.4 āđāļŠāļ”āļ‡āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļ™āļīāļ”āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ FS WINDOWS MAC LINUX ANDROID CHROME OS IPAD XBOX360 PS3 FAT32 Yes Yes Yes Yes Yes (1) Yes Yes EXFAT Yes(2) No(3) (3) Yes No No No No EXt3 (4) Yes Yes No(6) Yes No No No NTFS Yes Yes Yes (8) Yes No No[9] No HFS+ No[10] Yes (11) (8) (12) (1) No No āđ‚āļ”āļĒāļ—āļĩāđˆ: (1) iPads (āđ„āļĄāđˆāļĢāļ§āļĄ iPhones) āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļąāļ”āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ FAT āđāļĨāļ° HFS āđ„āļ”āđ‰ āđāļ•āđˆāļˆāļ°āļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒ āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āļĢāļđāļ›āļ āļēāļž āđāļĨāļ°āļ§āļīāļ”āļĩāđ‚āļ­āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (2) exFAT āļ—āļĩāđˆāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĄāļēāļˆāļēāļ FAT āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Vista / Windows 7 / Windows 8, āđāļĨāļ° XP (3) āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ FUSE āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰ (4) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ explore2fs, Ext2Fsd āļŦāļĢāļ·āļ­ Ext2IFS āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— ext2/ext3/ext4 āđ„āļ”āđ‰ (5) āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ OSXFUSE fuse-ext2, āļŦāļĢāļ·āļ­ Paragon (6) āđ€āļ‰āļžāļēāļ°āļšāļēāļ‡ ROMs āļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ ext3 āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ 146 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 147. (7) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS āđ‚āļ”āļĒāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡ āļ•āļīāļ”āļ•āļąāđ‰āļ‡ OSXFUSE with NTFS-3G, Paragon āļŦāļĢāļ·āļ­ Tuxera (8) āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Android āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Paragon app āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS āđāļĨāļ° HFS āđ„āļ”āđ‰ (9) Xbox 360 āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Microsoft āđ€āļ­āļ‡ āđ„āļĄāđˆāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ NTFS (10)āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Paragon āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ (11)āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ HFS+ āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ āļāđ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ›āļīāļ”āļ„āļ§āļēāļĄ āļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡ journalling āđ„āļ› (12)āļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ journaled HFS+ āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ BusyBox āļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ BusyBox āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ™āļēāļĒ Bruce Perens āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1996 āļ‹āļķāđˆāļ‡āđ€āļ”āļīāļĄāļ—āļĩāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āļāļđāđ‰āļ„āļ·āļ™āđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđ€āļāđ‡āļ•āđāļšāļšāļšāļđāļ—āļ•āļąāļ§āđ€āļ­āļ‡āđ„āļ”āđ‰ āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian (bootable Debian Linux system) āđ‚āļ”āļĒāļĄāļĩāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ§āđˆāļēāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļĄāļĩāļ‚āļ™āļēāļ” āļĢāļ§āļĄāļāļąāļ™āđāļĨāđ‰āļ§āđ„āļĄāđˆāđ€āļāļīāļ™ 1.4 MB āļ–āļķāļ‡ 1.7 MB āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļš āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđāļœāđˆāļ™āļ”āļīāļŠāļāđŒāđ€āļāđ‡āļ•āđƒāļ™āļĒāļļāļ„āļ™āļąāđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļŦāļĨāļąāļāļāļēāļĢāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡ āļ—āļģāđƒāļŦāđ‰ BusyBox āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđ€āļ•āđ‡āļĄāđ„āļ›āļ”āđ‰āļ§āļĒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļĄāļēāļāļĄāļēāļĒāļ„āļ·āļ­ āļāļēāļĢāđƒāļŠāđ‰āļŠāđˆāļ§āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āļąāļ§ Busy- Box āļˆāļ°āļ—āļģāļāļēāļĢāļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄ grep āđāļĨāļ° ïŽnd āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒāđ‚āļ”āļĒ āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ–āļķāļ‡āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļļāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (recursive) āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ€āļ›āđ‡āļ™āļœāļĨāđƒāļŦāđ‰āļ‚āļ™āļēāļ”āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢ āļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļĨāļ”āļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ BusyBox āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ™āļĩāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđ†āļ—āļĩāđˆāļĄāļĩ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 3.5 MB āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļĨāļ”āļĨāļ‡āđ€āļŦāļĨāļ·āļ­āđ€āļžāļĩāļĒāļ‡ 200 KB āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ BusyBox āļˆāļķāļ‡āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨ āļāļąāļ‡āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ†āļˆāļ™āļ–āļđāļāļ•āļąāđ‰āļ‡āļ‰āļēāļĒāļēāļ§āđˆāļēāđ€āļ›āđ‡āļ™ â€œāļĄāļĩāļ”āļžāļāļžāļēāļŠāļēāļĢāļžāļąāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒâ€ (Swiss Army Knife) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄāļŠāļļāļ” āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĢāļĢāļ–āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļˆāļąāļ”āļāļēāļĢāļšāļĢāļīāļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļ‚āļ“āļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāļģāļĨāļąāļ‡āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™ (Init program), āļŠāļļāļ”āļ„āļģ āļŠāļąāđˆāļ‡āļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļš (System & Conguration) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™ BusyBox ver- sion 1.13 āđ„āļ”āđ‰āđāļāđˆ [, [[ , addgroup, adduser, adjtimex, ar, arp, arping, ash, awk, base- name, bbconfig, bbsh, brctl, bunzip2, busybox, bzcat, bzip2, cal, cat, catv, chat, chattr, chcon, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, 147 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļđāļ›āļ—āļĩāđˆ 3.28 āļĄāļĩāļ” Swiss Army Knife
  • 148. cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devfsd, df, dhcprelay, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg_deb, du, dumpkmap, dumpleases, e2fsck, echo, ed, egrep, eject, env, envdir, envuidgid, ether_wake, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fetchmail, fgrep, find, findfs, fold, free, freeramdisk, fsck, fsck_minix, ftpget, ftpput, fuser, getenforce, getopt, getsebool, getty, grep, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifup, inetd, init, inotifyd, insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, lash, last, length, less, linux32, linux64, linuxrc, ln, load_policy, load- font, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, makedevs, man, matchpathcon, md5sum, mdev, mesg, microcom, mkdir, mke2fs, mkfifo, mkfs_minix, mknod, mkswap, mktemp, modprobe, more, mount, mountpoint, msh, mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup, od, openvt, parse, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, poweroff, printenv, printf, ps, pscan, pwd, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, renice, re- set, resize, restorecon, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run_parts, runcon, runlevel, runsv, runsvdir, rx, script, sed, selinuxenabled, sendmail, seq, sestatus, setarch, setconsole, se- tenforce, setfiles, setfont, setkeycodes, setlogcons, setsebool, set- sid, setuidgid, sh, sha1sum, showkey, slattach, sleep, softlimit, sort, split, start_stop_daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, top, touch, tr, traceroute, true, tty, ttysize, tune2fs, udhcpc, udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļ—āļģāđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļąāļ™āļĄāļēāļˆāļēāļāđ€āļžāļĩāļĒāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļ”āļĩāļĒāļ§āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļĢāļđāđ‰āļŠāļķāļāļ§āđˆāļēāļĄāļĩāļŦāļĨāļēāļĒāļ„āļģāļŠāļąāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļ•āđˆāļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§āđ€āļ›āđ‡āļ™āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ (argu- ment passing) āđ„āļ›āļĒāļąāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĐāļēāļ‹āļĩ // myBusyBox.c #include <stdio.h> int main( int argc, char *argv[] ) { int i; for (i = 0 ; i < argc ; i++) { printf("argv[%d] = %sn", i, argv[i]); } return 0; 148 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 149. } āļˆāļēāļāļ‚āđ‰āļēāļ‡āļšāļ™āļ•āļąāļ§ argc āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāđ€āļāđ‡āļšāļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āđāļĨāļ° argv āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļŠāļ™āļīāļ”āļ­āļ°āđ€āļĢāļĒāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļ•āđˆāļĨāļ°āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄāļžāļĢāđ‰āļ­āļĄāļāļēāļĢāļŠāđˆāļ‡āļœāđˆāļēāļ™āļ„āđˆāļēāļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āļ”āļąāļ‡āļ™āļĩāđ‰ $ gcc -o myBusyBox myBusyBox.c $ ./myBusyBox arg1 arg2 argv[0] = ./myBusyBox argv[1] = arg1 argv[2] = arg2 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” symbolic link āļŠāļ·āđˆāļ­āļ§āđˆāļē my_grep āđāļĨāļ° my_nd āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ myBusyBox āđ€āļ”āļīāļĄ $ ln -s myBusyBox my_grep $ ln -s myBusyBox my_find $ ls -al my* -rwxr-xr-x 1 student student 8503 2013-08-13 08:21 myBusyBox -rw-r--r-- 1 student student 162 2013-08-13 08:21 myBusyBox.c lrwxrwxrwx 1 student student 9 2013-08-13 08:27 my_find -> myBusyBox lrwxrwxrwx 1 student student 9 2013-08-13 08:22 my_grep -> myBusyBox $ ./my_grep -R 'declare' /usr/include/ argv[0] = ./my_grep argv[1] = -R argv[2] = declare argv[3] = /usr/include/ $ ./my_find /usr/include/ -name 'declare' -print argv[0] = ./my_find argv[1] = /usr/include/ argv[2] = -name argv[3] = declare argv[4] = -print āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āđāļ™āļ§āļ„āļīāļ”āđāļĨāļ°āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ myBusyBox āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨ (grep) āđāļĨāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ (nd) āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ”āļāđ‡āļ•āļēāļĄāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļ„āđˆāļēāđƒāļ™ argv[0] āļˆāļ°āļšāļĢāļĢāļˆāļļāļŠāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡ āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļžāļīāļĄāļžāđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āđāļ—āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™āđ†āļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļ•āļąāļ§ āđ‚āļ›āļĢāđāļāļĢāļĄ myBusyBox āļāđ‡āļˆāļ°āļ™āļģāļ„āđˆāļēāļ āļēāļĒāđƒāļ™ argv[0] āđ„āļ›āļ•āļĢāļ§āļˆāđ€āļŠāđ‡āļ„āļ•āđˆāļ­āđ„āļ›āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ” 149 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 150. āļ”āđ‰āļ§āļĒāđāļ™āļ§āļ„āļīāļ”āļāļēāļĢāļĢāļ§āļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļŦāđ‰āļāļĨāļēāļĒ āļĄāļēāđ€āļ›āđ‡āļ™ BusyBox āđ€āļžāļĩāļĒāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļĩāļĒāļ§āļ™āļąāđ‰āļ™ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĨāļ”āļ‚āļ™āļēāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āđ„āļ”āđ‰āļ–āļķāļ‡ 3 āļ–āļķāļ‡ 4 āđ€āļ—āđˆāļēāđ€āļĄāļ·āđˆāļ­āđ€āļ—āļĩāļĒāļš āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ls -al āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ§āđˆāļēāļ—āļļāļāļ„āļģāļŠāļąāđˆāļ‡āļˆāļ°āļ–āļđāļāļŠāļĩāđ‰ (symbolic link) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ busybox āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ Busybox Inittab āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡ BSP (Board Support Package) āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāđ‚āļŦāļĨāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ (Initialization) āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĨāļģāļ”āļąāļš āļāļēāļĢāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš (System services) āļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļŦāļĨāļ” āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāļģāļĨāļąāļ‡āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢ āļ—āļģāļ‡āļēāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Inittab āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/ āļ‹āļķāđˆāļ‡ āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ inittab āļ™āļąāđ‰āļ™āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ < id >:< runlevels >:< action >:< process > 150 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 151. āđ‚āļ”āļĒāļ—āļĩāđˆ: â€Ē< id > āļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ‚āļ”āļĒ BusyBox init āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļ console āļ—āļĩāđˆāđ€āļ›āļīāļ”āļ‚āļķāđ‰āļ™āļĄāļē (controlling tty) āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđ€āļ‹ āļŠāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļ°āļšāļļāđ„āļ§āđ‰āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļē BusyBox āļ•āļĢāļ§āļˆāļžāļšāļ§āđˆāļēāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ serial console āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ„āđˆāļēāļ™āļĩāđ‰āļāđ‡āļˆāļ°āļ–āļđāļ āđ€āļžāļīāļāđ€āļ‰āļĒāđ„āļ› â€Ē< runlevels > āļ„āđˆāļēāļ™āļĩāđ‰āļˆāļ°āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āđƒāļ™ BusyBox āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāļāļēāļĢ āđāļĒāļāļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ āđāļ•āđˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ‰āļžāļēāļ°āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ â€Ē< action > āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ sysinit, respawn, askrst, wait, once, restart, ctrlaltdel, āđāļĨāļ° shutdown āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ â€Ģ sysinit āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļĢāļ°āļšāļšāļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ–āļđāļāļšāļđāļ—āļ‚āļķāđ‰āļ™ â€Ģ respawn āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ€āļĄāļ·āđˆāļ­āđƒāļ”āļāđ‡āļ•āļēāļĄāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļ–āļđāļāļ›āļīāļ”āļĨāļ‡ â€Ģ askrst āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„āļĨāđ‰āļēāļĒāļāļąāļš respawn āđāļ•āđˆāļāđˆāļ­āļ™āļˆāļ°āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰ āļˆāļ°āļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡ āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ "Please press Enter to activate this console." āđ€āļžāļ·āđˆāļ­āļĢāļ­ āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Enter āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļģāļ”āļąāļšāļ–āļąāļ”āđ„āļ› â€Ģ ctrlaltdel āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļĄāļ·āđˆāļ­ init āđ„āļ”āđ‰āļĢāļąāļšāļŠāļąāļāļāļēāļ“ SIGINT āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ CTRL-ALT- DEL āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ inittab # Boot-time system configuration/initialization script. # This is run first except when booting in single-user mode. # ::sysinit:/etc/init.d/rcS # Put a getty on the serial line (for a terminal) ::respawn:/sbin/getty -L ttyS 115200 vt100 # Stuff to do when restarting the init process ::restart:/sbin/init # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot 151 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 152. āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ āļŠāļĄāļąāļĒāļāđˆāļ­āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļˆāļ°āļĄāļĩāļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļ™āđ‰āļ­āļĒāđƒāļ™āļāļēāļĢāļŦāļēāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡ āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļģāļĄāļēāļĻāļķāļāļĐāļēāđ€āļžāļ·āđˆāļ­āļ—āļ”āļĨāļ­āļ‡āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ•āļēāļĄ āđ‚āļˆāļ—āļĒāđŒāđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™āđ† āđāļ•āđˆāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āđ€āļĢāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļĄāļĩāļšāļ—āļšāļēāļ—āļ­āļĒāđˆāļđāđˆāđƒāļ™āļŠāļĩāļ§āļīāļ•āļ›āļĢāļ°āļˆāļģāļ§āļąāļ™ āļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđƒāļŦāļĄāđˆāđ† āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāđ†āđƒāļ™āļ§āļ‡āļāļ§āđ‰āļēāļ‡ āļŠāđˆāļ‡āļœāļĨāļ”āļĩāļ•āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŦāļēāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ” Evaluation Kit āļ—āļĩāđˆāļĄāļĩāļ§āļēāļ‡āļˆāļģāļŦāļ™āđˆāļēāļĒāļˆāļēāļāļšāļĢāļīāļĐāļąāļ—āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļšāļ­āļĢāđŒāļ” Mi- croBlaze, Sitara, Beagleboard, Beaglebone, Pandaboard, FriendlyARM, Raspberry Pi, ODROID, Versatile Express, Gumstix āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļĢāļēāļ„āļēāļ•āļąāđ‰āļ‡āđāļ•āđˆāļŦāļĨāļąāļāļžāļąāļ™āļāļ§āđˆāļēāļšāļēāļ—āļ–āļķāļ‡āļŦāļĨāļēāļĒāļŦāļĄāļ·āđˆāļ™āļšāļēāļ— āļ—āļģāđƒāļŦāđ‰āļĄāļĩāļ•āļąāļ§āđ€āļĨāļ·āļ­āļāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļ­āļīāļŠāļĢāļ° āļ™āļąāļāđ€āļĢāļĩāļĒāļ™āļ™āļąāļāļĻāļķāļāļĐāļē āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™āļšāļĢāļīāļĐāļąāļ—āļ•āđˆāļēāļ‡āđ†āļŠāļēāļĄāļēāļĢāļ– āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĨāļķāļāļ‹āļķāđ‰āļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āļ„āļēāļ”āļ§āđˆāļēāđƒāļ™āļ­āļĩāļāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ‚āđ‰āļēāļ‡āļŦāļ™āđ‰āļē āļĄāļđāļĨāļ„āđˆāļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļĩāđ‰āļˆāļ°āļŠāļđāļ‡āļĄāļēāļāļāļ§āđˆāļēāļĄāļđāļĨāļ„āđˆāļēāļˆāļēāļāļāļēāļĢāļœāļĨāļīāļ• āļ­āļĒāđˆāļēāļ‡āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļŠāļąāļ” āļ•āļēāļĢāļēāļ‡ 3.5 āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļ•āđˆāļĨāļ°āļĒāļĩāđˆāļŦāđ‰āļ­āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄ āļšāļ­āļĢāđŒāļ” SOC āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ RAM I/O āļĢāļēāļ„āļē BeagleBone Sitara AM3358 500MHz (on USB)/ 720MHz (on DC) 256MB USB OTG, USB Host, Ethernet, onboard Serial, onboard JTAG, expansion head- ers, microSD $89 BeagleBoard xM Davinci DM3730 1GHz 512MB USB OTG, USB Host, Ethernet, expan- sion headers, microSD, DVI-D, LCD header, S-Video, Camera header, Stereo IN/OUT $149 iMX53 QSB i.MX53 1GHz 1GB USB OTG, USB Host, Ethernet, Serial, expansion headers, SD, microSD, SATA, VGA, LCD header, Stereo IN/OUT $149 PandaBoard ES OMAP4 dual-core 1.2GHz 1GB USB OTG, USB Host, Ethernet, WLAN, Bluetooth, Serial, expansion headers, SD, HDMI, DVI, LCD header, Camera header, Stereo IN/OUT $182 AM335x Starter Kit Sitara AM3358 720MHz 256MB USB OTG, USB Host, Ethernet, WLAN, Bluetooth, onboard Serial, onboard JTAG, expansion headers, microSD, capacity-touch LCD, Accelerometer, Ste- reo OUT $199 OrigenBoard Exynos 4210 dual-core 1.2GHz 1GB USB OTG, USB Host, Ethernet, WLAN, Bluetooth, Serial, JTAG, SD, HDMI, LCD header, Camera header, Stereo IN/OUT $199 Origen 4 Quad Exynos 4 quad- core 1.4GHz 1GB USB OTG, USB Host, Ethernet, SD, JTAG, Serial, HDMI, onboard LCD header, audio $199 152 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 153. āļšāļ­āļĢāđŒāļ” SOC āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ RAM I/O āļĢāļēāļ„āļē ODROID-X2 Quad core ARM Cortex-A9 MPCore 1.7GHz 2GB USB OTG, USB Host, Ethernet, onboard Serial, expansion headers, SD, Stereo IN/OUT $135 DragonBoard APQ8060A Snapdragon dual- core 1.2GHz 1GB USB OTG, USB Host, Ethernet, WLAN, Bluetooth, GPS, onboard Serial, onboard JTAG, expansion headers, microSD, capacity-touch LCD, Accelerometer, Ste- reo OUT $499 Snapdragon MDP Snapdragon S4 dual-core 1.5GHz 1GB USB OTG, WLAN, Bluetooth, GPS, Accel- erometer, Gyroscope, Compass, Proxim- ity sensor, Temperature sensor, SD, HDMI, LCD Panel , Camera, Stereo OUT $999 RaspBerry Pi Broadcom ARM11 BCM2835 700MHz 512MB USB OTG, USB Host, onboard Ethernet, onboard Serial, expansion headers, MMC, SD, VGA, HDMI, Stereo OUT $35 SABRE i.MX53 1GHz 1GB USB OTG, USB Host, Ethernet, WLAN, Bluetooth, GPS, ZigBee, Accelerometer, Light sensor, Serial, JTAG, eMMC, SD, SATA, NOR Flash, VGA, HDMI, LCD Panel, Camera, Stereo IN/OUT $999 āļŠāļģāļŦāļĢāļąāļšāļ­āļĩāļāļ—āļēāļ‡āđ€āļĨāļ·āļ­āļāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆ āļŦāļĢāļ·āļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ‹āļ·āđ‰āļ­āļšāļ­āļĢāđŒāļ” āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ·āļ­āļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ (Virtualization) āđ€āļžāļ·āđˆāļ­āļˆāļģāļĨāļ­āļ‡āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđāļĨāļ°āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ™āļąāđ‰āļ™āđ€āļŠāđˆāļ™ ARM, MIPS, PowerPC, x86 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡āļ—āļĩāđˆāļ™āļīāļĒāļĄāļāļąāļ™āļĄāļēāļ™āļēāļ™āđāļĨāļ°āđƒāļŠāđ‰āļāļąāļ™āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU (Quick EMUlator) āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰ āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āđ† āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļŦāļĢāļ·āļ­ āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđƒāļ™āļĢāļ°āļ”āļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ§āđˆāļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ™āļąāđ‰āļ™āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāđ‚āļŦāļĄāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰ 2 āđāļšāļšāđ„āļ”āđ‰āđāļāđˆ A.user-mode emulation āļ„āļ·āļ­āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļšāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨ āļœāļĨ āļāļĨāļēāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ (āđ€āļŠāđˆāļ™āļšāļ™āļšāļ­āļĢāđŒāļ” target) āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ•āļąāļ§āļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ (āđ€āļŠāđˆāļ™āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host) āļ”āđ‰āļ§āļĒāļ•āļąāļ§ Dynamic Translator āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđ€āļĨāļĩāļĒāļ™āđāļšāļš Wine Windows API (http://www.winehq.org) āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢ cross-compile āđāļĨāļ° cross-debugging āļ‚āđ‰āļēāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ‹āļķāđˆāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļŠāļģāļŦāļĢāļąāļšāđ‚āļŦāļĄāļ”āļ™āļĩāđ‰āđ„āļ”āđ‰āđāļāđˆ x86, PowerPC, ARM, 32-bit MIPS, Sparc32/64, ColdFire(m68k), CRISv32 and MicroBlaze CPUs B.System-mode emulation āļ„āļ·āļ­āļāļēāļĢāļˆāļģāļĨāļ­āļ‡āļĢāļ°āļšāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļąāđ‰āļ‡āļĢāļ°āļšāļš āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒ āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļ­āļļāļ›āļāļĢāļ“āđŒāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ•āđˆāļēāļ‡āđ† āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡ (Virtual Machine) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļˆāļĢāļīāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ PowerPC āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āļĢāļ°āļšāļš 153 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 154. āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian āđāļ•āđˆāļˆāļĢāļīāļ‡āđ†āđāļĨāđ‰āļ§āļ•āļąāļ§āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāđƒāļŠāđ‰ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86-64 āļšāļīāļ• āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Ubuntu āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆ QEMU āļĢāļ­āļ‡āļĢāļąāļš āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 3.6 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ–āļđāļāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ PC (x86 or x86_64 processor) Luminary Micro LM3S6965EVB (ARM Cortex-M3) ISA PC (old style PC without PCI bus) Freescale MCF5208EVB (ColdFire V2) PREP (PowerPC processor) Arnewsh MCF5206 evaluation board (ColdFire V2) G3 Beige PowerMac (PowerPC processor) Palm Tungsten|E PDA (OMAP310 processor) Mac99 PowerMac (PowerPC processor, in progress) N800 and N810 tablets (OMAP2420 processor) Sun4m/Sun4c/Sun4d (32-bit Sparc processor) MusicPal (MV88W8618 ARM processor) Sun4u/Sun4v (64-bit Sparc processor, in progress) Gumstix "Connex" and "Verdex" motherboards (PXA255/270) Malta board (32-bit and 64-bit MIPS processors) Siemens SX1 smartphone (OMAP310 processor) MIPS Magnum (64-bit MIPS processor) Syborg SVP base model (ARM Cortex-A8) ARM Integrator/CP (ARM) AXIS-Devboard88 (CRISv32 ETRAX-FS) ARM Versatile baseboard (ARM) Petalogix Spartan 3aDSP1800 MMU ref design (MicroBlaze) ARM RealView Emulation/Platform baseboard (ARM) Luminary Micro LM3S811EVB (ARM Cortex-M3) Spitz, Akita, Borzoi, Terrier and Tosa PDAs (PXA270 proc- essor) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļ—āļĩāđˆāļ–āļđāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ‚āļ”āļĒ Linaro āļ‹āļķāđˆāļ‡āđ€āļ™āđ‰āļ™āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āđ€āļ›āđ‡āļ™ āļžāļīāđ€āļĻāļĐ $ sudo add-apt-repository ppa:linaro-maintainers/tools $ sudo apt-get update $ sudo apt-get install qemu-user-static qemu-system $ qemu --version QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ QEMU āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ qemu-alpha qemu-ppc qemu-system-mips64el qemu-arm qemu-ppc64 qemu-system-mipsel qemu-armeb qemu-ppc64abi32 qemu-system-moxie qemu-cris qemu-s390x qemu-system-or32 qemu-ga qemu-sh4 qemu-system-ppc qemu-i386 qemu-sh4eb qemu-system-ppc64 qemu-img qemu-sparc qemu-system-ppcemb 154 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 155. qemu-io qemu-sparc32plus qemu-system-s390x qemu-m68k qemu-sparc64 qemu-system-sh4 qemu-microblaze qemu-system-alpha qemu-system-sh4eb qemu-microblazeel qemu-system-arm qemu-system-sparc qemu-mips qemu-system-cris qemu-system-sparc64 qemu-mips64 qemu-system-i386 qemu-system-unicore32 qemu-mips64el qemu-system-lm32 qemu-system-x86_64 qemu-mipsel qemu-system-m68k qemu-system-xtensa qemu-mipsn32 qemu-system-microblaze qemu-system-xtensaeb qemu-mipsn32el qemu-system-microblazeel qemu-unicore32 qemu-nbd qemu-system-mips qemu-x86_64 qemu-or32 qemu-system-mips64 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩ āļšāļ™ QEMU āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Sourcery CodeBench āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ cross-compiling toolchain āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ‚āļŦāļĨāļ”āļˆāļēāļāļĢāļļāđˆāļ™āļĨāđˆāļēāļŠāļļāļ”āļˆāļēāļāļĨāļīāļ‡āļ„āđŒāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Men- tor Graphics $ chmod +x arm-2013.05-24-arm-none-linux-gnueabi.bin $ ./arm-2013.05-24-arm-none-linux-gnueabi.bin Checking for required programs: awk grep sed bzip2 gunzip Preparing to install... Extracting the JRE from the installer archive... Unpacking the JRE... Extracting the installation resources from the installer archive... Configuring the installer for this system's environment... Launching installer... 155 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 156. āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļŦāļĢāļąāļšāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­ init.c āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ â€œHello World” $ mkdir ~/qemu $ cd ~/qemu $ vim init.c #include <stdio.h> void main() { printf("Hello World!n"); while(1); } āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ cross-compiler āđāļĨāļ°āļ§āļēāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ ramdisk $ arm-none-linux-gnueabi-gcc -static init.c -o init $ echo init|cpio -o --format=newc > initramfs āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.9 $ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.tar.xz $ tar -xJvf linux-3.9.tar.xz $ cd linux-3.9 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- vexpress_defconfig $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all $ cp arch/arm/boot/zImage ~/qemu $ cd ~/qemu $ ls -al total 74488 drwxr-xr-x 3 student student 4096 2013-08-16 11:05 . drwxr-xr-x 46 student student 4096 2013-08-16 11:16 .. -rwxr-xr-x 1 student student 648380 2013-08-16 03:50 init -rw-r--r-- 1 student student 76 2013-08-16 03:20 init.c -rw-r--r-- 1 student student 648704 2013-08-16 03:54 initramfs drwxr-xr-x 24 student student 4096 2013-08-16 04:10 linux-3.9 -rw-r--r-- 1 student student 72104164 2013-04-28 17:40 linux-3.9.tar.xz -rw-r--r-- 1 student student 699 2013-08-16 09:33 README -rwxr-xr-x 1 student student 2844736 2013-08-16 04:16 zImage āļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄ init āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ qemu-system-arm āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ qemu-system-arm -M vexpress-a9 -kernel zImage -initrd initramfs -serial stdio -append "console=tty1" 156 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 157. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļš BUSYBOX āļ āļēāļĒāđƒāļ™ ROOT FILESYSTEM āļšāļ™ QEMU āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™ 3.9 āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡ ARM SoC āļ—āļĩāđˆāļŠāļ·āđˆāļ­ āļ§āđˆāļē versatile āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ make mrproper $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- versatile_defconfig $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ‚āļ”āļĒāļāļēāļĢāđ„āļĄāđˆāđ€āļĨāļ·āļ­āļ â€œEnable loadable module support” feature āđāļ•āđˆāđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ â€œUse the ARM EABI to compile the kernel” āđāļ—āļ™ āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ€āļĄāļ™āļđ Kernel Features 157 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 158. āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļŸāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- all āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ BusyBox āļĢāļļāđˆāļ™ 1.21.0 āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/qemu āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļēāļĄ āļĨāļģāļ”āļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ $ wget http://busybox.net/downloads/busybox-1.21.0.tar.bz2 $ tar -xjvf busybox-1.21.0.tar.bz2 $ cd busybox-1.21.0 $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- defconfig $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡ BusyBox āđ€āļ›āđ‡āļ™āđāļšāļš static binary āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ€āļĄāļ™āļđ Busybox Setting -> Build Op- tions -> āļ—āļģāļāļēāļĢ check Build BusyBox as a static binary 158 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 159. āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŦāļĢāļ·āļ­ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™ āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ NFS (Network File System) āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ†āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ„āļ”āđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™ BusyBox āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļĄāļ™āļđ “Linux System Utilities” āļŠāļ·āđˆāļ­āļ§āđˆāļē Support mounting NFS le systems on Linux āļ”āļąāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 159 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 160. āļ—āļģāļāļēāļĢāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ install āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡ BusyBox āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ _install $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install ... ./_install//usr/sbin/ubimkvol -> ../../bin/busybox ./_install//usr/sbin/ubirmvol -> ../../bin/busybox ./_install//usr/sbin/ubirsvol -> ../../bin/busybox ./_install//usr/sbin/ubiupdatevol -> ../../bin/busybox ./_install//usr/sbin/udhcpd -> ../../bin/busybox -------------------------------------------------- You will probably need to make your busybox binary setuid root to ensure all configured applets will work properly. -------------------------------------------------- āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļģāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™ āļŠāļģāļŦāļĢāļąāļš root lesystem $ cd _install $ mkdir proc sys dev etc etc/init.d $ ls -al total 36 drwxr-xr-x 9 student student 4096 2013-08-16 12:14 . drwxr-xr-x 34 student student 4096 2013-08-16 11:58 .. drwxr-xr-x 2 student student 4096 2013-08-16 11:58 bin drwxr-xr-x 2 student student 4096 2013-08-16 12:14 dev drwxr-xr-x 3 student student 4096 2013-08-16 12:14 etc lrwxrwxrwx 1 student student 11 2013-08-16 11:58 linuxrc -> bin/busybox drwxr-xr-x 2 student student 4096 2013-08-16 12:14 proc drwxr-xr-x 2 student student 4096 2013-08-16 11:58 sbin drwxr-xr-x 2 student student 4096 2013-08-16 12:14 sys drwxr-xr-x 4 student student 4096 2013-08-16 11:58 usr āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ rcS āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ etc/init.d/ āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc āđāļĨāļ° /sysfs āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ virtual lesystem $ vim etc/init.d/rcS āđ€āļžāļīāđˆāļĄ shell script āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ rcS āļ”āļąāļ‡āļ™āļĩāđ‰ #!/bin/sh mount -t proc none /proc mount -t sysfs none /sys /sbin/mdev -s āđāļ›āļĨāļ‡āļŠāļīāļ—āļ˜āļīāđŒāđ„āļŸāļĨāđŒ rcS āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ„āļ”āđ‰ āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ root lesystem āļŠāļ·āđˆāļ­ rootfs.img āļˆāļēāļ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ _install $ chmod +x etc/init.d/rcS $ find . | cpio -o --format=newc > ../rootfs.img 11984 blocks 160 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 161. $ cd .. $ gzip -c rootfs.img > rootfs.img.gz $ cp rootfs.img.gz ~/qemu āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ qemu-system-arm āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ BusyBox $ cd ~/qemu $ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root=/dev/ram rdinit=/bin/sh" āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM āļ”āđ‰āļ§āļĒāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ BUILDROOT āļšāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ $ sudo apt-get install autoconf automake libtool libexpat1-dev libncurses5-dev bison flex patch curl cvs texinfo build-essential sub- version gawk python-dev gperf ncurses-dev g++ gcc texi2html nfs- kernel-server āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļš root lesystem āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ NFS (Network File System) āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ LAN $ mkdir ~/nfsroot āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļĢāđŒāļœāđˆāļēāļ™ NFS āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ /etc/exports āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ 161 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 162. $ sudo vim /etc/exports /home/student/nfsroot *(rw,sync,no_root_squash,no_subtree_check) āđ€āļĢāļīāđˆāļĄāđ€āļĢāļĩāļĒāļāļšāļĢāļīāļāļēāļĢ NFS Server āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ $ sudo /etc/init.d/nfs-kernel-server restart āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ buildroot āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ cross-compiling toolchain $ wget http://buildroot.uclibc.org/downloads/buildroot-2013.05.tar.gz $ tar -xzvf buildroot-2013.05.tar.gz $ cd buildroot-2013.05/ āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļ·āđˆāļ™āđ† āļ”āļąāļ‡āļ™āļĩāđ‰ $ make menuconfig āđ‚āļ”āļĒāđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰: Target Architecture ==> ARM (little endian) Target Architecture Variant ==> arm926t Target ABI ==> EABI System Conguration ==> serial port to run getty on (ttyAMA0) Package Selection ==> Busybox FileSystem Images ==> cpio the root lesystem āđāļĨāļ° tar the root lesystem Kernel ==>āļĢāļ°āļšāļļāļŠāļ·āđˆāļ­ defcong āđ€āļ›āđ‡āļ™ â€œversatile” Kernel ==> Kernel binary format to zImage 162 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 163. 163 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 164. 164 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 165. $ make $ ls -al output/images/ total 6712 drwxr-xr-x 2 student student 4096 2013-07-22 11:45 . drwxr-xr-x 8 student student 4096 2013-07-22 21:03 .. -rw-r--r-- 1 student student 1922560 2013-07-22 21:03 rootfs.cpio -rw-r--r-- 1 student student 858843 2013-07-22 21:03 rootfs.cpio.gz -rw-r--r-- 1 student student 2181120 2013-07-22 21:03 rootfs.tar -rw-r--r-- 1 student student 1895000 2013-07-22 11:44 uImage $ cp output/images/uImage ~/qemu/ āļ§āļēāļ‡ root lesystem āđ„āļ›āļĒāļąāļ‡ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ NFS āļŠāļ·āđˆāļ­āļ§āđˆāļē ~/nfsroot āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļ”āđ‰āđ€āļ›āļīāļ”āđāļŠāļĢāđŒāđ„āļ§āđ‰ $ sudo tar -xvf rootfs.tar ~/nfsroot/ $ sudo chown -R student:student ~/nfsroot āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ tun/tap device āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļ§āļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ—āđ‰āļ­āļ‡āļ–āļīāđˆāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡ QEMU āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āļ āļēāļĒāđƒāļ™ QEMU āļŠāļēāļĄāļēāļĢāļ– mount āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ NFS āļ—āļĩāđˆāđ€āļ›āļīāļ”āđāļŠāļĢāđŒāđ„āļ§āđ‰āļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļ„āđˆāļē IP Address āđƒāļŦāđ‰āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļ›āđ‡āļ™ 192.168.1.1 āđāļĨāļ° āļ•āļąāđ‰āļ‡āļ„āđˆāļē IP Address āļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ target āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļāđ‡āļ„āļ·āļ­ 192.168.1.101 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ›āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ uml-utilities (āļ—āļĩāđˆāļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡ tunctl) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļˆāļģāļĨāļ­āļ‡āļŠāļąāļāļāļēāļ“ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (network trafc) 165 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 166. $ sudo apt-get install uml-utilities $ sudo tunctl -u $(whoami) -t tap1 $ sudo ifconfig tap1 192.168.1.1 $ sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev tap1 $ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āđ€āļžāļ·āđˆāļ­āļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Versatile Board) āđāļĨāļ°āļ—āļģāļāļēāļĢāđ‚āļŦāļĨāļ” root lesystem āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host $ qemu-system-arm -M versatilepb -m 128M -kernel ~/uImage -append "console=ttyAMA0 root=/dev/nfs rw nfsroot=192.168.1.1:~/nfsroot ip=192.168.1.101" -net nic -net tap,ifname=tap1,script=no -nographic Set 'tap1' persistent and owned by uid 1000 SIOCADDRT: File exists Uncompressing Linux... done, booting the kernel. Booting Linux on physical CPU 0x0 Linux version 3.9.4 (student@marabuntu) (gcc version 4.7.3 (Buildroot 2013.05) ) #1 Mon Jul 22 11:44:32 PDT 2013 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177 CPU: VIVT data cache, VIVT instruction cache Machine: ARM-Versatile PB Memory policy: ECC disabled, Data cache writeback sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 Kernel command line: console=ttyAMA0 root=/dev/nfs rw nfsroot=192.168.1.1:/home/student/nfsroot ip=192.168.1.101 PID hash table entries: 512 (order: -1, 2048 bytes) Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) __ex_table already sorted, skipping sort Memory: 128MB = 128MB total Memory: 126192k/126192k available, 4880k reserved, 0K highmem Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) vmalloc : 0xc8800000 - 0xff000000 ( 872 MB) lowmem : 0xc0000000 - 0xc8000000 ( 128 MB) modules : 0xbf000000 - 0xc0000000 ( 16 MB) .text : 0xc0008000 - 0xc0342850 (3307 kB) .init : 0xc0343000 - 0xc035f87c ( 115 kB) .data : 0xc0360000 - 0xc0385440 ( 150 kB) .bss : 0xc0385440 - 0xc039f78c ( 105 kB) NR_IRQS:224 VIC @f1140000: id 0x00041190, vendor 0x41 FPGA IRQ chip 0 "SIC" @ f1003000, 13 irqs Console: colour dummy device 80x30 Calibrating delay loop... 300.44 BogoMIPS (lpj=1502208) pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok Setting up static identity map for 0xc027e748 - 0xc027e7a0 NET: Registered protocol family 16 DMA: preallocated 256 KiB pool for atomic coherent allocations Serial: AMBA PL011 UART driver dev:f1: ttyAMA0 at MMIO 0x101f1000 (irq = 44) is a PL011 rev1 console [ttyAMA0] enabled dev:f2: ttyAMA1 at MMIO 0x101f2000 (irq = 45) is a PL011 rev1 166 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 167. dev:f3: ttyAMA2 at MMIO 0x101f3000 (irq = 46) is a PL011 rev1 ... Console: switching to colour frame buffer device 80x60 brd: module loaded physmap platform flash device: 04000000 at 34000000 physmap-flash physmap-flash.0: map_probe failed smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@fluxnic.net> eth0: SMC91C11xFD (rev 1) at c8800000 IRQ 57 [nowait] eth0: Ethernet addr: 52:54:00:12:34:56 mousedev: PS/2 mouse device common for all mice TCP: cubic registered NET: Registered protocol family 17 VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0 eth0: link up IP-Config: Guessing netmask 255.255.255.0 IP-Config: Complete: device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.1.101, mask=255.255.255.0, gw=255.255.255.255 host=192.168.1.101, domain=, nis-domain=(none) bootserver=255.255.255.255, rootserver=192.168.1.1, rootpath= input: AT Raw Set 2 keyboard as /devices/fpga:06/serio0/input/input0 input: ImExPS/2 Generic Explorer Mouse as /devices/fpga:07/serio1/input/input1 VFS: Mounted root (nfs filesystem) on device 0:9. Freeing init memory: 112K Starting logging: OK Initializing random number generator... done. Starting network... ip: RTNETLINK answers: File exists Welcome to Burapha Embedded System Lab Burapha login: # ls # ls -al total 20 drwxr-xr-x 2 default default 4096 Jul 23 2013 . drwxr-xr-x 17 default default 4096 Jul 23 2013 .. -rw------- 1 root root 10 Jul 23 2013 .ash_history -rw-r--r-- 1 default default 0 May 31 2013 .bash_history -rw-r--r-- 1 default default 175 May 31 2013 .bash_logout -rw-r--r-- 1 default default 161 May 31 2013 .bash_profile # 167 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 168. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” RASPBERRY PI āļšāļ™ QEMU āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ image āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry PI āļˆāļēāļ http://www.raspberrypi.org/ downloads āđāļĨāļ°āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ wheezy-raspbian.img āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ unzip 2013-07-26-wheezy-raspbian.zip $ mv 2013-07-26-wheezy-raspbian.img ~/qemu/wheezy-raspbian.img āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ïŽle āđ€āļžāļ·āđˆāļ­āļ”āļđāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ wheezy-raspbian.img $ file wheezy-raspbian.img wheezy-rasbian.img: x86 boot sector; partition 1: ID=0xc, starthead 130, startsector 8192, 114688 sectors; partition 2: ID=0x83, starthead 165, startsector 122880, 3665920 sectors, code offset 0xb8 āļ™āļģāļ„āđˆāļē startsector (122880) āļˆāļēāļ partition 2 āļĄāļēāļ„āļđāļ“āļāļąāļšāļ„āđˆāļē 512 āļˆāļ°āđ„āļ”āđ‰āļ„āđˆāļē offset āđ€āļ—āđˆāļēāļāļąāļš 62914560 āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ™āļģāļ„āđˆāļē offset āļāļēāļĢāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ mount āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­ wheezy-raspbian.img āđ€āļžāļ·āđˆāļ­ āđƒāļŦāđ‰āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /mnt āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ sudo mount wheezy-raspbian.img -o offset=62914560 /mnt āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ /mnt/etc/ld.so.preload āđāļĨāđ‰āļ§āļ›āļīāļ”āļšāļĢāļĢāļ—āļąāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒ # āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ‚āļŦāļĨāļ” āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ ... # /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so ... $ sudo umount /mnt āļāđˆāļ­āļ™āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi 168 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 169. $ cd ~/qemu/ $ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu $ qemu-system-arm -kernel ~/qemu/kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1" -hda ~/qemu/wheezy-raspbian.img āļˆāļēāļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļšāļ™āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļĨāđ‰āļĄāđ€āļŦāļĨāļ§āļˆāļēāļāļāļēāļĢāļ­āđˆāļēāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ (lesystem) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĄāđˆāđƒāļŠāđˆāļŠāļīāļ—āļ˜āļīāđŒ root āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ‹āđˆāļ­āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļ™āļ° root āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ $ sudo fsck /dev/sda2 āļ„āļģāļŠāļąāđˆāļ‡ fsck āļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ‹āđˆāļ­āļĄāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđƒāļ™āļāļĢāļ“āļĩāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ root@raspberrypi# raspi-config 169 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 170. āļˆāļēāļāđ€āļĄāļ™āļđāļ”āđ‰āļēāļ™āļšāļ™āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ­āļ·āđˆāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļšāļđāļ—āđ€āļ‚āđ‰āļēāļŠāļđāđˆ GUI Mode āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ‚āđ‰āļ­ āļ—āļĩāđˆ 3 (Enable Boot to Desktop) āđāļĨāļ°āđ€āļĢāļīāđˆāļĄāļšāļđāļ—āđ€āļ‚āđ‰āļēāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļāđ‡āļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆ GUI Mode āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 3.29 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļšāļ™ QEMU 170 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 171. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Friendly ARM (Mini2440) āļšāļ™ QEMU āļšāļ­āļĢāđŒāļ” FriendlyARM Mini2440 āļŦāļĢāļ·āļ­āļ™āļīāļĒāļĄāđ€āļĢāļĩāļĒāļāļŠāļąāđ‰āļ™āđ†āļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Mini2440 āđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāđƒāļ™āļĨāļąāļāļĐāļ“āļ° āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļ™āļīāļ” SBC (Single-Board Computer) āļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ ARM9 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ System- on-Chip āļĢāļļāđˆāļ™ Samsung S3C2440 āļĢāļđāļ›āļ—āļĩāđˆ 3.30 āļšāļ­āļĢāđŒāļ” Friendly ARM Mini2440 āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Mini2440 āđ‚āļ”āļĒāđ€āļĨāđˆāļ™āļ­āļĒāļđāđˆāļšāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļ—āļĩāđˆāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ”āļąāļ‡āļ•āđˆāļ­ āđ„āļ›āļ™āļĩāđ‰ (āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĄāļēāļˆāļēāļ http://project4fun.com/node/33) $ sudo apt-get -y update $ sudo apt-get -y install build-essential $ sudo apt-get -y install git-core $ sudo apt-get -y install zlib1g-dev $ sudo apt-get -y install libsdl-console-dev $ sudo apt-get -y install ia32-libs $ sudo apt-get -y install bridge-utils $ sudo apt-get -y install uml-utilities $ sudo apt-get -y install qemu-utils $ sudo apt-get -y install nbd-client $ sudo apt-get -y install kpartx āļ•āļīāļ”āļ•āļąāđ‰āļ‡ cross-compiling toolchains # cd /opt # wget http://dl-12.one2up.com/onetwo/content/2012/12/24/614ca76f9a53c060bd8c fa7effd541f6.tgz # mv 614ca76f9a53c060bd8cfa7effd541f6.tgz arm920t-eabi.tgz 171 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 172. # tar xzvf arm920t-eabi.tgz -C / # export PATH=$PATH:/opt/toolchains/arm920t-eabi/bin # export CROSS_COMPILE=arm-angstrom-linux-gnueabi- āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ git://repo.or.cz/qemu/mini2440.git āļ”āļąāļ‡āļ™āļĩāđ‰ $ mkdir ~/eeburapha/qemu $ cd ~/eeburapha/qemu $ git clone git://repo.or.cz/qemu/mini2440.git ... Receiving objects: 100% (xxxxx/xxxxx), xx.xx MiB | xxxx KiB/s, done. Resolving deltas: 100% (xxxxx/xxxxx), done. āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩ qemu āļ—āļĩāđˆāļ‹āļąāļžāļžāļ­āļĢāđŒāļ• Mini2440 $ cd mini2440 $ wget http://dl-10.one2up.com/onetwo/content/2013/9/10/fde6b403a54066a6aa138 38f7588b91e.patch $ mv fde6b403a54066a6aa13838f7588b91e.patch bug_SIGFPE.patch $ patch –p0 < bug_SIGFPE.patch $ ./configure --target-list=arm-softmmu $ make āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ mini2440_start.sh āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ vim ~/eeburapha/qemu/mini2440/mini2440/mini2440_start.sh echo Starting in $base name_nand="$base/mini2440_nand.bin" name_sd="$base/sd.img" if [ ! -f "$name_nand" ]; then echo $0 : creating NAND empty image : "$name_nand" dd if=/dev/zero of="$name_nand" bs=528 count=131072 fi cmd="$base/../arm-softmmu/qemu-system-arm -M mini2440 $* -serial stdio -mtdblock "$name_nand" -sd $name_sd -show-cursor -usb -usbdevice keyboard -usbdevice mouse -net nic,vlan=0 -net tap,vlan=0,ifname=tap1,script=/etc/qemu-ifup -monitor telnet::5555,server,nowait" echo $cmd $cmd āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ network.sh $ vim network.sh 172 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 173. #!/bin/sh sudo chown root.users /dev/net/tun sudo chmod g+rw /dev/net/tun sudo brctl addbr br0 sudo ifconfig eth0 0.0.0.0 promisc sudo brctl addif br0 eth0 sudo dhclient br0 sudo tunctl -t tap1 -u `whoami` $ chmod 755 network.sh āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ qemu-ifup āđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/ $ vim qemu-ifup #!/bin/sh echo "Executing /etc/qemu-ifup" echo "Bringing up $1 for bridged mode..." sudo /sbin/ifconfig $1 0.0.0.0 promisc up echo "Adding $1 to br0..." sudo /sbin/brctl addif br0 $1 sleep 2 $ chmod 755 qemu-ifup āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ u-boot.bin $ cd ~/eeburapha/qemu/mini2440/mini2440 $ mkdir uboot $ cd uboot $ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git $ cd mini2440 $ make mini2440_config $ make all dd if=u-boot.bin of=u-boot-nand2k.bin bs=2K conv=sync 119+1 records in 120+0 records out 245760 bytes (246 kB) copied, 0.000734641 s, 335 MB/s dd if=u-boot.bin of=u-boot-nand16k.bin bs=16K conv=sync 14+1 records in 15+0 records out 245760 bytes (246 kB) copied, 0.000435712 s, 564 MB/s āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ u-boot.bin āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/eeburapha/qemu/mini2440/mini2440 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ sd image $ cd eeburapha/qemu/mini2440/ 173 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 174. $ qemu-img create sd.img 256M Formatting 'sd.img', fmt=raw size=268435456 $ sudo modprobe nbd $ sudo modprobe dm-mod $ qemu-nbd -p 24561 sd.img & $ sudo nbd-client localhost 24561 /dev/nbd0 Negotiation: ..size = 256MB bs=1024, sz=268435456 bytes $ sudo fdisk -u=cylinders /dev/nbd0 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xe5f5bdf3. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: cylinders as display units are deprecated. Use command 'u' to change units to sectors. Command (m for help): o Building a new DOS disklabel with disk identifier 0x1999a406. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: cylinders as display units are deprecated. Use command 'u' to change units to sectors. Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First cylinder (1-32, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-32, default 32): +50MB Command (m for help): t Selected partition 1 Hex code (type L to list codes): b Changed system type of partition 1 to b (W95 FAT32) Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (1-4, default 2): 2 First cylinder (7-32, default 7): Using default value 7 174 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 175. Last cylinder, +cylinders or +size{K,M,G} (7-32, default 32): Using default value 32 Command (m for help): p Disk /dev/nbd0: 268 MB, 268435456 bytes 255 heads, 63 sectors/track, 32 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1999a406 Device Boot Start End Blocks Id System /dev/nbd0p1 1 7 55203 b W95 FAT32 /dev/nbd0p2 7 32 200813 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information. Syncing disks. $ sudo kpartx -a /dev/nbd0 $ sudo mkfs.vfat /dev/mapper/nbd0p1 $ sudo mkfs.ext3 /dev/mapper/nbd0p2 $ mkdir disk $ sudo mount /dev/mapper/nbd0p2 ./disk $ mkdir -p disk/boot $ sudo mount /dev/mapper/nbd0p1 ./disk/boot $ wget http://mini2440.googlecode.com/files/emdebian-grip-090306-armel-lenny- installed.tar.bz2 $ (cd disk; sudo tar jxf ../emdebian-grip-090306-armel-lenny-installed.tar.bz2) $ sudo umount disk/boot disk $ sudo nbd-client -d /deb/nbd0 āđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒ sd.img āđ„āļ›āļ§āļēāļ‡āđ„āļ§āđ‰āļ—āļĩāđˆ ~/eeburapha/qemu/mini2440/mini2440 āđāļĨāļ°āđ€āļĢāļīāđˆāļĄ āļāļēāļĢāļĢāļąāļ™ mini2440 āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ cd ~/eeburapha/qemu/mini2440/mini2440 $ ./network.sh Set 'tap1' persistent and owned by uid 1000 $ ./ mini2440_start.sh *** Warning - bad CRC or NAND, using default environment 175 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 176. USB:   S3C2410 USB Deviced ERROR: usbd_device_event_irq(), 613: (3401ea64,1) NULL device or device->bus ERROR: usbd_device_event_irq(), 613: (3401ea64,2) NULL device or device->bus ERROR: usbd_device_event_irq(), 613: (3401ea64,3) NULL device or device->bus In:    serial Out:   serial Err:   serial MAC: 08:08:11:18:12:27 Hit any key to stop autoboot:  0 MINI2440 # āļ—āļģāļāļēāļĢāļŸāļ­āļĢāđŒāđāļĄāļ— nand # nand scrub" NAND scrub: device 0 whole chip Warning: scrub option will erase all factory set bad blocks! There is no reliable way to recover them. Use this command only for testing purposes if you are sure of what you are doing! Really scrub this NAND flash? <y/N> Erasing at 0x3ffc000 -- 100% complete. Bad block table not found for chip 0 Bad block table not found for chip 0 OK āļŠāļĢāđ‰āļēāļ‡ bad block table # nand createbbt Create BBT and erase everything ? <y/N> Skipping bad block at 0x03ff0000 Skipping bad block at 0x03ff4000 Skipping bad block at 0x03ff8000 Skipping bad block at 0x03ffc000 Creating BBT. Please wait ...Bad block table not found for chip 0 Bad block table not found for chip 0 Bad block table written to 0x03ffc000, version 0x01 Bad block table written to 0x03ff8000, version 0x01 āļŠāļĢāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš (env) # dynenv set 40000 device 0 offset 0x40000, size 0x3fc0000 45 4e 56 30 - 00 00 04 00 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢ reset āļˆāļ°āđ„āļ”āđ‰ emulator āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŠāđˆ sd.img āđ„āļ”āđ‰ # reset S3C: CLK=240 HCLK=240 PCLK=240 UCLK=57 QEMU mini2440_reset: loaded default u-boot from NAND 176 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 177. QEMU mini2440_reset: loaded override u-boot (size 3c000) S3C: CLK=240 HCLK=240 PCLK=240 UCLK=48 S3C: CLK=304 HCLK=304 PCLK=304 UCLK=48 S3C: CLK=304 HCLK=101 PCLK=50 UCLK=48 S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48 S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48 S3C: CLK=405 HCLK=101 PCLK=50 UCLK=48 U-Boot 1.3.2-moko12 (Jun 26 2009 - 18:16:16) I2C: ready DRAM: 64 MB Flash: 2 MB NAND: 64 MiB Found Environment offset in OOB.. USB: S3C2410 USB Deviced In: serial Out: serial Err: serial MAC: 08:08:11:18:12:27 Hit any key to stop autoboot: 0 MINI2440 # 177 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 178. āļšāļ—āļ—āļĩāđˆ 4 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āđāļĨāļ° QT āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļ™āļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāđ‰āļ™āļˆāļ°āđ„āļĄāđˆ āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļ āļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩ/āļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄ āđ€āļ•āļīāļĄāļ—āļąāļāļĐāļ°āļ­āļ°āđ„āļĢāļĄāļēāļāļĄāļēāļĒāđ€āļ›āđ‡āļ™āļžāļīāđ€āļĻāļĐ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āļ­āļ·āđˆāļ™āđ†āđ€āļāļ·āļ­āļš āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ™āļąāđ‰āļ™ āļˆāļ°āļĒāļąāļ‡āļ„āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ•āđ‰āļ­āļ‡āļžāļķāļ‡āļĢāļ°āļ§āļąāļ‡āļ„āļ·āļ­āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡ āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļŦāļĢāļ·āļ­ āļ–āļēāļ§āļĢ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ‡āļ›āļāļīāđ€āļŠāļ˜āđ„āļĄāđˆāđ„āļ”āđ‰āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļ‹āļĩ (C Language) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļĨāļ°āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļĄāļēāļāļāļ§āđˆāļēāļĢāđ‰āļ­āļĒāļĨāļ° 80 āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļĨāļ‡āđ„āļ›āđƒāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļĨāđ‰āļ§āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™ āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ€āļŠāđˆāļ™ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒ I/O āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļĢāļ°āļšāļšāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢ āđ€āļ‹āļŠ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ (C++) āļ‹āļķāđˆāļ‡āļĄāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļīāļ‡āļ§āļąāļ•āļ–āļļ (Object oriented Programming - OOP) āđ€āļŦāļĄāļēāļ°āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ‹āļąāļš āļ‹āđ‰āļ­āļ™āđāļĨāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰āđāļ™āļ§āļ„āļīāļ”āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ™āļ§āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāđāļšāļš OOP āļ™āļąāļ āļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ•āļąāļ§āļ„āļ­āļĄāđ„āļžāļĨāđŒ (Compiler) āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ (C++ Tools) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩ (C++ library) āđ€āļžāļīāđˆāļĄ āđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļĄāļšāļđāļĢāļ“āđŒ 178 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 179. āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ MAKEFILE Makele (GNU automake system) āļ„āļ·āļ­āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāļ„āļģāļŠāļąāđˆāļ‡āļŦāļĢāļ·āļ­ āļŠāļ„āļĢāļīāļ›āļ—āđŒāļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļ°āļ”āļ§āļāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ make āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāļđāđˆāļšāļ™āđ€āļŠāļĨāļĨāđŒ āđ‚āļ”āļĒāļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ āļŠāļ·āđˆāļ­ â€œMakele” āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āđˆāļēāļ‡āđ†āđ„āļ§āđ‰ āđ€āļŠāđˆāļ™ āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āđ‚āļ„āđ‰āļ”āđ„āļŸāļĨāđŒāđ€āļŠāļĢāļīāļĄ āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™ Makele āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ (Macros) ! VARIABLE DECLARATIONS (Targets) ! TARGET:! DEPENDENCIES ! ! RULES TO BUILD TARGET āđ‚āļ”āļĒāļ—āļĩāđˆ (Macros) āļˆāļ°āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ CC=gcc OPT=-g āđ€āļĄāļ·āđˆāļ­āļ–āļđāļāđ€āļĢāļĩāļĒāļāļ āļēāļĒāđƒāļ™ (Targets) āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $(CC) a_source_file.c āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāđ„āļ”āđ‰āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ•āļąāļ§āđāļ›āļĢāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāđƒāļŦāļĄāđˆ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ COMP = $(CC) $(OPT) āļĢāļēāļĒāļāļēāļĢ (Targets) āļ„āļ·āļ­āļĢāļēāļĒāļāļēāļĢāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āļ§āđˆāļēāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰ (dependencies) āļ‹āļķāđˆāļ‡āļ§āļīāļ˜āļĩ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ™āļąāđ‰āļ™āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļĢāļđāļ›āđāļšāļšāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢāđƒāļŠāđ‰ whitespace (spacebar āđāļĨāļ° tab) āļ–āđ‰āļēāđ„āļĄāđˆāđ„āļ”āđ‰āļˆāļąāļ”āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡ make āļāđ‡āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ­āđˆāļēāļ™āļŠāļ„āļĢāļīāļ›āļ—āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļ­āļĄāđ„āļžāļĨāđŒ āđ„āļ”āđ‰ āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ tab space space | | | target:" dependency1 dependency2 dependency3 " rule1 " rule2 " rule3 ^^^^^ | tab 179 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 180. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 1 all: hello hello: main.o factorial.o hello.o ! g++ main.o factorial.o hello.o -o hello main.o: main.cpp ! g++ -c main.cpp factorial.o: factorial.cpp ! g++ -c factorial.cpp hello.o: hello.cpp ! g++ -c hello.cpp clean: ! rm -rf *o hello āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 2 āđƒāļŠāđ‰ macro āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢ CC āđāļĨāļ° CFLAGS # the compiler to use CC=g++ # options passed to the compiler CFLAGS=-c -Wall all: hello hello: main.o factorial.o hello.o ! $(CC) main.o factorial.o hello.o -o hello main.o: main.cpp ! $(CC) $(CFLAGS) main.cpp factorial.o: factorial.cpp ! $(CC) $(CFLAGS) factorial.cpp hello.o: hello.cpp ! $(CC) $(CFLAGS) hello.cpp clean: ! rm -rf *o hello āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 3 āļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āđāļ›āļĢ SOURCES, OBJECTS āđāļĨāļ° EXECUTABLE āđ€āļžāļ·āđˆāļ­āļĢāļ§āļĄāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) ! 180 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 181. $(EXECUTABLE): $(OBJECTS) ! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: ! $(CC) $(CFLAGS) $< -o $@ clean: ! rm -rf $(OBJECTS) $(EXECUTABLE) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđāļšāļšāļ—āļĩāđˆ 4 āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ (include) āđ„āļŸāļĨāđŒ header (.h) āđ€āļžāļīāđˆāļĄāļŦāļĢāļ·āļ­āđ„āļĨāļšāļĢāļēāļĢāļĩāļ āļēāļĒāļ™āļ­āļāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđˆ option -I āđāļĨāļ° -l āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) MY_INCLUDES=/home/student/project/myLib/ MY_LIBRARIES=zlib fltk EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) ! $(EXECUTABLE): $(OBJECTS) ! $(CC) -I$(MY_INCLUDES) $(LDFLAGS) $(OBJECTS) -o $@ -l$(MY_LIBRARIES) @echo “Compile hello completed...” .cpp.o: ! $(CC) $(CFLAGS) $< -o $@ @echo “Compile all object files completed...” clean: ! rm -rf $(OBJECTS) $(EXECUTABLE) @echo “Clean all object files and hello program done...” āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ‚āļšāļ§āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (source code) āļˆāļ™āļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļĢāļ·āļ­āļĢāļąāļ™āđ„āļ”āđ‰ (executable le) āļ™āļąāđ‰āļ™ āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļēāļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ› āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ·āļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (.c) āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āđ„āļšāļ™āļēāļĢāļĩāđ„āļŸāļĨāđŒ āļ—āļĩāđˆ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē āļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ” (object code) āļ‹āļķāđˆāļ‡āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ â€œ.o” āđ„āļŸāļĨāđŒāļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ”āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ āļĢāļ§āļĄāļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ ar (archiver) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĢāļ·āļ­āļˆāļ°āļ–āļđāļāđāļ›āļĨāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļ™āđ„āļ”āđ‰ (executable le) āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ ld (linker) 181 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 182. āđ„āļŸāļĨāđŒāđ‚āļ„āđ‰āļ” āđ‚āļ›āļĢāđāļāļĢāļĄ (.c) Compiler āđ„āļŸāļĨāđŒāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ (.o) āđ„āļĨāļšāļĢāļēāļĢāļĩ (.a āļŦāļĢāļ·āļ­ .so)Archiver āđ‚āļ›āļĢāđāļāļĢāļĄ (executable) āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆ āđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ āđ„āļŸāļĨāđŒāđ‚āļ„āđ‰āļ” āđ‚āļ›āļĢāđāļāļĢāļĄ (.c) Compiler āđ„āļŸāļĨāđŒāļ­āļ­āļ›āđ€āļˆāđ‡āļ„ (.o) Linker āđ„āļŸāļĨāđŒ Embedded Binary/Hex) Translator āļĢāļđāļ›āļ—āļĩāđˆ 4.1 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļ•āļąāļ§āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāļ­āļ­āļžāđ€āļˆāđ‡āļ„āđ‚āļ„āđ‰āļ”āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ§āļĄāļāļąāļ™āļˆāļ™ āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ (executable le) āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ™āļģāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļēāđāļ›āļĨāļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđāļšāļšāđ„āļšāļ™āļēāļĢāļĩāļŦāļĢāļ·āļ­āđ„āļĄāđˆāļāđ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļŠāļāļļāļĨ .hex āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ° āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ‚āļŦāļĨāļ”āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđāļšāļšāđāļŸāļĨāļŠāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰ āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ° āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆ 2 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ„āļ”āđ‰āđāļāđˆ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ src/ āđāļĨāļ° āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ inc/ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ SRC/ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ INC/ main.c func1.c func1.h func2.c func2.h 182 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 183. āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ SRC/ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ INC/ func3.c func3.h āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āđāļšāļšāļ„āļ·āļ­ āļŠāđāļ•āļ•āļīāļāđ„āļĨāļšāļĢāļēāļĢāļĩ (static library) āđāļĨāļ° āđ„āļ”āļ™āļēāļĄāļīāļāđ„āļĨāļšāļĢāļēāļĢāļĩ (dynamic library) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ™āļīāļ” static $ gcc -c src/func1.c src/func2.c src/func3.c -I./inc $ ar libmine.a func1.o func2.o func3.o āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ™āļīāļ” dynamic $ gcc -shared -o libmine.so func1.o func2.o func3.o -I./inc āđ€āļĄāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļĨāļšāļĢāļēāļĢāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļ›āđƒāļŠāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļˆāļ„āļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ gcc src/main.c libmine.a -I/inc -o myprogram āļŦāļĢāļ·āļ­ $ gcc src/main.c -lmine -L./ -I/inc -o myprogram āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makefile āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ CC=gcc CFLAGS=-c -Wall LDFLAGS= SOURCES=main.c OBJECTS=$(SOURCES:.c=.o) MY_INCLUDES=/home/student/project/inc/ # MY_STATIC_LIBRARIES=libmine.a MY_DYNAMIC_LIBRARIES=mine EXECUTABLE=myprogram all: $(SOURCES) $(EXECUTABLE) ! $(EXECUTABLE): $(OBJECTS) ! $(CC) -I$(MY_INCLUDES) $(LDFLAGS) $(OBJECTS) -o $@ -l$(MY_DYNAMIC_LI- BRARIES) @echo “Compile hello completed...” .c.o: ! $(CC) $(CFLAGS) $< -o $@ 183 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 184. @echo “Compile all object files completed...” clean: ! rm -rf $(OBJECTS) $(EXECUTABLE) @echo “Clean all object files and hello program done...” āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒ āđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļĩāđ‚āļ­āļāļēāļŠāđƒāļ™āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļĢāļąāļšāļ„āđˆāļē āļŠāļ–āļēāļ™āļ°āļˆāļēāļāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ†āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāļĨāļ‡āđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒāļŦāļĢāļ·āļ­āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļšāļąāļ™āļ—āļķāļ āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ§āđ‰āđāļĨāđ‰āļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļˆāļķāļ‡āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđāļĢāļāđ†āļ‚āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ‚āļ­āļ‡āļ™āļąāļ āļžāļąāļ’āļ™āļē āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ stdio.h āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ #include <stdio.h> FILE *fopen(const char *path, const char *mode); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); int fprintf(FILE *stream, const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int fflush(FILE *stream); int fclose(FILE *stream); āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆ 3 āđ‚āļŦāļĄāļ”āđ„āļ”āđ‰āđāļāđˆ āļ­āđˆāļēāļ™āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (O_RDONLY) āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (O_WRONLY) āđāļĨāļ° āļ­āđˆāļēāļ™āđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰ (O_RDWR) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒāđāļĨāļ°āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ // file_manipulation.c #include <stdio.h> #include <string.h> int usage(){ printf("n"); printf("Usage : file Manipulation [OPTION] [FILE]n"); printf("Demo for text file operation, read and write. [Jamp II]n"); printf(" -r tt read operationn"); printf(" -w tt write operationn"); printf("n"); return 0; } int check_operation(char *opt){ 184 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 185. if(!strcmp(opt, "-r")){ // read operation return 0; } else if(!strcmp(opt, "-w")){ // write operation return 1; } else{ // error return -1; } } int main(int argc, char *argv[]){ FILE *file; int opt; // check for argument if(argc != 3){ usage(); return 0; } // check for getting operation if((opt = check_operation(argv[1])) < 0){ usage(); return 0; } // start file operation if(file = fopen(argv[2], (argv[1]+1))){ char dataBuf[256]; if(opt == 0){ // READ printf("****************** READ *******************n"); while(fgets(dataBuf, 256, file) != 0){ printf("%s", dataBuf); memset(dataBuf, 0, 256); } printf("*******************************************n"); } else{ // WRITE printf("***************** WRITE *******************n"); while(1){ memset(dataBuf, 0, 256); gets(dataBuf); 185 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 186. if(!strcmp(dataBuf, ":exit")) break; fprintf(file, "%sn", dataBuf); } printf("*******************************************n"); } fclose(file); } else{ printf("Can not open filen"); } return 0; } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ ïŽle_manipulation.c āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡ arm-linux-gcc āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM # # Makefile!: File Manipulation sample Program # # Macro # CROSS_COMPILE= CROSS_COMPILE=arm-linux- CC=$(CROSS_COMPILE)gcc CFLAGS=-Os LDFLAGS=-Os -static # Targets all: file_manipulation fileOpt: file_manipulation.o ! $(CC) $(LDFLAGS) $< -o $@ fileOpt.o: file_manipulation.c ! $(CC) $(CFLAGS) -c -o $@ $< clean: ! rm -rf *.o file_manipulation 186 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 187. āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļēāļāļāļēāļ™āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāđ€āļŠāđˆāļ™ āđ‚āļĄāđ€āļ”āļĄ, āđ€āļĄāļēāļŠāđŒ āļŦāļĢāļ·āļ­ āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđ‚āļ”āļĒāļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļŠāļ™āļīāļ”āļ™āļĩāđ‰ āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ—āļĩāļĨāļ°āļšāļīāļ• (bit-by-bit) āļšāļ™āļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš RS-232 āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āđˆāļēāļ‡āļˆāļēāļ āļžāļ­āļĢāđŒāļ•āļ‚āļ™āļēāļ™ (parallel port) āļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ—āļĩāļĨāļ°āļŦāļĨāļēāļĒāđ†āļšāļīāļ• (8-bit) āđ‚āļ”āļĒāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļāļēāļĢ āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāļˆāļ°āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāļ–āļĩāđˆāļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ‚āđ‰āļ­āļ”āļĩāļ‚āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ™āļļāļāļĢāļĄ āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļĒāļ°āļ—āļēāļ‡āļ—āļĩāđˆāđ„āļāļĨāļāļ§āđˆāļēāđāļĨāļ°āđƒāļŠāđ‰āļŠāļēāļĒāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļēāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ‚āļ™āļēāļ™ āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ­āļ™āļļāļāļĢāļĄāđāļšāđˆāļ‡āļ•āļēāļĄāļĨāļąāļāļĐāļ“āļ°āļŠāļąāļāļāļēāļ“āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđ„āļ”āđ‰ 2 āđāļšāļš āđ„āļ”āđ‰āđāļāđˆ 1. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ (Synchronous) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāđƒāļ™āļāļēāļĢ āļ„āļ§āļšāļ„āļļāļĄāļˆāļąāļ‡āļŦāļ§āļ°āļ‚āļ­āļ‡āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ āļĢāļđāļ›āļ—āļĩāđˆ 4.2 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ 2. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ (Asynchronous) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§ āļˆāļ° āđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāļ‚āļ­āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Bit Pattern) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āđˆāļēāļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™ āļ•āļąāļ§āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāđˆāļ§āļ™āđ„āļŦāļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļŠāđˆāļ§āļ™āđ„āļŦāļ™āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ›āļīāļ”āļ—āđ‰āļēāļĒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āđƒāļŦāđ‰āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāđ€āļ—āđˆāļēāļāļąāļ™āļ—āļąāđ‰āļ‡āļ āļēāļ„āļŠāđˆāļ‡āđāļĨāļ°āļ āļēāļ„āļĢāļąāļš āļĢāļđāļ›āļ—āļĩāđˆ 4.3 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āļ°āļ‹āļīāļ‡āđ‚āļ„āļĢāļ™āļąāļŠ āļ‹āļķāđˆāļ‡āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢ āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļĢāļąāļšāđāļĨāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļēāļžāđˆāļ§āļ‡āđ„āļ›āļ”āđ‰āļ§āļĒ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē UART (Universal Asyn- chronous Receiver Transmitter) āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđƒāļŠāđ‰āļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđāļšāļš RS-232 āļ–āđ‰āļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļšāļ™ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āđ€āļĢāļĩāļĒāļāļ§āđˆāļē COMPORT āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļĄāļēāļ•āļĢāļāļēāļ™ RS-232 āđāļĨāđ‰āļ§āļĢāļ°āļ”āļąāļšāđāļĢāļ‡āļ”āļąāļ™āļ•āđ‰āļ­āļ‡āļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđƒāļŦāđ‰ āđ€āļ›āđ‡āļ™āđ„āļŸāļšāļ§āļāļĨāļšāđ€āļžāļ·āđˆāļ­āļĨāļ”āļŠāļąāļāļāļēāļ“āļĢāļšāļāļ§āļ™āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āđ„āļ›āđ„āļ”āđ‰āļĢāļ°āļĒāļ°āļ—āļēāļ‡āļŦāļĨāļēāļĒāļŠāļīāļšāđ€āļĄāļ•āļĢ āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āđ„āļĄāđ‚āļ„āļĢ āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ āđ€āļŠāđˆāļ™ PIC, MCS-51 āļŦāļĢāļ·āļ­ AVR āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩāđ‚āļĄāļ”āļđāļĨ UART āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ§āļĒāđƒāļ™āļāļēāļĢ āļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļąāļ§āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāđāļĨāļ°āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļˆāļ°āļĄāļĩāļĢāļ°āļ”āļąāļšāļŠāļąāļāļāļēāļ“āđ€āļ›āđ‡āļ™āļĢāļ°āļ”āļąāļšāļŠāļąāļāļāļēāļ“ TTL (5V) āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āļĢāļ°āļ”āļąāļšāđāļĢāļ‡ āļ”āļąāļ™āļ”āđ‰āļ§āļĒāđ„āļ­āļ‹āļĩ MAX232 187 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 188. āļ‚āļēāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩ 2 āļ‚āļēāļŦāļĨāļąāļāļ„āļ·āļ­āļ‚āļēāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ (RxD) āđāļĨāļ° āļ‚āļēāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (TxD) āđ‚āļ”āļĒāļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļĢāļ‡āļāļąāļ™āļ—āļąāđ‰āļ‡āļ•āļąāļ§āļĢāļąāļšāđāļĨāļ°āļ•āļąāļ§āļŠāđˆāļ‡ āđ€āļŠāđˆāļ™āļšāļ­āļ”āđ€āļĢāļ• (baudrate) 9600 āļšāļīāļ•āļ•āđˆāļ­āļ§āļīāļ™āļēāļ—āļĩ āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āđ€āļĢāļīāđˆāļĄ āļšāļīāļ•āļŦāļĒāļļāļ” āļšāļīāļ•āļžāļēāļĢāļīāļ•āļĩāđ‰ āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļšāļīāļ•āļ‚āđ‰āļ­āļĄāļđāļĨ āļ•āļēāļĢāļēāļ‡ 4.1 āđ„āļŸāļĨāđŒāļŠāļ™āļīāļ” character āļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev āļ­āļļāļ›āļāļĢāļ“āđŒ āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ MAJOR MINOR Parallel port 0 /dev/lp0 āļŦāļĢāļ·āļ­ /dev/par0 6 0 Parallel port 1 /dev/lp1 āļŦāļĢāļ·āļ­ /dev/par1 6 1 1st Serial port /dev/ttyS0 4 64 2nd Serial port /dev/ttyS1 4 65 IDE tape drive /dev/ht0 37 0 1st SCSI tape drive /dev/st0 9 0 2nd SCSI tape drive /dev/st1 9 1 System Console /dev/console 5 1 1st Virtual Terminal /dev/tty1 4 1 2nd Virtual Terminal /dev/tty2 4 2 Process current terminal /dev/tty 5 0 Sound card /dev/audio 14 4 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ (/dev/ttySx āļŦāļĢāļ·āļ­ /dev/ttyUSBx) āļ āļēāļĒ āđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ // serial_thread.c #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ #include <pthread.h> /* Create pthread to run reading prog in background */ struct serial_data { int fd, nbytes, portsite; /* device file */ char *bufptr; /* set pointer of buffer */ char buffer[255], data[255]; /* target buffer to get from pointer */ }; struct serial_data ffuart; void *ffuart_thread() { ffuart.portsite = 1; 188 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 189. ffuart.fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY); if (ffuart.fd == -1) { /* Could not open the port. */ perror("open_port: Unable to open /dev/ttyS1 - "); } else { struct termios options; fcntl(ffuart.fd, F_SETFL, 0); tcgetattr(ffuart.fd, &options); cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); options.c_cflag |= (CLOCAL | CREAD); options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 0; options.c_cc[VTIME] = 10; tcsetattr(ffuart.fd, TCSANOW, &options); printf("Port is scanning. ^^n"); ffuart.bufptr = ffuart.buffer; /* set buffer to get from pointer */ printf("Hey! You Reading yet.n"); printf("Now working in ST Port.n"); while (1) { printf("ReadingFFn"); ffuart.nbytes = read(ffuart.fd, ffuart.buffer, 255); if (ffuart.nbytes != 0) { ffuart.buffer[8] = '0'; printf("From %d side : %sn", ffuart.portsite, ffuart.buffer); } } } close(ffuart.fd); } int main() { pthread_t ff_tid; int rc; printf("FF_Thread creating!!n"); rc = pthread_create(&ff_tid, NULL, ffuart_thread, (void *) NULL); if (rc) { printf("ERROR; return code from pthread_create() is %drn", rc); exit(-1); } printf("FF_Thread created!!t[Complete!!]n"); pthread_join(ff_tid, NULL); printf("Created all!!t[Complete!!]n"); pthread_exit(NULL); } 189 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 190. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ serial_thread.c āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM # # Makefile! : Serial communication Sample Program # CROSS_COMPILE=arm-linux-uclibc- CC=$(CROSS_COMPILE)gcc SOURCES=serial_thread.c OBJECTS=$(SOURCES:.c=.o) CFLAGS=-Os LDFLAGS=-Os -lm -static LIBRARIES=pthread EXECUTABLE=serial_thread all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) ! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -l$(LIBRARIES) .c.o: ! $(CC) $(CFLAGS) $< -o $@ clean: ! rm -rf $(OBJECTS) $(EXECUTABLE) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āļ„āļ·āļ­āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ // serial_chat.c #include <termios.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/signal.h> #include <sys/types.h> #define BAUDRATE B38400 #define MODEMDEVICE "/dev/ttyS1" #define _POSIX_SOURCE 1 //POSIX compliant source #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void signal_handler_IO (int status); //definition of signal handler int wait_flag=TRUE; //TRUE while no signal received char devicename[80]; long Baud_Rate = 38400; // default Baud Rate (110 through 38400) long BAUD; // derived baud rate from command line long DATABITS; long STOPBITS; 190 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 191. long PARITYON; long PARITY; int Data_Bits = 8; // Number of data bits int Stop_Bits = 1; // Number of stop bits int Parity = 0; // Parity as follows: // 00 = NONE, 01 = Odd, 02 = Even, 03 = Mark, 04 = Space int Format = 4; FILE *input; FILE *output; int status; main(int Parm_Count, char *Parms[]) { char version[80] = " POSIX compliant Communications test program version 1.00 4-25-1999rn"; char version1[80] = " Copyright(C) Mark Zehner/Peter Baumann 1999rn"; char version2[80] = " This code is based on a DOS based test program by Mark Zeh- ner and a Serialrn"; char version3[80] = " Programming POSIX howto by Peter Baumann, integrated by Mark Zehnerrn"; char version4[80] = " This program allows you to send characters out the speci- fied port by typingrn"; char version5[80] = " on the keyboard. Characters typed will be echoed to the console, and rn"; char version6[80] = " characters received will be echoed to the console.rn"; char version7[80] = " The setup parameters for the device name, receive data for- mat, baud ratern"; char version8[80] = " and other serial port parameters must be entered on the command line rn"; char version9[80] = " To see how to do this, just type the name of this program. rn"; char version10[80] = " This program is free software; you can redistribute it and/or modify itrn"; char version11[80] = " under the terms of the GNU General Public License as pub- lished by the rn"; char version12[80] = " Free Software Foundation, version 2.rn"; char version13[80] = " This program comes with ABSOLUTELY NO WARRANTY.rn"; char instr[100] ="rnOn the command you must include six items in the following order, they are:rn"; char instr1[80] =" 1. The device name Ex: ttyS0 for com1, ttyS1 for com2, etcrn"; char instr2[80] =" 2. Baud Rate Ex: 38400 rn"; char instr3[80] =" 3. Number of Data Bits Ex: 8 rn"; char instr4[80] =" 4. Number of Stop Bits Ex: 0 or 1rn"; char instr5[80] =" 5. Parity Ex: 0=none, 1=odd, 2=evenrn"; char instr6[80] =" 6. Format of data received: 1=hex, 2=dec, 3=hex/asc, 4=dec/asc, 5=ascrn"; char instr7[80] =" Example command line: serial_chat ttyS0 38400 8 0 0 4 rn"; char Param_strings[7][80]; char message[90]; int fd, tty, c, res, i, error; 191 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 192. char In1, Key; //place for old and new port settings for serial port struct termios oldtio, newtio; //place tor old and new port settings for keyboard teletype struct termios oldkey, newkey; struct sigaction saio; //definition of signal action char buf[255]; //buffer for where data is put input = fopen("/dev/tty", "r"); //open the terminal keyboard output = fopen("/dev/tty", "w"); //open the terminal screen if (!input || !output) { fprintf(stderr, "Unable to open /dev/ttyn"); exit(1); } error=0; fputs(version,output); //display the program introduction fputs(version1,output); fputs(version2,output); fputs(version3,output); fputs(version4,output); fputs(version5,output); fputs(version6,output); fputs(version7,output); fputs(version8,output); fputs(version9,output); fputs(version10,output); fputs(version11,output); fputs(version12,output); fputs(version13,output); //read the parameters from the command line if (Parm_Count==7) //if there are the right number of parameters on the command line { for (i=1; i<Parm_Count; i++) // for all wild search parameters { strcpy(Param_strings[i-1],Parms[i]); } i=sscanf(Param_strings[0],"%s",devicename); if (i != 1) error=1; i=sscanf(Param_strings[1],"%li",&Baud_Rate); if (i != 1) error=1; i=sscanf(Param_strings[2],"%i",&Data_Bits); if (i != 1) error=1; i=sscanf(Param_strings[3],"%i",&Stop_Bits); if (i != 1) error=1; i=sscanf(Param_strings[4],"%i",&Parity); if (i != 1) error=1; i=sscanf(Param_strings[5],"%i",&Format); if (i != 1) error=1; 192 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 193. sprintf(message,"Device=%s, Baud=%lirn",devicename, Baud_Rate); //output the received setup parameters fputs(message,output); sprintf(message,"Data Bits=%i Stop Bits=%i Parity=%i Format=%irn",D- ata_Bits, Stop_Bits, Parity, Format); fputs(message,output); } //end of if param_count==7 if ((Parm_Count==7) && (error==0)) //if the command line entrys were correct { //run the program tty = open("/dev/tty", O_RDWR | O_NOCTTY | O_NONBLOCK); //set the user console port up tcgetattr(tty,&oldkey); // save current port settings //so commands are interpreted right for this program // set new port settings for non-canonical input processing //must be NOCTTY newkey.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newkey.c_iflag = IGNPAR; newkey.c_oflag = 0; newkey.c_lflag = 0; //ICANON; newkey.c_cc[VMIN]=1; newkey.c_cc[VTIME]=0; tcflush(tty, TCIFLUSH); tcsetattr(tty,TCSANOW,&newkey); switch (Baud_Rate) { case 38400: default: BAUD = B38400; break; case 19200: BAUD = B19200; break; case 9600: BAUD = B9600; break; case 4800: BAUD = B4800; break; case 2400: BAUD = B2400; break; case 1800: BAUD = B1800; break; case 1200: BAUD = B1200; break; case 600: BAUD = B600; break; case 300: 193 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 194. BAUD = B300; break; case 200: BAUD = B200; break; case 150: BAUD = B150; break; case 134: BAUD = B134; break; case 110: BAUD = B110; break; case 75: BAUD = B75; break; case 50: BAUD = B50; break; } //end of switch baud_rate switch (Data_Bits) { case 8: default: DATABITS = CS8; break; case 7: DATABITS = CS7; break; case 6: DATABITS = CS6; break; case 5: DATABITS = CS5; break; } //end of switch data_bits switch (Stop_Bits) { case 1: default: STOPBITS = 0; break; case 2: STOPBITS = CSTOPB; break; } //end of switch stop bits switch (Parity) { case 0: default: //none PARITYON = 0; 194 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 195. PARITY = 0; break; case 1: //odd PARITYON = PARENB; PARITY = PARODD; break; case 2: //even PARITYON = PARENB; PARITY = 0; break; } //end of switch parity //open the device(com port) to be non-blocking (read will return immediately) fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { perror(devicename); exit(-1); } //install the serial handler before making the device asynchronous saio.sa_handler = signal_handler_IO; sigemptyset(&saio.sa_mask); //saio.sa_mask = 0; saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); // allow the process to receive SIGIO fcntl(fd, F_SETOWN, getpid()); // Make the file descriptor asynchronous (the manual page says only // O_APPEND and O_NONBLOCK, will work with F_SETFL...) fcntl(fd, F_SETFL, FASYNC); tcgetattr(fd,&oldtio); // save current port settings // set new port settings for canonical input processing newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; //ICANON; newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0; tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); // loop while waiting for input. normally we would do something useful here while (STOP==FALSE) { status = fread(&Key,1,1,input); if (status==1) //if a key was hit { switch (Key) 195 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 196. { /* branch to appropriate key handler */ case 0x1b: /* Esc */ STOP=TRUE; break; default: fputc((int) Key,output); // sprintf(message,"%x ",Key); //debug // fputs(message,output); write(fd,&Key,1); //write 1 byte to the port break; } //end of switch key } //end if a key was hit // after receiving SIGIO, wait_flag = FALSE, input is available and can be read if (wait_flag==FALSE) //if input is available { res = read(fd,buf,255); if (res>0) { for (i=0; i<res; i++) //for all chars in string { In1 = buf[i]; switch (Format) { case 1: //hex sprintf(message,"%x ",In1); fputs(message,output); break; case 2: //decimal sprintf(message,"%d ",In1); fputs(message,output); break; case 3: //hex and asc if ((In1<32) || (In1>125)) { sprintf(message,"%x",In1); fputs(message,output); } else fputc ((int) In1, output); break; case 4: //decimal and asc default: if ((In1<32) || (In1>125)) { sprintf(message,"%d",In1); fputs(message,output); } else fputc ((int) In1, output); break; case 5: //asc fputc ((int) In1, output); break; } //end of switch format 196 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 197. } //end of for all chars in string } //end if res>0 // buf[res]=0; // printf(":%s:%dn", buf, res); // if (res==1) STOP=TRUE; /* stop loop if only a CR was input */ wait_flag = TRUE; /* wait for new input */ } //end if wait flag == FALSE } //while stop==FALSE // restore old port settings tcsetattr(fd,TCSANOW,&oldtio); tcsetattr(tty,TCSANOW,&oldkey); close(tty); close(fd); //close the com port } //end if command line entrys were correct else //give instructions on how to use the command line { fputs(instr,output); fputs(instr1,output); fputs(instr2,output); fputs(instr3,output); fputs(instr4,output); fputs(instr5,output); fputs(instr6,output); fputs(instr7,output); } fclose(input); fclose(output); } //end of main /*************************************************************************** * signal handler. sets wait_flag to FALSE, to indicate above loop that * * characters have been received. * ***************************************************************************/ void signal_handler_IO (int status) { // printf("received SIGIO signal.n"); wait_flag = FALSE; } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ Makele āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ serial_thread.c āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 āđ‚āļ”āļĒāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļē āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāđ‰āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡ gcc # # Makefile! : Serial chat sample Program # # CROSS_COMPILE=arm-linux-uclibc- CC=$(CROSS_COMPILE)gcc 197 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 198. SOURCES=serial_chat.c OBJECTS=$(SOURCES:.c=.o) CFLAGS=-Os LDFLAGS=-Os -lm -static LIBRARIES= EXECUTABLE=serial_chat all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) ! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -l$(LIBRARIES) .c.o: ! $(CC) $(CFLAGS) $< -o $@ clean: ! rm -rf $(OBJECTS) $(EXECUTABLE) āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ (COM1) āđ‚āļ”āļĒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ $ serial_chat /dev/ttyS0 38400 8 1 0 4 āđ‚āļ”āļĒāļ—āļĩāđˆ: - āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ• /dev/ttyS0 - baud rate āļ—āļĩāđˆ 38,400 bps - āļ‚āļ™āļēāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ 8 āļšāļīāļ• - āļ‚āļ™āļēāļ”āļšāļīāļ•āļŦāļĒāļļāļ” (stop bit) 1 āļšāļīāļ• - āđ„āļĄāđˆāļĄāļĩ parity bit - āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļāļēāļ™āļŠāļīāļš āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Interprocess Communication - IPC) āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļēāļˆāļˆāļ°āļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļ•āđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļœāđˆāļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļœāđˆāļēāļ™āđ€āļŠāļĨāļĨāđŒāđ‚āļ”āļĒāļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĢāļāļˆāļ°āļŠāđˆāļ‡āđ„āļ› āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ—āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ–āļąāļ”āđ„āļ› $ ls -al | grep "source" drwxr-xr-x 24 root root 4096 2013-09-25 04:51 linux-source-2.6.32 āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāđ„āļ›āļ›āđŒ (Pipe) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāđƒāļ™āļāļēāļĢāļ™āļģāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™ āļ‹āđ‰āļēāļĒāđ„āļ›āļĒāļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™āļ‚āļ§āļē āļ‹āļķāđˆāļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™ āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 198 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 199. āļ•āļēāļĢāļēāļ‡ 4.2 āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāđƒāļ™āđāļšāļšāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ IPC M E T H O D D E S C R I P T I O N File āļšāļąāļ™āļ—āļķāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ”āļīāļŠāļāđŒ āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ Signal āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āđ„āļ›āļ‚āļąāļ”āļˆāļąāļ‡āļŦāļ§āļ°āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ€āļžāļ·āđˆāļ­ āļšāļ­āļāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļģāļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļŠāļąāļāļāļēāļ“āļ™āļąāđ‰āļ™āđ† āļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰ āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ”āđ‰āļ§āļĒāļāļąāļ™ Socket āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ™āđ‡āļ—āđ€āļ§āļīāļĢāđŒāļ„āļšāļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļŦāļĢāļ·āļ­āđ„āļ›āļĒāļąāļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™ Pipe āļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļžāļĢāđ€āļ‹āļŠāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļŦāļĢāļ·āļ­ half duplex Message queue āļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ„āļĄāđˆāļĢāļ°āļšāļļāļ„āļĨāđ‰āļēāļĒāļāļąāļšāđ„āļ›āļ›āđŒ āđāļ•āđˆāđ€āļāđ‡āļšāđāļĨāļ°āđ€āļĢāļĩāļĒāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđƒāļ™āđāļžāđ‡āļāđ€āļāļˆ Named pipe āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒāļšāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāđāļ—āļ™āļĄāļēāļ•āļĢāļāļēāļ™ input āđāļĨāļ° output Semaphore āđ‚āļ„āļĢāļŠāļĢāđ‰āļēāļ‡āļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāļ›āļĢāļ°āļŠāļēāļ™ thread āļŦāļĢāļ·āļ­āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļĩāđˆāļāļĢāļ°āļ—āļģāļāļąāļš āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™ Shared memory āđ€āļ›āđ‡āļ™āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āđ„āļ§āđ‰āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđāļŠāļĢāđŒāđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ·āđˆāļ™āđ† āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ Message passing (shared nothing) āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš message queue Memory-mapped le āđāļĄāļžāđ„āļŸāļĨāđŒāđ„āļ›āļĒāļąāļ‡ RAM āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļāđ‰āđ„āļ‚āđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ—āļĩāđˆāļ­āļĒāļđāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ āļˆāļģāđ‚āļ”āļĒāļ•āļĢāļ‡ Pipe āđ„āļ›āļ›āđŒ (Pipe) āđ€āļ›āđ‡āļ™āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ‡āđˆāļēāļĒāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāļ™āļģāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļ āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡āđ„āļ›āđ€āļ›āđ‡āļ™āļ­āļīāļ™āļžāļļāļ—āļ‚āļ­āļ‡āļ­āļĩāļāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡ āđ‚āļ”āļĒāđ„āļ›āļ›āđŒāļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļĨāļēāļ‡āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ‹āļķāđˆāļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļšāļ—āļīāļĻāļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§ (unidirectional) pfd[1] āđ€āļ‚āļĩāļĒāļ™āļ‚āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡ pfd[0] āļ­ïœŠāļēāļ™āļ‚āļ­āļĄāļđāļĨāļ•āļģāđāļŦāļ™ïœŠāļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡ Pipe āļĢāļđāļ›āļ—āļĩāđˆ 4.4 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ—āļīāļĻāļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ”āđ‰āļ§āļĒ Pipe 199 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 200. āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ•āļĢāļĩāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļžāļĢāđ€āļ‹āļŠāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe āļ—āļĩāđˆ āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē unistd.h #include <unistd.h> int pipe ( int pipefd[2] ); <--- pipefd - āļ•āļąāļ§āđāļ›āļĢ array āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ„āđˆāļē le descriptors pipefd[0] - le descriptor āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āđˆāļēāļ™ pipefd[1] - le descriptor āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™ āļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ pipe 0 - āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ, -1 - āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļĨāđ‰āļĄāđ€āļŦāļĨāļ§ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļŠāļ·āđˆāļ­āļŠāļēāļĢāļŠāļ™āļīāļ”āļ—āļēāļ‡āđ€āļ”āļĩāļĒāļ§āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ”āļĒāļˆāļ°āļ„āļ·āļ™āļ„āđˆāļē le descriptor āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļāļąāđˆāļ‡ āļœāđˆāļēāļ™āļ•āļąāļ§āđāļ›āļĢ pipefd[] āļāļĨāđˆāļēāļ§āļ„āļ·āļ­ āļ›āļĨāļēāļĒāļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™ (pipefd[0]) āđāļĨāļ°āļ­āļĩāļāļ›āļĨāļēāļĒāļŦāļ™āļķāđˆāļ‡āļŠāļģāļŦāļĢāļąāļšāđ€āļ‚āļĩāļĒāļ™ (pipefd[1]) āļ„āđˆāļēāļ‚āļ­āļ‡ ïŽle descriptor āđ€āļ›āđ‡āļ™āļŠāļ™āļīāļ”āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄ (int) āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ–āļķāļ‡āđāļŸāđ‰āļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe āļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāđˆāļ‡āļ­āļēāđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļˆāļģāļ™āļ§āļ™āđ€āļ•āđ‡āļĄāļ—āļĩāđˆāļĄāļĩāļŠāļĄāļēāļŠāļīāļ 2 āļ•āļąāļ§āđƒāļŦāđ‰āđāļāđˆ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pipe() int pipefd[2]; // file descriptor āļ‚āļ­āļ‡ pipe āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ pipe // pipe.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]){ pid_t pid; int mypipefd[2]; int ret; char buf[20]; ret = pipe(mypipefd); if(ret == -1) { perror("pipe"); exit(1); } pid = fork(); if(pid == 0) { /* Child Process */ printf("Child Processn"); write(mypipefd[1], "Hello there!", 12); }else{ /* Parent Process */ printf("Parent Processn"); read(mypipefd[0], buf, 15); 200 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 201. printf("buf : %sn", buf); } return 0; } āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ pipe.c āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡ (āđ‚āļ›āļĢāđ€āļ‹āļŠ parent āđāļĨāļ°āđ‚āļ›āļĢ āđ€āļ‹āļŠ child) $ gcc -o pipe pipe.c $ ./pipe Parent Process Child Process buf : Hello there! Message Queues āļˆāļ°āļĄāļĩāļĨāļąāļāļĐāļ“āļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļšāđ„āļŸāļĨāđŒ pipe āļ„āļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļ™āļķāđˆāļ‡āđ„āļ›āļĒāļąāļ‡āļ­āļĩāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļ™āļķāđˆāļ‡ āļœāđˆāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢ āđ€āļ‹āļŠāļ­āļ·āđˆāļ™āđ†āļŠāļēāļĄāļēāļĢāļ–āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ™āļąāđ‰āļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļˆāļ°āđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ pipe āļ‹āļķāđˆāļ‡āļ—āļąāđ‰āļ‡ āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‹āļķāđˆāļ‡āļāļąāļ™āđāļĨāļ°āļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš message queue āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ·āļ­ āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡ queue (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ msgsnd) āđāļĨāđ‰āļ§ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļˆāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āļ–āđ‰āļē āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ”āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ­āđˆāļēāļ™ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ queue āđ„āļ”āđ‰āļ āļēāļĒāļŦāļĨāļąāļ‡ (āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ msgrcv) āļ”āļąāļ‡āđāļŠāļ”āļ‡ āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ message queue āļāđ‡āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđ€āļĢāļ·āđˆāļ­āļ‡āļ‚āļ™āļēāļ”āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļˆāļģāļāļąāļ”āļ‚āļ™āļēāļ”āđ„āļ§āđ‰ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļˆāļģāļ™āļ§āļ™āļšāļĨāđ‡āļ­āļāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļĄāļĩāļšāļ™āļĢāļ°āļšāļšāļāđ‡āļˆāļ°āļ–āļđāļāļˆāļģāļāļąāļ”āđ„āļ§āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āđāļ›āļĢ āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļŠāđˆāļ§āļ™āļ„āļ·āļ­ MSGMAX(4096) āđāļĨāļ° MSGMNB(16384) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āđāļĢāļāļˆāļ°āļŦāļĄāļēāļĒ āļ–āļķāļ‡āļ„āļ§āļēāļĄāļˆāļļāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļšāļĨāđ‡āļ­āļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āđāļĨāļ°āļ•āļąāļ§āļ—āļĩāđˆāļŠāļ­āļ‡āļˆāļ°āļŦāļĄāļēāļĒāļ–āļķāļ‡āļ„āļ§āļēāļĄāļˆāļļāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡ queue āđāļ•āđˆāđƒāļ™āļšāļēāļ‡āļĢāļ°āļšāļš āļ„āđˆāļēāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ­āļēāļˆāļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāđƒāļŠāđ‰āļ„āđˆāļēāļ™āļĩāđ‰āđ€āļĨāļĒāļāđ‡āđ€āļ›āđ‡āļ™āđ„āļ”āđ‰ ...āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ›āļĢāđ€āļ‹āļŠ msgsnd() msgrev() msgget() msgctl() āļĢāļđāļ›āļ—āļĩāđˆ 4.5 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļš message queue 201 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 202. āļĢāļēāļĒāļāļēāļĢāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ sys/msg.h āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™ Message Queues #include<sys/msg.h> int msgct1(int msqid, int cmd, struct msqid_ds *buf); int megget1(key_t key, int ms_gflg); int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļŠāđˆāļ‡āļšāļĨāđŠāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ Message Queues /* ** msg_sender.c -- writes to a message queue */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> struct my_msgbuf { long mtype; char mtext[200]; }; int main(void) { struct my_msgbuf buf; int msqid; key_t key; if ((key = ftok("msg_sender.c", 'B')) == -1) { perror("ftok"); exit(1); } if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) { perror("msgget"); exit(1); } printf("Enter lines of text, ^D to quit:n"); buf.mtype = 1; /* we don't really care in this case */ while(gets(buf.mtext), !feof(stdin)) { if (msgsnd(msqid, (struct msgbuf *)&buf, sizeof(buf), 0) == -1) perror("msgsnd"); } if (msgctl(msqid, IPC_RMID, NULL) == -1) { perror("msgctl"); 202 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 203. exit(1); } return 0; } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļ­āđˆāļēāļ™āļšāļĨāđŠāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ āļ āļēāļĒāđƒāļ™ Message Queues /* ** msg_receiver.c -- reads from a message queue */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> struct my_msgbuf { long mtype; char mtext[200]; }; int main(void) { struct my_msgbuf buf; int msqid; key_t key; if ((key = ftok("msg_sender.c", 'B')) == -1) { /* same key as msg_sender.c */ perror("ftok"); exit(1); } if ((msqid = msgget(key, 0644)) == -1) { /* connect to the queue */ perror("msgget"); exit(1); } printf("spock: ready to receive messages, captain.n"); for(;;) { /* Spock never quits! */ if (msgrcv(msqid, (struct msgbuf *)&buf, sizeof(buf), 0, 0) == -1) { perror("msgrcv"); exit(1); } printf("spock: "%s"n", buf.mtext); } return 0; } 203 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 204. Thread āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ° multi-tasking programming āđ‚āļ”āļĒāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ—āļĢāļ” (thread) āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļš āļŦāļĨāļēāļĒāļ‡āļēāļ™āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ€āļ—āļĢāļ”āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē “lightweight processes” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđˆāļ§āđ„āļ›āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ (āđ€āļŠāđˆāļ™āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ AX,BX,DX), āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļāļēāļĢāļˆāļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļš code, globals, heap āđāļĨāļ° stack) āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ, āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ) āļ‹āļķāđˆāļ‡āđ€āļ—āļĢāļ”āļāđ‡āļˆāļ°āļ„āļĨāđ‰āļēāļĒāļāļąāļ™ āđāļ•āđˆāļˆāļ°āļ•āđˆāļēāļ‡āļāļąāļ™āļ•āļĢāļ‡āļ—āļĩāđˆ multiple processes āļˆāļ°āđāļĒāļāļāļēāļĢāđ€āļāđ‡āļš āļŠāļ–āļēāļ™āļ°āļāļąāļ™āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ multiple threads āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ code, globals āđāļĨāļ° heap āļĢāđˆāļ§āļĄāļāļąāļ™ āđ€āļ—āļĢāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ”āļĩāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ™āļąāđ‰āļ™āļĄāļĩāļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āđ‚āļ”āļĒāđƒāļ™ āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ (āđ„āļ”āđ‰āđāļāđˆ main(), function1() āđāļĨāļ° function2()) āļ‹āļķāđˆāļ‡āļ–āđ‰āļē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļĩāđ‰āļāđ‡āļˆāļ°āļ—āļģāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ‚āļ­āļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļ•āđˆāļĨāļ° āļšāļĢāļĢāļ—āļąāļ” (program counter) āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 2 āļ™āļēāļ—āļĩ āđāļ•āđˆāļ–āđ‰āļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļˆāļģāļ™āļ§āļ™ 3 āļ•āļąāļ§āļ—āļąāđ‰āļ‡āļŠāļēāļĄāļŠāđˆāļ§āļ™āļāđ‡āļˆāļ°āđāļĒāļāļāļąāļ™āļ—āļģāļ‡āļēāļ™āđ„āļ›āđāļ•āđˆāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™āđ€āļžāļĩāļĒāļ‡ 50 āļ§āļīāļ™āļēāļ—āļĩāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ main thread thread 3 thread 2 āđ€āļ§āļĨāļē (Time) āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Single-Thread CPU #1 CPU #1 CPU #2 CPU #3 āļ„āļ·āļ­ main() āļ„āļ·āļ­ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 2() āļ„āļ·āļ­ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 1() āļāļēāļĢāļ—āđāļēāļ‡āļēāļ™āļĨāļąāļāļĐāļ“āļ°āđāļšāļš Multi-Thread āđ€āļ§āļĨāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āđ€āļ§āļĨāļēāļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāđƒāļŠāđ‰ multi-thread āđ€āļ§āļĨāļēāļ—āļĩāđˆāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāđƒāļŠāđ‰ single-thread āļĢāļđāļ›āļ—āļĩāđˆ 4.6 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš Single-Thread āđāļĨāļ° Multi-Thread 204 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 205. āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ—āļĢāļ”āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļāļąāļ™āđ„āļ”āđ‰āļ—āļēāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ­āļĒāļđāđˆāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđƒāļ™ āļ‚āļ“āļ°āļ—āļĩāđˆāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļœāđˆāļēāļ™āļāļąāļ™āđ„āļ”āđ‰āļ•āđ‰āļ­āļ‡āļœāđˆāļēāļ™āļ—āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļŠāđˆāļ™ āļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ, āļœāđˆāļēāļ™āđ„āļ›āļ›āđŒ āļŦāļĢāļ·āļ­āļœāđˆāļēāļ™āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ POSIX threads āđ„āļĨāļšāļĢāļēāļĢāļĩ POSIX thread āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļĄāļēāļ•āļĢāļēāļāļēāļ™āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ€āļ—āļĢāļ”āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ†āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ€āļ—āļĢāļ”āđāļĨāļ°āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (multi-processor āļŦāļĢāļ·āļ­ multi-core systems) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļ•āļēāļĢāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļšāļ™āđāļ•āđˆāļĨāļ°āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆ āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āđāļĨāļ°āđ€āļ—āļĢāļ”āļ—āļļāļāļ•āļąāļ§āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒ āļ„āļ§āļēāļĄāļˆāļģāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ (address space) āļ‹āļķāđˆāļ‡āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļ‚āļ™āļēāļ™ (Parallel programming) āđ€āļŠāđˆāļ™ MPI āđāļĨāļ° PVM āļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļāļēāļĢāļ„āļģāļ™āļ§āļ“āđāļšāļšāļāļĢāļ°āļˆāļēāļĒ (distributed computing) āđ„āļ›āļĒāļąāļ‡āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āđ† āļ—āļĩāđˆāļ­āļĒāļđāđˆāđ„āļāļĨāļ­āļ­āļāđ„āļ›āļŦāļĢāļ·āļ­āļ•āđˆāļēāļ‡āļŠāļ–āļēāļ™āļ—āļĩāđˆāļāļąāļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ—āļĢāļ”āđ‚āļ”āļĒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix threads (pthread.h) āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ”āļąāļ‡āļ™āļĩāđ‰ #include <pthread.h> int pthread_create(pthread_t *new_thread_ID, const pthread_attr_t *attr, void * (*start_func)(void *), void *arg); int pthread_join(pthread_t target_thread, void **status); āļ‚āļšāļ§āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ™āļąāđ‰āļ™āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ thread creation, termination, thread synchro- nization (joins,blocking), scheduling, data management āđāļĨāļ° process interaction Master Thread Worker Thread Worker Thread pthread_create() pthread_join() pthread_exit() āļ•āļąāļ§āļĨāļđāļāđ€āļĢāļīāđˆāļĄāļ—āđāļēāļ‡āļēāļ™ āļ•āļąāļ§āļĨāļđāļāļ—āđāļēāļ‡āļēāļ™ āđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ āļ—āđāļēāļ‡āļēāļ™ āļĢāļđāļ›āļ—āļĩāđˆ 4.7 āđāļŠāļ”āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļĨāļđāļāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļˆāļ™āļŠāļīāđ‰āļ™āļŠāļļāļ” 205 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 206. āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ āļˆāļ°āļĄāļĩāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ â€Ē āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (Process instructions) â€Ē āļ„āđˆāļē les descriptors āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļīāļ”āđ„āļ§āđ‰ â€Ē āļŠāļąāļāļāļēāļ“ (signals) āđāļĨāļ°āļ•āļąāļ§āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ (signal handlers) â€Ē āđ„āļ”āđ€āļĢāļ”āļ—āļ­āļĢāļĩāđˆāļ›āļąāļˆāļˆāļļāļšāļąāļ™ (current working directory) â€Ē āļŦāļĄāļēāļĒāđ€āļĨāļ‚ User āđāļĨāļ° Group Thread #1 Registers Thread #2 RegistersFiles Heap Static Code Stack Stack Stack Thread #3 Stack Registers Thread #2 Stack Registers Thread #1 Stack Registers āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ āļĢāļđāļ›āļ—āļĩāđˆ 4.8 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđ€āļ—āļĢāļ”āļˆāļ°āļĄāļĩ: â—Ķ āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ—āļĢāļ” (Thread ID) â—Ķ āļāļĨāļļāđˆāļĄāļ•āļąāļ§āđāļ›āļĢāļĢāļĩāļˆāļīāļŠāđ€āļ•āļ­āļĢāđŒ (set of registers) āđāļĨāļ° stack pointer â—Ķ āļŠāđāļ•āđ‡āļāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢ (local variables) â—Ķ signal mask â—Ķ āļ„āđˆāļē priority â—Ķ āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāļŠāđˆāļ‡āļāļĨāļąāļš: errno āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix threads āļ”āđ‰āļ§āļĒ -lpthread āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ gcc -o main main.c –lpthread 206 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 207. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ simple_threads.c // simple_threads.c #include <stdio.h> #include <stdlib.h> #include <pthread.h> void *print_message_function(void *ptr); main() { pthread_t thread1, thread2; const char *message1 = "Thread 1"; const char *message2 = "Thread 2"; int iret1, iret2; /* Create independent threads each of which will execute function */ iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) mes- sage1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) mes- sage2); /* Wait till threads are complete before main continues. Unless we */ /* wait we run the risk of executing an exit which will terminate */ /* the process and all threads before the threads have completed. */ pthread_join( thread1, NULL); pthread_join( thread2, NULL); printf("Thread 1 returns: %dn",iret1); printf("Thread 2 returns: %dn",iret2); exit(0); } void *print_message_function(void *ptr) { char *message; message = (char *) ptr; printf("%s n", message); } āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ $ gcc -o simple_threads simple_threads.c –lpthread $ ./simple_threads Thread 2 Thread 1 Thread 1 returns: 0 Thread 2 returns: 0 Thread Synchronization āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ›āļĢāļ°āļŠāļēāļ™āļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ—āļĢāļ” (synchronization mechanisms) āđ‚āļ”āļĒāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ—āļĢāļ” āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ”āļĒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ pthread 207 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 208. āļ•āļąāļ§āđāļ›āļĢ (var) Thread #1 Thread #2 mutex_var lock āļ•āļąāđ‰āļ‡āļ„āđˆāļē blocked āļĢāļđāļ›āļ—āļĩāđˆ 4.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ™ mutex āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļ‚āļ­āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢ āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™āđāļŠāļ”āļ‡āļāļēāļĢāļ­āļ™āļļāļāļēāļ•āđ€āļžāļĩāļĒāļ‡ thread #1 āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļē mutex (Mutual Exclusion Lock) āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢ āđ‚āļ”āļĒāļ—āļĩāđˆ thread #2 āļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ­ (block) āļ„āļīāļ§āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆ thread #1 āļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ•āļąāļ§ thread #2 āļˆāļķāļ‡āļˆāļ°āļŠāļēāļĄāļēāļĢāļ– āđ€āļ‚āđ‰āļēāđ„āļ›āļāļģāļŦāļ™āļ”āļ„āđˆāļē mutex āđ€āļžāļ·āđˆāļ­āļ‚āļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļ™āļąāđ‰āļ™āļ•āđˆāļ­āđ„āļ› Mutexes āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļēāļĢāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļŠāđˆāļ§āļĒāļ›āđ‰āļ­āļ‡āļāļąāļ™āļ›āļąāļāļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āļāļēāļĢāđ„āļĄāđˆ āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (data inconsistency) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļēāđ€āļŦāļ•āļļāļāļēāļĢāđāļĒāđˆāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļŠāđˆāļ§āļ™āļāļĨāļēāļ‡ āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āļŦāļĨāļēāļĒāļ•āļąāļ§āļžāļĢāđ‰āļ­āļĄāļāļąāļ™ āđ€āļŠāđˆāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (shared memory) āļŦāļĢāļ·āļ­āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡ (global variable) āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļ™āļąāđ‰āļ™āļ§āđˆāļē critical region āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāļēāļĢāđƒāļŠāđ‰ mutexes āļˆāļ°āļ–āļđāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āđƒāļ™āļāļĢāļ“āļĩāļĄāļĩāļŦāļĨāļēāļĒāđ€āļ—āļĢāļ”āđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđāļ•āđˆāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļŦāļĨāļēāļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļē āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āđāļāđ‰āđ„āļ‚āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„ semaphores āđāļ—āļ™ mutexes 208 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 209. āļāļĢāļ“āļĩāđ„āļĄāđˆāđƒāļŠāđ‰ MUTEXāļāļĢāļ“āļĩāđ„āļĄāđˆāđƒāļŠāđ‰ MUTEX āļāļĢāļ“āļĩāđƒāļŠāđ‰ MUTEXāļāļĢāļ“āļĩāđƒāļŠāđ‰ MUTEX int counter=0; void func() { counter++; } int counter=0; void func() { counter++; } pthread_mutex_t var = PTHREAD_MUTEX_INTIALIZER; int counter=0; void func() { pthread_mutex_lock(&var); counter++; pthread_mutex_unlock(&var); } pthread_mutex_t var = PTHREAD_MUTEX_INTIALIZER; int counter=0; void func() { pthread_mutex_lock(&var); counter++; pthread_mutex_unlock(&var); } Thread #1 Thread #2 Thread #1 Thread #2 counter=0 counter=0 counter=0 counter=0 counter=1 counter=1 counter=1 Thread #2 āļ–āļđāļāļšāļĨāđ‡āļ­āļ„āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢ counter āđāļ•āđˆ Thread #1 āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢ counter āđ„āļ”āđ‰ counter=2 āļ‹āļķāđˆāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļš mutex āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ pthread āđ„āļ”āđ‰āđāļāđˆ â€Ēpthread_mutex_lock() āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļĨāđ‡āļ­āļ„āļ„āđˆāļēāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ mutex āļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļāđ‡ āļˆāļ°āļ–āļđāļāļšāļĨāđŠāļ­āļ„āđ€āļ­āļēāđ„āļ§āđ‰āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļĄāļē āļˆāļ™āļāļ§āđˆāļēāđ€āļ—āļĢāļ”āļ•āļąāļ§āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆāļ—āļģāļāļēāļĢāļ›āļĨāđˆāļ­āļĒāļ•āļąāļ§ mutex āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ â€Ēpthread_mutex_unlock() āđ€āļžāļ·āđˆāļ­āļ›āļĨāđˆāļ­āļĒāļŦāļĢāļ·āļ­āļ›āļĨāļ”āļĨāđ‡āļ­āļ„āļ„āđˆāļē mutex āļˆāļēāļāđ€āļ—āļĢāļ”āļ—āļĩāđˆāđƒāļŠāđ‰ mutex āļ­āļĒāļđāđˆ â€Ēpthread_mutex_trylock() āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•āļąāļ§āđāļ›āļĢ mutex āļ§āđˆāļēāļāļģāļĨāļąāļ‡āļ–āļđāļāđƒāļŠāđ‰āļĨāđŠāļ­āļ„āđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļ™āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļ•āđˆāļēāļ‡āļāđˆāļēāļĒāļ•āđˆāļēāļ‡āļĢāļ­āđƒāļŦāđ‰āđāļ•āđˆāļĨāļ° āļ•āļąāļ§āđ€āļŠāļĢāđ‡āļˆ (deadlock conditions) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ—āļĢāļ”āļˆāļģāļ™āļ§āļ™ 10 āđ€āļ—āļĢāļ” āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āļąāļ§āđāļ›āļĢāļāļĨāļēāļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē counter āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄāļ„āđˆāļē counter āđ„āļ”āđ‰āđ€āļžāļĩāļĒāļ‡āļ„āļĢāļąāđ‰āļ‡āļĨāļ° 1 āđ€āļ—āļĢāļ”āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ // simple_mutex.c #include <stdio.h> #include <pthread.h> #define NTHREADS 10 void *thread_function(void *); pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; int counter = 0; main() { pthread_t thread_id[NTHREADS]; int i, j; for(i=0; i < NTHREADS; i++) 209 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 210. { pthread_create( &thread_id[i], NULL, thread_function, NULL ); } for(j=0; j < NTHREADS; j++) { pthread_join( thread_id[j], NULL); } // Now that all threads are complete I can print the final result. // Without the join I could be printing a value before all the threads // have been completed. printf("Final counter value: %dn", counter); } void *thread_function(void *dummyPtr) { printf("Thread number %ldn", pthread_self()); pthread_mutex_lock(&mutex1); counter++; pthread_mutex_unlock(&mutex1); } āļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ $ gcc -o simple_mutex simple_mutex.c –lpthread $ ./simple_mutex Thread number 139638417069824 Thread number 139638425462528 Thread number 139638442247936 Thread number 139638433855232 Thread number 139638408677120 Thread number 139638400284416 Thread number 139638391891712 Thread number 139638383499008 Thread number 139638375106304 Thread number 139638366713600 Final counter value: 10 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļ·āđˆāļ­āļŠāļēāļĢāļšāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļĄāļĩāļžāļ­āļĢāđŒāļ•āļŠāļģāļŦāļĢāļąāļšāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (Ethernet Port) āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™ āļāļēāļ™ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļŠāļąāđˆāļ‡āļ—āļēāļ‡āļ”āđ‰āļēāļ™ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§āđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļšāļ­āļĢāđŒāļ”āļ­āļ·āđˆāļ™āđ† āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ­āļ·āđˆāļ™āđ† āļŦāļĢāļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰ āđ‚āļ”āļĒāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļāļēāļāđ„āļ§āđ‰āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ­āļ·āđˆāļ™āđ†āļŦāļĢāļ·āļ­ 210 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 211. āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆāļ™āļąāđ‰āļ™āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđ€āļ­āļ‡ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļžāļ·āđˆāļ­ āļ„āļ§āļšāļ„āļļāļĄāļŦāļĢāļ·āļ­āļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļēāļāļ—āļĩāđˆāđ„āļŦāļ™āļāđ‡āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚ IP Addresses āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ āđ„āļĄāđˆ āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ (Network ID) āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (Host ID) āļŦāļĄāļēāļĒāđ€āļĨāļ‚ Netmask Address āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ”āđ‰āļ§āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āļēāļĄ āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āļ‹āļķāđˆāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļš Transport Layer āđāļĨāļ°āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• (Port Ad- dress) āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđāļ­āļžāļžāļīāđ€āļ„āļŠāļąāđˆāļ™ (Application Protocol) āļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļ•āđˆāļĨāļ°āļāļąāđˆāļ‡āđƒāļŠāđ‰āļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļąāļšāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ FTP āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āļ§āļšāļ„āļļāļĄāļ§āļīāļ˜āļĩāļāļēāļĢāļŠāđˆāļ‡āđ„āļŸāļĨāđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ āđ€āļĢāļĩāļĒāļāļāļēāļĢāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āļ§āđˆāļē Socket Programming TCP UDP IP 1 2 ... ... ... ... 65535 1 2 ... ... ... ... 65535 ... ...TCP sockets UDP sockets UDP portsTCP ports Application Application Application āļĢāļ°āļšāļļāļŦāļĄāļēāļĒāđ€āļĨāļ‚ port āļŠāđāļēāļŦāļĢāļąāļš socket Descriptor references āļĢāļđāļ›āļ—āļĩāđˆ 4.10 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļ”āļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ‚āļ­āļ‡ TCP/IP āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• (socket) āļ™āļąāđ‰āļ™āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 3 āļ›āļĢāļ°āđ€āļ āļ—āđ‚āļ”āļĒāļĒāļķāļ”āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ TCP/IP āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 4.3 āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Socket SOCKET āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ Datagram Socket āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Connection less Socket āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ UDP (User Datagram Protocol) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđāļžāđ‡āļāđ€āļāđ‡āļ• (packet) āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļšāļ™ datagram socket āļ—āļĩāđˆāđāļĒāļāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļāļąāļ™āļ­āļ­āļāđ„āļ› āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđāļžāđ‡āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāļŠāđˆāļ‡āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ™āļ—āļēāļ‡āļāđ‡āļˆāļ°āļ–āļđāļāļĨāļģāđ€āļĨāļĩāļĒāļ‡āļāļĢāļ°āļˆāļēāļĒāļ­āļ­āļāđ„āļ›āđƒāļ™āđāļ•āđˆāļĨāļ°āđ€āļŠāđ‰āļ™ āļ—āļēāļ‡ āļˆāļ™āļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļąāļšāļ›āļĨāļēāļĒāļ—āļēāļ‡ āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āđāļžāđ‡āļāđ€āļāđ‡āļ•āļāđ‡āļ­āļēāļˆāļˆāļ°āļĄāļēāļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡ āđāļšāļšāđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļĢāļĩāļĒāļ‡āļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ•āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ•āđ‰āļ™āļ—āļēāļ‡āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļąāđ‰āļ™ 211 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 212. SOCKET āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ Stream Socket āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Connection-oriented Socket āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ TCP (Transport Control Protocol) āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļāļģāļŦāļ™āļ”āļ§āļīāļ˜āļĩāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļāļēāļĢ āļŠāļ–āļēāļ›āļ™āļēāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ°āļāļēāļĢāļąāļ™āļ•āļĩāļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āđāļžāđ‡āļāđ€āļāđ‡āļ• āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĢāļ·āļ­āđāļžāđ‡āļāđ€āļāđ‡āļ• āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļšāļ™ stream socket āđāļĨāļ°āļˆāļ°āļ–āļđāļāļĨāļģāđ€āļĨāļĩāļĒāļ‡āļŠāđˆāļ‡āļœāđˆāļēāļ™āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļ—āļĩāđˆāļ–āļđāļ āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāļ™āļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ›āļĨāļēāļĒāļ—āļēāļ‡āļˆāļ™āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļŠāļĄāļšāļđāļĢāļ“āđŒ Raw Socket āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļžāļšāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļŠāđˆāļ™ āļŠāļ§āļīāļ—āļ‹āđŒ (Switch) āđāļĨāļ° āđ€āļĢāļēāđ€āļ•āļ­āļĢāđŒ (Router) āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļš Internet Layer āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļąāļš- āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāđ€āļŦāļĄāļ·āļ­āļ™ datagram āđāļĨāļ° stream socket āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļĄāļēāļ•āļĢāļēāļāļēāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ• āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ āđāļĨāļ°āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđ€āļžāļ·āđˆāļ­ āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļāļąāļ™ āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰āđ„āļ”āđ‰āđāļāđˆ â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļ™āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ āļēāļĒāļ™āļ­āļāđ„āļ”āđ‰āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļēāļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ•āļąāļ§āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđāļ•āđˆāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļžāļšāđ€āļŦāđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰ āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ™āļĩāđ‰ â€Ē āļĄāļēāļāļāļ§āđˆāļēāļŦāļ™āļķāđˆāļ‡āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™āļžāļ­āļĢāđŒāļ•āļ­āļąāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ â€Ē āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ—āļąāđ‰āļ‡ TCP āđāļĨāļ° UDP āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ•āļēāļĄāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› āđ€āļŠāđˆāļ™ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āđāļĄāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļŦāļēāļĒāđ„āļ”āđ‰āļšāđ‰āļēāļ‡āļāđ‡āļˆāļ° āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡ UDP āļŦāļĢāļ·āļ­āļ–āđ‰āļēāđ€āļ™āđ‰āļ™āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ—āļĩāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāļŠāļđāļāļŦāļēāļĒāļāđ‡āļˆāļ°āđƒāļŠāđ‰āļŠāđˆāļ­āļ‡āļ—āļēāļ‡ TCP āđƒāļ™āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āđāļ—āļ™ â€Ē āđ„āļŸāļĨāđŒ /etc/services āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļˆāļ°āļšāļ­āļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ āđāļĨāļ°āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļ—āļĩāđˆāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™āļ‹āđ‡āļīāļ­āļāđ€āļāđ‡āļ•āđƒāļ™āļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡ Transport layer 212 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 213. socket socket bind bind recvfrom/ sendto sendto/ recvfrom close close Connect Listen Accept Client Server āļŠāļĢāđ‰āļēāļ‡ socket āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ socket āđ„āļ›āļĒāļąāļ‡āļžāļ­āļĢāđŒāļ• āļĢāđ‰āļ­āļ‡āļ‚āļ­āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ› āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ server āđāļĨāļ°āļĢāļ­āļ•āļ­āļšāļāļĨāļąāļš āļĢāļąāļšāđāļĨāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļĢāđ‰āļēāļ‡ socket āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ socket āđ„āļ›āļĒāļąāļ‡āļžāļ­āļĢāđŒāļ• āļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Client āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļ•āļ­āļšāļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Client āđ€āļžāļ·āđˆāļ­ āļžāļĢāđ‰āļ­āļĄāļĢāļąāļš/āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāđˆāļ‡āđāļĨāļ°āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ āļĢāļđāļ›āļ—āļĩāđˆ 4.11 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ Socket āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™āļ‹āđ‡āļ­āļāđ€āļāđ‡āļ•āļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļ­āļ˜āļīāļšāļēāļĒāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļ•āļąāļ§āļĨāļđāļ (Client) āļˆāļ°āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ„āļ› āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server) āđāļĨāđ‰āļ§āļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ Hello World of Socket āđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ āđ€āļĄāļ·āđˆāļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāđ„āļ”āđ‰āļĢāļąāļš āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ āļ”āļąāļ‡āļ™āļĩāđ‰ āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server): #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { /* Variables */ int sock; struct sockaddr_in server; int mysock; char buff[1024]; 213 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 214. int rval; /* Create socket */ sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0){ perror("Failed to create socket"); exit(1); } server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(5000); /* Call bind */ if(bind(sock, (struct sockaddr *)&server, sizeof(server))) { perror("bind failed"); exit(1); } /* Listen */ listen(sock, 5); /* Accept */ do { mysock = accept(sock, (struct sockaddr *) 0, 0); if(mysock == -1) { perror("accept failed"); }else{ memset(buff, 0, sizeof(buff)); if((rval = recv(mysock, buff, sizeof(buff), 0)) < 0 ) perror("reading stream message error"); else if(rval == 0) printf("Ending connectionn"); else printf("MSG: %sn", buff); printf("Got the message (rval = %d)n", rval); close(mysock); } }while(1); return 0; } āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ (Client): #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> 214 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 215. #include <string.h> #include <stdlib.h> #include <unistd.h> #define DATA "Hello World of Socket" int main(int argc, char *argv[]) { int sock; struct sockaddr_in server; struct hostent *hp; char buff[1024]; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { perror("socket failed"); exit(1); } server.sin_family = AF_INET; hp = gethostbyname(argv[1]); if(hp == 0) { perror("gethostbyname failed"); close(sock); exit(1); } memcpy(&server.sin_addr, hp->h_addr, hp->h_length); server.sin_port = htons(5000); if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { perror("connect failed"); close(sock); exit(1); } if(send(sock, DATA, sizeof(DATA), 0) < 0 ) { perror("send failed"); close(sock); exit(1); } printf("Sent %sn", DATA); close(sock); return 0; } 215 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 216. āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ (Server) āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđƒāļ™āļāļąāđˆāļ‡āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ Client Program Server Program Port:3333 xinetd stdin stdin stdout socket socket stdout 172.16.56.134172.16.56.130 āļĢāļđāļ›āļ—āļĩāđˆ 4.12 āđāļŠāļ”āļ‡āļ‚āļšāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļžāļ­āļĢāđŒāļ• 3333 āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 : āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒ āđ€āļžāļ·āđˆāļ­āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāļąāđˆāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆāļ‚āđˆāļēāļĒ $ vim hello_server.sh  #!/bin/bash /bin/echo -n "Hello World:" | /usr/bin/tee /tmp/log.log /bin/date | /usr/bin/tee -a /tmp/log.log āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āđ„āļŸāļĨāđŒāļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļāļĢāļąāļ™āđ„āļ”āđ‰ $ chmod 755 hello_server.sh $ ./hello_server.sh Hello World:Mon Sep 30 01:44:24 PDT 2013     āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 : āļāļģāļŦāļ™āļ”āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļˆāļ°āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ: $ gcc -o server server.c $ ./server MSG: Hello World of Socket Got the message (rval = 22) āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĨāļđāļ: $ gcc -o client client.c $ ./client <IP āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĄāđˆ> Sent Hello World of Socket 216 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 217. āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• 3333 āđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āđāļĨāļ°āļāļēāļĢāđ€āļŠāđ‡āļ„āļˆāļēāļāļāļēāļĢāđ€āļ›āļīāļ”āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āļāđˆāļ­āļ™āļ§āđˆāļēāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ”āļąāļ‡āļ™āļĩāđ‰ $ cat /etc/services | grep 3333 $ grep -r 3333 /etc/xinetd.d/* āđ€āļĄāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāđ‰āļ§ āļ›āļĢāļēāļāļāļ§āđˆāļēāļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļžāļ­āļĢāđŒāļ• 3333 āđāļĨāļ°āļŠāļ·āđˆāļ­āļšāļĢāļīāļāļēāļĢ â€œhello” āļāđ‡āļŠāļēāļĄāļēāļĢāļ– āđ€āļ‚āđ‰āļēāđ„āļ›āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āļšāļĢāļīāļāļēāļĢāđƒāļŦāļĄāđˆāđƒāļ™āđ„āļŸāļĨāđŒ /etc/services āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ sudo vim /etc/services āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āđāļĨāđ‰āļ§āļšāļąāļ™āļ—āļķāļāđ„āļŸāļĨāđŒ /etc/services āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ hello        3333/tcp        # sample hello service āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ: - āđƒāļŦāđ‰āļĨāļšāļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ /etc/services āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ—āļ”āļŠāļ­āļš hello service āđāļĨāđ‰āļ§ āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļąāļāļŦāļē āļāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āđƒāļ™āļ­āļ™āļēāļ„āļ• āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 : āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡ hello service āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /etc/xinetd.d/ $ sudo vim /etc/xinetd.d/hello āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ”āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ # default: on # description: Hello World socket server service hello { ! port! = 3333 ! disable! = no ! socket_type! = stream ! protocol! = tcp ! user! = root ! wait! = no ! server! = /home/student/hello_server.sh ! log_on_success! += USERID ! log_on_failure! += USERID } āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ xinetd āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļ°āļšāļšāđƒāļŦāļĄāđˆ $ sudo /etc/init.d/xinetd restart * Stopping internet superserver xinetd [ OK ] * Starting internet superserver xinetd [ OK ] 217 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 218. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 : āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ telnet $ telnet 172.16.56.134 3333 Trying 172.16.56.134... Connected to 172.16.56.134. Escape character is '^]'. Hello World:Mon Sep 30 02:30:39 PDT 2013 Connection closed by foreign host. āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQLITE āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļ§āļīāļ˜āļĩ āđāļ•āđˆāļ›āļąāļāļŦāļēāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļš āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ„āļ·āļ­āļ–āđ‰āļēāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ log āđƒāļ™ āļĨāļąāļāļĐāļ“āļ° text le āļ˜āļĢāļĢāļĄāļ”āļē āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļšāļŦāļĢāļ·āļ­āđāļ—āļĢāļāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āđƒāļ™āđ„āļŸāļĨāđŒ log āļˆāļ°āļĄāļĩ āđ‚āļ­āļāļēāļŠāļ—āļģāđƒāļŦāđ‰āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļŦāļēāļĒāđ„āļ”āđ‰āļŠāļđāļ‡ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ log āļāđ‡āļˆāļ°āļĄāļĩ āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļ­āļ­āļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļĄāļĩāļĢāļ°āļšāļš āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āļ„āļ§āļĢāļˆāļ° āļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ (Database) āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāđ„āļ”āđ‰ āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļŠāļđāļ‡ āđāļĨāļ°āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļĄāļēāļ•āļĢāļēāļāļēāļ™āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡ āļ•āļąāļ§āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ, iOS āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāđ‡āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite  āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— Open Source āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ āļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļšāđ€āļ›āđ‡āļ™ .db, .sdb, āļŦāļĢāļ·āļ­ .s3db āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļž āđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļ—āļĩāđˆāđƒāļŠāđ‰āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡ SQLite āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļąāļ‡āļ•āļąāļ§āļ•āđˆāļ­āđ„āļ› āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1 : āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĨāđˆāļēāļŠāļļāļ” āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ SQLite (sqlite-autoconf-3080002.tar.gz) āļˆāļēāļāļĨāļīāļ‡āļ„āđŒ http://www.sqlite.org/download.html $ tar -xzvf sqlite-autoconf-3080002.tar.gz $ cd sqlite-autoconf-3080002/ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 : āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ•āļąāļ§ cross compiler āļĨāļ‡āđƒāļ™ Ubuntu āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 10.10 āļ‚āļķāđ‰āļ™āđ„āļ› 218 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 219. $ sudo apt-get install gcc-arm-linux-gnueabi. āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰ Ubuntu āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ•āđˆāļģāļāļ§āđˆāļē 10.10 $ sudo add-apt-repository ppa:linaro-maintainers/toolchain $ sudo apt-get update $ sudo apt-get install gcc-arm-linux-gnueabi āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3 : āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ SQLite āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM $ mkdir ~/sqlite $ ./configure --host=arm CC=arm-linux-gnueabi-gcc AR=arm-linux- -gnueabi-ar STRIP=arm-linux-gnueabi-strip RANLIB=arm-linux-gnueabi- -ranlib CFLAGS=" -mfpu=vfp -Os -lpthread -lrt" LDFLAGS=${LDFLAGS} $ make $ make install DESTDIR=~/sqlite āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļˆāļ°āļ–āļđāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/sqlite/ āļ”āļąāļ‡āļ™āļĩāđ‰ usr/local/bin usr/local/include usr/local/lib usr/local/share āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4 : āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ SQLite āđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ”āđ‰āļ§āļĒ cross compiler āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ ARM $ vim my_sqlite.c #include <stdio.h> #include <sqlite3.h> int main(int argc, char* argv[]) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db)); exit(0); }else{ fprintf(stderr, "Opened database successfullyn"); } sqlite3_close(db); } 219 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 220. āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ arm-linux-gnueabi-gcc -o my_sqlite my_sqlite.c -I~/sqlite/usr/local/ include e -L~/sqlite/usr/local/lib -lsqlite3 -lpthread -ldl āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ•āļąāļ§āđ€āļĨāļ·āļ­āļ "-lpthread" āļŦāļĢāļ·āļ­ "-pthread" āļāđ‡āđ„āļ”āđ‰ āđāļ•āđˆāļ–āđ‰āļēāđƒāļŠāđ‰ "-pthread" āļ•āļąāļ§āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļĨāļ­āļĢāđŒ āļāđ‡āļˆāļ°āļ„āđ‰āļ™āļŦāļēāļ•āļąāļ§āđ„āļĨāļšāļĢāļēāļĢāļĩ Posix Thread āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄāđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ "-ldl" āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ§āđˆāļēāđƒāļŠāđˆāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ dlsym, dlopen āļ—āļĩāđˆāļĄāļĩāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ $ file my_sqlite my_sqlite: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, not stripped āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļŦāļēāļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āļŦāļĢāļ·āļ­āđāļĄāđ‰āļāļĢāļ°āļ—āļąāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ§āđˆāļēāđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ„āļ§āđ‰āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļ™āļąāđ‰āļ™āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ›āļĨāđˆāļ­āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļāļģāļŦāļ™āļ” āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ”āļđāļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļŦāļĢāļ·āļ­āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļģāļĨāļąāļ‡ āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ (run-time) āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ‚āļšāļ§āļ™āļāļēāļĢāļ™āļĩāđ‰āļ§āđˆāļēāļāļēāļĢāļ”āļĩāļšāļąāļ (Debugging) āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ™āļąāđ‰āļ™ āļāđ‡āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ”āļĩāļšāļąāļ āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē GNU debugger āļ–āļđāļāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒ Richard Stallman āļšāļīāļ”āļēāđāļŦāđˆāļ‡ GPL āđƒāļ™āļ›āļĩ āļ„.āļĻ. 1986 āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļš GNU āļ‚āļ­āļ‡ Richard Stallman āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļāļĨāļļāđˆāļĄāļ„āļģāļŠāļąāđˆāļ‡ gdb kdb āļŦāļĢāļ·āļ­ ddd āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ„āļģāļŠāļąāđˆāļ‡ gdb āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāļ™āļąāļ āļžāļąāļ’āļ™āļēāđƒāļ™āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰: â€Ē āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ„āļģāļŠāļąāđˆāļ‡āļšāļĢāļĢāļ—āļąāļ”āļ•āđˆāļ­āļšāļĢāļĢāļ—āļąāļ” (line by line) āļ”āđ‰āļ§āļĒ āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡ gdb â€Ē āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĒāļļāļ”āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰āđ„āļ”āđ‰ â€Ē āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ āļ“ āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ (run-time) â€Ē āļāļģāļŦāļ™āļ”āļˆāļļāļ”āļŦāļĒāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (breakpoints) āđāļĨāđ‰āļ§āļˆāļķāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļ•āđˆāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļšāļš step- by-step āļŦāļĢāļ·āļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ›āļāļ•āļīāļ•āđˆāļ­āđ„āļ›āđ„āļ”āđ‰ āđ‚āļ”āļĒāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ â€œ-g” āļ•āđ‰āļ­āļ‡āļ—āđ‰āļēāļĒāļ„āļģāļŠāļąāđˆāļ‡ gcc āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆ āļāļģāļĨāļąāļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ gcc –g –c main.c $ g++ -g –c function1.c $ g++ -g –o my_program main.o function1.o 220 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 221. āļ„āļ­āļĄāđ„āļžāļĨāđ€āļĨāļ­āļĢāđŒāļˆāļ°āđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđˆāļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ gdb āļĨāļ‡āđ„āļ›āđƒāļ™āļ­āļ­āļ›āđ€āļˆāļ„āđ„āļŸāļĨāđŒ (.o) āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ (executable le) āļ‹āļķāđˆāļ‡ gdb āļˆāļ°āđƒāļŠāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļŦāļēāļšāļĢāļĢāļ—āļąāļ” āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ­āļ­āļāļĄāļē āļ„āļģāļŠāļąāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ gdb āļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļāļąāļ™āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 4.4 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ gdb āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ•āđ‡āļĄ āļ„āļģāļŠāļąāđˆāļ‡āļĒāđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ run r āđ€āļĢāļīāđˆāļĄāđ‚āļ›āļĢāđāļāļĢāļĄ kill k āļŦāļĒāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ quit q āļ­āļ­āļāļˆāļēāļ GDB continue c āļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āđ‚āļ”āļĒāļŦāļĒāļļāļ”āļ—āļĩāđˆ breakpoint āļ–āļąāļ”āđ„āļ› disassemble disass āđāļŠāļ”āļ‡ assembly code āļ‚āļ­āļ‡ function āļ—āļĩāđˆ EIP āļ­āļĒāļđāđˆ disassemble ADDR disass ADDR āđāļŠāļ”āļ‡ assembly code āļ—āļĩāđˆ address ADDR (āđƒāļŠāđ‰ āļŠāļ·āđˆāļ­ function āđ„āļ”āđ‰) disassemble ADDR1 ADDR2 disass ADDR1 ADDR2 āđāļŠāļ”āļ‡ assembly code āļ—āļĩāđˆ address ADDR1 āļ–āļķāļ‡ ADDR2 info breakpoints i b āđāļŠāļ”āļ‡ breakpoint āļ—āļąāđ‰āļ‡āļŦāļĄāļ” info registers i r āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ CPU registers āļ—āļąāđ‰āļ‡āļŦāļĄāļ” info frame i f āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš stack frame āļ›āļąāļˆāļˆāļļāļšāļąāļ™ backtrace bt āđāļŠāļ”āļ‡ call stack break *ADDR b *ADDR set breakpoint āļ—āļĩāđˆ address ADDR (āļ–āđ‰āļēāđƒāļŠāđ‰āļŠāļ·āđˆāļ­ function āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩ *) enable [NUM] en [NUM] enable breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM disable [NUM] dis [NUM] disable breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM delete [NUM] d [NUM] delete breakpoint āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ—āļĩāđˆ NUM delete d delete breakpoint āļ—āļąāđ‰āļ‡āļŦāļĄāļ” nexti [num] ni [num] āļ—āļģāļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ call stepi [num] si [num] āļ—āļģāļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ–āļąāļ”āđ„āļ› āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ call x/NFU ADDR āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ address ADDR āđ‚āļ”āļĒ N āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨ F āļ„āļ·āļ­āļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļœāļĨ (āļ”āļđāļ•āļēāļĢāļēāļ‡āļ–āļąāļ”āđ„āļ›) U āļ„āļ·āļ­āļˆāļģāļ™āļ§āļ™ byte āļĄāļĩ b (byte), h (2 bytes), w (4 bytes), g (8 bytes) display/F ADDR disp/F ADDR āđāļŠāļ”āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ address ADDR āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļ–āļķāļ‡āļŦāļĒāļļāļ” āļ—āļģāļ‡āļēāļ™āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ display disp āđāļŠāļ”āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ display list āļ—āļąāđ‰āļ‡āļŦāļĄāļ” 221 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 222. āļ„āļģāļŠāļąāđˆāļ‡āđ€āļ•āđ‡āļĄ āļ„āļģāļŠāļąāđˆāļ‡āļĒāđˆāļ­ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ undisplay [NUM] und [NUM] āļĨāļš display āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļ§āđ‰āļ—āļĩāđˆ NUM set ADDR=VAL set āļ„āđˆāļē VAL āđ„āļ›āļ—āļĩāđˆ address ADDR āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ factorial āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ $ vim factorial.c # include <stdio.h> int main() { int i=0, num=0, j=1; printf ("Enter the number: "); scanf ("%d", &num ); for (i=1; i<num; i++) j=j*i; printf("The factorial of %d is %dn",num,j); } āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ factorial āđ‚āļ”āļĒāđƒāļŠāđˆāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -g āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ gcc -g factorial.c $ ./a.out Enter the number: 10 The factorial of 10 is 362880 āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ gdb āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ gdb ./a.out GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11~ppa1) 7.2 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/student/unix/a.out...done. āļ—āļ”āļŠāļ­āļšāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āļ•āļąāđ‰āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡ breakpoint āđāļĨāļ° clear breakpoint āļ‹āļķāđˆāļ‡āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ 2 āđāļšāļšāļ„āļ·āļ­āđāļšāļšāļ—āļĩāđˆ 1 āļŦāļĒāļļāļ”āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļšāļĢāļĢāļ—āļąāļ”āļ—āļĩāđˆāļĢāļ°āļšāļļ break [file_name]:line_number 222 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 223. clear [file_name]:line_number āđāļšāļšāļ—āļĩāđˆ 2 āļ„āļ·āļ­āļŦāļĒāļļāļ”āđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļĢāļ°āļšāļļ break [file_name]:func_name clear [file_name]:func_name āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļĩāļšāļąāļāđ‚āļ›āļĢāđāļāļĢāļĄ (gdb) break 3 Breakpoint 2 at 0x40059c: file factorial.c, line 3. (gdb) break 7 Breakpoint 2 at 0x4005c3: file factorial.c, line 7. (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x000000000040059c in main at factorial.c:3 2 breakpoint keep y 0x00000000004005c3 in main at factorial.c:10 (gdb) run Starting program: /home/student/unix/a.out Breakpoint 2, main () at factorial.c:7 7! ! scanf ("%d", &num ); āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ print [variables] āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ„āļ”āđ‰ (gdb) print j $1 = 1 (gdb) s Enter the number: 3 9! ! for (i=1; i<num; i++) (gdb) s 10! ! ! j=j*i; (gdb) s 9! ! for (i=1; i<num; i++) (gdb) s 10! ! ! j=j*i; (gdb) print j $2 = 1 (gdb) print i $3 = 2 223 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 224. (gdb) break 10 if j==2 Note: breakpoint 1 also set at pc 0x4005e5. Breakpoint 3 at 0x4005e5: file factorial.c, line 10. (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10 2 breakpoint keep y 0x000000000040059c in main at factorial.c:3 3 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10 ! stop only if j==2 (gdb) watch j==3 Hardware watchpoint 2: j == 3 (gdb) disass main Dump of assembler code for function main: 0x0000000000400594 <+0>:!push %rbp 0x0000000000400595 <+1>:!mov %rsp,%rbp 0x0000000000400598 <+4>:!sub $0x10,%rsp 0x000000000040059c <+8>:!movl$0x0,-0x4(%rbp) 0x00000000004005a3 <+15>:! movl$0x0,-0x8(%rbp) 0x00000000004005aa <+22>:! movl$0x1,-0xc(%rbp) 0x00000000004005b1 <+29>:! mov $0x40070c,%eax 0x00000000004005b6 <+34>:! mov %rax,%rdi 0x00000000004005b9 <+37>:! mov $0x0,%eax 0x00000000004005be <+42>:! callq 0x400478 <printf@plt> 0x00000000004005c3 <+47>:! mov $0x40071f,%eax 0x00000000004005c8 <+52>:! lea -0x8(%rbp),%rdx 0x00000000004005cc <+56>:! mov %rdx,%rsi 0x00000000004005cf <+59>:! mov %rax,%rdi 0x00000000004005d2 <+62>:! mov $0x0,%eax 0x00000000004005d7 <+67>:! callq 0x400498 <__isoc99_scanf@plt> 0x00000000004005dc <+72>:! movl$0x1,-0x4(%rbp) 0x00000000004005e3 <+79>:! jmp 0x4005f3 <main+95> => 0x00000000004005e5 <+81>:" mov -0xc(%rbp),%eax 0x00000000004005e8 <+84>:! imul -0x4(%rbp),%eax 0x00000000004005ec <+88>:! mov %eax,-0xc(%rbp) 0x00000000004005ef <+91>:! addl$0x1,-0x4(%rbp) ... 0x0000000000400608 <+116>:! mov %rax,%rdi 0x000000000040060b <+119>:! mov $0x0,%eax 0x0000000000400610 <+124>:! callq 0x400478 <printf@plt> 0x0000000000400615 <+129>:! leaveq 0x0000000000400616 <+130>:! retq End of assembler dump. 224 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 225. āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ ddd āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļĩāļšāļąāļāđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ‹āļķāđˆāļ‡āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļžāļĢāļēāļ°āļĄāļĩāđ„āļ­āļ„āļ­āļ™āļ—āļĩāđˆ āļŠāļēāļĄāļēāļĢāļ–āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ–āļķāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ gdb āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.13 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ DDD āđāļĨāļ°āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ† āļāļēāļĢāļ•āļąāđ‰āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡ breakpoint āđāļĨāļ°āļ”āļđāļ„āđˆāļēāļ āļēāļĒāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 225 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 226. āļĢāļđāļ›āļ—āļĩāđˆ 4.14 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļˆāļļāļ” Break Point āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“ (Signal) āđāļšāļšāļ•āđˆāļēāļ‡āđ† āđāļĨāļ°āļ”āļđāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ āļēāļĐāļēāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™āļāļąāļ™ āļĢāļđāļ›āļ—āļĩāđˆ 4.15 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļāļēāļ“āđāļĨāļ°āļ”āļđāļ āļēāļĐāļēāđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰ 226 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 227. āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C++ āļ”āđ‰āļ§āļĒ Qt āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļĒāļ­āļĄāļĢāļąāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™ cross-platform application framework āļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ•āļąāļ§āļŦāļ™āļķāđˆāļ‡ āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ API āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠ āļžāļĨāļąāļŠ āļ‹āļķāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŦāļĨāļēāļĒāđ†āļ”āđ‰āļēāļ™āļ āļēāļĒāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩāļ‚āļ­āļ‡āļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠāđ€āļ­āļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļžāļ­āļĢāđŒāļ•āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĨāļ°āđ€āļ—āļĢāļ” āđƒāļŦāđ‰āļĄāļĩ āļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™ āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ–āļĩāļĒāļĢāļ āļēāļž āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļĄāļēāļāļ‚āļķāđ‰āļ™ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡ āļāļąāļ™āđ„āļ› Qt āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ­āļ­āļāđāļšāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļ‡āļēāļ™āļ”āđ‰āļēāļ™ āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒ XML āļŦāļĢāļ·āļ­āļ‡āļēāļ™āļ”āđ‰āļēāļ™āđ€āļ§āđŠāļ›āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļē āļ āļēāļĒāđƒāļ•āđ‰ Qt āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ–āļđāļāļĢāļ­āļ‡āļĢāļąāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļĨāļ°āļŦāļĨāļēāļĒ āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ āđ„āļ”āđ‰āđāļāđˆ āļĢāļ°āļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS X āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒ āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļ™āđ‚āļ”āļŠāđŒāļ‹āļĩāļ­āļĩ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĄāļĩāđ‚āļāđ‰ āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ„āđ‰āļ”āļ āļēāļĐāļē C++ Core Libraries GUI Libraries Database Network XML OpenGL Multimedia Web Kit Windows Linux/X11 MacOS X Embedded Linux WinCE āļĢāļđāļ›āļ—āļĩāđˆ 4.16 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ Qt framework āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡ Qt framework āđ‚āļ”āļĒāļŠāļąāđ‰āļ™āļšāļ™āļŠāļļāļ”āļ„āļ·āļ­āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ āļŠāļąāđ‰āļ™āļĢāļ­āļ‡āļĨāļ‡āļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ Qt classes āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ GUI, Webkit, Database āđāļĨāļ°āļ­āļ·āđˆāļ™āđ† āđāļĨāļ°āļŠāļąāđ‰āļ™ āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ„āļ·āļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ QT āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Qt āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē Qt Installer āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļĢāļ§āļĄ Qt Libraries āđāļĨāļ° Qt Creator āļŠāļģāļŦāļĢāļąāļšāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļąāļ’āļ™āļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļ”āđ‰āļˆāļēāļ http://qt-project.org/downloads āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ 227 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 228. āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ—āļģāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” Qt source code āļĨāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āđāļ•āļāđ„āļŸāļĨāđŒ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ wget http://download.qt-project.org/official_releases/qt/4.8/4.8.5/qt-every where-opensource-src-4.8.5.tar.gz $ tar -xzvf qt-everywhere-opensource-src-4.8.5.tar.gz āļāļģāļŦāļ™āļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™ ARM āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ•āļēāļĄāļĨāļģāļ”āļąāļš $ cd ~/qt-everywhere-opensource-src-4.8.5 $ ./configure -embedded [architecture] āđ‚āļ”āļĒāļ—āļĩāđˆ: [architecture] āļ„āļ·āļ­āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āđ€āļŠāđˆāļ™ āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ arm, x86 āļŦāļĢāļ·āļ­ mips āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļžāļīāđ€āļĻāļĐāļ­āļ·āđˆāļ™āđ†āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ./congure āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļŠāļ āļēāļž āđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ sudo /usr/local/qt-embedded-4.8.5 $ ./configure -prefix /usr/local/qt-embedded-4.8.5 -embedded -qt-gfx-linuxfb -qt-gfx-qvfb -qt-gfx-vnc -no-largefile -exceptions -no-accessibility -no-qt3support -qt-zlib -no-gif -no-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-nis -no-cups -depths 8,16,18,32 -qt-kbd-tty -qt-kbd-qvfb -qt-kbd-linuxinput -qt-mouse-linuxinput -qt-mouse-qvfb -qt-mouse-pc $ make āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāđ‰āļ§ āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļīāđˆāļĄāļĨāļ‡āđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡ āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Embedded Linux āļ”āļąāļ‡āļ™āļĩāđ‰ -libQtCore.so <--- āđ„āļĨāļšāļĢāļēāļĢāļĩāļŦāļĨāļąāļ -libQtGui.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļŠāđˆāļ§āļ™āļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ (GUI) -libQtNetwork.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ -libQtSql.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ SQlite -libQtXml.so <--- āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒ XML āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /lib āļ‚āļ­āļ‡ root le system āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ 228 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 229. āđƒāļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ â€œHello World” āļ­āļĒāđˆāļēāļ‡ āļ‡āđˆāļēāļĒ āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ $ vim main.cpp // main.cpp #include<QtCore> int main(){ qDebug() << "Hello Worldn"; } āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡ 2 āđ„āļŸāļĨāđŒāļ‚āļķāđ‰āļ™āļĄāļē āđ„āļ”āđ‰āđāļāđˆ āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ Makele āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ qmake -project āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ ###################################################################### # Automatically generated by qmake ######################################################################   TEMPLATE = app TARGET = DEPENDPATH += . INCLUDEPATH += .   # Input SOURCES += main.cpp āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Makele āđ‚āļ”āļĒāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ qmake āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđˆāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ $ qmake $ cat Makefile ####### Compile main.o: main.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp ####### Install install: FORCE uninstall: FORCE FORCE: 229 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 230. āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ $ make g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/ include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp g++ -Wl,-O1 -o qt main.o -L/usr/lib -lQtGui -lQtCore -lpthread āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ $ ./qt Hello World āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđƒāļ™āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (GUI program) āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Qt Creator āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Text editor āļ—āļąāđˆāļ§āđ„āļ› āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ vim qt_gui.cpp // qt_gui.cpp #include<QApplication> #include<QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel* hello = new QLabel("<h1>Hello, World</h1>"); hello->show(); hello->setWindowTitle("Welcome to Embedded System World"); return app.exec(); } āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ Makele āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ qmake -project $ qmake āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļ”āļąāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ $ ls gui.pro Makefile qt_gui.cpp $ cat gui.pro ###################################################################### # Automatically generated by qmake (2.01a) Mon Sep 30 23:09:58 2013 ###################################################################### TEMPLATE = app 230 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 231. TARGET = DEPENDPATH += . INCLUDEPATH += . # Input SOURCES += qt_gui.cpp $ cat Makefile ############################################################################# # Makefile for building: gui # Generated by qmake (2.01a) (Qt 4.6.2) on: Mon Sep 30 23:10:00 2013 # Project: gui.pro # Template: app # Command: /usr/bin/qmake -unix -o Makefile gui.pro ############################################################################# ####### Compiler, tools and options CC = gcc CXX = g++ DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES) ... compiler_uic_clean: compiler_yacc_decl_make_all: compiler_yacc_decl_clean: compiler_yacc_impl_make_all: compiler_yacc_impl_clean: compiler_lex_make_all: compiler_lex_clean: compiler_clean: ####### Compile qt_gui.o: qt_gui.cpp ! $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qt_gui.o qt_gui.cpp ####### Install install: FORCE uninstall: FORCE FORCE: āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ $ make g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/ include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o qt_gui.o qt_gui.cpp g++ -Wl,-O1 -o gui qt_gui.o -L/usr/lib -lQtGui -lQtCore -lpthread 231 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 232. āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Hello World āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ./gui āļĢāļđāļ›āļ—āļĩāđˆ 4.17 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Hello World āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ SIGNAL āđāļĨāļ° SLOT Signals āđāļĨāļ° slots āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ§āļąāļ•āļ–āļļ (object) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ› āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (GUI) āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.18 āļāļĨāđ„āļāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Signals āđāļĨāļ° Slots āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ signals āļāļąāļš slots āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļĢāļđāļ›āđāļšāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ™āļĩāđ‰ connect(sender, SIGNAL(signal), receiver, SLOT(slot)); āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ signals āđāļĨāļ° slots #include<QApplication> 232 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 233. #include<QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton* hello = new QPushButton("Quit"); hello->resize(150, 75); QObject::connect(hello, SIGNAL(clicked()), &app, SLOT(quit())); hello->show(); hello->setWindowTitle("Hi"); return app.exec(); } āļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļšāļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ signal āļ‚āļ­āļ‡āļ›āļļāđˆāļĄāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļ–āļđāļāļāļ” (clicked()) āđ„āļ›āļĒāļąāļ‡āļ•āļąāļ§ slot āļ—āļĩāđˆ āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ quit() āļ‹āļķāđˆāļ‡āļ—āļģāļāļēāļĢāļ­āļ­āļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļ·āļ­āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāļāđ‡āļˆāļ° āļ­āļ­āļāļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļŠāļąāļ‡āđ€āļāļ•āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰ signal āđāļĨāļ° slot āļĄāļĩāļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļŦāļ™āļķāđˆāļ‡ signal āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ„āļ”āđ‰āļŦāļĨāļēāļĒ slots 2. āļŦāļĨāļēāļĒ signals āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļāļąāļš slot āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰ 3. āļŠāļēāļĄāļēāļĢāļ–āļĒāļāđ€āļĨāļīāļāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ (connection) āđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt Creator āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Qt Creator āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„āđƒāļŦāļĄāđˆ āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ” Qt GUI Application āđāļĨāđ‰āļ§ āđ€āļĨāļ·āļ­āļ Base class āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļš QDialog āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.19 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļŠāđˆāļ§āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ„āļĨāļēāļŠ 233 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 234. āļŦāļĨāļąāļ‡āļˆāļēāļāļāļ” Next āđāļĨāđ‰āļ§ Qt Creator āļˆāļ°āđ„āļ”āđ‰āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.20 āđāļŠāļ”āļ‡āđ‚āļ„āđ‰āļ”āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ dialog.ui āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ UI āđƒāļŦāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ QPushButton āđāļĨāļ° QLabel āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™ āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.21 āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ GUI āļœāđˆāļēāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ Design āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡ āđ‚āļ”āļĒāļāļēāļĢāļ„āļĨāļīāđŠāļāļ‚āļ§āļēāļ—āļĩāđˆāļ›āļļāđˆāļĄ Count āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ â€œGo to Slot” āļˆāļēāļ āļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļ signal āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ„āļ›āļĒāļąāļ‡ slot āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ clicked() āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK 234 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 235. āļĢāļđāļ›āļ—āļĩāđˆ 4.22 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Signal āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ” Slot āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ signals āđāļĨāļ° slots āđƒāļŦāđ‰āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ‚āļ”āļĒāļˆāļ°āļ•āļąāđ‰āļ‡ āļŠāļ·āđˆāļ­ slots āđƒāļŦāđ‰āļŠāļ·āđˆāļ­āļ§āđˆāļē “on_pushButton_clicked” āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 4.23 Method āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļĨāļ·āļ­āļ slot āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ on_pushButton_clicked() āļ”āļąāļ‡āļ™āļĩāđ‰ void Dialog::on_pushButton_clicked() {     static int count; 235 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 236.     count++;     ui->label->setText(QString::number(count)); } āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļāļ”āļ›āļļāđˆāļĄāļĨāļąāļ” Ctrl+R āļˆāļ°āđ„āļ”āđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ āļ‹āļķāđˆāļ‡ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļ›āļļāđˆāļĄ Count āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļšāļ§āļāđ€āļĨāļ‚āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļ—āļĩāļĨāļ° 1 āļĢāļđāļ›āļ—āļĩāđˆ 4.24 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āļāļ”āļ›āļļāđˆāļĄ Count āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āļ™āļąāđ‰āļ™āđ€āļĢāļīāđˆāļĄāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļĄāļēāļāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āļ§āļ‡āļāļēāļĢāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āđāļĨāļ°āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļ”āļĩ āļ‚āļķāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļ āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ” āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļāđ‡āļĒāļąāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ­āļĒāļđāđˆ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđƒāļ™ Qt āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āđƒāļŦāļĄāđˆ āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāđ‚āļĄāļ”āļđāļĨ QtSerialPort āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ Qt5 āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™ āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āđ„āļ”āđ‰āļ—āļąāđ‰āļ‡ hardware serial ports āđāļĨāļ° virtual serial ports āļ āļēāļĒāđƒāļ™āđ‚āļĄāļ”āļđāļĨ QtSerialPort āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ 2 āļ„āļĨāļēāļŠāļŦāļĨāļąāļāđ†āļ„āļ·āļ­ SerialPort āđāļĨāļ° SerialPortInfo āđ‚āļ”āļĒāļ„āļĨāļēāļŠ SerialPort āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļĩāđ€āļĄāļ—āļ˜āļ­āļ”āļ•āđˆāļēāļ‡āđ† āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ āļ•āļēāļĢāļēāļ‡ 4.5 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ­āļĢāđŒāļĄāļ­āļ™āļļāļāļĢāļĄāļ”āđ‰āļ§āļĒ Qt āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” Windows NT/2K/XP/Vista/7/8 YES Full support Windows CE YES āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđāļĨāļ° 6 āļšāļ™āļ•āļąāļ§ WinCE Emulator Gnu/Linux YES Full support MacOS X YES Full support 236 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 237. āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” Unix āļ­āļ·āđˆāļ™āđ† YES POSIX-compatible āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļŠāļģāļŦāļĢāļąāļšāļ„āļĨāļēāļŠ SerialPortInfo āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ•āļąāļ§āļŠāđˆāļ§āļĒ āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ– āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļšāļšāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļŦāļĢāļ·āļ­āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļēāļĢāļēāļ‡ 4.6 āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SerialPortInfo āđƒāļ™āđāļ•āđˆāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļŠāļ™āļąāļšāļŠāļ™āļļāļ™ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” Windows NT/2K/XP/Vista/7/8 YES Full support āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SetupAPI Windows CE YES āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 5 āđāļĨāļ° 6 āļšāļ™āļ•āļąāļ§ WinCE Emulator Gnu/Linux YES Full support āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ libudev āļŦāļĢāļ·āļ­āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰ āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev/ āđ‚āļ”āļĒāļ•āļĢāļ‡ MacOS X YES Full support Unix āļ­āļ·āđˆāļ™āđ† YES POSIX-compatible āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ„āđ‰āļ™āļŦāļēāđ„āļ”āđ‰āđƒāļ™ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /dev/ āđ‚āļ”āļĒāļ•āļĢāļ‡ āđāļ•āđˆāđ‚āļĄāļ”āļđāļĨ QtSerialPort āļĒāļąāļ‡āļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĢāļ­āļ‡āļĢāļąāļšāđ„āļ”āđ‰āđāļāđˆ -āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļšāđ‚āļŦāļĄāļ” Terminal, control CR/LF -āļ•āļąāđ‰āļ‡āļ„āđˆāļē timeouts āđāļĨāļ° delays āļ‚āļ­āļ‡āļāļēāļĢāļ­āđˆāļēāļ™ -āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļĄāļĩāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡ RS-232 āļ‚āļēOUT āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™ Qt4/Qt5 āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ git clone git://gitorious.org/qt/qtserialport.git Initialized empty Git repository in /home/student/Downloads/qtserialport/.git/ remote: Counting objects: 4482, done. remote: Compressing objects: 100% (1737/1737), done. remote: Total 4482 (delta 3158), reused 3764 (delta 2719) Receiving objects: 100% (4482/4482), 1.22 MiB | 233 KiB/s, done. Resolving deltas: 100% (3158/3158), done. 237 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 238. $ cd qtserialport/ $ qmake qtserialport.pro $ make $ sudo make install āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļ™āļąāđ‰āļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt4 āđāļĨāļ° Qt5 āļ™āļąāđ‰āļ™ āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢ āļĢāļ°āļšāļļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđƒāļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āļ”āđ‰āļ§āļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ qmake -project āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āļ”āļąāļ‡āļ™āļĩāđ‰ āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt4 CONFIG += serialport āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Qt5 QT += serialport āđāļ•āđˆāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ include āđƒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡ Qt4 āđāļĨāļ° Qt5 āļˆāļ°āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™ ... #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> ... āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ read-only (r/o), write-only (w/o), read/write (r/w) āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āđ„āļ”āđ‰āļŠāļģāđ€āļĢāđ‡āļˆ āđ‚āļĄāļ”āļđāļĨ QSerialPort āļˆāļ°āđƒāļŠāđ‰āļ„āđˆāļēāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰āļ”āļąāđ‰āļ‡āđ€āļ”āļīāļĄāļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ™āļąāđ‰āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāļĄāđˆāđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ setBaudRate(), setDataBits(), set- Parity(), setStopBits() āđāļĨāļ° setFlowControl() āļ•āļēāļĄāļĨāļģāļ”āļąāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ›āļīāļ”āļžāļ­āļĢāđŒāļ•āļ­āļ™āļļāļāļĢāļĄ /dev/ttyS0 QSerialPort serial; serial.setPortName("/dev/ttyS0"); serial.setBaudRate(QSerialPort::Baud9600); if (serial.open(QIODevice::ReadWrite)) { // to do this } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ„āļĨāļēāļŠ QSerialPortInfo āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ āļŠāđˆāļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļžāļ­āļĢāđŒāļ•āļ™āļąāđ‰āļ™āļ•āđˆāļ­āđ„āļ›āđƒāļŦāđ‰āļ„āļĨāļēāļŠ QSerialPort āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļ•āđˆāļ­āđ„āļ› #include <QtCore/QCoreApplication> #include <QtCore/QDebug> 238 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 239. #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Example use QSerialPortInfo foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ qDebug() << "Name : " << info.portName(); qDebug() << "Description : " << info.description(); qDebug() << "Manufacturer: " << info.manufacturer(); // Example use QSerialPort QSerialPort serial; serial.setPort(info); if (serial.open(QIODevice::ReadWrite)) serial.close(); } return a.exec(); } āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāđ‰āļ§āđ€āļžāļīāđˆāļĄāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ QtSerialPort āđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ qmake -project $ echo “CONFIG += serialport” >> serial.pro $ qmake $ make g++ -Wl,-O1 -Wl,-rpath,/usr/local/qt-embedded-4.8.5/lib -o serial main.o -L/usr/local/qt-embedded-4.8.5/lib -lQtSerialPort -lQtGui -L/usr/local/qt-embedded-4.8.5/lib -lQtNetwork -lQtCore -lpthread $ ls main.cpp main.o Makefile serial serial.pro $ ./serial Name : "ttyS0" Description : "" Manufacturer: "" Name : "ttyS1" Description : "" Manufacturer: "" 239 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 240. āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš MULTI-THREADING āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļŦāļĨāļēāļĒāļ•āļąāļ§āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđ„āļ”āđ‰ (multi-threading) āļ”āļąāļ‡āļ—āļĩāđˆāđ€āļ„āļĒ āļ­āļ˜āļīāļšāļēāļĒāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C āđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆ āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C++ āļāļąāļšāļ•āļąāļ§ Qt āļ™āļąāđ‰āļ™ āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ–āđ‰āļēāļ‡āļēāļ™āđ„āļŦāļ™āļ—āļĩāđˆāļĄāļĩāđ‚āļ­āļāļēāļŠ āļˆāļ°āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ™āļēāļ™ āļāđ‡āļ„āļ§āļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđƒāļŦāđ‰āđ„āļ›āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡āđāļ—āļ™ (background processing) āđ€āļžāļ·āđˆāļ­āđ„āļĄāđˆāđƒāļŦāđ‰āļāļĢāļ°āļ—āļšāļ•āđˆāļ­āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļŠāđˆāļ§āļ™āļāļĢāļēāļŸāļŸāļīāļāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ° multi-threading āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ™āļģāļĄāļēāđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āđāļžāļĢāđˆāļŦāļĨāļēāļĒ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™ Qt āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āđāļĨāļ°āļĒāļąāļ‡āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāđāļšāļš signal āđāļĨāļ° slot āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™āđ„āļ›āļĄāļēāļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđ„āļ”āđ‰ Qt āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™ Thread āđ„āļ”āđ‰ 2 āđāļšāļšāđƒāļŦāļāđˆ āļ„āļ·āļ­ 1. āđāļšāļš Low Level āļ”āđ‰āļ§āļĒ QThread āļ„āļĨāļēāļŠ QThread āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš 1 āđ€āļ—āļĢāļ” āļ•āđˆāļ­ 1 QThread āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ—āļģāļ‡āļēāļ™āļˆāļēāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āđāļ•āđˆāļˆāļ° āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢ implement āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āļ™āļĩāđ‰āļāđˆāļ­āļ™ (::run()) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ writer.h āđāļĨāļ° main.cpp āļ”āļąāļ‡āļ™āļĩāđ‰ $ vim writer.h // writer.h #ifndef WRITER_H #define WRITER_H #include <QThread> #include <QString> #include <iostream> class Writer: public QThread { public: explicit Writer(const QString& mark) : mark_(mark) { } void run(); private: QString mark_; }; #endif // WRITER_H void Writer::run() { for (int i = 0; i < 20; ++i) { std::cout << qPrintable(mark_); msleep(200); } } 240 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 241. āđƒāļ™āđ„āļŸāļĨāđŒ main.cpp āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļ›āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ run() āđāļĨāļ°āļˆāļ°āļĄāļĩāļāļēāļĢāļŦāļĒāļļāļ”āđ„āļ›āļŠāļąāđˆāļ§āļ‚āļ“āļ°āļ›āļĢāļ°āļĄāļēāļ“ 200 āļĄāļīāļĨāļĨāļī āļ§āļīāļ™āļēāļ—āļĩ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ­āļ­āļāļ—āļēāļ‡āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ vim main.cpp // main.cpp #include <QtCore/QCoreApplication> #include <QTimer> #include "writer.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Writer w1("One"); Writer w2("Two"); Writer w3("Three"); w1.start(); w2.start(); w3.start(); w1.wait(); w2.wait(); w3.wait(); QTimer::singleShot(12000, &a, SLOT(quit())); return a.exec(); } āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāļ°āđ„āļŸāļĨāđŒ Makele āđ€āļžāļ·āđˆāļ­āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ qmake -project $ qmake $ make $ ./thread Two Three One Two Three One Two Three One Three Two One Two One Three Two One Three Three Two One Three One Two Two Three One Two Three One Two Three One Two One Three Two One Three Two One Three Two One Three One Three Two One Three Two One Three Two One Three Two One Three Two 2. āđāļšāļš High Level āļ”āđ‰āļ§āļĒ QConcurrent QtConcurrent āđ€āļ›āđ‡āļ™āļ•āļąāļ§ API āđƒāļ™āļĢāļ°āļ”āļąāļšāļŠāļđāļ‡ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļš multi-threading āļšāļ™ Qt āļ™āļĩāđ‰ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļĨāļ‡āļĨāļķāļāđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ€āļ—āļĢāļ”āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļˆāļģāļ™āļ§āļ™āđ€āļ—āļĢāļ” āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒ QtConcurrent āđ„āļ”āđ‰āļĢāļ§āļĄāđ€āļ­āļēāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ„āļ§āđ‰āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļšāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰ 241 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 242. āļāļąāļšāļ‡āļēāļ™āđāļšāļšāđ„āļĄāđˆāļ•āļĢāļ‡āļˆāļąāļ‡āļŦāļ§āļ°āļāļąāļ™ (asynchronous task) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ (GUI applications) QtConcurrent::run() āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ āļēāļĒāđƒāļ™ thread āļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆ extern void aFunction(); extern void bFunction(); QFuture<void> future1 = QtConcurrent::run(aFunction); QFuture<void> future2 = QtConcurrent::run(bFunction); āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļĨāļēāļŠ QFuture āđāļĨāļ° QFutureWatcher āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ–āļđāļāđ€āļĢāļĩāļĒāļāđ€āļ‚āđ‰āļēāđ„āļ› āđƒāļ™āđ€āļ—āļĢāļ”āđ„āļ”āđ‰āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ #include <QCoreApplication> #include <qtconcurrentrun.h> #include <QThread> #ifndef QT_NO_CONCURRENT void myRunFunction(QString name) { for (int i = 0; i <= 5; i++) { qDebug() << name << " " << i << "from" << QThread::currentThread(); } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A")); QFuture<void> t2 = QtConcurrent::run(myRunFunction, QString("B")); QFuture<void> t3 = QtConcurrent::run(myRunFunction, QString("C")); t1.waitForFinished(); t2.waitForFinished(); t3.waitForFinished(); return a.exec(); } #else #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QString text("Qt Concurrent is not yet supported on this platform"); QLabel *label = new QLabel(text); label->setWordWrap(true); label->show(); 242 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 243. qDebug() << text; app.exec(); } #endif āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāļ„ (.pro) āđāļĨāđ‰āļ§āđ€āļžāļīāđˆāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ concurrent āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ qmake -project $ echo “CONFIG += concurrent” >> qtconcurrent.pro āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļžāļ·āđˆāļ­āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ multi-threading āļ”āļąāļ‡āļ„āļģ āļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ qmake $ make $ ls main.cpp main.o Makefile qtconcurrent qtconcurrent.pro $ ./qtconcurrent "B" 0 from QThread(0x128d1c0, name = "Thread (pooled)") "B" 1 from QThread(0x128d1c0, name = "Thread (pooled)") "B" 2 from QThread(0x128d1c0, name = "Thread (pooled)") "A" 0 from QThread(0x128cb10, name = "Thread (pooled)") "A" 1 from QThread(0x128cb10, name = "Thread (pooled)") "A" 2 from QThread(0x128cb10, name = "Thread (pooled)") "A" 3 from QThread(0x128cb10, name = "Thread (pooled)") "A" 4 from QThread(0x128cb10, name = "Thread (pooled)") "A" 5 from QThread(0x128cb10, name = "Thread (pooled)") "B" 3 from QThread(0x128d1c0, name = "Thread (pooled)") "B" 4 from QThread(0x128d1c0, name = "Thread (pooled)") "C" 0 from QThread(0x128cb10, name = "Thread (pooled)") "C" 1 from QThread(0x128cb10, name = "Thread (pooled)") "B" 5 from QThread(0x128d1c0, name = "Thread (pooled)") "C" 2 from QThread(0x128cb10, name = "Thread (pooled)") "C" 3 from QThread(0x128cb10, name = "Thread (pooled)") "C" 4 from QThread(0x128cb10, name = "Thread (pooled)") "C" 5 from QThread(0x128cb10, name = "Thread (pooled)") 243 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 244. āļšāļ—āļ—āļĩāđˆ 5 āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļ āļžāļąāļ’āļ™āļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ›āļĢāļ°āļ§āļąāļ•āļīāļĻāļēāļŠāļ•āļĢāđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļ›āļĩ āļ„.āļĻ. 2002 āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āļāđˆāļ­āļ•āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđ āđ€āļāļīāļĨāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ„āļ·āļ­ Larry Page āđāļĨāļ° Sergey Brin āđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāļŸāļąāļ‡āļŠāļąāļĄāļ™āļē āļ“ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļŠāđāļ•āļ™āļŸāļ­āļĢāđŒāļ” (Stan- ford University) āđƒāļ™āļŦāļąāļ§āļ‚āđ‰āļ­āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļĄāļ·āļ­āļ–āļ·āļ­āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­ â€œSideKick Phone” āļ™āļģāđ€āļŠāļ™āļ­āđ‚āļ”āļĒāļ™āļēāļĒ Andy Rubin āļ‹āļķāđˆāļ‡āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āļģāļĢāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‹āļĩāļ­āļĩāđ‚āļ­ (CEO) āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Danger Inc. āđ€āļ‚āļēāđ„āļ”āđ‰āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ– āļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļŠāļ·āđˆāļ­āļ§āđˆāļē SideKick Phone āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ•āļąāļ§āđāļĢāļāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ āļœāđˆāļēāļ™āļĢāļ°āļšāļšāļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ• (Internet) āđāļĨāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Instant Messenger), āļ­āļĩāđ€āļĄāļĨāđŒ (Mail), āļ•āļēāļĢāļēāļ‡āļ›āļāļīāļ—āļīāļ™ (Calendar), āđāļĨāļ°āļāļēāļĢāļ—āđˆāļ­āļ‡āđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒ (Browser) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢ āļ•āļąāđ‰āļ‡āļŦāļ™āđ‰āļēāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļŦāļĨāļąāļ (Search Engine default) āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Google search āļāđ‡āļĒāļīāđˆāļ‡āļ—āļģāđƒāļŦāđ‰ Larry Page āđ€āļāļīāļ” āļ„āļ§āļēāļĄāļ›āļĢāļ°āļ—āļąāļšāđƒāļˆāđāļĨāļ°āđ„āļ”āđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļœāļđāđ‰āđƒāļŠāđ‰ Sidekick Phone āđāļĄāđ‰āļ§āđˆāļēāļ•āļąāļ§ Sidekick Phone āļˆāļ°āđ€āļ›āđ‡āļ™āļĄāļ·āļ­āļ–āļ·āļ­āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ—āļĩāđˆāđ‚āļ”āļ”āđ€āļ”āđˆāļ™āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđˆāļēāļ‡āļĢāļđāđ‰āļŠāļķāļāļ•āļ·āđˆāļ™āđ€āļ•āđ‰āļ™āđ„āļ”āđ‰āđ„āļĄāđˆāļ™āđ‰āļ­āļĒ āļāđ‡āļ•āļēāļĄāļ—āļĩ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđƒāļŦāđ‰āđ€āļāļīāļ”āļœāļĨāļŠāļģāđ€āļĢāđ‡āļˆāđƒāļ™āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ—āļĩāđˆāļ„āļ§āļĢāļˆāļ°āđ€āļ›āđ‡āļ™ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰ Andy Rubin āļ–āļđāļāļšāļĩāļšāđƒāļŦāđ‰āļ­āļ­āļāļˆāļēāļāļšāļĢāļīāļĐāļąāļ— Danger Inc. āđƒāļ™āļŠāđˆāļ§āļ‡āļ•āđ‰āļ™āļ›āļĩ āļ„.āļĻ. 2003 āļŦāļĨāļąāļ‡āļˆāļēāļāļŦāļ™āļķāđˆāļ‡āļ›āļĩāļœāđˆāļēāļ™āđ„āļ› Andy Rubin āļžāļĢāđ‰āļ­āļĄāļāļąāļšāđ€āļ‡āļīāļ™āļāđ‰āļ­āļ™āļŦāļ™āļķāđˆāļ‡ āđ€āļ‚āļēāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāļ„āļ§āļēāļĄāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ™āļ§āļ„āļīāļ”āđƒāļŦāļĄāđˆ āļŠāļģāļŦāļĢāļąāļšāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆ (Mobile Operating System) āđ€āļ‚āļēāļˆāļķāļ‡āļ—āļģāļāļēāļĢāļˆāļ”āđ‚āļ”āđ€āļĄāļ™āđƒāļŦāļĄāđˆāđƒāļ™āļŠāļ·āđˆāļ­āļ§āđˆāļē Android.com āļžāļĢāđ‰āļ­āļĄāļāļąāļšāļāđˆāļ­āļ•āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āđƒāļŦāļĄāđˆāđƒāļ™āļŠāļ·āđˆāļ­āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āļ§āđˆāļē Android Inc. āđāļĨāļ°āđ„āļ”āđ‰āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļē Open Mobile handset platform āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ” (Open Operating System) āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļœāļĨāļīāļ•āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™āļ āļēāļĒāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ‚āļ­āļ‡āļ•āļ™āđ„āļ”āđ‰ āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļĢāļ°āļĄāļēāļ“āđ€āļ”āļ·āļ­āļ™āļŠāļīāļ‡āļŦāļēāļ„āļĄ āļ›āļĩ āļ„.āļĻ. 2005 āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļ‚āļ­āđ€āļˆāļĢāļˆāļēāļāļąāļš Andy Rubin āđ€āļžāļ·āđˆāļ­ āļ‚āļ­āđ€āļ‚āđ‰āļēāļ‹āļ·āđ‰āļ­āļāļīāļˆāļāļēāļĢāļšāļĢāļīāļĐāļąāļ—āļ‚āļ­āļ‡āđ€āļ‚āļēāļˆāļ™āđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļšāļĢāļĢāļĨāļļāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļĢāđˆāļ§āļĄāļāļąāļ™āļ”āđ‰āļ§āļĒāļĄāļđāļĨāļ„āđˆāļēāļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļ–āļđāļāđ€āļ›āļīāļ”āđ€āļœāļĒāļ•āđˆāļ­ āļŠāļēāļ˜āļēāļĢāļ“āļ°āļŠāļ™ āđāļĨāļ°āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĨāļēāļĒāļ›āļĩ āļ„.āļĻ. 2007 āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļ›āļĢāļ°āļāļēāļĻāđ€āļ‚āđ‰āļēāļĢāđˆāļ§āļĄāđ€āļ›āđ‡āļ™ āļŠāļĄāļēāļŠāļīāļāđƒāļ™ Open Handset Alliance (OHA) āđ€āļžāļ·āđˆāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ”āļŠāļģāļŦāļĢāļąāļšāđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāđƒāļ™āļŠāļ·āđˆāļ­āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android Operating System) āļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢ āđāļĨāļ°āļ•āđˆāļ­ āļĄāļēāđƒāļ™āđ€āļ”āļ·āļ­āļ™āļāļąāļ™āļĒāļēāļĒāļ™ āļ›āļĩ āļ„.āļĻ. 2008 āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āļ›āļĨāđˆāļ­āļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ 1.0 āđ‚āļ”āļĒ āđƒāļŠāđ‰āļŠāļ·āđˆāļ­āļĢāļŦāļąāļŠ (Codename) āļ§āđˆāļē Astro āļ•āđˆāļ­āļŠāļēāļ˜āļēāļĢāļ“āļ°āļŠāļ™āđ€āļ›āđ‡āļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ āđāļĨāļ°āļāđ‡āđ„āļ”āđ‰āļ›āļĨāđˆāļ­āļĒāļĢāļļāđˆāļ™āļ•āđˆāļēāļ‡āđ†āļ­āļĒāđˆāļēāļ‡āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļ™ āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 244 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 245. 1.5 Cupcake 1.6 Donut 2.0/2.1 Eclair 2.2 Froyo 2.3 Gingerbread 3.0/3.1 Honeycomb 4.0 Icecream Sandwich 4.1/4.2/4.3 Jelly Bean 4.4 KitKat āļĢāļđāļ›āļ—āļĩāđˆ 5.1 āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ•āļēāļĢāļēāļ‡ 5.1 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļ·āđˆāļ­āđ‚āļ„āđ‰āļ” āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­ āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļģāļ„āļąāļ KERNEL SDK API NDK API āđ„āļĄāđˆāļĢāļ°āļšāļļ 1.0 āļāļąāļ™āļĒāļēāļĒāļ™ 2551 2.6.25 1 N/A Petit Four 1.1 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2552 2.6.25 2 N/A Cupcake 1.5 āđ€āļĄāļĐāļēāļĒāļ™ 2552 - Onscreen soft keyboard - āļŦāļ™āđ‰āļēāļˆāļ­āļŦāļĄāļļāļ™āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī 2.6.27 3 1 Donut 1.6 āļāļąāļ™āļĒāļēāļĒāļ™ 2552 - āļĄāļĩāļŠāļ–āļēāļ™āļ°āļāļēāļĢāđƒāļŠāđ‰āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ - āļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ VPN 2.6.27 4 2 Eclair 2.0 āļ•āļļāļĨāļēāļ„āļĄ 2552 - āļĄāļĩ Live Wallpaper - āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange 2.6.29 5 2 Eclair 2.0.1 āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2552 - āļĄāļĩ Live Wallpaper - āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange 2.6.29 6 2Eclair 2.1 āļĄāļāļĢāļēāļ„āļĄ 2553 - āļĄāļĩ Live Wallpaper - āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļš Exchange 2.6.29 7 3 Froyo 2.2 āļžāļĪāļĐāļ āļēāļ„āļĄ 2553 - āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ WiFi Hotspot - Just In Time Compile - āļāļģāđ€āļ™āļīāļ” Nexus One 2.6.32 8 4 Ginger- bread 2.3 - 2.3.2 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2553 - āļĢāļ­āļ‡āļĢāļąāļš NFC āđāļĨāļ° SIP - āļĄāļĩāļ•āļąāļ§ Download Manager - āļāļģāđ€āļ™āļīāļ” Nexus S 2.6.35 9 5Ginger- bread 2.3.3 - 2.3.7 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2554 - āļĢāļ­āļ‡āļĢāļąāļš ADK 2.6.35 10 5 Honey- comb 3.0 āļāļļāļĄāļ āļēāļžāļąāļ™āļ˜āđŒ 2554 - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļšāļ™āđāļ—āđŠāļ›āđ€āļĨāđŠāļ• - āļĢāļ­āļ‡āļĢāļąāļš Multi-core CPU 2.6.36 11 6 Honey- comb 3.1.x āļžāļĪāļĐāļ āļēāļ„āļĄ 2554 - āļĢāļ­āļ‡āļĢāļąāļš USB Host āđāļĨāļ°āļĄāļĩ APIs 2.6.36 12 6 Honey- comb 3.2.x āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2554 2.6.36 13 6 245 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 246. āļŠāļ·āđˆāļ­āđ‚āļ„āđ‰āļ” āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ āļ­āļ­āļāđ€āļĄāļ·āđˆāļ­ āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļģāļ„āļąāļ KERNEL SDK API NDK API Ice-Cream Sandwich 4.0 - 4.0.2 āļ•āļļāļĨāļēāļ„āļĄ 2554 - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļšāļ™āļĄāļ·āļ­āļ–āļ·āļ­āđāļĨāļ°āđāļ—āđŠāļ›āđ€āļĨāđ‡āļ• - āļāļģāđ€āļ™āļīāļ” Galaxy Nexus 3.0.1 14 7 Ice-Cream Sandwich 4.0.3 - 4.0.4 āļ˜āļąāļ™āļ§āļēāļ„āļĄ 2554 - āļāļģāđ€āļ™āļīāļ” WiFi Direct āđāļĨāļ° Android Beam - āļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ– Face Unlock 3.0.1 15 7 Jelly Bean 4.1.1 - 4.1.2 āļĄāļīāļ–āļļāļ™āļēāļĒāļ™ 2555 - āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ‚āļ”āļĒāļĢāļ§āļĄāļĄāļēāļāļ‚āļķāđ‰āļ™ 3.0.31 16 8 Jelly Bean 4.2 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2555 - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļšāļš Multi-user 3.0.31 17 8 Jelly Bean 4.3 āļāļĢāļāļāļēāļ„āļĄ 2556 - āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ Low Power Bluetooth - āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļĢāļ°āļ”āļąāļš 4K 3.4.5 18 9 KitKat 4.4 āļžāļĪāļĻāļˆāļīāļāļēāļĒāļ™ 2556 - āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļļāđˆāļ™āđ€āļāđˆāļē (RAM >512MB) - āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒāļ™āļąāļšāļāđ‰āļēāļ§āđ€āļ”āļīāļ™ - āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļŠāđˆāļ‡ Infrared Remote 3.4.5 19 9 āļ”āđ‰āļ§āļĒāļ„āļ§āļēāļĄāļĢāđˆāļ§āļĄāļĄāļ·āļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāļĄāļ”āļđāđāļĨāļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ—āļĩāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļāļđāđ€āļāļīāļĨ āļāđ‡āđ„āļ”āđ‰āļ—āļģāđƒāļŦāđ‰āđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĩ āļ„.āļĻ. 2011 āļ–āļķāļ‡ āļ„.āļĻ. 2012 āđ€āļāļīāļ”āđ‚āļ„āļĢāļ‡āļāļēāļĢ Android Mainlining Project āļ‚āļķāđ‰āļ™āđ‚āļ”āļĒāļĄāļĩāļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ„āļ·āļ­āļāļēāļĢāļĢāļ§āļĄ āđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android drivers) āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ•āđˆāļēāļ‡āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.3 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āļĄāļēāļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ‚āļ„āļĢāļ‡āļāļēāļĢāļ™āļĩāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļĢāļ§āļĄāļāļąāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļ™ āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 3.5 āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļāļ™āļāļĨāļēāļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē (Mobile Environment) āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļāļēāļĢ āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ (InterProcess Communication - IPC) āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ āļˆāļģāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŠāđ‰āļ‡āļēāļ™ āđāļĨāļ°āđāļāđ‰āļ›āļąāļāļŦāļēāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āļŦāļĨāļąāļāđ†āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđāļĨāļ°āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡ āļĨāđˆāļēāļ‡ āļ•āļēāļĢāļēāļ‡ 5.2 āļāļēāļĢāļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļĢāļ·āđˆāļ­āļ‡ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ Binder āļāļĨāđ„āļāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (An- droid's IPC mechanism) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāļ„ Open Binder Ashmem āļĒāđˆāļ­āļĄāļēāļˆāļēāļ Anonymous Shared Memory āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆ āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ āļĢāđˆāļ§āļĄāļāļąāļ™āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (Shared memory allocator) āđ‚āļ”āļĒāļˆāļ°āļ–āļ­āļ” āļŠāđˆāļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāđ„āļ§āđ‰ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļĢāļīāđˆāļĄāļ§āļīāļāļĪāļ•āļī Logger āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user space) 246 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 247. āđ€āļĢāļ·āđˆāļ­āļ‡ āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ Wakelocks āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ (suspend) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļ™āđ‰āļ­āļĒ āļŦāļĢāļ·āļ­āļĄāļĩāļāļēāļĢāļžāļąāļšāļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ›āļīāļ” āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ” suspend āđāļ•āđˆ Wakelocks āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ”āļąāļšāļŦāļ™āđ‰āļēāļˆāļ­ (Screen Turn-Off) āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđˆāļ­āļāđ‡āđ€āļžāļĩāļĒāļ‡āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļāļĨāļąāļšāļĄāļē (Screen Turn-On) āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ”āļąāļš OOM āļĒāđˆāļ­āļĄāļēāļˆāļēāļ Out Of Memory handler āļ„āļ·āļ­āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄ āļˆāļģāđ€āļ•āđ‡āļĄāđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļŠāļąāļāļēāļ“ Triggers āļāđˆāļ­āļ™āļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰ Kernel āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ Alarm āļ•āļąāļ§āļ™āļąāļšāļŦāļ™āđˆāļ§āļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ (Android's alarm timer) āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļē āļˆāļēāļāļ•āļąāļ§āļ™āļēāļŽāļīāļāļē RTC (Real-time Clock) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ RAM console āļ•āļąāļ§āđāļŠāļ”āļ‡āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Kernel āļ āļēāļĒāđƒāļ™ āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ /proc/last_kmsg āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ‚āļ”āļĒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĨāļĩāļ™āļļāļāļ‹āđŒāļ—āļąāđˆāļ§āđ„āļ›āļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ„āļĨāđ‰āļēāļĒāļ„āļĨāļķāļ‡āļāļąāļ™āļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļĄāļĩāļ­āļĩāļāļŦāļĨāļēāļĒāđ†āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ­āļ­āļāđ„āļ›āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆāļĄāļĩāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāļāļģāļˆāļąāļ”āđāļĨāļ°āļžāļĪāļ•āļīāļāļĢāļĢāļĄ āļāļēāļĢāđƒāļŠāđ‰āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđāļšāļšāļ•āļąāđ‰āļ‡āđ‚āļ•āđŠāļ° āļ”āļąāļ‡āļĢāļđāļ›āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡ Application Application Application Application Application Application Library Framework & VM middleware & Library Kernel Kernel scheduler scheduler Linux Android āļĢāļđāļ›āļ—āļĩāđˆ 5.2 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđāļĨāļ°āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 247 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 248. āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ Launcher2 Phone AlarmClock Email Settings Camera Gallery Calendar Browser Bluetooth Contacts ... āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ Power Manager Mount Service Activity Manager Notication Manager Package Manager Location Manager Battery Service Search Service .... android.* Libs Bionic / OpenGL / WebKit / ... Init / Toolbox Native Daenons Hardware Support āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ (āļžāļąāļ’āļ™āļē/āļˆāļēāļ Play Store) java.* (Apache Harmony) Android Runtime / Dalvik / Zygote Linux Kernel Wakelocks / lowmem / binder / ashmem / ... App API Java Native Interface Binder āļĢāļđāļ›āļ—āļĩāđˆ 5.3 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļˆāļēāļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđāļšāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ†āļ—āļĩāđˆāļĄāļĩ āļ„āļ§āļēāļĄāđ€āļāļĩāđˆāļĒāļ§āđ€āļ™āļ·āđˆāļ­āļ‡āļāļąāļ™ āđ‚āļ”āļĒāļŠāđˆāļ§āļ™āļšāļ™āļŠāļļāļ”āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđ‚āļ”āļĒāļ•āļĢāļ‡āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ (Applications) āđāļĨāļ°āļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļĨāļ‡āļĄāļēāļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļˆāļ™āļ–āļķāļ‡āļŠāļąāđ‰āļ™āļĨāđˆāļēāļ‡ āļŠāļļāļ”āļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ‚āļ”āļĒāļœāđˆāļēāļ™āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨ āļ‹āļķāđˆāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āļˆāļ°āļ­āļ˜āļīāļšāļēāļĒāļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē Applications  āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŦāļĢāļ·āļ­āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āđ‚āļ”āļĒāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļ‹āļķāđˆāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ­āļēāđ„āļ§āđ‰ â€Ē Application Framework āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰ āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ—āļģāļāļēāļĢāļĻāļķāļāļĐāļēāļ§āļīāļ˜āļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Ap- plication Framework āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āļ‹āļķāđˆāļ‡āļĄāļĩāļŦāļĨāļēāļĒāļāļĨāļļāđˆāļĄāļ”āđ‰āļ§āļĒāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ o Activities Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ§āļ‡āļˆāļĢāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ (Activity) o Content Providers āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđāļĨāļ° āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ›āļąāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ o View System āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāđāļŠāļ”āļ‡āļœāļĨ āđƒāļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ (User Interface) 248 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 249. o Telephony Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļēāļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļŠāđˆāļ™ āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ o Resource Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ, āļĢāļđāļ›āļ āļēāļž āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ o Location Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļēāļ‡āļ āļđāļĄāļīāļĻāļēāļ•āļĢāđŒ āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāđ„āļ”āđ‰āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒ o Notication Manager āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ āļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡ āļœāļĨāđƒāļŦāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ āļœāđˆāļēāļ™āļ—āļēāļ‡āđāļ–āļšāļŠāļ–āļēāļ™āļ°(Status Bar) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­ â€Ē Libraries  āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C/C++ āđ‚āļ”āļĒāđāļšāđˆāļ‡āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļ­āļāđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ•āļēāļĄ āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™ Surface Manage āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ, Media Frame- work āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļāļēāļĢāđāļŠāļ”āļ‡āļ āļēāļžāđāļĨāļ°āđ€āļŠāļĩāļĒāļ‡, Open GL | ES āđāļĨāļ° SGL āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ āļēāļž 3āļĄāļīāļ•āļī āđāļĨāļ° 2āļĄāļīāļ•āļī, SQLite āļˆāļąāļ”āļāļēāļĢāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļĢāļ°āļšāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē Android Runtime āļˆāļ°āļĄāļĩ Dalvik Virtual Machine āļ—āļĩāđˆāļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆ āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (Memory), āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ (CPU) āđāļĨāļ°āļžāļĨāļąāļ‡āļ‡āļēāļ™ (Battery)āļ—āļĩāđˆāļˆāļģāļāļąāļ” āļ‹āļķāđˆāļ‡āļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Dalvik Virtual Machine āļˆāļ°āļ—āļģāļāļēāļĢāđāļ›āļĨāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ„āļ›āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .DEX āļāđˆāļ­āļ™ āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ€āļŦāļ•āļļāļœāļĨāļāđ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ āđ„āļĄāđˆāļĄāļēāļ āļŠāđˆāļ§āļ™āļ•āđˆāļ­āļĄāļēāļ„āļ·āļ­ Core Libraries āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļĢāļ§āļšāļĢāļ§āļĄāļ„āļģāļŠāļąāđˆāļ‡āđāļĨāļ°āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļŠāļģāļ„āļąāļāđ†āļ‹āļķāđˆāļ‡āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļ”āđ‰āļ§āļĒ āļ āļēāļĐāļēāļˆāļēāļ§āļē (Java Language) â€Ē Linux Kernel  āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļąāļ§āđƒāļˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļāļąāļšāļšāļĢāļīāļāļēāļĢāļŦāļĨāļąāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđ€āļŠāđˆāļ™ āđ€āļĢāļ·āđˆāļ­āļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āļžāļĨāļąāļ‡āļ‡āļēāļ™ āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ† āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ‚āļ”āļĒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļ™āļģāđ€āļ­āļēāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļĄāļēāļˆāļēāļāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ 2.6 (Kernel 2.6.24) āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļ­āļ­āļāđāļšāļšāļĄāļēāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļ–āđ‰āļē āļˆāļ°āļ™āļģ vanilla kernel āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āļ™āļąāđ‰āļ™ āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāļ‡āđˆāļēāļĒāļ™āļąāļ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āđāļĨāļ°āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļžāļ·āđ‰āļ™āļāļēāļ™ āļ āļēāļĒāđƒāļ•āđ‰āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļŠāļ·āđˆāļ­āļ§āđˆāļē AOSP (Android Open Source Project) āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđāļ™āļ§āļ—āļēāļ‡āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļē āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļŠāļ°āļ”āļ§āļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ 249 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 250. āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android āđ€āļĄāļ·āđˆāļ­āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļ™āļ§āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āđ€āļŠāļīāļ‡āļĨāļķāļāļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļ—āļēāļ‡ āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāđ„āļ”āđ‰ 4 āļāļĨāļļāđˆāļĄāđ„āļ”āđ‰āđāļāđˆ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (Application Developers) Application Framework Linux Kernel Applications Surface Manager Dalvik VM Media Manager Shared Libraries āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ System Image āđ€āļ™āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē (Android JAVA) āđāļĨāļ° āļ āļēāļĐāļēāļ‹āļĩ (Native C lan- guage) āđƒāļ™āļĢāļ°āļ”āļąāļš Application Layer āđ€āļŠāđˆāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āđ€āļāļĄāļŠāđŒ āļ­āđ€āļ™āļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒ āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ āļ˜āļļāļĢāļāļīāļˆāļāļēāļĢāđ€āļ‡āļīāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ (Platform Developers) Application Framework Linux Kernel Applications Surface Manager Dalvik VM Media Manager Shared Libraries Rebuild āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™ āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ›āđ‡āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Application Framework āđ€āļŠāđˆāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļēāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļāļēāļĢ āđāļŠāļ”āļ‡ UI āļžāļīāđ€āļĻāļĐ āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđāļšāļšāļŠāļ­āļ‡āļŦāļ™āđ‰āļēāļžāļĢāđ‰āļ­āļĄ āļāļąāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļĨāļļāđˆāļĄāļ—āļĩāđˆāđ€āļ™āđ‰āļ™āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ ROMs āđ€āļŠāđˆāļ™ CyanogenMod āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 250 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 251. āļ™āļąāļāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ (Android Porting) Application Framework Linux Kernel Applications Surface Manager Dalvik VM Media Manager Shared Libraries āļāļēāļĢ Porting āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ™āđ‰āļ™āļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢ Porting āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļļāđˆāļ™ āļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ­āļ·āđˆāļ™ āđ€āļŠāđˆāļ™ MIPS, Intel x86 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŦāļĢāļ·āļ­āđ„āļ›āļ­āļĒāļđāđˆāļšāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Netbook (EeePC) āļŦāļĢāļ·āļ­ Virtual Ma- chine (VMWare, Virtual Box, GenyMotion āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™) āļ™āļąāļāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (Hardware Developers) Application Framework Linux Kernel Applications Surface Manager Dalvik VM Media Manager Shared Libraries āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Kernel āđ€āļ™āđ‰āļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļŠāļģāļŦāļĢāļąāļš āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āļ­āļļāļ›āļāļĢāļ“āđŒ Set-top- box, Android USB Stick, āļ•āļđāđ‰ Kiosk āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ‚āļ”āļĒāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ āļĢāļ­āļ‡āļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļžāđˆāļ§āļ‡āļĢāļ­āļšāļ‚āđ‰āļēāļ‡āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđāļĨāļ° āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš, Launcher UI āļŦāļĢāļ·āļ­ āļāļēāļĢāđ€āļĨāđˆāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒāđāļšāļšāļžāļīāđ€āļĻāļĐ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 251 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 252. āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē Embedded Android āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™āļāļēāļ™āđāļĨāļ°āļšāļĢāļīāļāļēāļĢāļĢāļ°āļšāļš Power Manager Mount Service Activity Manager Notication Manager Package Manager Location Manager Battery Service Search Service .... Media Server Media WebKit Fresstype SQLite Home Dialer Camera Media Player Settings ... Service Manager Network Manager ... Skia Input ALSA ... Core Libraries Dalvik VM Audio Camera Radio (RIL) GPS ...Sensors NFS Audio WiFi Camera Display ...Bimder Logger Applications Application Frameworks Libraries & Runtimes Hardware Abstraction Layer Linux Kernel āļĢāļđāļ›āļ—āļĩāđˆ 5.4 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ HOST āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāļ§āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĻāļķāļāļĐāļēāđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ„āļ·āļ­ Ubuntu LTS (Long Term Support) āļĢāļļāđˆāļ™ 10.04 āļŦāļĢāļ·āļ­ Ubuntu LTS āļĢāļļāđˆāļ™ 12.04 āļ‹āļķāđˆāļ‡āļ—āļēāļ‡āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§ āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļļāđˆāļ™āļ•āđˆāļēāļ‡āđ†āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļĢāļļāđˆāļ™ Android Gingerbread (2.3.x) āļ‚āļķāđ‰āļ™āđ„āļ›āļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļš 64 āļšāļīāļ•āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļĢāļąāļžāļĒāļēāļāļĢāļžāļ·āđ‰āļ™ āļāļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļāđ‡āļ„āļ§āļĢāļˆāļ°āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 8GB (āđāļ™āļ°āļ™āļģāļ­āļĒāļđāđˆāļ—āļĩāđˆ 16GB) āđāļĨāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ„āļ§āļēāļĄāļˆāļļ āļ§āđˆāļēāļ‡āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 30GB āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Android IceScream Sandwich (ICS) āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ›āļĢāļ°āļĄāļēāļ“ 25GB āļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļķāđˆāļ‡āđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ āđƒāļ™āļāļĢāļ“āļĩāļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ—āļļāļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ AOSP āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 80GB āļŠāļģāļŦāļĢāļąāļš āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ„āļ› āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ Python āļĢāļļāđˆāļ™ 2.6 - 2.7 â€Ēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ GNU Make āļĢāļļāđˆāļ™ 3.81 - 3.82 â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ JDK āļĢāļļāđˆāļ™ 6 āļŠāļģāļŦāļĢāļąāļš Android Gingerbread āļ‚āļķāđ‰āļ™āđ„āļ› āđāļ•āđˆāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢ Android Froyo āļ•āđˆāļģāļĨāļ‡ āļĄāļē āļˆāļ°āļ•āđ‰āļ­āļ‡āļĨāļ‡ JDK āļĢāļļāđˆāļ™ 5 (fromjava.sun.com) â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄ Git āļĢāļļāđˆāļ™ 1.7 āļ‚āļķāđ‰āļ™āđ„āļ› (git-scm.com) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ JDK āļĢāļļāđˆāļ™ 6 āļŠāļģāļŦāļĢāļąāļš Gingerbread āļ‚āļķāđ‰āļ™āđ„āļ› āđāļĨāļ° JDK āļĢāļļāđˆāļ™ 5 āļŠāļģāļŦāļĢāļąāļš Froyo āļ•āđˆāļģāļĨāļ‡āļĄāļē 252 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 253. $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid part- ner" $ sudo apt-get update $ sudo apt-get install openjdk-6-jre āļŦāļĢāļ·āļ­ $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse" $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy- updates main multiverse" $ sudo apt-get update $ sudo apt-get install openjdk-6-jre āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 64-bit Ubuntu LTS 10.04 $ sudo apt-get install git-core gnupg flex bison gperf build-essential   zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs   x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev   libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown   libxml2-utils xsltproc āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ 64-bit Ubuntu LTS 12.04 $ sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so 253 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 254. Android Open Source Project (AOSP) āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠ AOSP āđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ repo āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ Git Wrapper script āđ€āļžāļ·āđˆāļ­āļĢāļ°āļšāļļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđāļĨāļ°āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ‚āļ”āļĒāļ›āļāļ•āļī āđāļĨāđ‰āļ§āļˆāļ°āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļĄāđˆāļ•āđˆāļģāļāļ§āđˆāļē 20GB āđāļĨāļ°āļ­āļēāļˆāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ›āļĢāļ°āļĄāļēāļ“ 3-6 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡ āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ‚āļ­āļ‡āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļ™āļąāđ‰āļ™āđ† āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” AOSP $ mkdir ~/bin $ export PATH=$PATH:~/bin $ sudo apt-get install curl $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 22889 100 22889 0 0 50164 0 --:--:-- --:--:-- --:--:-- 111k $ chmod a+x ~/bin/repo āđ„āļŸāļĨāđŒ manifest āļˆāļ°āđ€āļāđ‡āļšāļĨāļīāļ‡āļ„āđŒāđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđāļŠāļ”āļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ XML āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ•āļēāļĢāļēāļ‡ 5.3 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™ XML āđ„āļŸāļĨāđŒāļ‚āļ­āļ‡ AOSP āļŠāļ·āđˆāļ­ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” name āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāļ„ āļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāđ‚āļ„āđ‰āļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ” fetch Server URL revision git branch remote āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” server path āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļˆāļ°āđ€āļāđ‡āļšāļˆāļēāļāļāļēāļĢ unpack project āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ 254 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 255. āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” AOSP āļĢāļļāđˆāļ™āļĨāđˆāļēāļŠāļļāļ” āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ $ repo init -u https://android.googlesource.com/platform/manifest āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļ°āļšāļļāļĢāļļāđˆāļ™ āđ€āļŠāđˆāļ™ āļĢāļļāđˆāļ™ 4.0.1_r1 āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ option -b āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āđāļ™āļ§āļ„āļīāļ”āļ‚āļ­āļ‡ AOSP āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļĨāļ°āļ›āļĨāđˆāļ­āļĒāđ‚āļ„āđ‰āļ”āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™ āļĢāļđāļ›āļ—āļĩāđˆ 5.5 āđāļŠāļ”āļ‡āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ­āļ­āļāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™ āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ„āđ‰āļ” AOSP āļĨāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 3-5 āļ‚āļąāđˆāļ§āđ‚āļĄāļ‡ $ mkdir ~/aosp $ cd ~/aosp $ repo sync 255 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 256. āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™ AOSP āđ€āļĄāļ·āđˆāļ­āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™ āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp āļˆāļ°āļĄāļĩāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāđ†āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 35,000 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāļģāļŦāļĢāļąāļšāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļģāļ„āļąāļāđ†āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļˆāļ°āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āđ„āļ”āđ‰āđāļāđˆ āļ•āļēāļĢāļēāļ‡ 5.4 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ AOSP āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” abi āļšāļĢāļĢāļˆāļļ Minimal C++ Run-time Type information bionic āđ„āļĨāļšāļĢāļēāļĢāļĩāļ āļēāļĐāļē C āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ bootable āļšāļĢāļĢāļˆāļļāđ‚āļ„āđ‰āļ”āļŠāļģāļŦāļĢāļąāļš Bootloader āđāļĨāļ° Recovery build āļšāļĢāļĢāļˆāļļāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ framework āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ AOSP cts āļŠāļļāļ” Test Suite āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ dalvik āļšāļĢāļĢāļˆāļļāļ•āļąāļ§ Dalvik Virtual Machine development āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāļ•āđˆāļēāļ‡āđ† device āļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒ conguration āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļœāļđāđ‰āļ‚āļēāļĒāļ•āļąāļ§ System-on-Chip external āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāļ™āļ­āļāļ—āļĩāđˆāļ–āļđāļāļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™ AOSP frameworks Android core application framework hardware āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ (HAL) kernel Linux Kernel libcore āļšāļĢāļĢāļˆāļļāđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ Apache Harmony āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļˆāļēāļ§āļēāļ—āļĩāđˆāļ–āļđāļāđƒāļŠāđ‰āđƒāļ™ Dalvik ndk Native Development Kit packages āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ AOSP prebuilt āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Toolchain āļŠāļģāđ€āļĢāđ‡āļˆāļĢāļđāļ› sdk Android's Software Development Kit system āđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāđ„āļšāļ™āļēāļĢāļĩāļŦāļĨāļąāļāđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļŠāđˆāļ™ init, toolbox, adb tools āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļĨāļ°āđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļĄāļ·āđˆāļ­āļ„āļīāļ”āđ€āļ›āđ‡āļ™āļŠāļąāļ”āļŠāđˆāļ§āļ™āđ€āļ›āļ­āļĢāđŒāđ€āļ‹āđ‡āļ™āļ•āđŒāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļ‚āļ™āļēāļ”āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļ§āļ‡āļāļĨāļĄāđ„āļ”āđ‰āļ”āļąāļ‡āļĢāļđāļ› āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ 256 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 257. āļĢāļđāļ›āļ—āļĩāđˆ 5.6 āđāļŠāļ”āļ‡āļ‚āļ™āļēāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡ AOSP Stock Android Apps packages/ android.* frameworks/base/core/ System Services frameworks/base/services/, frameworks/base/media/, java.* (Apache Harmony) libcore/ Linux Kernel āđ„āļĄāđˆāļĄāļĩ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļ Kernel āđ„āļĄāđˆāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđˆ AOSP Libraries bionic/, external/, frameworks/base/ App API āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļˆāļēāļ Play Store HAL hardware/, device/ Native Daemons system/, external, frameworks/base/cmds/ Init / Toolbox system/core/ Binder JNI āļĢāļđāļ›āļ—āļĩāđˆ 5.7 āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ bionic 0.3% cts 2.3% dalvik 0.7% development 1.5% device 0.7% external 26.9% frameworks 19.4% hardware 0.9% libcore 0.7% ndk 0.5% packages 4.7% prebuilts 40.2% sdk 0.9% others 0.3% 257 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 258. āļŠāļīāļ—āļ˜āļīāđŒāļ­āļ™āļļāļāļēāļ• (License) āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āļ āļēāļĒāđƒāļ™ AOSP āļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļ—āļĩāđˆāļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡āļ­āļĒāļđāđˆāđ„āļ”āđ‰ 4 āļāļĨāļļāđˆāļĄ āđ„āļ”āđ‰āđāļāđˆ â€ĒāļŠāđˆāļ§āļ™ Kernel āļˆāļ°āļĄāļĩ GNU GPLv2/GPLv3 license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡ â€ĒāļŠāđˆāļ§āļ™ external libraries āļˆāļ°āļĄāļĩ LGPL āđāļĨāļ° GPL license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡ â€ĒāļŠāđˆāļ§āļ™ bionic āđāļĨāļ° toolbox āļˆāļ°āļĄāļĩ BSD license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡ â€ĒāļŠāđˆāļ§āļ™ framework āļˆāļ°āļĄāļĩ Apache 2.0 license āļ„āļļāđ‰āļĄāļ„āļĢāļ­āļ‡ Android Kernel āđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡ Android Kernel patches āđ„āļĄāđˆāđ„āļ”āđ‰āļ–āļđāļāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ§āđ‰āđƒāļ™āļĢāļ°āļšāļšāļāļĨāļēāļ‡āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāļŦāļĨāļąāļ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ€āļ›āđ‡āļ™āļœāļđāđ‰āļ”āļđāđāļĨāđ€āļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļĢāļĩāļĒāļāđƒāļ™āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļ§āđˆāļē “android-common” āđ‚āļ”āļĒāļŠāđˆāļ§āļ™ An- droid Kernel patches āļˆāļ°āļ§āļēāļ‡āļ­āļĒāļđāđˆāđƒāļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļĢāļ°āļ”āļąāļšāļšāļ™āļ‚āļ­āļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ•āļēāļĄāļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļ‚āļ­āļ‡ Linus Torvalds āļŠāđˆāļ§āļ™āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ—āļĩāđˆāļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āļ™āļąāđ‰āļ™ āļāđ‡āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļ‚āļēāļ”āļ­āļĒāļđāđˆāđāļĨāļ° āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄāļšāļēāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ—āļĢāļąāļžāļĒāļēāļāļĢāļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāļˆāļģāļāļąāļ” āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ āđāļĨāļ°āļžāļĪāļ•āļīāļāļĢāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē (Portable device) āļˆāļ™āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ€āļ›āđ‡āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨ (Android Kernel) āđ€āļ‰āļžāļēāļ°āļ‚āļķāđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ â€ĒBinder - āļāļĨāđ„āļāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android's IPC mechanism) āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļˆāļ„ Open Binder āđ‚āļ›āļĢāđāļāļĢāļĄ A āđ‚āļ›āļĢāđāļāļĢāļĄ BBinder Function(Object) - Marshalling (assembling) - Relaying Thread āļĢāļđāļ›āļ—āļĩāđˆ 5.8 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Binder â€ĒAshmem (Anonymous Shared Memory) - āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ•āļąāļ§āļˆāļąāļ”āļŠāļĢāļĢāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™ āļ āļēāļĒāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļāļĨāļēāļ‡ (Shared memory allocator) āđ‚āļ”āļĒāļˆāļ°āļ–āļ­āļ”āļŠāđˆāļ§āļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļ–āļđāļāđāļŠāļĢāđŒāđ„āļ§āđ‰āđƒāļ™āļāļĢāļ“āļĩ āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļĢāļīāđˆāļĄāļ§āļīāļāļĪāļ•āļī â€ĒLogger - āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāļ—āļĩāđˆāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļˆāļēāļāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰ (user space) â€ĒWakelocks - āļŠāđˆāļ§āļ™āļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ (suspend) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļ™āđ‰āļ­āļĒāļŦāļĢāļ·āļ­āļĄāļĩ āļāļēāļĢāļžāļąāļšāļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ›āļīāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđāļĨāđ‰āļ§āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĨāļ” suspend āđāļ•āđˆ Wakelocks āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļžāļĩāļĒāļ‡āđāļ„āđˆāļ”āļąāļšāļŦāļ™āđ‰āļēāļˆāļ­ (Screen Turn-Off) āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ āļ‡āļēāļ™āļ•āđˆāļ­āļāđ‡āđ€āļžāļĩāļĒāļ‡āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļāļĨāļąāļšāļĄāļē (Screen Turn-On) āđ‚āļ”āļĒāļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļ”āļąāļš 258 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 259. CPU Screen Keyboard Wakelock āļšāļēāļ‡āļŠāđˆāļ§āļ™ Wakelock āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļš āļĢāļđāļ›āļ—āļĩāđˆ 5.9 āļĢāļ°āļ”āļąāļšāļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāđ„āļĄāđˆāđƒāļŦāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļ‚āđ‰āļēāļŠāļđāđˆāđ‚āļŦāļĄāļ”āļžāļąāļ â€ĒOOM (Out Of Memory handler) - āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢāļ›āļąāļāļŦāļēāđƒāļ™āļāļĢāļ“āļĩāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļ•āđ‡āļĄ āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļāļē āļĢāļŠāđˆāļ‡āļŠāļąāļāļēāļ“ Triggers āļāđˆāļ­āļ™āļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāđ‰āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ â€ĒAlarm - āļ•āļąāļ§āļ™āļąāļšāļŦāļ™āđˆāļ§āļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ (Android's alarm timer) āļ‹āļķāđˆāļ‡āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļˆāļēāļāļ•āļąāļ§ āļ™āļēāļŽāļīāļāļē RTC (Real-time Clock) āļ‚āļ­āļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ€āļ”āļīāļĄ â€ĒRAM console - āļ•āļąāļ§āđāļŠāļ”āļ‡āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ āļēāļĒāđƒāļ™āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™āđ„āļŸāļĨāđŒ /proc/last_kmsg â€ĒParanoid network - āļ•āļąāļ§āļ”āļđāđāļĨāļˆāļąāļ”āļāļēāļĢāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāļœāđˆāļēāļ™ uid (user id) āđāļĨāļ° pid (process id) āđ€āļŠāđˆāļ™ āļāļēāļĢāļāļģāļŦāļ™āļ”āđƒāļŦāđ‰ uid āļŦāļĢāļ·āļ­ pid āļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (access permission) āļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ manifest.xml āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ <permission name=”android.permission.INTERNET”> <group gid=”inet” /> </permission> āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļžāļĢāđ‰āļ­āļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP $ cd ~/aosp $ source build/envsetup.sh āļˆāļēāļāļ„āļģāļŠāļąāđˆāļ‡āļ”āđ‰āļēāļ™āļšāļ™āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāđƒāļŦāđ‰āļāļąāļšāļĢāļ°āļšāļšāđ€āļžāļ·āđˆāļ­āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđˆāļ­āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđāļĨāļ°āđ€āļžāļīāđˆāļĄ āļ„āļģāļŠāļąāđˆāļ‡ shell script āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāđāļžāļĨāļĄāļŸāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđ€āļŠāđˆāļ™ â€Ē hmm() - āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļĄāļ™āļđāļŠāđˆāļ§āļĒāđ€āļŦāļĨāļ·āļ­ â€Ē lunch() - āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡ lunch āđ€āļĄāļ™āļđāđ€āļžāļ·āđˆāļ­āđ€āļĨāļ·āļ­āļāđāļžāļĨāļĄāļŸāļ­āļĢāđŒāļ•āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ (target board) â€Ē add_lunch_combo() - āļŠāļģāļŦāļĢāļąāļšāđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāđƒāļŦāļĄāđˆāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡ â€Ē mm() - āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ›āļąāļˆāļˆāļļāļšāļąāļ™ 259 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 260. āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļĢāļĩāļĒāļ envsetup.sh āļāđ‡āļˆāļ°āļĄāļĩāļāļēāļĢāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ source vendorsetup.sh, vendor/*/vendorsetup.sh, vendor/*/*/vendorsetup.sh  āđāļĨāļ°Â device/*/*/ vendorsetup.sh āđ€āļžāļ·āđˆāļ­āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļĢāļēāļĒāļŠāļ·āđˆāļ­āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļāļģāļŦāļ™āļ”āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ Samsung Maguro product āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ device/samsung/maguro # #  Copyright  (C)  2011  The  Android  Open  Source  Project # #  Licensed  under  the  Apache  License,  Version  2.0  (the  "License"); #  you  may  not  use  this  file  except  in  compliance  with  the  License. #  You  may  obtain  a  copy  of  the  License  at # #            http://www.apache.org/licenses/LICENSE-­‐2.0 # #  Unless  required  by  applicable  law  or  agreed  to  in  writing,  software #  distributed  under  the  License  is  distributed  on  an  "AS  IS"  BASIS, #  WITHOUT  WARRANTIES  OR  CONDITIONS  OF  ANY  KIND,  either  express  or  implied. #  See  the  License  for  the  specific  language  governing  permissions  and #  limitations  under  the  License. #   add_lunch_combo  full_maguro-­‐userdebug āļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ shell script āļ—āļĩāđˆāļ–āļđāļāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļēāļāđ„āļŸāļĨāđŒ envsetup.sh $ hmm Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C++ files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file. Look at the source to view more functions. The complete list is: addcompletions add_lunch_combo cgrep check_product check_variant choosecombo choose- product choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var getbugreports get_build_var getprebuilt gettop godir hmm is- viewserverstarted jgrep key_back key_home key_menu lunch _lunch m mm mmm pid print- config print_lunch_menu resgrep runhat runtest set_java_home setpaths set_se- quence_number set_stuff_for_environment settitle smoketest startviewserver stopviewserver systemstack tapas tracedmdump āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāļšāļ­āļĢāđŒāļ” target (āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āđ€āļĨāļ·āļ­āļāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ lunch You're building on Linux Lunch menu... pick a combo: 260 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 261. 1. full-eng 2. full_x86-eng 3. vbox_x86-eng 4. full_grouper-userdebug 5. mini_armv7a_neon-userdebug 6. mini_armv7a-userdebug 7. full_wingray-userdebug 8. full_crespo-userdebug 9. full_maguro-userdebug 10. full_panda-userdebug Which would you like? [full-eng] full_x86-eng ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.1.1 TARGET_PRODUCT=full_x86 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=x86 TARGET_ARCH_VARIANT=x86-atom HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.0.0-burapha-x86_64-with-Ubuntu-10.04-lucid HOST_BUILD_TYPE=release BUILD_ID=JRO03L OUT_DIR=out ============================================ āļŦāļĨāļąāļ‡āļˆāļēāļāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļĨāļ·āļ­āļāđ„āļ§āđ‰ āļˆāļ°āļ–āļđāļāļ•āļąāđ‰āļ‡āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡ āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ† āđ„āļ”āđ‰āđāļāđˆ â€ĒANDROID_BUILD_TOP â€ĒANDROID_TOOLCHAIN â€ĒANDROID_PRODUCT_OUT â€ĒANDROID_HOST_OUT āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ echo $ANDROID_BUILD_TOP āļāđˆāļ­āļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 3-4 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡āļ‹āļķāđˆāļ‡āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļ™āđ‡āļ•āļ™āļąāđ‰āļ™ āļˆāļ° āļĄāļĩāļ­āļĒāļđāđˆāļ­āļĩāļ 2 āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰āđ„āļ”āđ‰āđāļāđˆ āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāđ€āļāđ‡āļšāđāļ„āļŠāļ‹ (cache) āļ­āđŠāļ­āļŸāđ€āļˆāđ‡āļ„āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄ āđ„āļžāļĨāđŒāđ‚āļ”āļĒāđ€āļœāļ·āđˆāļ­āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļšāļ„āļĢāļąāđ‰āļ‡āļ–āļąāļ”āđ„āļ›āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđƒāļŦāļĄāđˆāļ­āļĩāļāļĢāļ­āļš āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰ $ export USE_CCACHE=1 261 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 262. āđāļĨāļ°āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļˆāļģāļ™āļ§āļ™āļ„āļ­āļĢāđŒāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāđƒāļŠāđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ āđ€āļžāļ·āđˆāļ­āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļāļēāļĢāļĢāļ°āļšāļļ option -jX āđ‚āļ”āļĒāļ—āļĩāđˆ X āļˆāļ°āđāļ—āļ™āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ„āļ­āļĢāđŒ (Core) āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļšāļ§āļ 1 āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ make -j3 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.1.1 TARGET_PRODUCT=full_x86 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=x86 TARGET_ARCH_VARIANT=x86-atom HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-2.6.32-42-server-x86_64-with-Ubuntu-10.04-lucid HOST_BUILD_TYPE=release BUILD_ID=JRO03L OUT_DIR=out ============================================ find: `src': No such file or directory PRODUCT_COPY_FILES frameworks/base/data/sounds/F1_MissedCall.ogg:system/media/audio/notifications/F1_Mi ssedCall.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/F1_New_MMS.ogg:system/media/audio/notifications/F1_New_M MS.ogg ignored. . . . PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/camera_click.ogg:system/media/audio/ui/camera_cl ick.ogg ignored. āļœāļĨāļĨāļąāļžāļ˜āđŒāļ‚āļ­āļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļĄāļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 6 āđ„āļŸāļĨāđŒāđ„āļ”āđ‰āđāļāđˆ 1. boot.img – Native system boot image 2. ramdisk.img – Ramdisk rootfs 3. recovery.img – Recovery image 4. ramdisk-recovery.img – Ramdisk rootfs āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļāļđāđ‰āļ„āļ·āļ™ (recovery) 5. system.img – System data (āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /system) 6. userdata.img – User data (āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /data) āđ„āļŸāļĨāđŒāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āđ€āļžāļĩāļĒāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāļˆāļēāļ AOSP āđāļ•āđˆāļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ§āļĄ āļ–āļķāļ‡ Android Kernel āļ‹āļķāđˆāļ‡āļˆāļ°āļ•āđ‰āļ­āļ‡āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđāļĨāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĒāļāļ­āļ­āļāđ„āļ›āļˆāļēāļ AOSP āļ‹āļķāđˆāļ‡āļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āđƒāļ™āļšāļ—āļ–āļąāļ” āđ„āļ› āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđˆāđ„āļ§āđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ” target āļ•āļēāļĄāļ•āļģāđāļŦāļ™āđˆāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ”āļąāļ‡āļ­āļ˜āļīāļšāļēāļĒ āđ„āļ§āđ‰āđƒāļ™āļĢāļđāļ› 262 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 263. Stack āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host PRJROOT (glibc) sysapps/ rootfs/ build-tools/ ... AOSP (bionic) build/ system/ frameworks/ packages/ external/ Kernel āļšāļ­āļĢāđŒāļ” Target Root (/) RAM disk /acct /cache /d /data /dev /etc /mnt /proc /root /sbin /sdcard /sys /system /vendor /cong /storage /charger /cache Image /data Image /amr /app /app-private /backup /dalvik-cache /data /dontpanic /local /misc /property /secure /system SD Card (/mnt/sdcard) /system Image /app /bin /etc /fonts /framework /lib /usr /xbin Live Kernel procfs sysfs tmpfs cgroup congfs āļĢāļđāļ›āļ—āļĩāđˆ 5.10 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ•āļēāļĢāļēāļ‡ 5.5 āđāļŠāļ”āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ–āļđāļ mount āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ„āļŸāļĨāđŒ image āđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ IMAGE FILE MTD PARTITION MOUNT POINT ramdisk.img N/A / system.img /dev/mtdblock0 /system userdata.img /dev/mtdblock1 /data N/A /dev/mtdblock2 /cache āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđāļĨāļ°āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļ āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āļ­āļ˜āļīāļšāļēāļĒāļ­āļĒāļđāđˆāđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 5.6 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ āļ›āļĢāļ°āđ€āļ āļ— āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” /acct āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ cgroup /cache āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļŠāđˆāļ§āļ™āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ /d symlink āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /sys/kernel/debug āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount-point āļŠāļģāļŦāļĢāļąāļš de- bugfs /data āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ data āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ userdata.img 263 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 264. āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒ āļ›āļĢāļ°āđ€āļ āļ— āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” /dev āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ tmpfs āļ‹āļķāđˆāļ‡āļšāļĢāļĢāļˆāļļ device node āļ•āđˆāļēāļ‡āđ† /etc symlink āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /system/etc /mnt āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ”āļŠāļģāļŦāļĢāļąāļš mount āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ /proc āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ procfs /root āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš root āđ€āļ”āļīāļĄāļ‚āļ­āļ‡ Linux āđāļ•āđˆāđƒāļ™ Android āļˆāļ°āđ„āļĄāđˆāļĄāļĩ āļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒāđƒāļ”āđ† /sbin āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđ‚āļ”āļĒāļ›āļāļ•āļīāđƒāļ™ Linux āļˆāļ°āđ€āļāđ‡āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš āđāļ•āđˆāđƒāļ™ Android āļˆāļ°āđ€āļāđ‡āļšāđ€āļžāļĩāļĒāļ‡ ueventd āđāļĨāļ° adbd /sdcard āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ”āļŠāļģāļŦāļĢāļąāļš mount āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļšāļ™ SD Card /sys āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ sysfs /system āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ system āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļˆāļļāļ” mount āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ system.img /vendor symlink āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡ /system/vendor āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļžāļšāđ€āļˆāļ­āđ„āļ”āđ‰āđƒāļ™āļšāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ /config āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āļˆāļļāļ” mount-point āđ„āļ›āļĒāļąāļ‡ congfs /storage āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.1) āļŠāļģāļŦāļĢāļąāļš mount āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāļ™āļ­āļ (Ex- ternal Storage) /charger āđ„āļŸāļĨāđŒ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļŠāļ”āļ‡āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ /res āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ (āļ•āļąāđ‰āļ‡āđāļ•āđˆ Jelly Bean 4.2) āđ„āļŸāļĨāđŒ resources āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ charger /init āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āđ‚āļ›āļĢāđāļāļĢāļĄ init āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ‚āļ”āļĒ Kernel āļŦāļĨāļąāļ‡āļˆāļēāļāļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļĢāļ°āļšāļš āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ /init.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ init /init<device_na me>.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ† āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ init /ueventd.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ uventd /uventd<device_ name>.rc āđ„āļŸāļĨāđŒ āđ„āļŸāļĨāđŒ conguration āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” target āļĢāļļāđˆāļ™āļ™āļąāđ‰āļ™āđ† āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ ueventd /default.prop āđ„āļŸāļĨāđŒ āļ„āđˆāļēāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļąāđˆāļ§āđ„āļ›āļ‚āļ­āļ‡āļĢāļ°āļšāļš (global properties) āļ‹āļķāđˆāļ‡āļˆāļ°āļ­āđˆāļēāļ™āđ‚āļ”āļĒ āđ‚āļ›āļĢāđāļāļĢāļĄ init 264 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 265. āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļ™ Android Emulator āđ„āļŸāļĨāđŒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ”āļąāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ ls ~/aosp/out/target/product/generic_x86/ android-info.txt grub previous_build_config.mk system userdata-qemu.img clean_steps.mk hardware-qemu.ini ramdisk.img system.img data installed-files.txt root test dex_bootjars obj symbols userdata.img āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļāđ‡āļˆāļ°āļ‚āļķāđ‰āļ™āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡ āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ emulator & 265 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 266. 266 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 267. āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđƒāļŠāđ‰ ANDROID DEBUG BRIDGE (ADB) āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Android Emulator āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļ”āļĩāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļ āļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ™āļĩāđ‰ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ—āļąāđ‰āļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļ āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™ āđāļĨāļ° Android Kernel āļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāđƒāļˆāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ root lesystem āđ„āļ”āđ‰āđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļŦāļĢāļ·āļ­āļ–āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļ·āđˆāļ­āļ§āđˆāļē “adb” (Android Debug Bridge) āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđāļĨāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš āļ āļēāļĒāđƒāļ™ Android Emulator āļ”āļąāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ adb āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 5.11 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ adb āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host $ adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached emulator-5554 device āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‚āļ­āļ‡ Android Emulator $ adb shell # ls -al drwxr-xr-x root root 2013-08-17 15:11 acct drwxrwx--- system cache 2013-08-17 15:11 cache dr-x------ root root 2013-08-17 15:11 config lrwxrwxrwx root root 2013-08-17 15:11 d -> /sys/kernel/debug 267 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 268. drwxrwx--x system system 2013-08-05 02:01 data -rw-r--r-- root root 116 1970-01-01 00:00 default.prop drwxr-xr-x root root 2013-08-17 15:11 dev lrwxrwxrwx root root 2013-08-17 15:11 etc -> /system/etc -rwxr-x--- root root 234929 1970-01-01 00:00 init -rwxr-x--- root root 2344 1970-01-01 00:00 init.goldfish.rc -rwxr-x--- root root 17057 1970-01-01 00:00 init.rc -rwxr-x--- root root 1637 1970-01-01 00:00 init.trace.rc -rwxr-x--- root root 3915 1970-01-01 00:00 init.usb.rc drwxrwxr-x root system 2013-08-17 15:11 mnt dr-xr-xr-x root root 2013-08-17 15:11 proc drwx------ root root 2011-11-14 19:00 root drwxr-x--- root root 1970-01-01 00:00 sbin lrwxrwxrwx root root 2013-08-17 15:11 sdcard -> /mnt/sdcard drwxr-xr-x root root 2013-08-17 15:11 sys drwxr-xr-x root root 2013-08-04 18:33 system -rw-r--r-- root root 272 1970-01-01 00:00 ueventd.goldfish.rc -rw-r--r-- root root 3879 1970-01-01 00:00 ueventd.rc lrwxrwxrwx root root 2013-08-17 15:11 vendor -> /system/vendor # cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 3 model name : Pentium II (Klamath) stepping : 3 cpu MHz : 2293.936 cache size : 2048 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu de pse tsc msr pae mce cx8 apic sep pge cmov pat mmx fxsr sse sse2 pni ssse3 bogomips : 4587.87 clflush size: 32 āđāļŠāļ”āļ‡āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™ MTD Device āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđ„āļŸāļĨāđŒāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđāļ•āđˆāļĨāļ°āļžāļēāļĢāđŒāļ—āļīāļŠāļąāđˆāļ™āļ”āđ‰āļ§āļĒ āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ # cat /proc/mtd dev: size erasesize name mtd0: 0f180000 00020000 "system" mtd1: 0c200000 00020000 "userdata" mtd2: 04000000 00020000 "cache" # cat /proc/mounts rootfs / rootfs ro 0 0 tmpfs /dev tmpfs rw,nosuid,mode=755 0 0 devpts /dev/pts devpts rw,mode=600 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0 268 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 269. tmpfs /mnt/obb tmpfs rw,mode=755,gid=1000 0 0 /dev/block/mtdblock0 /system yaffs2 ro 0 0 /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0 /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0 Android Emulator Android Emulator āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ­āļĩāļāļŠāļ·āđˆāļ­āļŦāļ™āļķāđˆāļ‡āļ§āđˆāļē Goldsh āļ–āļđāļāļžāļąāļ’āļ™āļēāļšāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄ QEMU āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ‹āļ­āļĢāđŒāļŠāļ‚āļ­āļ‡ Android Kernel āļ‹āļķāđˆāļ‡āđ€āļŦāļĄāļēāļ°āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļ·āđˆāļ™āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™ āļˆāļĢāļīāļ‡ Goldsh āļ•āļąāļ§āļ™āļĩāđ‰āļĄāļĩ āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ­āļ­āļāļĄāļēāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 4 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē cross-compiling toolchain āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡ Android kernel 2. āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ‹āļ­āļĢāđŒāļŠāđ‚āļ„āđ‰āļ”āļ‚āļ­āļ‡ Android Kernel āđ‚āļ”āļĒāļĢāļ°āļšāļļāļĢāļļāđˆāļ™āļ‚āļ­āļ‡ Kernel āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ 3. āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ Android Kernel 4. āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļĄāļ™āļđāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš loadable kernel module (LKM) $ cd ~/aosp $ source build/envsetup.sh $ lunch full_x86-eng $ emulator -help Android Emulator usage: emulator [options] [-qemu args] options: -sysdir <dir> search for system disk images in <dir> -system <file> read initial system image from <file> -datadir <dir> write user data into <dir> .... -help-build-images about disk images when building Android -help-all prints all help content āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļĢāļ°āļšāļļāļ•āļąāļ§āđ€āļĨāļ·āļ­āļ -show-kernel āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Android Kernel āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļĩāđ‰ $ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -wipe-data -show-kernel emulator: WARNING: system partition size adjusted to match image file (249 MB > 200 MB) serial0 console student@marabuntu:~/aosp$ [ 0.000000] Linux version 3.4.0+ (student@marabuntu) (gcc version 4.4.3 (GCC) ) #1 PREEMPT Tue Aug 6 12:14:53 PDT 2013 [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f000 (usable) [ 0.000000] BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) [ 0.000000] BIOS-e820: 00000000000e8000 - 0000000000100000 (reserved) [ 0.000000] BIOS-e820: 0000000000100000 - 000000001fff0000 (usable) [ 0.000000] BIOS-e820: 000000001fff0000 - 0000000020000000 (ACPI data) [ 0.000000] BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved) 269 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 270. [ 0.000000] Notice: NX (Execute Disable) protection missing in CPU! [ 0.000000] DMI 2.4 present. [ 0.000000] last_pfn = 0x1fff0 max_arch_pfn = 0x100000 [ 0.000000] init_memory_mapping: 0000000000000000-000000001fff0000 [ 0.000000] RAMDISK: 1ffb4000 - 1fff0000 ..... for 1f700000-1f796000, got write-back [ 4.816692] Clocksource tsc unstable (delta = 70001460 ns) [ 35.829113] warning: `zygote' uses 32-bit capabilities (legacy support in use) [ 86.091553] binder: 1208: binder_alloc_buf, no vma [ 86.091710] binder: 1115:1126 transaction failed 29201, size 4-0 [ 86.091868] binder: send failed reply for transaction 3147 to 1208:1208 [ 99.262724] init: sys_prop: permission denied uid:1003 name:service.bootanim.exit 270 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 271. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ”āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Kernel āļŠāļģāļŦāļĢāļąāļš Emulator āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļē Android Emulator āļ‚āļ­āļ‡ Android āļĢāļļāđˆāļ™ 4.1.1 (ICS) āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļĄāļēāļāļąāļš AOSP āļ™āļąāđ‰āļ™āļĒāļąāļ‡āđƒāļŠāđ‰ Android Kernel āļĢāļļāđˆāļ™ 2.6.29 āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ­āļąāļžāđ€āļāļĢāļ” ANDROID KERNEL āļŠāļģāļŦāļĢāļąāļš ANDROID EMULATOR (GOLDFISH) āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” Android Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cd ~/aosp $ git clone http://android.googlesource.com/kernel/goldfish.git āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ git branch -r āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļĄāļĩ Kernel āļĢāļļāđˆāļ™āđ„āļŦāļ™āļ­āļĒāļđāđˆāļšāđ‰āļēāļ‡ $ cd goldfish $ git branch -r origin/HEAD -> origin/master origin/android-goldfish-2.6.29 271 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 272. origin/android-goldfish-3.4 origin/linux-goldfish-3.0-wip origin/master āđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ Kernel āļĢāļļāđˆāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđˆāļˆāļ°āđ€āļĨāļ·āļ­āļāļĢāļļāđˆāļ™ 3.4 $ git checkout -b 3.4 origin/android-goldfish-3.4 Checking out files: 100% (38868/38868), done. Branch 3.4 set up to track remote branch android-goldfish-3.4 from origin. Switched to a new branch '3.4' āļ•āļąāđ‰āļ‡āļ„āđˆāļē Kernel āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Goldsh āđ‚āļ”āļĒāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļ°āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāļ„āđˆāļēāļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ§āđ‰āļŠāļģāļŦāļĢāļąāļš Goldsh Emulator āļ‹āļķāđˆāļ‡āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/x86/configs/ $ ls -al arch/x86/configs/ total 80 drwxr-xr-x 2 student student 4096 2013-08-17 18:46 . drwxr-xr-x 25 student student 4096 2013-08-17 18:46 .. -rw-r--r-- 1 student student 55883 2013-08-17 18:46 goldfish_defconfig -rw-r--r-- 1 student student 7511 2013-08-17 18:46 i386_defconfig -rw-r--r-- 1 student student 7528 2013-08-17 18:46 x86_64_defconfig $ make goldfish_defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāļĄāļēāļāļąāļšāļšāļ­āļĢāđŒāļ” target āđāļĨāļ°āļ­āļļāļ›āļāļĢāļ“āđŒāļĄāļ·āļ­āļ–āļ·āļ­/āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ•āļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļ›āļāļ•āļīāļˆāļ°āļĄāļĩāđ„āļŸāļĨāđŒ .cong āđ€āļ”āļīāļĄāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ‹āļķāđˆāļ‡āļˆāļ°āļ–āļđāļāļšāļĩāļšāļ­āļąāļ”āđāļĨāļ°āđ€āļāđ‡āļšāđƒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāļ§āđˆāļē cong.gz āđāļĨāļ°āļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ /proc/ āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļąāđ‰āļ™āđ† āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb pull āđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āđ„āļŸāļĨāđŒ cong.gz āļ­āļ­āļāļĄāļē āđāļĨāđ‰āļ§ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ .cong āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰ $ adb pull /proc/config.gz . $ gunzip config.gz $ cp config .config 272 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 273. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ Kernel image āđƒāļŦāļĄāđˆ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļ—āļĩāđˆāļĄāļĩ āļ­āļĒāļđāđˆāđƒāļ™ āđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđ„āļ”āđ‰āļ•āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Networking support, Device Drivers, Firmware Driv- ers, File systems, Security options, Cryptographic API, Virtualization, Library routines āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ $ make menuconfig āļ—āļ”āļĨāļ­āļ‡āđ€āļžāļīāđˆāļĄāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Bluetooth āđāļĨāļ° NFC āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āđ‰āļēāđ„āļ›āđ€āļĨāļ·āļ­āļāļˆāļēāļāđ€āļĄāļ™āļđ Network- ing support 273 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 274. āđ€āļĨāļ·āļ­āļāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Kernel Loading Module (KLM) āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļāđƒāļ™āđ€āļĄāļ™āļđ enable loadable module support āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 274 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 275. āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆāļŠāļģāļŦāļĢāļąāļš Goldsh āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ‚āļ”āļĒāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš cross-compiling āđāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ‚āļ­āļ‡ Goldsh Emula- tor āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļ„āļ·āļ­āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ x86 $ export CROSS_COMPILE=~/aosp/external/qemu/distrib/kernel-toolchain/android-ke rnel-toolchain- $ export REAL_CROSS_COMPILE=~/aosp/prebuilts/gcc/linux-x86/x86/i686-android-lin ux-4.4.3/bin/i686-android-linux- $ export ARCH=x86 $ export SUBARCH=x86 $ make -j3 āļŦāļĨāļąāļ‡āļˆāļēāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļīāđ‰āļ™āļŠāļļāļ”āļĨāļ‡āļāđ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒ kernel image āļŠāļ·āđˆāļ­āļ§āđˆāļē “bzImage” āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ arch/ x86/boot/ āļ”āļąāļ‡āļĢāļēāļĒāļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ ls arch/x86/boot/ a20.c cpustr.h mtools.conf.in version.o a20.o ctype.h pm.c vesa.h apm.c early_serial_console.c pmjump.o video-bios.c bioscall.o early_serial_console.o pmjump.S video-bios.o bioscall.S edd.c pm.o video.c bitops.h edd.o printf.c video.h boot.h header.o printf.o video-mode.c bzImage header.S regs.c video-mode.o cmdline.c install.sh regs.o video.o cmdline.o main.c setup.bin video-vesa.c code16gcc.h main.o setup.elf video-vesa.o compressed Makefile setup.ld video-vga.c copy.o mca.c string.c video-vga.o copy.S mca.o string.o vmlinux.bin cpu.c memory.c tools voffset.h cpucheck.c memory.o tty.c zoffset.h cpucheck.o mkcpustr tty.o cpu.o mkcpustr.c version.c āļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđ‚āļ”āļĒāļĢāļ°āļšāļļāļ•āļģāđāļŦāļ™āđˆāļ‡āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ kernel image āļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ‚āļ”āļĒāđƒāļŠāđ‰ option -kernel āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ cd ~/aosp $ source build/envsetup.sh $ lunch full_x86-eng $ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -wipe-data & 275 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 276. āļāļēāļĢāļžāļąāļ’āļ™āļē Kernel Module āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđƒāļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļ•āļąāļ§ Android Emulator āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāļ•āļąāļ§āđƒāļŦāļĄāđˆ (āļĢāļļāđˆāļ™ 3.4) āļ‹āļķāđˆāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļĩāđ‰ āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļĻāļķāļāļĐāļēāđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ Android Kernel āđ„āļ”āđ‰āđāļĨāđ‰āļ§ āļ™āļ­āļāļˆāļēāļ āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ kernel module āļŦāļĢāļ·āļ­ kernel device driver āđƒāļ™āļĢāļ°āļ”āļąāļš kernel space āđ€āļžāļ·āđˆāļ­āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŦāļĢāļ·āļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāđƒāļ™āđ„āļ”āđ‰āļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āļĄāļēāļāļ‚āļķāđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē kernel module āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ mkdir ~/aosp/goldfish/my_modules $ cd ~/aosp/goldfish/my_modules/ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļĄāļ”āļđāļĨāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello.c āđāļĨāļ° hello1.c āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ // hello.c #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_ALERT */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Wiroon Sriborrirux EE-Burapha, 2013"); MODULE_DESCRIPTION("Demo module"); int init_module(void) 276 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 277. { printk(KERN_INFO "Hello world! 1n"); return 0; } void cleanup_module(void) { printk(KERN_ALERT "Cleaning up module 1n"); } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ hello1.c // hello1.c // Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually available to userspace programs. #undef __KERNEL__ #define __KERNEL__ #undef MODULE #define MODULE // Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO. #include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros MODULE_LICENSE("GPL"); MODULE_AUTHOR("Wiroon Sriborrirux EE-Burapha, 2013"); MODULE_DESCRIPTION("Demo module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world! 2n"); return 0; // Non-zero return means that the module couldn't be loaded. } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module 2n"); } module_init(hello_init); module_exit(hello_cleanup); āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ”āļąāļ‡āļ™āļĩāđ‰ $ vim Makefile VERSION = 3 PATCHLEVEL = 4 277 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 278. SUBLEVEL = 0 EXTRAVERSION= obj-m += hello.o hello1.o all: make -C /home/student/aosp/goldfish/ M=$(PWD) modules clean: make -C /home/student/aosp/goldfish/ M=$(PWD) clean āļāđˆāļ­āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļĄāļ”āļđāļĨ hello āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļ„āļ­āļĄāđ„āļžāļĨāđŒ Kernel āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļĄāļ”āļđāļĨ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ cd ~/aosp/goldfish/ $ make ARCH=x86 CROSS_COMPILE=~/aosp/prebuilts/gcc/linux-x86/x86/i686-android-linux-4. 4.3/bin/i686-android-linux- modules_prepare make[1]: Nothing to be done for `all'. make[1]: Nothing to be done for `relocs'. CHK include/linux/version.h CHK include/generated/utsrelease.h CC kernel/bounds.s GEN include/generated/bounds.h CC arch/x86/kernel/asm-offsets.s GEN include/generated/asm-offsets.h CALL scripts/checksyscalls.sh CC scripts/mod/empty.o MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/mod/modpost āđ€āļĢāļīāđˆāļĄāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ kernel module āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļ§āđ‰ (hello.c) $ cd ~/aosp/goldfish/my_modules/ $ make make -C /home/student/aosp/goldfish/ M=/home/student/aosp/goldfish- /custom_modules modules make[1]: Entering directory `/home/student/aosp/goldfish' CC [M] /home/student/aosp/goldfish/custom_modules/hello.o CC [M] /home/student/aosp/goldfish/custom_modules/hello1.o Building modules, stage 2. MODPOST 2 modules CC /home/student/aosp/goldfish/custom_modules/hello.mod.o LD [M] /home/student/aosp/goldfish/custom_modules/hello.ko CC /home/student/aosp/goldfish/custom_modules/hello1.mod.o LD [M] /home/student/aosp/goldfish/custom_modules/hello1.ko make[1]: Leaving directory `/home/student/aosp/goldfish' $ ls 278 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 279. hello1.c hello1.mod.o hello.ko hello.o Makefile_old hello1.ko hello1.o hello.mod.c Makefile modules.order hello1.mod.c hello.c hello.mod.o Makefile1 Module.symvers āļŦāļĨāļąāļ‡āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒāļāđ‡āļˆāļ°āđ„āļ”āđ‰āđ„āļŸāļĨāđŒāđ‚āļĄāļ”āļđāļĨāļŠāļ·āđˆāļ­āļ§āđˆāļē hello.ko āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāđ‚āļ”āļĒāļŠāđˆāļ‡āļœāđˆāļēāļ™ adb push āđ„āļ›āļĒāļąāļ‡ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ adb push hello.ko /data/local 52 KB/s (2203 bytes in 0.040s) $ adb push hello1.ko /data/local 54 KB/s (2238 bytes in 0.040s) $ adb shell # cd /data/local # ls hello.ko hello1.ko tmp āļ—āļ”āļŠāļ­āļšāđ‚āļŦāļĨāļ”āđ‚āļĄāļ”āļđāļĨ hello āđāļĨāļ° hello1 āļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰ Kernel āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ (3.4.0) āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļœāļĨāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļĄāļ”āļđāļĨ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ dmesg # insmod hello.ko # insmod hello1.ko # lsmod hello1 506 0 - Live 0x00000000 (PO) hello 540 0 - Live 0x00000000 (O) # rmmod hello # rmmod hello1 # dmesg ... <3>[ 79.016988] init: sys_prop: permission denied uid:1003 name:service.bootanim.exit <4>[ 4000.418990] hello: module license 'unspecified' taints kernel. <4>[ 4000.419343] Disabling lock debugging due to kernel taint <6>[ 4064.182198] Hello world! 1 <6>[ 4068.910892] Hello world! 2 <6>[ 4086.416483] Cleaning up module 1 <6>[ 4089.112969] Cleaning up module 2 279 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 280. āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āļāļąāļ‡āļĨāļ‡āđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (.APK) āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āđāļĨāđ‰āļ§āļˆāļ°āļĄāļĩ āļ§āļīāļ˜āļĩāļāļēāļĢāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļ§āļīāļ˜āļĩāļ„āļ·āļ­āļāļēāļĢāļ™āļģāļ‚āļķāđ‰āļ™ Google PlayStore āđāļĨāđ‰āļ§āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđāļĨāļ°āļ§āļīāļ˜āļĩāļ—āļĩāđˆāļŠāļ­āļ‡āļ„āļ·āļ­āļāļēāļĢāļ™āļģ āđ„āļŸāļĨāđŒāļ•āļīāļ”āļ•āļąāđ‰āļ‡ (āļ™āļēāļĄāļŠāļāļļāļĨ .APK) āļĄāļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāļāļąāļ‡āļĨāļ‡āđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™ āļāļēāļ™āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļĒāļĩāđˆāļŦāđ‰āļ­āļ™āļąāđ‰āļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāđ‰āļ‡āđāļ•āđˆāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™ āļ”āļĢāļ­āļĒāļ”āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ‚āļ”āļĒāļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ 1. āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđāļ­āļžāļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­āļ§āđˆāļē MyApp 280 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 281. 281 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 282. // MainActivity.java package com.example.myapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } // activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> 282 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 283. 2. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Android.mk 283 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 284. 3. āļŠāļĢāđ‰āļēāļ‡ symbolic link āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ‚āļ›āļĢāđāļāļĢāļĄ MyApp $ cd ~/aosp/packages/apps $ ln -s /home/student/android/workspace/MyApp MyApp $ ls -al total 148 drwxr-xr-x 37 student student 4096 2013-08-19 02:27 . drwxr-xr-x 7 student student 4096 2012-09-04 04:30 .. drwxr-xr-x 5 student student 4096 2012-09-04 22:50 BasicSmsReceiver drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Bluetooth drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Browser drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Calculator drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Calendar drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Camera drwxr-xr-x 5 student student 4096 2012-09-04 22:50 CellBroadcastReceiver drwxr-xr-x 4 student student 4096 2012-09-04 22:50 CertInstaller drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Contacts drwxr-xr-x 6 student student 4096 2012-09-04 22:50 DeskClock drwxr-xr-x 7 student student 4096 2012-09-04 22:50 Email drwxr-xr-x 6 student student 4096 2012-09-04 22:50 Exchange drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Gallery drwxr-xr-x 8 student student 4096 2012-09-04 22:50 Gallery2 drwxr-xr-x 4 student student 4096 2012-09-04 22:50 HTMLViewer drwxr-xr-x 6 student student 4096 2012-09-04 22:50 KeyChain drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Launcher2 drwxr-xr-x 6 student student 4096 2012-09-04 22:50 LegacyCamera drwxr-xr-x 6 student student 4096 2012-09-04 22:50 Mms drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Music drwxr-xr-x 4 student student 4096 2012-09-04 22:50 MusicFX lrwxrwxrwx 1 student student 37 2013-08-19 02:27 MyApp -> /home/student/android/ workspace/MyApp drwxr-xr-x 8 student student 4096 2012-09-04 22:50 Nfc drwxr-xr-x 4 student student 4096 2012-09-04 22:50 PackageInstaller drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Phone drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Protips drwxr-xr-x 3 student student 4096 2012-09-04 22:50 Provision drwxr-xr-x 6 student student 4096 2012-09-04 22:50 QuickSearchBox drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Settings drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SoundRecorder drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SpareParts drwxr-xr-x 4 student student 4096 2012-09-04 22:50 SpeechRecorder drwxr-xr-x 4 student student 4096 2012-09-04 22:50 Stk drwxr-xr-x 5 student student 4096 2012-09-04 22:50 Tag drwxr-xr-x 4 student student 4096 2012-09-04 22:50 VideoEditor drwxr-xr-x 5 student student 4096 2012-09-04 22:50 VoiceDialer 4. āļĨāļšāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ gen/ āđāļĨāļ° bin/ āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MyApp $ cd MyApp $ rm -rf gen bin 5. āđ€āļžāļīāđˆāļĄāļŠāļ·āđˆāļ­āđāļ­āļžāļžāļĨāļīāđ€āļ„āļŠāļąāđˆāļ™āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ ~/aosp/build/target/product/core.mk āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ PRODUCT_PACKAGES 284 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 285. $ cd /home/student/aosp/build/target/product/ $ gedit core.mk 6. āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš AOSP āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ $ cd ~/aosp $ source build/envsetup.sh $ lunch 2 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.1.1 TARGET_PRODUCT=full_x86 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=x86 TARGET_ARCH_VARIANT=x86-atom HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-2.6.32-42-server-x86_64-with-Ubuntu-10.04-lucid HOST_BUILD_TYPE=release BUILD_ID=JRO03L OUT_DIR=out ============================================ 7. āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ MyApp $ cd package/apps/MyApp $ make $ mm ============================================ PLATFORM_VERSION_CODENAME=REL 285 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 286. PLATFORM_VERSION=4.1.1 TARGET_PRODUCT=full_x86 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=x86 TARGET_ARCH_VARIANT=x86-atom .... Processing target/product/generic_x86/obj/APPS/MyAppAndroid_intermediates/package.apk Done! Install: out/target/product/generic_x86/system/app/MyAppAndroid.odex Install: out/target/product/generic_x86/system/app/MyAppAndroid.apk make: Leaving directory `/home/student/aosp' 8.āļĨāļšāđ„āļŸāļĨāđŒ system.img āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp/out/target/product/generic_x86 āđāļĨāļ°āđāļŸāđ‰āļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/aosp/out/target/product/generic_x86/obj/PACKAGING/systemimage_ intermediates/ $ cd ~/aosp/out/target/product/generic_x86 $ rm -rf system.img obj/PACKAGING/systemimage_intermediates/ 9. āļ„āļ­āļĄāđ„āļžāļĨāđŒ AOSP āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ $ cd ~/aosp $ make -j3 ringtones/Rigel.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtone s/Scarabaeus.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/ Solarium.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Th emos.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/UrsaMinor.ogg:system/media/audio/ringtones /UrsaMinor.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Zeta.ogg:system/media/audio/ringtones/Zeta .ogg ignored. Target system fs image: out/target/product/generic_x86/obj/PACKAGING/systemimage_intermediates/system.img Running: mkyaffs2image -f out/target/product/generic_x86/system out/target/product/generic_x86/obj/PACKAGING/systemimage_intermediates/system.img Install system fs image: out/target/product/generic_x86/system.img 286 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 287. 10. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ $ emulator -kernel ~/aosp/goldfish/arch/x86/boot/bzImage -system out/target/product/generic_x86/system.img -ramdisk out/target/product/generic_x86/ramdisk.img & 287 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 288. āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđāļĨāļ°āļ„āļģāļŠāļąāđˆāļ‡āļ āļēāļĒāđƒāļ™ Android Emulator āđ€āļžāļ·āđˆāļ­āļĻāļķāļāļĐāļēāļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ•āļąāļ§ Android Emulator āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļ™āļąāļ āļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļŠāļąāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 5.7 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ āļēāļĒāđƒāļ™ Android Emulator āļ„āļģāļŠāļąāđˆāļ‡ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” services āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ”āļđ Service āļ—āļĩāđˆāļ­āļĒāļđāđˆ Android āļ—āļąāđ‰āļ‡āļŦāļĄāļ” dumpsys āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļšāļšāļ—āļĩāđˆāđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡CPU dumpstate āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™ Android rawbu āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ backup āđāļĨāļ° restore āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āļĒāļđāđˆ /data am āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Activity pm āļ•āļąāļ§āļˆāļąāļ”āļāļēāļĢ Package dalvikvm āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļĢāļąāļ™āđ„āļŸāļĨāđŒ Java Class āđƒāļ™āļĢāļđāļ›āđāļšāļš DEX format 288 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 289. āļ„āļģāļŠāļąāđˆāļ‡ āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” getprop āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļĢāļ°āļšāļš āđ€āļŠāđˆāļ™ DNS servers, gateways, GSM, serv- ices āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™, build parameters, āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļĢāļēāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Android Emulator āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ $ cd ~/aosp/ $ source build/envsetup.sh including device/asus/grouper/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh including device/generic/armv7-a/vendorsetup.sh including device/moto/wingray/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh including device/samsung/maguro/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash $ lunch You're building on Linux Lunch menu... pick a combo: 1. full-eng 2. full_x86-eng 3. vbox_x86-eng 4. full_grouper-userdebug 5. mini_armv7a_neon-userdebug 6. mini_armv7a-userdebug 7. full_wingray-userdebug 8. full_crespo-userdebug 9. full_maguro-userdebug 10. full_panda-userdebug Which would you like? [full-eng] 2 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.1.1 TARGET_PRODUCT=full_x86 TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=x86 TARGET_ARCH_VARIANT=x86-atom HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.2.17-x86_64-with-Ubuntu-10.04-lucid HOST_BUILD_TYPE=release BUILD_ID=JRO03L OUT_DIR=out ============================================ $ emulator & 289 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 290. āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āļāļąāļšāļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ (Mounting) āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ„āļģāļŠāļąāđˆāļ‡: mount -o rw,remount -t "filesystem" "Device" "Mount Point" $ adb shell āļāļēāļĢāļ•āļąāđ‰āļ‡āđƒāļŦāđ‰ root le system āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ # mount -o rw,remount -t rootfs / āļāļēāļĢāļ•āļąāđ‰āļ‡āđƒāļŦāđ‰āļžāļēāļĢāđŒāļ—āļīāļŠāļąāļ™ /system āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰ # mount -o rw,remount -t yaffs2 /dev/block/mtdblock4 /system $ adb shell āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļĢāļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Android Emulator # service Usage: service [-h|-?] service list service check SERVICE service call SERVICE CODE [i32 INT | s16 STR] ... Options: i32: Write the integer INT into the send parcel. s16: Write the UTF-16 string STR into the send parcel. # service list Found 65 services: 0! phone: [com.android.internal.telephony.ITelephony] 1! iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo] 2! simphonebook: [com.android.internal.telephony.IIccPhoneBook] 3! isms: [com.android.internal.telephony.ISms] 4! commontime_management: [] 5! samplingprofiler: [] 6! diskstats: [] 7! appwidget: [com.android.internal.appwidget.IAppWidgetService] 8! backup: [android.app.backup.IBackupManager] 9! uimode: [android.app.IUiModeManager] 10! serial: [android.hardware.ISerialManager] 11! usb: [android.hardware.usb.IUsbManager] 12! audio: [android.media.IAudioService] 13! wallpaper: [android.app.IWallpaperManager] 14! dropbox: [com.android.internal.os.IDropBoxManagerService] 15! search: [android.app.ISearchManager] 16! country_detector: [android.location.ICountryDetector] 17! location: [android.location.ILocationManager] 18! devicestoragemonitor: [] 19! notification: [android.app.INotificationManager] 20! updatelock: [android.os.IUpdateLock] 21! throttle: [android.net.IThrottleManager] 290 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 291. 22! servicediscovery: [android.net.nsd.INsdManager] 23! connectivity: [android.net.IConnectivityManager] 24! wifi: [android.net.wifi.IWifiManager] 25! wifip2p: [android.net.wifi.p2p.IWifiP2pManager] 26! netpolicy: [android.net.INetworkPolicyManager] 27! netstats: [android.net.INetworkStatsService] 28! textservices: [com.android.internal.textservice.ITextServicesManager] 29! network_management: [android.os.INetworkManagementService] 30! clipboard: [android.content.IClipboard] 31! statusbar: [com.android.internal.statusbar.IStatusBarService] 32! device_policy: [android.app.admin.IDevicePolicyManager] 33! lock_settings: [com.android.internal.widget.ILockSettings] 34! mount: [IMountService] 35! accessibility: [android.view.accessibility.IAccessibilityManager] 36! input_method: [com.android.internal.view.IInputMethodManager] 37! input: [android.hardware.input.IInputManager] 38! window: [android.view.IWindowManager] 39! alarm: [android.app.IAlarmManager] 40! vibrator: [android.os.IVibratorService] 41! battery: [] 42! hardware: [android.os.IHardwareService] 43! content: [android.content.IContentService] 44! account: [android.accounts.IAccountManager] 45! permission: [android.os.IPermissionController] 46! cpuinfo: [] 47! dbinfo: [] 48! gfxinfo: [] 49! meminfo: [] 50! activity: [android.app.IActivityManager] 51! package: [android.content.pm.IPackageManager] 52! scheduling_policy: [android.os.ISchedulingPolicyService] 53! telephony.registry: [com.android.internal.telephony.ITelephonyRegistry] 54! usagestats: [com.android.internal.app.IUsageStats] 55! batteryinfo: [com.android.internal.app.IBatteryStats] 56! power: [android.os.IPowerManager] 57! entropy: [] 58! sensorservice: [android.gui.SensorServer] 59! media.audio_policy: [android.media.IAudioPolicyService] 60! media.camera: [android.hardware.ICameraService] 61! SurfaceFlinger: [android.ui.ISurfaceComposer] 62! media.player: [android.media.IMediaPlayerService] 63! media.audio_flinger: [android.media.IAudioFlinger] 64! drm.drmManager: [drm.IDrmManagerService] āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ # service call statusbar 1 Result: Parcel(00000000 '....') 291 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 292. # service call statusbar 2 Result: Parcel(00000000 '....') 292 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 293. āļ„āļģāļŠāļąāđˆāļ‡ dumpsys āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āļŠāļ–āļēāļ™āļ°āļ•āđˆāļēāļ‡āđ† āļ‚āļ­āļ‡āļ•āļąāļ§āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš (system service) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆ āļ•āļąāļ§āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ $ adb shell dumpsys | grep "DUMP OF SERVICE" Output Command DUMP OF SERVICE SurfaceFlinger: DUMP OF SERVICE accessibility: DUMP OF SERVICE account: DUMP OF SERVICE activity: DUMP OF SERVICE alarm: DUMP OF SERVICE appwidget: DUMP OF SERVICE audio: DUMP OF SERVICE backup: DUMP OF SERVICE battery: DUMP OF SERVICE batteryinfo: DUMP OF SERVICE clipboard: DUMP OF SERVICE commontime_management: DUMP OF SERVICE connectivity: DUMP OF SERVICE content: DUMP OF SERVICE country_detector: DUMP OF SERVICE cpuinfo: DUMP OF SERVICE dbinfo: DUMP OF SERVICE device_policy: DUMP OF SERVICE devicestoragemonitor: DUMP OF SERVICE diskstats: DUMP OF SERVICE drm.drmManager: DUMP OF SERVICE dropbox: DUMP OF SERVICE entropy: DUMP OF SERVICE gfxinfo: DUMP OF SERVICE hardware: DUMP OF SERVICE input: DUMP OF SERVICE input_method: DUMP OF SERVICE iphonesubinfo: DUMP OF SERVICE isms: DUMP OF SERVICE location: DUMP OF SERVICE lock_settings: DUMP OF SERVICE media.audio_flinger: DUMP OF SERVICE media.audio_policy: DUMP OF SERVICE media.camera: DUMP OF SERVICE media.player: DUMP OF SERVICE meminfo: DUMP OF SERVICE mount: DUMP OF SERVICE netpolicy: DUMP OF SERVICE netstats: DUMP OF SERVICE network_management: DUMP OF SERVICE notification: DUMP OF SERVICE package: DUMP OF SERVICE permission: DUMP OF SERVICE phone: DUMP OF SERVICE power: DUMP OF SERVICE samplingprofiler: DUMP OF SERVICE scheduling_policy: DUMP OF SERVICE search: DUMP OF SERVICE sensorservice: DUMP OF SERVICE serial: DUMP OF SERVICE servicediscovery: DUMP OF SERVICE simphonebook: DUMP OF SERVICE statusbar: DUMP OF SERVICE telephony.registry: DUMP OF SERVICE textservices: 293 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 294. DUMP OF SERVICE throttle: DUMP OF SERVICE uimode: DUMP OF SERVICE updatelock: DUMP OF SERVICE usagestats: DUMP OF SERVICE usb: DUMP OF SERVICE vibrator: DUMP OF SERVICE wallpaper: DUMP OF SERVICE wifi: DUMP OF SERVICE wifip2p: DUMP OF SERVICE window: $ adb shell dumpsys battery Current Battery Service state: AC powered: true USB powered: false status: 2 health: 2 present: true level: 50 scale: 100 voltage:0 temperature: 0 technology: Li-ion $ adb shell dumpsys wifi Wi-Fi is disabled Stay-awake conditions: 1 Internal state: current HSM state: DriverUnloadedState mLinkProperties LinkAddresses: [] Routes: [] DnsAddresses: [] mWifiInfo SSID: <none>, BSSID: <none>, MAC: <none>, Supplicant state: UNINITIALIZED, RSSI: -9999, Link speed: -1, Net ID: -1, Metered hint: false mDhcāļ‚āļēfoInternal addr: null/0 mRoutes: dns: null,null dhcpServer: null leaseDura- tion: 0 mNetworkInfo NetworkInfo: type: WIFI[], state: UNKNOWN/IDLE, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: false mLastSignalLevel -1 mLastBssid null mLastNetworkId -1 mReconnectCount 0 mIsScanMode false Supplicant status null mLastPriority -1 Configured networks Latest scan results: Locks acquired: 0 full, 0 full high perf, 0 scan Locks released: 0 full, 0 full high perf, 0 scan Locks held: Scan count since last plugged in WifiWatchdogStateMachine dump WatchdogStatus: State: android.net.wifi.WifiWatchdogStateMachine$NotConnectedState@b444f100mWifiInfo: [null] mLinkProperties: [null] mCurrentSignalLevel: [0] mArpCheckIntervalMs: [120000] mRssiFetchIntervalMs: [1000] mWalledGardenIntervalMs: [1800000] 294 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 295. mNumArppings: [5] mMinArpResponses: [1] mArppingTimeoutMs: [100] mPoorNetworkDetectionEnabled: [true] mWalledGardenTestEnabled: [true] mWalledGardenUrl: [http://clients3.google.com/generate_204] WifiStateMachine dump WifiStateMachine: total messages=3 msg[0]: time=09-21 16:03:00.308 state=DefaultState orgState=DriverUnloadedState what=69632(0x11000) msg[1]: time=09-21 16:03:00.389 state=DefaultState orgState=DriverUnloadedState what=131085(0x2000d) msg[2]: time=09-21 16:03:00.408 state=DefaultState orgState=DriverUnloadedState what=131147(0x2004b) curState=DriverUnloadedState $ adb shell dumpsys cpuinfo Load: 3.24 / 1.4 / 0.51 CPU usage from 533936ms to 513149ms ago: 23% 2477/system_server: 22% user + 0.7% kernel / faults: 625 minor 4.8% 2445/surfaceflinger: 4.6% user + 0.1% kernel / faults: 592 minor 1.5% 2634/android.process.acore: 1.4% user + 0% kernel / faults: 252 minor 1.9% 2782/android.process.media: 1.7% user + 0.1% kernel / faults: 125 minor 1.7% 2619/com.android.launcher: 1.4% user + 0.2% kernel / faults: 145 minor 1.5% 2570/com.android.inputmethod.latin: 1.3% user + 0.1% kernel / faults: 141 mi- nor 1.4% 2708/com.android.deskclock: 1.3% user + 0% kernel / faults: 150 minor 1.3% 2765/com.android.email: 1.3% user + 0% kernel / faults: 106 minor 1.3% 2851/com.android.providers.calendar: 1.3% user + 0% kernel / faults: 148 mi- nor 1.3% 2552/com.android.systemui: 1.2% user + 0% kernel / faults: 60 minor 0.9% 2731/com.android.contacts: 0.8% user + 0% kernel / faults: 160 minor 1% 2589/com.android.phone: 0.8% user + 0.1% kernel / faults: 55 minor 0.7% 2681/zygote: 0.6% user + 0% kernel / faults: 160 minor 0.9% 2805/com.android.exchange: 0.9% user + 0% kernel / faults: 120 minor 0.5% 2659/com.android.smspush: 0.4% user + 0% kernel / faults: 165 minor 0.8% 2878/com.android.calendar: 0.8% user + 0% kernel / faults: 99 minor 0.5% 806/adbd: 0% user + 0.5% kernel / faults: 11 minor 0.1% 2428/mediaserver: 0% user + 0% kernel / faults: 27 minor 0% 4/events/0: 0% user + 0% kernel 0% 783/servicemanager: 0% user + 0% kernel +0% 2900/sh: 0% user + 0% kernel +0% 2902/dumpsys: 0% user + 0% kernel 48% TOTAL: 45% user + 3.3% kernel $ adb shell dumpsys meminfo Applications Memory Usage (kB): Uptime: 9118113 Realtime: 9118113 Total PSS by process: 22980 kB: system (pid 2477) 19899 kB: com.android.settings (pid 2681) 19648 kB: com.android.launcher (pid 2619) 12665 kB: com.android.systemui (pid 2552) 8792 kB: com.android.phone (pid 2589) 7504 kB: com.android.contacts (pid 2731) 7085 kB: com.android.inputmethod.latin (pid 2570) 6619 kB: android.process.acore (pid 2634) 5815 kB: com.android.email (pid 2765) 5402 kB: android.process.media (pid 2782) 295 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 296. 5328 kB: com.android.calendar (pid 2878) 4603 kB: com.android.providers.calendar (pid 2851) 4287 kB: com.android.deskclock (pid 2708) 4282 kB: com.android.exchange (pid 2805) 2824 kB: com.android.smspush (pid 2659) 2686 kB: com.android.defcontainer (pid 2965) Total PSS by OOM adjustment: 22980 kB: System 22980 kB: system (pid 2477) 21457 kB: Persistent 12665 kB: com.android.systemui (pid 2552) 8792 kB: com.android.phone (pid 2589) 19648 kB: Foreground 19648 kB: com.android.launcher (pid 2619) 2824 kB: Visible 2824 kB: com.android.smspush (pid 2659) 7085 kB: Perceptible 7085 kB: com.android.inputmethod.latin (pid 2570) 22585 kB: Previous 19899 kB: com.android.settings (pid 2681) 2686 kB: com.android.defcontainer (pid 2965) 43840 kB: Background 7504 kB: com.android.contacts (pid 2731) 6619 kB: android.process.acore (pid 2634) 5815 kB: com.android.email (pid 2765) 5402 kB: android.process.media (pid 2782) 5328 kB: com.android.calendar (pid 2878) 4603 kB: com.android.providers.calendar (pid 2851) 4287 kB: com.android.deskclock (pid 2708) 4282 kB: com.android.exchange (pid 2805) Total PSS by category: 53374 kB: Dalvik 23817 kB: Unknown 19418 kB: Other mmap 18091 kB: Native 11556 kB: .apk mmap 11425 kB: .so mmap 1936 kB: Ashmem 718 kB: .ttf mmap 68 kB: Other dev 12 kB: Cursor 4 kB: .jar mmap 0 kB: .dex mmap Total PSS: 140419 kB KSM: 0 kB saved from shared 0 kB 0 kB unshared; 0 kB volatile $ adb shell dumpsys meminfo com.android.providers.calendar Applications Memory Usage (kB): Uptime: 8961566 Realtime: 8961566 ** MEMINFO in pid 2851 [com.android.providers.calendar] ** Shared Private Heap Heap Heap Pss Dirty Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ Native 806 684 760 1908 1692 143 Dalvik 2145 8904 1608 6407 6093 314 Cursor 0 0 0 Ashmem 0 0 0 296 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 297. Other dev 4 0 0 .so mmap 522 1828 216 .jar mmap 4 0 0 .apk mmap 95 0 0 .ttf mmap 0 0 0 .dex mmap 0 0 0 Other mmap 912 24 24 Unknown 177 36 176 TOTAL 4665 11476 2784 8315 7785 457 Objects Views: 0 ViewRootImpl: 0 AppContexts: 1 Activities: 0 Assets: 2 AssetManagers: 2 Local Binders: 10 Proxy Binders: 8 Death Recipients: 0 OpenSSL Sockets: 0 SQL MEMORY_USED: 171 PAGECACHE_OVERFLOW: 53 MALLOC_SIZE: 62 DATABASES pgsz dbsz Lookaside(b) cache Dbname 4 120 117 24/36/11 /data/data/com.android.providers.calendar/databases/calendar.db Asset Allocations zip:/system/app/CalendarProvider.apk:/resources.arsc: 57K āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ dumpsys āđ„āļ”āđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļžāļīāđˆāļĄāļšāļĢāļĢāļ—āļąāļ” <uses-permission android:name="android.permission.DUMP" /> āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ„āļģāļŠāļąāđˆāļ‡ dumpstate āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ” $ adb shell # dumpstate ...... PROVIDER ContentProviderRecord{b4669e98 com.android.email/.provider.AttachmentProvider} pid=1306 Client: nothing to dump PROVIDER ContentProviderRecord{b470bc88 com.android.providers.contacts/.CallLogProvider} pid=1151 Client: nothing to dump PROVIDER ContentProviderRecord{b462a2a0 com.android.providers.downloads/.DownloadProvider} pid=1324 Client: nothing to dump PROVIDER ContentProviderRecord{b46e1b68 com.android.providers.userdictionary/.UserDictionaryProvider} pid=1151 Client: nothing to dump [dumpsys: 0.4s elapsed] ======================================================== == dumpstate: done ======================================================== 297 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 298. āļ„āļģāļŠāļąāđˆāļ‡ dalvikvm (Dalvik VM) āđ€āļ›āđ‡āļ™āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđ‚āļ›āļĢāđāļāļĢāļĄ Dalvik VM āđ€āļžāļ·āđˆāļ­āļĢāļąāļ™āđ„āļŸāļĨāđŒ Java class āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļš DEX āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ mkdir dalvik $ cd dalvik/ āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒ $ cat hello.java package org.apache; public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } } āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ JAVA Compiler $ javac -d . -g Hello.java āļ—āļģāļāļēāļĢāļĢāļ§āļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ .jar $ jar -cvf Temp.jar * added manifest adding: Hello.java(in = 139) (out= 115)(deflated 17%) adding: org/(in = 0) (out= 0)(stored 0%) adding: org/apache/(in = 0) (out= 0)(stored 0%) adding: org/apache/Hello.class(in = 541) (out= 336)(deflated 37%) āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ â€œdx” āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ classes.dex āļˆāļēāļāđ„āļŸāļĨāđŒ Temp.jar $ dx --dex --output=./classes.dex Temp.jar $ ls classes.dex Hello.java org Temp.jar āļ–āļąāļ”āđ„āļ›āđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ â€œaapt” āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ .jar āļ•āļąāļ§āđƒāļŦāļĄāđˆ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ•āđ‰ Dalvik VM āđ„āļ”āđ‰ $ aapt add CmdLine.jar classes.dex 'classes.dex'... āļ™āļģāđ„āļŸāļĨāđŒ CmdLine.jar āļ—āļĩāđˆāļšāļĢāļĢāļˆāļļāđ„āļŸāļĨāđŒ classes.dex āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļ•āļąāļ§ Android Emulator āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ€āļĢāļĩāļĒāļ āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Dalvikvm āļ”āļąāļ‡āļ„āļģāļŠāļąāđˆāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ adb push CmdLine.jar /data 298 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 299. 10 KB/s (547 bytes in 0.050s) $ adb shell # /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -version DalvikVM version 1.6.0 Copyright (C) 2007 The Android Open Source Project This software is built from source code licensed under the Apache Licen- se,Version 2.0 (the "License"). You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 See the associated NOTICE file for this software for further details. Dalvik VM init failed (check log file) # /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -classpath /data/CmdLine.jar org.apache.Hello Hello World! am (Activity Manager) āļ„āļģāļŠāļąāđˆāļ‡ am āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (activities) āđ€āļŠāđˆāļ™ āđ€āļĢāļĩāļĒāļāđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™ āļŠāļąāđˆāļ‡āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āđ€āļāđ‰āļēāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ # am usage: am [subcommand] [options] usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>] [--R COUNT] [-S] [--opengl-trace] <INTENT> am startservice <INTENT> am force-stop <PACKAGE> am kill <PACKAGE> am kill-all am broadcast <INTENT> .... [--activity-single-top] [--activity-clear-task] [--activity-task-on-home] [--receiver-registered-only] [--receiver-replace-pending] [--selector] [<URI> | <PACKAGE> | <COMPONENT>] # am start com.android.deskclock .Clock Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock } Warning: Activity not started, its current task has been brought to the front 299 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 300. # am start -a android.intent.action.MAIN -n com.android.browser/.BrowserActivity Starting: Intent { action=android.intent.action.MAIN comp={com.android.browser/com.android.browser.BrowserActivity} } Warning: Activity not started, its current task has been brought to the front # am start -a android.intent.action.MAIN -n com.android.settings/.Settings Starting: Intent { action=android.intent.action.MAIN comp={com.android.settings/com.android.settings.Settings} } āļ„āļģāļŠāļąāđˆāļ‡āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđāļžāđ‡āļāđ€āļāđ‡āļ• (package manager) # pm list package package:android package:com.android.backupconfirm package:com.android.bluetooth package:com.android.browser package:com.android.calculator2 .... package:com.android.wallpaper.holospiral package:com.android.wallpaper.livepicker package:com.example.myapp package:com.svox.pico package:jp.co.omronsoft.openwnn 300 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 301. āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ (.apk) āđ€āļžāļīāđˆāļĄ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ pm install āđ„āļ”āđ‰āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ # pm install /sdcard/com.twitter.android-1.apk āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ›āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ # pm list packages | grep twitter āđāļŠāļ”āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ āļ—āļĩāđˆāđ€āļāđ‡āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļ› # pm path com.twitter.android āļ„āļģāļŠāļąāđˆāļ‡ svc (service control) āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļ”āļđāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļĢāļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ # svc help Available commands: help Show information about the subcommands power Control the power manager data Control mobile data connectivity wifi Control the Wi-Fi manager usb Control Usb state # svc power Control the power manager usage: svc power stayon [true|false|usb|ac] Set the 'keep awake while plugged in' setting. # svc data Control mobile data connectivity usage: svc data [enable|disable] Turn mobile data on or off. svc data prefer Set mobile as the preferred data network # svc wifi Control the Wi-Fi manager usage: svc wifi [enable|disable] Turn Wi-Fi on or off. svc wifi prefer Set Wi-Fi as the preferred data network # svc usb Control Usb state usage: svc usb setFunction [function] Set the current usb function. svc usb getFunction Gets the list of currently enabled functions 301 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 302. āļšāļ—āļ—āļĩāđˆ 6 āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāļšāļ™ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆ āļ›āļĢāļ°āļŠāļšāļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļŠāļđāļ‡āļŠāļļāļ”āđ€āļ—āđˆāļēāļ—āļĩāđˆāđ€āļ„āļĒāļĄāļĩāļĄāļēāđāļĨāļ°āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™āļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļ§āļ‡āļāļēāļĢāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļžāļīāļŠāļđāļˆāļ™āđŒāđƒāļŦāđ‰ āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļĻāļąāļāļĒāļ āļēāļžāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļšāļ—āļšāļēāļ—āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ•āđˆāļ­āļĄāļ§āļĨāļĄāļ™āļļāļĐāļĒāļŠāļēāļ•āļīāļī āļ—āļąāđ‰āļ‡āđƒāļ™āđ‚āļĨāļāļ‚āļ­āļ‡āļāļēāļĢ āļŠāļ·āđˆāļ­āļŠāļēāļĢ āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđāļĨāļ°āļĄāļ­āļšāđ‚āļ­āļāļēāļŠāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļāđˆāđ€āļŦāļĨāđˆāļēāļ™āļąāļ āļžāļąāļ’āļ™āļēāļ—āļąāđˆāļ§āļ—āļļāļāļĄāļļāļĄāđ‚āļĨāļāļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļšāļĢāļīāļĐāļąāļ—āļœāļđāđ‰āļœāļĨāļīāļ•āđƒāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāļ­āļļāļ›āļāļĢāļ“āđŒāļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢ āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĢāļ§āļĄāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđāļĨāļ°āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļĢāđˆāļ§āļĄāļāļąāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĨāļ‡āļ•āļąāļ§ āđāļĨāļ° āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ‚āļ­āļ‡āļœāļđāđ‰āļ„āļ™āđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒāļĢāļ°āļ”āļąāļšāļ āļēāļ„āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ āļĢāļ§āļĄāļ–āļķāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļĒāļāļĢāļ°āļ”āļąāļšāļāļēāļĢāđāļ‚āđˆāļ‡āļ‚āļąāļ™āđƒāļŦāđ‰āļāļąāļšāļ›āļĢāļ°āđ€āļ—āļĻāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļ„āļĒāļĄāļĩāļĄāļēāļāđˆāļ­āļ™āđāļĨāļ° āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ—āļĢāļēāļšāļāļąāļ™āļ”āļĩāļ§āđˆāļēāļ•āđ‰āļ™āļ™āđ‰āļģāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļˆāļēāļāļ›āļĢāļ°āđ€āļ—āļĻāļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđāļĨāđ‰āļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ›āļĢāļ°āđ€āļ—āļĻāļ—āļĩāđˆāļāļģāļĨāļąāļ‡ āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļ­āļĒāļđāđˆāđƒāļ™āļāļēāļ™āļ°āļœāļđāđ‰āđƒāļŠāđ‰āļĄāļēāđ‚āļ”āļĒāļ•āļĨāļ­āļ”āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ„āļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ‹āļ·āđ‰āļ­āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĄāļēāđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļ›āļĢāļ°āđ€āļ—āļĻ āļ‚āļ­āļ‡āļ•āļ™ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ€āļĄāļ·āđˆāļ­āļĒāļļāļ„āļ‚āļ­āļ‡āļ‹āļ­āļŸāļ—āđŒāđāļ§āļĢāđŒāđ€āļŠāļĢāļĩ (Open Source) āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļšāļšāđ€āļ›āļīāļ” (Open Operating System) āđāļŦāļĨāđˆāļ‡āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ­āļąāļ™āļĄāļŦāļēāļĻāļēāļĨāđƒāļ™āđ‚āļĨāļāļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāđ€āļ™āđ‡āļ• āļĢāļ§āļĄāļ–āļķāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ āđāļšāļšāđ€āļ›āļīāļ” (Open Hardware) āđ„āļ”āđ‰āļĄāļēāļ–āļķāļ‡āļˆāļļāļ”āļĨāļ‡āļ•āļąāļ§āđƒāļ™āļŠāđˆāļ§āļ‡āđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āļāđ‡āļ—āļģāđƒāļŦāđ‰āđ€āļāļīāļ”āđ‚āļ­āļāļēāļŠāļ—āļĩāđˆāļŠāļģāļ„āļąāļāđƒāļ™āļāļēāļĢāļ™āļģ āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āđ‰āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļĄāļēāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđƒāļ™āļāļēāļĢāļ•āđˆāļ­āļĒāļ­āļ”āļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļĩāđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āđ„āļ—āļĒāļžāļĒāļēāļĒāļēāļĄāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĻāļēāļŠāļ•āļĢāđŒāļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡ āđāļĨāļ°āļ™āļēāļ™āđ€āļžāļĩāļĒāļ‡āļžāļ­āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļĄāļ­āļ‡āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļœāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āļĄāļēāđāļāđ‰āļ›āļąāļāļŦāļēāļĢāļ°āļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļ­āļĒāđˆāļēāļ‡āđāļ—āđ‰āļˆāļĢāļīāļ‡ āļĢāļ§āļĄ āļ—āļąāđ‰āļ‡āļ–āđ‰āļēāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļŠāļ™āļąāļšāļŠāļ™āļļāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļ„āļ™āđ„āļ—āļĒāļŦāļ™āđˆāļ§āļĒāļ‡āļēāļ™āļ­āļ‡āļ„āđŒāļāļĢāļ āļēāļ„āļĢāļąāļāļŦāļĢāļ·āļ­ āļ āļēāļ„āđ€āļ­āļāļŠāļ™āļ”āđ‰āļ§āļĒāđāļĨāđ‰āļ§ āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļāđ‡āļĄāļĩāļ„āļ§āļēāļĄāđ€āļŠāļ·āđˆāļ­āļĄāļąāđˆāļ™āļ§āđˆāļēāđƒāļ™āļ­āļĩāļāđ„āļĄāđˆāļāļĩāđˆāļ›āļĩāļ‚āđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒāļāđ‡āļ­āļēāļˆāļĄāļĩāđ‚āļ­āļāļēāļŠāļŠāļĢāđ‰āļēāļ‡ āļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāđ‚āļˆāļ—āļĒāđŒāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļžāļķāđˆāļ‡āļžāļēāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļˆāļēāļāļ›āļĢāļ°āđ€āļ— āļĻāļ­āļ·āđˆāļ™āđ†āļĄāļēāļāđ€āļāļīāļ™āđ„āļ› āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āđāļ‚āđˆāļ‡āļ‚āļąāļ™āđ„āļ”āđ‰āđƒāļ™āļĢāļ°āļ”āļąāļšāļ™āļēāļ™āļēāļŠāļēāļ•āļīāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ āļēāļ„āļ āļđāļĄāļīāđƒāļˆāđ„āļ”āđ‰ 302 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 303. āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļˆāļķāļ‡āļ–āļ·āļ­āđ„āļ”āđ‰āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļŠāļģāļ„āļąāļāļ‚āļ­āļ‡āļāļēāļĢāļ‚āļąāļšāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļāļēāļĢ āļžāļąāļ’āļ™āļēāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļāļīāļ”āļāļēāļĢāļ™āļģāđ„āļ›āļŠāļđāđˆāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđƒāļ™āļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļāļĐāļ•āļĢāļāļĢāļĢāļĄāđāļĨāļ° āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄāđƒāļ™āļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ—āļąāđˆāļ§āļ–āļķāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļŦāļĨāļēāļĒāđ†āļ­āļĒāđˆāļēāļ‡āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° āļ­āļĒāđˆāļēāļ‡āļĒāļīāđˆāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļ”āļąāļšāļžāļ·āđ‰āļ™āļāļēāļ™āļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļš āļŠāļđāļ‡ āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļĢāļ°āļšāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļĢāļ§āļĄāļ–āļķāļ‡āļĢāļđāđ‰āđāļ™āļ§āļ—āļēāļ‡āļ§āļīāļ˜āļĩāļāļēāļĢāđāļāđ‰āđ„āļ‚āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļēāļ āļ—āļĩāđˆāđ„āļ”āđ‰āļāļĨāđˆāļēāļ§āđƒāļ™āļšāļ—āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļĻāļēāļŠāļ•āļĢāđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļ•āđˆāļēāļ‡āđ† (āđ€āļŠāđˆāļ™ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒ āđāļĨāļ°āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ) āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Android Studio IDE āđƒāļ™āļ‡āļēāļ™ Google I/O 2013 āļ—āļĩāđˆāļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļąāļ§āđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē Android Studio IDE āļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ IntelliJ IDEA āđ€āļžāļ·āđˆāļ­āļĄāļēāđāļ—āļ™āļ—āļĩāđˆāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļ•āļąāļ§āđ€āļ”āļīāļĄāļ—āļĩāđˆāđƒāļŠāđ‰ āđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE āđ‚āļ”āļĒāļ‚āđ‰āļ­āļ”āļĩāļ‚āļ­āļ‡ Android Studio IDE āļ„āļ·āļ­āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™ āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļąāļāļĐāļ“āļ° Live Layout, Live Coding (WYSIWYG Editor) āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļŦāđ‡āļ™āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™ āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļĢāļđāļ›āļ āļēāļžāđāļĨāļ° āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļĢāļēāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļāđ„āļŸāļĨāđŒāļ­āļ·āđˆāļ™ (Preview) āđāļĨāļ°āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (Lint tools) āļ„āļĢāļš āļ–āđ‰āļ§āļ™ āđ€āļŠāđˆāļ™āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļšāđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĢāļļāđˆāļ™āļāđˆāļ­āļ™āđ† āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļđāļ›āļ—āļĩāđˆ 6.1 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio 303 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 304. āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ ANDROID STUDIO IDE āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows: āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ EXE android-studio-bundle-<version>.exe āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ­āļĒāļđāđˆāļĄāļĩāļāļēāļĢ āļĢāđ‰āļ­āļ‡āļ‚āļ­āđƒāļŦāđ‰āļ•āļīāļ”āļ•āļąāđ‰āļ‡ JAVA āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ­āļēāļˆāļˆāļ°āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ (environment variables) āđ‚āļ”āļĒāļāļēāļĢāđ€āļĨāļ·āļ­āļ Start menu > Computer > System Properties > Advanced System Properties āđ€āļĨāļ·āļ­āļāđāļ—āļš Advanced > Environment Variables āļāļ”āļ›āļļāđˆāļĄ â€œadd a new system variable” āļˆāļēāļāļ™āļąāđ‰āļ™ āđƒāļŦāđ‰āđƒāļŠāđˆ path āļ‚āļ­āļ‡ JAVA_HOME āđ€āļŠāđˆāļ™ C:Program FilesJavajdk1.7.0_21. āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ MacOS X: āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ dmg android-studio-bundle-<version>.dmg āļ‹āļķāđˆāļ‡āļ›āļąāļāļŦāļēāļ—āļĩāđˆāļžāļšāđ€āļˆāļ­āļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ„āļ·āļ­ āļāļēāļĢāļ‚āļ­āļŠāļīāļ—āļ˜āļīāđŒāļ­āļ™āļļāļāļēāļ• (Permissions) āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ”āļąāļ‡āļ™āļĩāđ‰ āđ€āļĨāļ·āļ­āļāļ—āļĩāđˆ System Preferences > Security & Privacy āļ—āļĩāđˆāđāļ—āļšāļ‚āļ­āļ‡ Allow applications downloaded āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļ Anywhere āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ: āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ android-studio-bundle-<version>.tgz āđ€āļĄāļ·āđˆāļ­āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāļāđ‡āđƒāļŦāđ‰āđāļ•āļ āđ„āļŸāļĨāđŒ āđāļĨāđ‰āļ§āļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ ./studio.sh āđ€āļĄāļ·āđˆāļ­āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĢāđ‡āļˆāđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļšāđƒāļ™āđ„āļŸāļĨāđŒ ~/.bashrc āđ€āļŠāđˆāļ™ PATH āđ€āļžāļ·āđˆāļ­āļŠāļĩāđ‰āđ„āļ›āļĒāļąāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ android-studio/bin/ āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļ„āļĢāļąāđ‰āļ‡āđāļĢāļāļāđ‡āļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.2 āļŦāļ™āđ‰āļēāļ•āļēāļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āļŦāļĢāļ·āļ­āļ™āļģāđ€āļ‚āđ‰āļēāđ‚āļ›āļĢāđāļāļĢāļĄ 304 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 305. āļ—āļ”āļŠāļ­āļšāļŠāļĢāđ‰āļēāļ‡ Project āđƒāļŦāļĄāđˆ (New Project...) āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđ„āļ›āđāļĨāđ‰āļ§āļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™āļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ› āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ Application name: āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Module name: Package name: āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡ Package āļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™ Project location: āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ Minimum required SDK: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ•āđˆāļģāļŠāļļāļ”āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ Target SDK: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļ‚āđ‰āļ‡āļēāļ™ Compile with: āđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ‚āļ­āļ‡ SDK āļ—āļĩāđˆāļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Theme: āļĨāļąāļāļĐāļ“āļ°āļ˜āļĩāļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļĢāļđāļ›āļ—āļĩāđˆ 6.3 āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ–āļąāļ”āđ„āļ›āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļāđ„āļ­āļ„āļ­āļ™ āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āđ„āļ­āļ„āļ­āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ 305 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 306. āļĢāļđāļ›āļ—āļĩāđˆ 6.4 āļāļģāļŦāļ™āļ”āļĢāļđāļ›āđ„āļ­āļ„āļ­āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ„āđˆāļēāļ—āļēāļ‡āļāļĢāļēāļŸāļŸāļīāļāļ•āđˆāļēāļ‡āđ† āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđāļšāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ Blank Activity, Fullscreen Activity, Login Activity, Master/Detail Flow āļŦāļĢāļ·āļ­ Settings Activity āđ‚āļ”āļĒāđƒāļ™ āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ‚āļ­āđ€āļĨāļ·āļ­āļ Blank Activity āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Activity āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ§āđˆāļē MainActivity āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Finish āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļĢāļđāļ›āļ—āļĩāđˆ 6.5 āđ€āļĨāļ·āļ­āļ template āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Activity 306 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 307. āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļˆāļ°āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ āđāļĨāļ°āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđ€āļˆāļ„āļ•āļēāļĄāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āđ„āļ§āđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 6.6 āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļœāđˆāļēāļ™ Gradle āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āļĢāļēāļĒāļāļēāļĢāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āđ„āļŸāļĨāđŒāļ•āđˆāļēāļ‡āđ† āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 6.7 āđāļŠāļ”āļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ 307 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 308. āļ‚āđ‰āļ­āļĄāļđāļĨāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res (Resource) āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒāđ„āļŸāļĨāđŒāļ›āļĢāļ°āđ€āļ āļ— XML āļ‹āļķāđˆāļ‡āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđ€āļāđ‡āļš āļ‚āđ‰āļ­āļĄāļđāļĨāļ‚āļ­āļ‡ Layout āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res āļˆāļ°āđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āđ„āļŸāļĨāđŒāļ āļēāļž āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļ‡ āđ€āļĄāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ res āļāđ‡āļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļĢāļ§āļĄ āļāļąāļšāđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļēāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē R.java āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āđƒāļ™āđ„āļŸāļĨāđŒ AndroidMainfest.xml āđ„āļŸāļĨāđŒāļŠāļģāļ„āļąāļāđ„āļŸāļĨāđŒāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™āđ† āļ‹āļķāđˆāļ‡āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ Activities, Services, Broadcast Receivers āđāļĨāļ° Con- tent Providers āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ AndroidManifest.xml Activities Services BroadcastReceiviers ContentProviders āļĢāļđāļ›āļ—āļĩāđˆ 6.8 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāđˆāļ­āļĒāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļˆāļ°āļĄāļĩāļāļēāļĢāļ‚āļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļĢāļ°āļšāļš āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļāļēāļĻāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­āļŠāļīāļ—āļ˜āļīāđŒ āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē AndroidManifest.xml āļ”āđ‰āļ§āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒ AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidaudiostream" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity 308 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 309. android:name="com.example.androidaudiostream.ActivityAudioDecode" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡ XML āļ”āđ‰āļēāļ™āļšāļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ—āļĩāđˆāļĄāļĩāļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē manifest āđ‚āļ”āļĒāļŦāļĨāļąāļāļˆāļ°āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āđƒāļ™āļŠāļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāļ„āļ·āļ­ android:versionCode āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ‚āļ“āļ°āļ—āļĩāđˆāļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļĢāļēāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļšāļšāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļļāđˆāļ™āđƒāļŦāļĄāđˆ (upgrade) āļŦāļĢāļ·āļ­āļĨāļ”āļĢāļļāđˆāļ™āļĨāļ‡ (downgrade) āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ android:versionName āļˆāļ°āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļĢāļ°āļšāļļāđ€āļ§āļ­āļĢāđŒāļŠāļąāđˆāļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰āđāļŠāļ”āļ‡āđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄ āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <application> āļˆāļ°āļĢāļ°āļšāļļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļ‰āļĨāļēāļ (label) āđāļĨāļ°āđ„āļ­āļ„āļ­āļ™ (Icon) āļ‚āļ­āļ‡ āđ‚āļ›āļĢāđāļāļĢāļĄ āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <activity> āđ€āļ›āđ‡āļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļ‹āļķāđˆāļ‡āļˆāļ° āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āļ•āļąāļ§ android:name āđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āđāļžāđ‡āļ„āđ€āļāļˆāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆ āļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ <intent-filter> āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļĢāļđāđ‰āļ§āđˆāļēāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļ‡āļēāļ™āļ„āļ­āļĄāđ‚āļžāđ€āļ™āđ‡āļ™āļ•āđŒāļ•āļąāļ§āđ„āļŦāļ™āļšāđ‰āļēāļ‡ āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻāļ­āļĩāļĨāļĩāđ€āļĄāļ™āļ•āđŒ < a c t i o n > āđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­ android.intent.action.MAIN āđ€āļ›āđ‡āļ™āļāļēāļĢāļšāļ­āļāļ§āđˆāļēāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļģāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļšāļ™āļ­āļļāļ›- āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ„āļ”āđ‰ 2 āļ—āļēāļ‡āļ„āļ·āļ­ āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Emulator āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ Emulator āļāđˆāļ­āļ™āļ­āļ·āđˆāļ™āļœāļđāđ‰āđƒāļŠāđ‰āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Emulator āđ€āļ‚āđ‰āļēāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™ āļĢāļēāļĒāļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļāđˆāļ­āļ™ āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļāļ”āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļˆāļ°āļ›āļĢāļēāļāļāļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđāļŠāļ”āļ‡āļĢāļēāļĒāļŠāļ·āđˆāļ­āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāđ€āļĨāļ·āļ­āļāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļ”āļŠāļ­āļš āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 309 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 310. āļĢāļđāļ›āļ—āļĩāđˆ 6.9 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ Android Emulator āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļœāđˆāļēāļ™ ADB āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĩāļāļ§āļīāļ˜āļĩāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļœāđˆāļēāļ™ ADB āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡ āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ§āļīāļ˜āļĩāļāļēāļĢāļ™āļĩāđ‰āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ„āļ§āļēāļĄāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļ”āļĩāļāļ§āđˆāļē āļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™ Emulator āļĢāļđāļ›āļ—āļĩāđˆ 6.10 āđāļŠāļ”āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Android āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ 310 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 311. āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ ECLIPSE IDE āļĄāļēāļŠāļđāđˆ ANDROID STUDIO āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļ™āļĒāļļāļ„āđāļĢāļāđ†āļˆāļ°āļĄāļĩāļ„āļ§āļēāļĄāļ„āļļāđ‰āļ™āđ€āļ„āļĒāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē Eclipse IDE āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđ€āļ”āļīāļĄāļ—āļĩāđˆāđ€āļ„āļĒāļžāļąāļ’āļ™āļēāļ­āļĒāļđāđˆāļšāļ™ Eclipse IDE āļĄāļēāļŠāļđāđˆ Android Studio IDE āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļĒāđ‰āļēāļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: Export āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄāļˆāļēāļ Eclipse IDE 1. āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđ€āļˆāļ„āđāļĨāļ°āļ­āļąāļžāđ€āļ”āļ• ADT Plugin (āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 22.0 āļŦāļĢāļ·āļ­āļŠāļđāļ‡āļāļ§āđˆāļē) 2. āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File > Export 3. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļ Generate Gradle build les āļ āļēāļĒāđƒāļ™ Android āļˆāļēāļāļ™āļąāđ‰āļ™ āļāļ”āļ›āļļāđˆāļĄ Finish āļĢāļđāļ›āļ—āļĩāđˆ 6.11 āđāļŠāļ”āļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Gradle build les āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: Import āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ‚āđ‰āļēāļŠāļđāđˆ Android Studio 1. āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File > Import Project 2. āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļĨāļ·āļ­āļāđ„āļ›āļĒāļąāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđ‚āļ›āļĢāđ€āļˆāļ„ āđ€āļĨāļ·āļ­āļ build.gradle āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ”āļ›āļļāđˆāļĄ Finish 3. āđƒāļŦāđ‰āđ€āļĨāļ·āļ­āļāļ•āļēāļĄ Dialog āļ—āļĩāđˆāđāļŠāļ”āļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāļ” OK 311 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 312. APACHE ANT āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ Apache Ant āļ„āļ·āļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļŠāļ„āļĢāļīāļ›āļ—āđŒ (Script) āđƒāļ™āļĢāļđāļ›āđāļšāļš XML āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĢāļ°āļšāļļ packages āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ āđ‚āļ›āļĢāđāļāļĢāļĄ ant āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ .APK (Android Package) āđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļš āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ Makele āđāļĨāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ â€œmake” āđƒāļ™āļĢāļ°āļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Ant (http://ant.apache.org) āļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļŠāļ­āļšāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļžāļ·āđ‰āļ™ āļāļēāļ™ (srcantTest.java) āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ package ant; class Test {   public static void main(String args[])   {      System.out.println("Hello World from ANT");    } } āļŠāļ„āļĢāļīāļ›āļ—āđŒāđ„āļŸāļĨāđŒ srcantbuild.xml <project basedir="." default="make">  <property name="root" value="../.." />  <property name="classes" value="${root}/classes" />   <property name="srcroot" value="${root}/src" />  <path id="project.class.path">   <pathelement location="${classes}" />        </path>  <target name="make">    <javac debug="true" srcdir="${srcroot}" includes="ant/**/*.java" destdir="${classes}">   </javac>  </target>  <target name="run" depends="make" description="Run Test">    <java classname="ant.Test" classpathref="project.class.path"  fork="true">   </java>  </target>    <target name="clean" description="clean all classes">   <delete dir="${classes}/ant"/>   </target> </project> <?xml version="1.0" encoding="UTF-8"?> āļ„āļ­āļĄāđ„āļžāļĨāđŒāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļ­āļāļĄāļēāđ€āļ›āđ‡āļ™ .APK C:...srcant>ant make Buildfile: build.xml make: 312 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 313. BUILD SUCCESSFUL Total time: 0 seconds C:...srcant>ant run Buildfile: build.xml make: run:      [java] test ANT BUILD SUCCESSFUL Total time: 0 seconds C:...srcant>ant clean Buildfile: build.xml clean:    [delete] Deleting directory C:...classesant BUILD SUCCESSFUL Total time: 0 seconds āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ (.APK) āļˆāļ°āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ bin āļœāļđāđ‰āđˆāđƒāļŠāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļŸāļĨāđŒ .APK āđ„āļ›āļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđƒāļ™ An- droid Emulator āļŦāļĢāļ·āļ­āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb install <āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ>.apk ANDROID ACTIVITY āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ : āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity) āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity) āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļĄāļēāļāļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļžāļĢāļēāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļœāđˆāļēāļ™ UI āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ UI Activity Service Operating System āļŠāđˆāļ‡ broadcast Intent āļāļēāļĢ Intent āđ‚āļ”āļĒāļ•āļĢāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.12 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđāļ•āđˆāļĨāļ° activity āļˆāļ°āđāļ—āļ™āļŦāļ™āļķāđˆāļ‡āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ‚āļķāđ‰āļ™āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 313 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 314. āļĢāļđāļ›āļ—āļĩāđˆ 6.13 āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ° activity āļ‹āļķāđˆāļ‡āđƒāļ™āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ•āļąāļ§āđāļ•āđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ”āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđ€āļžāļĩāļĒāļ‡āļ•āļąāļ§āđƒāļ”āļ•āļąāļ§ āļŦāļ™āļķāđˆāļ‡āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āđ€āļ›āđ‡āļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŦāļĨāļąāļāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ™āļąāđ‰āļ™ āļ‹āļķāđˆāļ‡āđāļ•āđˆāļĨāļ°āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ° āđ€āļĢāļĩāļĒāļāđƒāļŦāđ‰āļ•āļąāļ§āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ­āļ·āđˆāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđ‚āļ”āļĒāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™āļŠāđāļ•āđ‡āļ (Stack) āļ‚āļ­āļ‡āļĢāļ°āļšāļš āļ•āļēāļĄāļĨāļģāļ”āļąāļšāđ„āļ›āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ Activity Activity Activity Activity āļ—āļĩāđˆāļ—āđāļēāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļē (foreground) (visible āđāļĨāļ° focused) Task (stack of activity) Activity āļ—āļĩāđˆāļ—āđāļēāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ (background) āļĢāļđāļ›āļ—āļĩāđˆ 6.14 āļ‚āļšāļ§āļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āļ­āļ‡ activities āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆ āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļˆāļ°āļĄāļĩ 4 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāđ„āļ”āđ‰āđāļāđˆ 1)Activity 2)Service 3)Intent 4)Broadcast Receiver 314 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 315. āļ•āļēāļĢāļēāļ‡ 6.1 āđāļŠāļ”āļ‡āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ 4 āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļŦāļĨāļąāļāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Android āļ›āļĢāļ°āđ€āļ āļ— āļĨāļąāļāļĐāļ“āļ°āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ Activity āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļš User Interface āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ, āļĢāļđāļ›āļ āļēāļž, āđ€āļĨāđˆāļ™āđ€āļāļĄāļŠāđŒ āļŊāļĨāļŊ Service āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ āđ€āļĨāđˆāļ™āđ€āļžāļĨāļ‡, āļĢāļ°āļšāļšāļ‹āļīāļ‡āļ„āđŒāļ‚āđ‰āļ­āļĄāļđāļĨ Intent Intent āļŠāļ™āļīāļ” Directed Intent āļāļēāļĢāđāļˆāđ‰āļ‡āđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļĢāļ°āļšāļļāđ„āļ§āđ‰ Intent Intent āļŠāļ™āļīāļ” Broadcast Intent āļāļēāļĢāđāļˆāđ‰āļ‡āđāļšāļšāļāļĢāļ°āļˆāļēāļĒāđ„āļ›āļĒāļąāļ‡āļ—āļļāļāđ‚āļ›āļĢāđ€āļ‹āļŠ Intent Intent Filter āļĢāļēāļĒāļāļēāļĢāļ‚āļ­āļ‡ Intents āđƒāļ™ Activity āļŦāļĢāļ·āļ­ Services Broadcast Receiver āļāļēāļĢāļ‚āļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‚āđ‰āļ­āļĄāļđāļĨ GPS, Internet, āļŠāļĄāļļāļ”āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āļŊāļĨāļŊ āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ• (lifecycle) āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ Starting Running Stopped Stopped Destroyed 1. onCreate() 2. onStart() 3. onResume() onPause() onResume() onStop() onDestroy() āļĢāļđāļ›āļ—āļĩāđˆ 6.15 āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ (Activity) 315 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 316. āļŠāđˆāļ§āļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 3 āļŠāđˆāļ§āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļ„āļ·āļ­ 1. Entire Lifetime āļ„āļ·āļ­āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđāļĨāļ°āļāļēāļĢāļ›āļīāļ”āļ•āļąāļ§āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āđƒāļ™āļŠāđˆāļ§āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ„āļ·āļ­ onCreate() āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ–āļđāļāļŠāļąāđˆāļ‡āļ›āļīāļ”āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ„āļ·āļ­ onDestroy() 2. Visible Lifetime āļ„āļ·āļ­āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ‚āļ”āļĒāļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē āđāļĨāđ‰āļ§ āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onStart() āđāļĨāļ°āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āļ™āļąāđ‰āļ™āļ–āļđāļāļŠāļąāđˆāļ‡āļ›āļīāļ”āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāđˆāļ­āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onStop() 3. Foreground Lifetime āļ„āļ·āļ­āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āļāļģāļĨāļąāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļ™āđ‰āļēāđ€āļŠāđˆāļ™ āđ€āļĄāļ·āđˆāļ­āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™ āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļ°āļ–āļđāļāļ”āļąāļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ”āđ‰āļēāļ™āļšāļ™āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onResume() āđāļĨāļ°āļ–āđ‰āļēāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļ™āļąāđ‰āļ™āļāļģāļĨāļąāļ‡āļˆāļ°āļŦāļĒāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§āļŦāļĢāļ·āļ­āļ–āļēāļ§āļĢ āļāđ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onPause() āļŦāļĢāļ·āļ­ onDestroy() āļĢāļđāļ›āļ—āļĩāđˆ 6.16 āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ 316 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 317. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āļˆāļēāļāđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ”āļąāļ‡āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āļ˜āļīāļšāļēāļĒāļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāđƒāļˆāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāļ‚āļķāđ‰āļ™ āđ‚āļ”āļĒāļˆāļ° āļĄāļĩāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ•āļēāļĄ Lifecycle āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ˜āļīāļšāļēāļĒāđāļĨāđ‰āļ§āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ public class ActivityA extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); Log.d("Embedded Debug”, onCreate - Called when the Activity is first created”); } @Override protected void onStart() { Log.d("Embedded Debug”, onStart - Called when the Activity is becoming visible to the User”); super.onStart(); } @Override protected void onRestart() { Log.d("Embedded Debug”, onRestart - Called after your activity has been stopped, prior to it being started again”); super.onRestart(); } @Override protected void onResume() { Log.d("Embedded Debug”, onResume - Called when the Activity will start in- teracting with the User”); super.onResume(); } @Override protected void onPause() { Log.d("Embedded Debug”, onPause - Called when the system is about to start resuming a previous activity”); super.onPause(); } @Override protected void onStop() { Log.d("Embedded Debug”, onStop - Called when the Activity is no longer visi- ble to the User because another activity has been resumed and is covering this one”); super.onStop(); } @Override protected void onDestroy() { 317 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 318. Log.d("Embedded Debug”, onDestroy - the final call you receive before your activity is destroyed”); super.onDestroy(); } public void startActivityB(View v) { Intent intent = new Intent(ActivityA.this, ActivityB.class); startActivity(intent); } public void startActivityC(View v) { Intent intent = new Intent(ActivityA.this, ActivityC.class); startActivity(intent); } public void finishActivityA(View v) { ActivityA.this.finish(); } } āđ„āļŸāļĨāđŒ AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dark_blue" android:padding="8dip" > <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" > <Button android:id="@+id/btn_start_b" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/btn_start_b_label" android:onClick="startActivityB" /> <Button android:id="@+id/btn_start_c" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/btn_start_c_label" 318 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 319. android:layout_toRightOf="@id/btn_start_b" android:onClick="startActivityC" /> <Button android:id="@+id/btn_finish_a" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/btn_finish_a_label" android:layout_toRightOf="@id/btn_start_c" android:onClick="finishActivityA" /> <Button android:id="@+id/btn_start_dialog" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="@string/btn_start_dialog_label" android:layout_toRightOf="@id/btn_finish_a" android:onClick="startDialog" /> </RelativeLayout> </LinearLayout> āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āđ‚āļ”āļĒāļˆāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™ āļ–āļķāļ‡āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ āļˆāļēāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ A āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ›āļĢāđāļāļĢāļĄ āļˆāļ°āļ—āļģāļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļąāļ™āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ A āļ‚āļķāđ‰āļ™āļĄāļē āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāđāļŠāļ”āļ‡ layout āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāđāļšāļšāđ„āļ§āđ‰āļ‹āļķāđˆāļ‡ āļ āļēāļĒāđƒāļ™ layout āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ B āđ€āļĢāļĩāļĒāļāđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰ C āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđāļĨāļ°āļœāļĨāļāļēāļĢāļ—āļģāļāļēāļĢāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ android:onClick="startActivityB" 319 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 320. āļĢāļđāļ›āļ—āļĩāđˆ 6.17 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ USER INTERFACE āđ€āļĄāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļāļēāļĢāļ‚āļ­āļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āđāļĨāđ‰āļ§ āđƒāļ™āļŠāđˆāļ§āļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ­āļ„āļ—āļīāļ§āļīāļ•āļĩāđ‰āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļāđ‡āļĄāļĩāļŠāđˆāļ§āļ™āļŠāļģāļ„āļąāļ āđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāļŸāļīāļāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ—āļąāđˆāļ§āđ„āļ› āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļĢāļĩāļĒāļāļāļąāļ™āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļ§āđˆāļē User Inter- face (UI) āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­ UI āļ‚āļķāđ‰āļ™āļĄāļēāđ„āļ”āđ‰āļ™āļąāđ‰āļ™āļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļĒāļđāđˆāļ•āđˆāļēāļ‡āđ†āļĄāļēāļāļĄāļēāļĒ āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢ āļāđ‡āļ•āļēāļĄāļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļ­āļ‡āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ•āđ‰āļ­āļ‡ āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļē User Experience (UX) āļ„āļ§āļšāļ„āļđāđˆāđ„āļ› āļ”āđ‰āļ§āļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļĻāļķāļāļĐāļēāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļžāļĪāļ•āļīāļāļĢāļĢāļĄāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ„āļŪāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āđ„āļĄāđˆ āļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŦāļ™āđ‰āļēāļˆāļ­āļŠāļąāļĄāļœāļąāļŠāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨ āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļĨāļ°āļāļēāļĢāļžāļąāļ’āļ™āļē āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ„āļ§āļšāļ„āļđāđˆāļāļąāļ™āđ„āļ›āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āļŦāļ™āđˆāļ§āļĒāļ„āđˆāļēāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŦāļ™āđ‰āļēāļˆāļ­āļŠāļąāļĄāļœāļąāļŠāđāļĨāļ°āđāļŠāļ”āļ‡āļœāļĨ āļāļēāļĢāļ­āļ­āļāđāļšāļš āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļ‡āļēāļ™ āđ‚āļ”āļĒāļˆāļ°āļāļĨāđˆāļēāļ§āļ–āļķāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āļŦāļ™āđˆāļ§āļĒāļ„āđˆāļēāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļ āļāļēāļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļĢāļēāļŸāļŸāļīāļ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ„āđˆāļ­āļ™āļ‚āđ‰āļēāļ‡āļĄāļĩāļ›āļąāļāļŦāļē āđƒāļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļžāļ­āļŠāļĄāļ„āļ§āļĢāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ­āļĒāļđāđˆāđ„āļĄāđˆāļ™āđ‰āļ­āļĒ āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ™āļąāđ‰āļ™ āļĄāļĩāļ­āļĒāļđāđˆāļĄāļēāļāļĄāļēāļĒāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āđāļĨāļ°āļĄāļĩāļ„āļ§āļēāļĄāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļ‚āļ­āļ‡āļŠāļąāļ”āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāļˆāļ­āđāļŠāļ”āļ‡āļœāļĨ āđ€āļŠāđˆāļ™āļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­ 480x320, 800x480, 960x540, 1280x720 āļ‹āļķāđˆāļ‡āļˆāļ°āļĄāļĩāļœāļĨāļ•āđˆāļ­āļāļēāļĢāļ­āļ­āļāđāļšāļšāļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢ āļāļģāļŦāļ™āļ”āļ•āļģāđāļŦāļ™āđˆāļ‡āļāļēāļĢāļ§āļēāļ‡āļāļĢāļēāļŸāļŸāļīāļāļŦāļĢāļ·āļ­āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ†āļˆāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āļˆāļļāļ”āļŠāļĩ (Pixel) āđāļšāļšāļ•āļēāļĒāļ•āļąāļ§āđ„āļ”āđ‰ āđ€āļžāļĢāļēāļ°āļŦāļēāļāļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāļˆāļļāļ”āļŠāļĩāļ•āļēāļĒāļ•āļąāļ§āđ€āļĄāļ·āđˆāļ­āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļāđ‡ āļˆāļ°āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļœāļīāļ”āđ€āļžāļĩāđ‰āļĒāļ™āđ„āļ›āļˆāļēāļāđ€āļ”āļīāļĄāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđ„āļ”āđ‰ 320 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 321. āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ—āļēāļ‡āļœāļđāđ‰āļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļķāļ‡āđ„āļ”āđ‰āļ„āļīāļ”āļ„āđ‰āļ™āļŦāļ™āđˆāļ§āļĒāļˆāļļāļ”āļŠāļĩāđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆ āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ€āļāļīāļ”āļ„āļ§āļēāļĄāļ„āļĨāļēāļ”āđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āđ€āļĢāļĩāļĒāļāļŦāļ™āđˆāļ§āļĒāļ™āļĩāđ‰āļ§āđˆāļēāļŦāļ™āđˆāļ§āļĒ â€œdp” (Density Independent Pixel) āļŦāļĢāļ·āļ­āļˆāļļāļ”āļŠāļĩāđ€āļŠāļĄāļ·āļ­āļ™ (Virtual Pixel) āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ‚āļ­āļ‡āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļŠāļĄāļĄāļ•āļīāļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļ­āļīāļ‡āļˆāļēāļāļ„āļ§āļēāļĄ āļĨāļ°āđ€āļ­āļĩāļĒāļ” (Resolution), āļ‚āļ™āļēāļ” (Size) āđāļĨāļ°āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™āļˆāļļāļ”āļŠāļĩ (Pixel) (Density) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒ āļ™āļąāđ‰āļ™āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ„āđˆāļē dp āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (Text) āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļĢāļđāļ›āļ āļēāļžāļŦāļĢāļ·āļ­āļ‚āļ™āļēāļ” āļ‚āļ­āļ‡āļ›āļļāđˆāļĄāļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒāļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļ”āļąāļ‡āļ™āļĩāđ‰ 1 dp = (āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™āļ‚āļ­āļ‡āļˆāļ­) / 160 āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āđāļšāđˆāļ‡āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ›āđ‡āļ™āļŦāļĨāļēāļĒāļ‚āļ™āļēāļ”āđ‚āļ”āļĒāļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŦāļ™āđ‰āļēāļˆāļ­ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 3" 5" 7" 11" 13" 120 160 240 320 480 640 ldpi mdpi hdpi xdpi xxdpi xxxdpi Actual size (inches) Actual density (dpi) small normal large xlarge xxlarge xxxlarge āļĢāļđāļ›āļ—āļĩāđˆ 6.18 āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļĨāļ°āļ„āđˆāļē dpi āļĨāđˆāļēāļŠāļļāļ”āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™ 4.3 āđ„āļ”āđ‰āļ›āļĢāļ°āļāļēāļĻāļ­āļ­āļāļĄāļēāļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ—āļēāļ‡āļāļēāļĢāđāļĨāđ‰āļ§āļ§āđˆāļēāļžāļĢāđ‰āļ­āļĄāļˆāļ° āļĢāļ­āļ‡āļĢāļąāļšāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļĢāļ°āļ”āļąāļš extra extra high dpi (xxhdpi) āļ‚āļ™āļēāļ” 640 dpi āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āđāļĨāļ°āđƒāļ™āļ­āļ™āļēāļ„āļ•āļ­āļąāļ™āđƒāļāļĨāđ‰āļ™āļĩāđ‰āļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļāđ‡āļˆāļ°āđ€āļ—āļĩāļĒāļšāđ€āļ—āđˆāļēāļāļąāļšāļ„āđˆāļēāļ„āļ§āļēāļĄ āļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđ‚āļ—āļĢāļ—āļąāļĻāļ™āđŒāļ—āļĩāđˆ 4K āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™ â€Ē ldpi (low dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āđ„āļĄāđˆāđ€āļāļīāļ™ 120 dpi â€Ē mdpi (medium dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ 120 - 160 dpi āđ€āļŠāđˆāļ™āļĢāļļāđˆāļ™ T-Mobile G1 â€Ē hdpi (high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ āļ•āļąāđ‰āļ‡āđāļ•āđˆ 160 - 240 dpi āđ€āļŠāđˆāļ™āļĢāļļāđˆāļ™Â Nexus S â€Ē xdpi (extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 240 dpi āļ‚āļķāđ‰āļ™āđ„āļ› (320 dpi āļšāļ™āļĢāļļāđˆāļ™Â Galaxy Nexus/N4 āļŦāļĢāļ·āļ­ 480 dpi āļšāļ™āļĢāļļāđˆāļ™ HTC One) 321 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 322. â€Ē xxdpi (extra extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 480 dpi āļ‚āļķāđ‰āļ™āđ„āļ› â€Ē xxxdpi (extra extra extra high dpi) āļ„āļ·āļ­ āļŦāļ™āđ‰āļēāļˆāļ­āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļ™āļēāđāļ™āđˆāļ™ 640 dpi āļ‚āļķāđ‰āļ™āđ„āļ› āļ‹āļķāđˆāļ‡āļ„āđˆāļē dpi (Dot Per Inch) āļŦāļĄāļēāļĒāļ–āļķāļ‡ āļˆāļģāļ™āļ§āļ™āļˆāļļāļ”āļŠāļĩāļ—āļĩāđˆāļĄāļĩāđ„āļ”āđ‰ āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ™āļēāļ” 1 āļ•āļēāļĢāļēāļ‡āļ™āļīāđ‰āļ§ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ”āđ‰āļēāļ™āļ‚āļ§āļē āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļˆāļģāļ™āļ§āļ™āļˆāļļāļ”āđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ™āļēāļ” 1 āļ•āļēāļĢāļēāļ‡āļ™āļīāđ‰āļ§ āļˆāļ°āļĄāļĩāļˆāļļāļ”āļŠāļĩāđ€āļĢāļĩāļĒāļ‡āļāļąāļ™āļ­āļĒāļđāđˆāļˆāļģāļ™āļ§āļ™āļ—āļąāđ‰āļ‡āļŠāļīāđ‰āļ™ 300 x 300 Pixel āļ‹āļķāđˆāļ‡āļ„āđˆāļē dpi āļĒāļīāđˆāļ‡āļŠāļđāļ‡āļāđ‡āļˆāļ°āļĄāļĩāļœāļĨāļ•āđˆāļ­āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļāļĄāļŠāđŒāđƒāļ™āļĨāļąāļāļĐāļ“āļ° FPS āļŦāļĢāļ·āļ­āđ€āļāļĄāļŠāđŒāļĨāļąāļāļĐāļ“āļ° Shooting āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļđāļ•āļĢāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļˆāļēāļāļ„āđˆāļē dpi āļ„āļ·āļ­ dp = pixel * (160 / dpi) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĒāļĩāđˆāļŦāđ‰āļ­ Samsung Galaxy Note 10.1 āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš mdpi āļ‹āļķāđˆāļ‡āđ€āļ—āļĩāļĒāļšāļ„āđˆāļē dpi āđ€āļ—āđˆāļēāļāļąāļš 160 (āļ•āļēāļĄāļĢāļđāļ›āļ—āļĩāđˆ 6.8) āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ™āļĩāđ‰āļĄāļĩāļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļ­āļĒāļđāđˆāļ—āļĩāđˆ 1280 x 800 Pixel āļ„āđˆāļē dp āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ—āđˆāļēāļāļąāļš 1280 * (160 / 160) = 1280 dp 800 * (160 / 160) = 800 dp āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung Galaxy Note 10.1 āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ„āđˆāļēāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš dp āđ€āļ—āđˆāļēāļāļąāļšÂ 1280 x 800 dp  āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āļ™āļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung Nexus 10 āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­āđāļšāļš xhdpi āļ—āļĩāđˆāļ„āđˆāļē dpi āđ€āļ—āđˆāļēāļāļąāļš 320 dpi (āļ•āļēāļĄāļĢāļđāļ› āļ—āļĩāđˆ 6.8) āđāļĨāļ°āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļŦāļ™āđ‰āļēāļˆāļ­āļŠāļđāļ‡āļ–āļķāļ‡ 2560 x 1600 Pixel āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļēāļĄāļĩāļ„āđˆāļēāļŠāļđāļ‡āļāļ§āđˆāļēāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Samsung Galaxy Note 10.1 āđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āļ„āļģāļ™āļ§āļ“āļ„āđˆāļē dp āļˆāļ°āļĄāļĩāļ„āđˆāļēāđ€āļ—āđˆāļēāļāļąāļš 2560 * (160 / 320) = 1280 dp 1600 * (160 / 320) = 800 dp āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļ„āđˆāļē dp āļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡ 2 āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļĩāļ„āđˆāļē 1280 x 800 dp āđ€āļ—āđˆāļēāļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļ„āļ§āļĢāļĒāļķāļ”āļ„āđˆāļē dp āđ€āļ›āđ‡āļ™ āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ§āļēāļ‡āļĢāļđāļ›āđāļšāļšāļāļĢāļēāļŸāļŸāļīāļāļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđ‚āļ”āļĒāļ—āļĩāđˆāļĒāļąāļ‡āļ„āļ‡āđāļŠāļ”āļ‡āđƒāļ™āļŠāļąāļ”āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļĄāļēāļˆāļēāļ: http://www.akexorcist.com/2013/03/android-design-dp.html 322 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē 1 āļ™āļīāđ‰āļ§ 5āļˆāļļāļ”āļŠāļĩ 5 āļˆāļļāļ”āļŠāļĩ 1 āļˆāļļāļ”āļŠāļĩ (pixel) āļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ” āđ€āļ—āđˆāļēāļāļąāļš 5 dpi (5 āļˆāļļāļ”āļŠāļĩāļ•āđˆāļ­ 1 āļ™āļīāđ‰āļ§) āļĢāļđāļ›āļ—āļĩāđˆ 6.19 āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļīāļ”āļ„āđˆāļēāļ„āļ§āļēāļĄāļĨāļ°āđ€āļ­āļĩāļĒāļ” (dpi) āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­
  • 323. View āđāļĨāļ° ViewGroup View āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļ›āđ‡āļ™āļ­āļ‡āļ„āđŒāļ›āļĢāļ°āļāļ­āļšāļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļ‚āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ UI āļ•āđˆāļēāļ‡āđ†āļ āļēāļĒāđƒāļ™ āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ TextView, ImageView, SurfaceView, ViewGroup āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļŠāļģāļŦāļĢāļąāļšāļ„āļĨāļēāļŠ ViewGroup āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļĒāļēāļĒāļ‚āļ­āļ‡ View āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĄāļĩ View āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļ•āļąāļ§āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāđ€āļŠāļ·āđˆāļ­āļĄ āļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡ View āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ ViewGroup View ViewGroup View View āļĢāļđāļ›āļ—āļĩāđˆ 6.20 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ ViewGroup āđāļĨāļ° View Input Controls āļ„āļ·āļ­āļŠāđˆāļ§āļ™āļ§āļąāļ•āļ–āļļ (Object) āļ—āļĩāđˆāđƒāļŠāđ‰āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ‚āļ•āđ‰āļ•āļ­āļšāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰ āļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ›āļļāđˆāļĄ (Button), āļŠāđˆāļ­āļ‡āđƒāļŠāđˆāļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (text elds), āļšāļēāļĢāđŒāļ•āļąāđ‰āļ‡āļ„āđˆāļē (seek bars), āļ›āļļāđˆāļĄāđ€āļĨāļ·āļ­āļ (checkboxes), āļ›āļļāđˆāļĄāļ‚āļĒāļēāļĒ (zoom but- tons), āļ›āļļāđˆāļĄāļāļĨāļąāļšāļ„āđˆāļē (toggle buttons) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļĢāļđāļ›āļ—āļĩāđˆ 6.21 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ Input Controls Layout Containers āļ–āđ‰āļēāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļšāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ JAVA AWT āļŦāļĢāļ·āļ­ JAVA Swing āļ•āļąāļ§ layout āļāđ‡āđ€āļ›āļĢāļĩāļĒāļš āđ€āļŠāļĄāļ·āļ­āļ™ JAVA Containers āļŠāđˆāļ§āļ™ View āļāđ‡āļˆāļ°āđ€āļ›āļĢāļĩāļĒāļšāđ€āļŠāļĄāļ·āļ­āļ™ JAVA Components āļŦāļĢāļ·āļ­ Widgets āļ™āļąāđˆāļ™āđ€āļ­āļ‡ āđ‚āļ”āļĒāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ layout āđāļĨāļ° view āđāļŠāļ”āļ‡āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 323 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 324. Parent Layout Button Another Layout View (aka Widget) TextView EditView āļĢāļđāļ›āļ—āļĩāđˆ 6.22 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Layout āđāļĨāļ° components āļ•āđˆāļēāļ‡āđ† āđ‚āļ”āļĒ layout āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļšāļĢāļĢāļˆāļļ View āđāļĨāļ° layout āļ­āļ·āđˆāļ™āđ†āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰āļŦāļĨāļēāļĒāđ†āļ•āļąāļ§ āđ„āļ”āđ‰āđāļāđˆ 1. RelativeLayout āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāđ€āļĢāļīāđˆāļĄāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ•āļąāļ§āļ§āļąāļ•āļ–āļļ (object) āđ‚āļ”āļĒāļĄāļĩāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļāļ™āļąāđ‰āļ™āļāļąāļšāļ§āļąāļ•āļ–āļļāļ­āļ·āđˆāļ™āļ āļēāļĒāđƒāļ™ layout āļŦāļĢāļ·āļ­āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļāļąāļšāļ•āļąāļ§ layout āļ—āļĩāđˆāļ§āļąāļ•āļ–āļļāļ™āļąāđ‰āļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ āđ‚āļ”āļĒāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļœāđˆāļēāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚ (android:id) āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļ āļŦāļĢāļ·āļ­ layout āļĢāļđāļ›āļ—āļĩāđˆ 6.23 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš RelativeLayout 2. FrameLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđ€āļ›āđ‡āļ™āļŠāļąāđ‰āļ™āđ† āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļēāļāļĄāļļāļĄāļ‹āđ‰āļēāļĒāļšāļ™ (top-left) āļ‚āļ­āļ‡ layout āđ€āļŠāļĄāļ­āđāļĨāļ°āļˆāļ°āļ™āļģāļ§āļąāļ•āļ–āļļāļ—āļĩāđˆāļ§āļēāļ‡āļ—āļĩāļŦāļĨāļąāļ‡āļĄāļēāđ„āļ§āđ‰āļŠāļąāđ‰āļ™āļšāļ™āļŠāļļāļ”āļ‚āļ­āļ‡ layout 324 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 325. āļĢāļđāļ›āļ—āļĩāđˆ 6.24 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš FrameLayout 3. LinearLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āđ€āļĢāļĩāļĒāļ‡āļ§āļąāļ•āļ–āļļāđ€āļ›āđ‡āļ™āđāļ™āļ§āđ€āļŠāđ‰āļ™āļ•āļĢāļ‡ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āđ€āļ›āđ‡āļ™āđāļ™āļ§āļ•āļąāđ‰āļ‡āļŦāļĢāļ·āļ­āđāļ™āļ§āļ™āļ­āļ™ āļāđ‡āđ„āļ”āđ‰ āđ‚āļ”āļĒāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļ™ android:orientation (horizontal/vertical) āļĢāļđāļ›āļ—āļĩāđˆ 6.25 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš LinearLayout āđāļ™āļ§āļ•āļąāđ‰āļ‡ 325 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 326. āļĢāļđāļ›āļ—āļĩāđˆ 6.26 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš LinearLayout āđāļ™āļ§āļ™āļ­āļ™ 4. TableLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāđƒāļ™āđāļšāļšāļ•āļēāļĢāļēāļ‡ āđ‚āļ”āļĒāļ§āļąāļ•āļ–āļļāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļˆāļ°āļ–āļ·āļ­āđ€āļ›āđ‡āļ™ 1 āļ„āļ­āļĨāļąāļĄāļ™āđŒ āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāđāļ–āļ§āđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļžāļīāđˆāļĄ XML tag āļ‚āļ­āļ‡ TableRow āļĢāļđāļ›āļ—āļĩāđˆ 6.27 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš TableLayout āđ„āļĄāđˆāļĄāļĩāđāļ–āļ§ 326 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 327. āļĢāļđāļ›āļ—āļĩāđˆ 6.28 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš TableLayout āļĄāļĩāđāļ–āļ§ 5. AbsoluteLayout āđ€āļ›āđ‡āļ™ layout āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļˆāļąāļ”āļ§āļēāļ‡āļ§āļąāļ•āļ–āļļāļ•āļēāļĄāļ•āļģāđāļŦāļ™āđˆāļ‡āļˆāļĢāļīāļ‡āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­ āđ‚āļ”āļĒāļˆāļ°āļāļģāļŦāļ™āļ” āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļ§āļąāļ•āļ–āļļāđ„āļ”āđ‰āļœāđˆāļēāļ™āļ„āđˆāļē android:layout_x āđāļĨāļ° android:layout_y āļĢāļđāļ›āļ—āļĩāđˆ 6.29 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļš AbsoluteLayout 327 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 328. 6. ListView āđ€āļ›āđ‡āļ™āļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āļšāļ—āļ­āļ”āļˆāļēāļāļ„āļĨāļēāļŠ ViewGroup āļ—āļĩāđˆāļĄāļĩāļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāļĢāļēāļĒāļāļēāļĢ (list) āļ‚āļ­āļ‡āđ„āļ­ āđ€āļ—āđ‡āļĄ (item) āđ‚āļ”āļĒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āđˆāļ­āļ™āļ‚āļķāđ‰āļ™āļĨāļ‡ (Scrolling) āđ€āļžāļ·āđˆāļ­āļ”āļđāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ‚āļ­āļ‡āļĢāļēāļĒāļāļēāļĢāđāļ•āđˆāļĨāļ° āļĢāļēāļĒāļāļēāļĢāļˆāļ°āļ–āļđāļāđāļ—āļĢāļāļĨāļ‡āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļœāđˆāļēāļ™āļ—āļēāļ‡āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒ (Adapter) āļĢāļđāļ›āļ—āļĩāđˆ 6.30 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē ListView 7. GridView āđ€āļ›āđ‡āļ™āļ­āļĩāļāļ„āļĨāļēāļŠāļ—āļĩāđˆāļŠāļ·āļšāļ—āļ­āļ”āļˆāļēāļāļ„āļĨāļēāļŠ ViewGroup āļ—āļĩāđˆāļĄāļĩāļĄāļļāļĄāļĄāļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāļŠāļ­āļ‡āļĄāļīāļ•āļī (āđāļ–āļ§- āļ„āļ­āļĨāļąāļĄāļ™āđŒ) āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļ•āļēāļĢāļēāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢāđ€āļĨāļ·āđˆāļīāļ­āļ™āļ‚āļķāđ‰āļ™āļĨāļ‡āđ€āļžāļ·āđˆāļ­āļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āļĢāļēāļĒāļāļēāļĢāļˆāļ°āļ–āļđāļāđāļ—āļĢāļāļĨāļ‡āļ­āļąāļ•āļī āđ‚āļ™āļĄāļąāļ•āļīāļœāđˆāļēāļ™āļ—āļēāļ‡āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒāđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđāļšāļš ListView āļĢāļđāļ›āļ—āļĩāđˆ 6.31 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē GridView āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Dialog āđāļĨāļ° Alert āļ„āļ·āļ­āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āļ•āļ­āļšāđ‚āļ•āđ‰ (Dialog) āļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļŦāļĢāļ·āļ­āļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļœāļđāđ‰āđƒāļŠāđ‰ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ 328 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 329. āļĢāļđāļ›āļ—āļĩāđˆ 6.32 āđāļŠāļ”āļ‡ Dialog āļžāļ·āđ‰āļ™āļāļēāļ™ āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļ­āļĩāļāđāļšāļšāļŦāļ™āļķāđˆāļ‡āļ„āļ·āļ­āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ°āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļŠāļąāđ‰āļ™āđ†āļŠāļąāđˆāļ§āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļ™āļķāđˆāļ‡ āđƒāļŦāđ‰āļ›āļĢāļēāļāļ āļšāļ™āļŦāļ™āđ‰āļēāļˆāļ­ āđ€āļĢāļĩāļĒāļāļ§āđˆāļē Toast āđāļ•āđˆāļˆāļ°āđ„āļĄāđˆāļĄāļĩāļāļēāļĢāđ‚āļ•āđ‰āļ•āļ­āļšāļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđƒāļ” āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ Toast.makeText(this, “text”, Toast.LENGTH_SHORT).show() āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.33 āđāļŠāļ”āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāđāļšāļš toast ANDROID ADAPTER āļ­āļ°āđāļ”āļ›āđ€āļ•āļ­āļĢāđŒ (Adapter) āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāļ•āļīāļ”āļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ AdapterView āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āđāļŠāļ”āļ‡āđƒāļ™ ListView, GridView, spinner āļŦāļĢāļ·āļ­ Gallery āļ™āļ­āļāļˆāļēāļāļ™āļĩāđ‰ Adapter āļĒāļąāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢ View āļāļąāļšāļŠāļļāļ” āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ—āļĩāđˆ AdapterView āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļēāļ‡āļŠāđˆāļ§āļ™āļ‹āļķāđˆāļ‡āļ–āļđāļāļāļģāļŦāļ™āļ”āđ‚āļ”āļĒ Adapter āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļĄāļĩ āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāļāđāļĨāļ°āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđāļŠāļ”āļ‡āđ„āļ”āđ‰āđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđ€āļ”āļĩāļĒāļ§ 329 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 330. Adapter Adapter ViewDataSource Cursor ArrayList List View Grid View Spinner āļĢāļđāļ›āļ—āļĩāđˆ 6.34 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ Adapter āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Adapter        1.  ArrayAdapter āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ„āđˆāļēāđ€āļ‚āđ‰āļēāđ„āļ›āđāļŠāļ”āļ‡āļšāļ™ listview āđāļĨāļ°āļĨāļšāļ„āđˆāļēāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļāļ”āļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡ list āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_list.xml <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> āļĢāļđāļ›āļ—āļĩāđˆ 6.35 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_list.xml āđ‚āļ„āđ‰āļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_name.xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dp" android:textSize="18sp" /> 330 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 331. āļĢāļđāļ›āļ—āļĩāđˆ 6.36 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ device_name.xml āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ MainActivity.java āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ package com.example.basicarrayadapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { ListView listview; private ArrayAdapter<String> mNewDevicesArrayAdapter; String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2", "Android", "iPhone", "WindowsMobile" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.device_list); listview = (ListView) findViewById(R.id.listview); mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 331 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 332. for (int i = 0; i < values.length; ++i) { mNewDevicesArrayAdapter.add(values[i]); } listview.setAdapter(mNewDevicesArrayAdapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = (String) parent.getItemAtPosition(position); mNewDevicesArrayAdapter.remove(item); mNewDevicesArrayAdapter.notifyDataSetChanged(); } }); } } āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰ ArrayAdapter āļˆāļ°āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ â€Ē  āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ ID āļ‚āļ­āļ‡āļ•āļąāļ§ ListView āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ xml āđ€āļ‚āđ‰āļēāļāļąāļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ â€Ē āļ—āļģāļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡ Layout āļ‚āļ­āļ‡ xml āļ—āļĩāđˆāļˆāļ°āđāļŠāļ”āļ‡āļ„āđˆāļēāđƒāļ™ ListView â€Ē āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĨāļ‡āđƒāļ™ ArrayAdapter â€Ē āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄ ArrayAdapter āđ€āļ‚āđ‰āļēāļāļąāļš listview āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļĢāļđāļ›āļ—āļĩāđˆ 6.37 āđāļŠāļ”āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ 332 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 333. ANDROID INTENT Intent āđ€āļ›āđ‡āļ™āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‹āļķāđˆāļ‡āļˆāļ°āļžāļš āļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ Activity āļ•āļąāļ§āļ­āļ·āđˆāļ™ āđ‚āļ”āļĒāļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš āļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ€āļ›āđ‡āļ™āļŠāđˆāļ­āļ‡āļ—āļēāļ‡āļāļēāļĢāļŠāđˆāļ‡ āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ™āļīāļĒāļĄāđƒāļŠāđ‰āļĄāļēāļāđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.38 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰ intent āđāļĒāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ Activity āđāļ•āđˆāļĨāļ°āļ•āļąāļ§ āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡ Intents Intent āđāļšāđˆāļ‡āđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ—āļŦāļĨāļąāļāļ”āļąāļ‡āļ™āļĩāđ‰ 1. Implicit Intent āđ€āļ›āđ‡āļ™ Intent āļ—āļĩāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđƒāļ™āļ—āļąāļ™āļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āđ€āļ§āđ‡āļšāđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļāļēāļĢāļ„āđ‰āļ™āļŦāļē āļĢāļēāļĒāļŠāļ·āđˆāļ­āļœāļđāđ‰āļ•āļīāļ”āļ•āđˆāļ­āđƒāļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āļāļēāļĢāđ‚āļ—āļĢāļ­āļ­āļ āđāļĨāļ° āđāļœāļ™āļ—āļĩāđˆ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻ Intent āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ Intent i = new Intent(Intent.ACTION_WEB_SEARCH); 2. Explicit Intent āđ€āļ›āđ‡āļ™ intent āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđ€āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ Â  āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļāļēāļĻ Intent āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļ activity āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāđˆāļ™ ActivityTwo.class āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ Intent i = new Intent(this, ActivityTwo.class); 333 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 334. BROADCAST RECEIVER Broadcast receivers āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļˆāļ°āļ—āļģāļ‡āļēāļ™āļāđ‡āļ•āđˆāļ­āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāļŠāļ™āļ­āļ‡āļŦāļĢāļ·āļ­āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ•āļēāļĄāļ—āļĩāđˆ āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļāļģāļŦāļ™āļ”āđ€āļ­āļēāđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāļ”āđ‰āļ§āļĒāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāđāļˆāđ‰āļ‡āļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļĨāļąāļ‡āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđāļĄāđ‰āļˆāļ°āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ›āđāļĨāđ‰āļ§ āļāđ‡āļ•āļēāļĄāļ—āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļŠāđˆāļ™ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļĨāļąāļ‡āļ‚āļąāļšāļĢāļ–āļŦāļĢāļ·āļ­āđ„āļĄāđˆāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢāļĢāļąāļšāļŠāļēāļĒāđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļ„āļ™āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ āđ€āļ‚āđ‰āļēāļĄāļēāļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄāļāđ‡āļ—āļģāļāļēāļĢāļ•āļąāļ”āļŠāļēāļĒāļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ‚āļ—āļĢāļŊāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļąāļ™āļ—āļĩāđāļĨāļ°āļˆāļ°āļ—āļģāļāļēāļĢāļŠāđˆāļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ (SMS) āļāļĨāļąāļšāđ„āļ›āļŦāļēāļ„āļ™ āļ—āļĩāđˆāļāļģāļĨāļąāļ‡āđ‚āļ—āļĢāđ€āļ‚āđ‰āļēāļĄāļēāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļŦāļĢāļ·āļ­āļ­āļĩāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰āļ§āđˆāļēāđ€āļĄāļ·āđˆāļ­āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļšāļđāļ—āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ (AC- TION_BOOT_COMPLETED) āļāđ‡āđƒāļŦāđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđƒāļ™ Broadcast receiver āđƒāļŦāđ‰āļ—āļģāļ‚āļķāđ‰āļ™āļĄāļēāļ—āļąāļ™āļ—āļĩ Android System Broadcast Receiver āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ Intent āđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļ§āđˆāļēāļĄāļĩāļāļēāļĢāļ‚āļ­āđƒāļŠāđ‰ Intent āļĢāļđāļ›āļ—āļĩāđˆ 6.39 āđāļŠāļ”āļ‡āļāļēāļĢāđƒāļŠāđ‰āļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ intent āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Broadcast receivers â€Ēāļ—āļģāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™ AndroidManifest.xml āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ„āļ§āđ‰ āļŦāļĢāļ·āļ­āļŠāļēāļĄāļēāļĢāļ–āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđāļšāļšāļ•āļēāļĄ āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļœāđˆāļēāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Context.registerReceiver() â€Ēāđ€āļ‚āļĩāļĒāļ™āļ„āļĨāļēāļŠāļ‚āļķāđ‰āļ™āļĄāļēāđ‚āļ”āļĒāļŠāļ·āļšāļ—āļ­āļ”āļ•āđˆāļ­āļĄāļēāļˆāļēāļāļ„āļĨāļēāļŠ BroadcastReceiver â€Ēāļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ onReceive() āļŠāļģāļŦāļĢāļąāļšāļāļģāļŦāļ™āļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āđ€āļāļīāļ”āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒ (event) āļ•āļēāļĄāļ—āļĩāđˆāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ„āļ§āđ‰ System broadcasts āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš (system events) āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļāļģāļŦāļ™āļ”āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ„āļ‡āļ—āļĩāđˆāđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™ āļ”āļĢāļ­āļĒāļ”āđŒ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ 334 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 335. āļ•āļēāļĢāļēāļ‡ 6.2 āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļš Event Usage Intent.ACTION_BATTERY_LOW āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ•āđˆāļģ Intent.ACTION_BATTERY_OKAY āļĢāļ°āļ”āļąāļšāđāļšāļ•āđ€āļ•āļ­āļĢāļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ”āļĩ Intent.ACTION_BOOT_COMPLETED āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļšāļđāļ—āđ€āļŠāļĢāđ‡āļˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ Intent.ACTION_DEVICE_STORAGE_LOW āļĢāļ°āļ”āļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ•āđˆāļģ Intent.ACTION_DEVICE_STORAGE_OK āļĢāļ°āļ”āļąāļšāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļ”āļąāļšāļ”āļĩ Intent.ACTION_HEADSET_PLUG āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŦāļđāļŸāļąāļ‡āļ§āđˆāļēāļ•āđˆāļ­āļ­āļĒāļđāđˆāļŦāļĢāļ·āļ­āđ„āļĄāđˆ Intent.ACTION_LOCALE_CHANGED āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ āļēāļĐāļēāļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Intent.ACTION_MY_PACKAGE_REPLACED āļ­āļąāļžāđ€āļ”āļ—āđāļ—āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ”āļīāļĄ Intent.ACTION_PACKAGE_ADDED āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆ Intent.ACTION_POWER_CONNECTED āļ•āđˆāļ­āļŠāļēāļĒāđ„āļŸāđ€āļ‚āđ‰āļēāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ Intent.ACTION_POWER_DISCONNECTED āļ–āļ­āļ”āļŠāļēāļĒāđ„āļŸāļ­āļ­āļāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒ KeyChain.ACTION_STORAGE_CHANGED āđ€āļāļīāļ”āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡ keystore BluetoothDevice.ACTION_ACL_CONNECTED Bluetooth ACL āđ€āļāļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ AudioManager.ACTION_AUDIO_BECOMING_NOISY āđ€āļĨāļ·āļ­āļ audio output āļ—āļĩāđˆāļĄāļĩāļŠāļąāļāļāļēāļ“āļĢāļšāļ§āļ™āļ™āđ‰āļ­āļĒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļŦāļđāļŸāļąāļ‡āđ‚āļ”āļĒāđƒāļŠāđ‰āđ€āļŦāļ•āļļāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļ§āđˆāļē ACTION_HEAD- SET_PLUG āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļŠāļļāļ”āļŦāļđāļŸāļąāļ‡ āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡āļ­āļĒāļđāđˆāļāđ‡āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāđ€āļ›āđ‡āļ™ â€œ1” āļ–āđ‰āļēāđ„āļĄāđˆāļāđ‡āļˆāļ°āļŠāđˆāļ‡ āļ„āđˆāļē “0” āđāļ—āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļšāļĢāļ­āļ”āļ—āđŒāđāļ„āļŠāļ—āđŒ āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđ€āļŠāļĩāļĒāļšāļŦāļđāļŸāļąāļ‡āđ€āļ‚āđ‰āļēāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ // MainActivity.java package com.example.demoeebuubroadcastreceiver; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter intentfilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 335 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 336. MyBroadCast mybroadcast = new MyBroadCast(); registerReceiver(myboradcast,intentfilter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } // MyBroadCast..java package com.example.demoeebuubroadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadCast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { int state = intent.getIntExtra("state", -1); switch (state) { case 0: Toast.makeText(context, "Headset is unplugged", Toast.LENGTH_LONG).show(); break; case 1: Toast.makeText(context, "Headset is plugged", Toast.LENGTH_LONG).show(); break; default: Toast.makeText(context, "Unknow", Toast.LENGTH_LONG).show(); } } } } āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ (āļ”āđ‰āļēāļ™āļ‹āđ‰āļēāļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡ āļ”āđ‰āļēāļ™āļ‚āļ§āļēāļ•āđˆāļ­āļŦāļđāļŸāļąāļ‡) 336 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 337. āļĢāļđāļ›āļ—āļĩāđˆ 6.40 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāđ€āļŠāļĩāļĒāļšāļŦāļđ āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android Native Development Kit āļžāļ·āđ‰āļ™āļāļēāļ™ ANDROID NDK āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļēāļĄāļēāļĢāļ–āđāļĒāļāļ­āļ­āļāđ„āļ”āđ‰āđ€āļ›āđ‡āļ™ 2 āļ›āļĢāļ°āđ€āļ āļ— āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ„āļ”āđ‰āđāļāđˆ â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļēāļĢāđŒāļ§āļīāļ„ (Dalvik applications) āļ„āļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĢāļ§āļĄāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđāļĨāļ° SDK API āļ•āļēāļĄāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļāļēāļĢāļĢāļ§āļĄāđ€āļ­āļēāđ„āļŸāļĨāđŒāļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ† (resource les) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ āđ€āļŠāđˆāļ™ āđ„āļŸāļĨāđŒ XML āđ„āļŸāļĨāđŒāļĢāļđāļ›āļŠāļ™āļīāļ” PNG āļĢāļ§āļĄāđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļˆāļ™āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ APK â€Ēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ NDK (Android NDK applications) āļ‹āļķāđˆāļ‡āļĢāļ§āļĄāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ„āļŸāļĨāđŒ āļ›āļĢāļ°āļāļ­āļšāļ•āđˆāļēāļ‡āđ† (resource les) āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ (āļŦāļĢāļ·āļ­āļ­āļēāļˆāļĄāļĩāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē āđāļ­āļŠāđ€āļ‹āļĄāļšāļĨāļĩāđ‰ (Assembly) āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ (Dynamic linked library) āļ‹āļķāđˆāļ‡āļĄāļĩāļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđ€āļ›āđ‡āļ™ â€œ.so” āđāļĨāđ‰āļ§āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđ‚āļ”āļĒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ•āļēāļĄ āļāļĨāđ„āļāļ‚āļ­āļ‡ JNI (JAVA Native Interface) āđāļĨāļ°āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļāđ‡āļˆāļ°āļ–āļđāļāļĢāļ§āļĄāļāļĨāļēāļĒāļĄāļēāđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ APK 337 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 338. Android NDK Application Dalvik Application Java* Native Library āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē Java āļ—āđāļēāļāļēāļĢ Compile āļ”āđ‰āļ§āļĒāļ„āđāļēāļŠāļąāđˆāļ‡ Javac Compile with Javac Dynamic Library Java Native Library Class Android App Class āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļ āļēāļĐāļē C Head File āļ—āđāļēāļāļēāļĢ Compile āđāļĨāļ° Link āđ‚āļ„āđ‰āļ” C āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ C header āļ”āđ‰āļ§āļĒāļ„āđāļēāļŠāļąāđˆāļ‡ Javah -jni Application File Makele āļĢāļđāļ›āļ—āļĩāđˆ 6.41 āđāļŠāļ”āļ‡āļāļĨāđ„āļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ NDK āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ—āļąāđˆāļ§āđ„āļ› Android NDK āđ€āļ›āđ‡āļ™āļ­āļĩāļāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āđ€āļ āļ— Android NDK āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļē āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļąāđ‰āļ‡āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŦāļĢāļ·āļ­ āļ āļēāļĐāļē Assembly (Native Language) āđāļĨāļ°āļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ‹āļķāđˆāļ‡āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ”āļĒāļĢāļ§āļĄāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āđ€āļŦāļĄāļēāļ°āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ›āļĢāļ°āđ€āļ āļ—āļāļēāļĢāđ€āļ‚āđ‰āļē-āļ–āļ­āļ”āļĢāļŦāļąāļŠāļŠāļąāļāļāļēāļ“āļ§āļīāļ”āļĩāđ‚āļ­ (Video en- coding and decoding) āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļ āļēāļž (Image processing) āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒāļ—āļĩāđˆāļ‹āļąāļš āļ‹āđ‰āļ­āļ™āđāļĨāļ°āļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ„āļģāļ™āļ§āļ“āđ‚āļ”āļĒāļ•āļĢāļ‡āļˆāļēāļāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļŦāļ•āļļāļœāļĨāļŦāļĨāļąāļāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰ āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Native language (C/C++, Assembly) āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™ āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ•āļ­āļšāļŠāļ™āļ­āļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡ āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒāđ„āļ”āđ‰āļ”āļĩāļāļ§āđˆāļēāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡ āđ„āļ”āđ‰āđāļāđˆ â€Ēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (C/C++ āļŦāļĢāļ·āļ­ Assembly) āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāļˆāļ™āļĄāļēāđ€āļ›āđ‡āļ™āļĢāļŦāļąāļŠāđ„āļšāļ™āļēāļĢāļĩ (binary code) āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļ‹āļķāđˆāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļˆāļ°āļ–āļđāļāđāļ›āļĨāđƒāļŦāđ‰āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™ JAVA byte-code āđ‚āļ”āļĒāļ•āļąāļ§ DVM (Dalvik Virtual Machine) āļ–āļķāļ‡āđāļĄāđ‰āļ§āđˆāļē āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļļāđˆāļ™ 2.2 āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļĄāļĩāļāļēāļĢāđ€āļžāļīāđˆāļĄāļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđƒāļŦāđ‰āļāļąāļš JAVA byte-code āļ”āđ‰āļ§āļĒāđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāđāļ›āļĨāļ‡āļšāđ‰āļēāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļŦāļąāļŠāđ„āļšāļ™āļēāļĢāļĩ (binary code) āļ”āđ‰āļ§āļĒ JIT Com- piler (Just-In-Time Compiler) āđāļĨāđ‰āļ§āļāđ‡āļ•āļēāļĄ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāđ‰āļēāļāļ§āđˆāļēāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ C/C++ āļ­āļĒāļđāđˆāļ”āļĩ â€ĒāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒ Android NDK āļˆāļ°āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ– āļžāļīāđ€āļĻāļĐāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡āļ—āļĩāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļšāļēāļ‡āļ•āļąāļ§ āļ‹āļķāđˆāļ‡āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Android SDK āđ„āļ”āđ‰ 338 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 339. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļ•āļąāļ§ NEON āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļĢāđˆāļ§āļĄāļ‚āļ­āļ‡ ARM CPU āđ€āļ›āđ‡āļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļšāļš SIMD (Single Instruction Multiple Data) āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļĒāļ­āļĄāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āđāļšāļšāļ‚āļ™āļēāļ™ (Parallel processing) āļ‹āļķāđˆāļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ•āļąāļ§āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āđ€āļŠāđˆāļ™ āļāļēāļĢāļ—āļģ Video encoding/decoding āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļ”āđ‰āļēāļ™āļāļĢāļēāļŸāļŸāļīāļāļ—āļąāđ‰āļ‡āđāļšāļšāļŠāļ­āļ‡āļĄāļīāļ•āļīāđāļĨāļ°āļŠāļēāļĄāļĄāļīāļ•āļī āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāļąāļāļāļēāļ“āđ€āļŠāļĩāļĒāļ‡āļžāļđāļ” āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āđ„āļŸāļĨāđŒ Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := neon_utils LOCAL_SRC_FILES := neon_add.c LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7 include $(BUILD_STATIC_LIBRARY) NDK_PATH:=$(call my-dir)/../.. include $(CLEAR_VARS) LOCAL_MODULE := test_conditional_load LOCAL_C_INCLUDES := $(NDK_PATH)/sources/cpufeatures LOCAL_SRC_FILES := main.c LOCAL_STATIC_LIBRARIES := neon_utils cpufeatures include $(BUILD_EXECUTABLE) include $(NDK_PATH)/sources/cpufeatures/Android.mk āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ main.c #include <stdio.h> #include <cpu-features.h> int main() { int32_t int32_4[] = {2,3,4,5}; if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) 339 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 340. { neon_add(int32_4); printf("NEON supportedn"); } else { printf("NEON Not Supportedn"); } printf("values = %d, %d, %d, %dn", int32_4[0], int32_4[1], int32_4[2], int32_4[3]); return 0; } āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļŸāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ neon_add.c #include <arm_neon.h> void neon_add(int32_t * ptr) { int32x4_t vin = vld1q_s32(ptr); int32x4_t vout = vaddq_s32(vin, vin); vst1q_s32(ptr, vout); } āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ™āļģāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native āļĄāļēāđƒāļŠāđ‰āđƒāļŦāļĄāđˆ (Code Reusability) āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļšāļšāđ€āļ›āļīāļ” (Open source) āđāļĨāļ°āđ„āļĨāļšāļĢāļēāļĢāļĩāļ•āđˆāļēāļ‡āđ† āļ‹āļķāđˆāļ‡āļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļ‹āļķāđˆāļ‡āļ–āļđāļāđƒāļŠāđ‰āļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđƒāļ™āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ­āļ·āđˆāļ™ āļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļžāļĩāļĒāļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ‚āđ‰āļ­ āļ•āļāļĨāļ‡āļ—āļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļāđ‡āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ€āļŠāđˆāļ™ āđ„āļĨāļšāļĢāļēāļĢāļĩ zlib āļ—āļĩāđˆāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļšāļĩāļšāļ­āļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­ āđ„āļĨāļšāļĢāļēāļĢāļĩ OpenMAX āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļŠāļģāļŦāļĢāļąāļšāđ€āļĨāđˆāļ™āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒāļ§āļīāļ”āļĩāđ‚āļ­āļŦāļĢāļ·āļ­āđ„āļŸāļĨāđŒāđ€āļŠāļĩāļĒāļ‡ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ANDROID NDK āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Android NDK āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Android NDK āđ€āļ§āļ­āļĢāđŒāļŠāļąāļ™āļĨāđˆāļēāļŠāļļāļ”āđ„āļ”āđ‰āļˆāļēāļ Android NDK āđāļĨāļ°āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļēāļĄāļ„āļģāđāļ™āļ°āļ™āļģāļˆāļēāļāđ€āļ§āđŠāļ›āđ„āļ‹āļ•āđŒ āļ—āļĩāđˆāļ‚āļķāđ‰āļ™āļ­āļĒāļđāđˆāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāđƒāļŠāđ‰āļ‡āļēāļ™āļ­āļĒāļđāđˆ āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļī āļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŦāļĨāļąāļ‡āļˆāļēāļāđāļ•āļāđ„āļŸāļĨāđŒāđāļĨāđ‰āļ§āđƒāļŦāđ‰āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ Android NDK āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ›āļĢāļĢāļ°āļšāļš āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ ~/.bashrc āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ $ cat ~/.bashrc 340 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 341. ... export USE_CCACHE=0 export CCACHE_DIR=~/ccache export JAVA_HOME=/usr/lib/jvm/jdk export ANT_HOME=~/android/ant export ANDROID_SDK_HOME=~/android/sdk export ANDROID_NDK_HOME=~/android/ndk export AOSP_HOME=~/aosp export PATH=$HOME/bin:$JAVA_HOME/bin:$ANT_HOME/bin:$ANDROID_SDK_HOME/tools:$ANDROID_ SDK_HOME/platform-tools:$ANDROID_NDK_HOME:$PATH āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ†āļ„āļ·āļ­ 1.āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ”āđ‰āļ§āļĒāļ āļēāļĐāļē C/C++ āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ (Dynamic link library) 2.āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ”āđ‰āļ§āļĒāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ Android NDK āļĢāļļāđˆāļ™ r7b āđāļĨāļ° GNU make āļĢāļļāđˆāļ™ 3.81 āļ”āļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ ls -al ~/android-ndk-r7b/ total 320 drwxr-xr-x@ 19 sriborrirux staff 646 Mar 17 2012 . drwxr-xr-x+ 94 sriborrirux staff 3196 Oct 6 02:12 .. -rw-r--r--@ 1 sriborrirux staff 6148 Mar 17 2012 .DS_Store -rw-r-----@ 1 sriborrirux staff 1306 Dec 19 2011 GNUmakefile -rw-r-----@ 1 sriborrirux staff 1360 Dec 19 2011 README.TXT -rw-r--r--@ 1 sriborrirux staff 4 Jan 25 2012 RELEASE.TXT drwxr-xr-x@ 6 sriborrirux staff 204 Jan 25 2012 build drwxr-xr-x@ 29 sriborrirux staff 986 Jan 25 2012 docs -rw-r-----@ 1 sriborrirux staff 201 Dec 19 2011 documentation.html -rwxr-x---@ 1 sriborrirux staff 2985 Dec 19 2011 ndk-build -rw-r-----@ 1 sriborrirux staff 279 Dec 19 2011 ndk-build.cmd -rwxr-x---@ 1 sriborrirux staff 21832 Dec 19 2011 ndk-gdb -rwxr-xr-x@ 1 sriborrirux staff 103928 Jan 25 2012 ndk-stack drwxr-x---@ 8 sriborrirux staff 272 Jan 25 2012 platforms drwxr-xr-x@ 3 sriborrirux staff 102 Jan 25 2012 prebuilt drwxr-x---@ 17 sriborrirux staff 578 Oct 6 02:09 samples drwxr-xr-x@ 5 sriborrirux staff 170 Dec 18 2010 sources drwxr-xr-x@ 10 sriborrirux staff 340 Jan 25 2012 tests drwxr-xr-x@ 4 sriborrirux staff 136 Jan 25 2012 toolchains $ ndk-build --version GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i386-apple-darwin11.3.0 341 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 342. āļŠāđˆāļ§āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2 āļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļ—āļĩāđˆāļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨ āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļĄāļēāļˆāļēāļ InteliJ IDEA āđ€āļžāļ·āđˆāļ­āļĄāļēāđāļ—āļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE (āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ” āļ•āļąāđ‰āļ‡ Android ADT Plugin āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ) āļ‹āļķāđˆāļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļāđ‡āđ„āļ”āđ‰āļĢāļ§āļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢ āļžāļąāļ’āļ™āļēāđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļąāļ”āļāļēāļĢāļ•āđˆāļēāļ‡āđ†āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ§āđ‰āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.42 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡ Android SDK Manager āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļˆāļ°āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē āđ‚āļ›āļĢāđāļāļĢāļĄ Android NDK āđ„āļ”āđ‰āļ›āļĢāļ°āļĄāļēāļ“āļ•āđ‰āļ™āļ›āļĩ āļž.āļĻ. 2557 āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™āđ„āļ› āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰ āļˆāļ°āđ€āļ›āđ‡āļ™ 342 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 343. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āļ—āļģāđƒāļ™āļŠāđˆāļ§āļ‡āļ›āļĨāļēāļĒāļ›āļĩ āļž.āļĻ. 2556 āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļšāļ™ Android Studio āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ native C/C++ āđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ HELLO WORLD āļ”āđ‰āļ§āļĒ ANDROID NDK āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ„āļ”āđ‰āļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/android-ndk-r7b/samples/ $ ls -al total 0 drwxr-x---@ 17 sriborrirux staff 578 Oct 6 02:09 . drwxr-xr-x@ 19 sriborrirux staff 646 Mar 17 2012 .. drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 bitmap-plasma drwxr-x---@ 7 sriborrirux staff 238 Jan 25 2012 hello-gl2 drwxr-x---@ 10 sriborrirux staff 340 Oct 5 21:26 hello-jni drwxr-x---@ 8 sriborrirux staff 272 Jul 14 2011 hello-neon drwxr-x---@ 4 sriborrirux staff 136 Jul 14 2011 module-exports drwxr-x---@ 6 sriborrirux staff 204 Jan 25 2012 native-activity drwxr-x---@ 8 sriborrirux staff 272 Oct 1 2011 native-audio drwxr-x---@ 10 sriborrirux staff 340 Nov 3 2011 native-media drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 native-plasma drwxr-x---@ 7 sriborrirux staff 238 Oct 1 2011 san-angeles drwxr-x---@ 3 sriborrirux staff 102 Dec 18 2010 test-libstdc++ drwxr-x---@ 8 sriborrirux staff 272 Jul 14 2011 two-libs āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļŦāļĒāļīāļšāļĒāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello-jni āļĄāļēāļ›āļĢāļąāļšāđƒāļŠāđ‰āļāļąāļšāđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđ‚āļ”āļĒ āđƒāļŦāđ‰āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ hello-jni.c $ cd samples/hello-jni/ $ ls AndroidManifest.xml default.properties jni res src tests $ cd jni/ āđ€āļ›āļīāļ”āđ„āļŸāļĨāđŒ hello-jni.c āđ€āļžāļ·āđˆāļ­āđāļāđ‰āđ„āļ‚āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļŦāļĄāđˆāļˆāļēāļ Java_com_example_hellojni_HelloJni_stringFromJNI āđ€āļ›āđ‡āļ™ Java_com_example_hellondk_MainActivity_stringFromJNI $ vim hello-jni.c #include <string.h> #include <jni.h> Java_com_example_hellondk_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz ) { 343 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 344. return (*env)->NewStringUTF(env, "Hello from JNI !"); } āļ—āļģāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ ndk-build $ ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so $ cd .. āđ€āļĄāļ·āđˆāļ­āļ–āļ­āļĒāļ­āļ­āļāļĄāļēāļˆāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ jni/ āļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđƒāļŦāļĄāđˆāļˆāļēāļāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļŠāļ·āđˆāļ­ libs āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™ āļ„āļģāļŠāļąāđˆāļ‡ ls āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ ls AndroidManifest.xml! res default.properties libs! src jni! obj! tests āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļˆāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļˆāļēāļāļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Eclipse IDE āļ„āļ·āļ­āļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāļ›āļĢāļąāļšāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļšāļēāļ‡ āļ­āļĒāđˆāļēāļ‡āļžāļīāđ€āļĻāļĐ āđ„āļ”āđ‰āđāļāđˆ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāđƒāļ™āļĢāļđāļ›āđāļšāļš .jar āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™ .so āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Android Studio āļ­āđ‰āļēāļ‡āļ­āļīāļ‡ āļœāđˆāļēāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđ„āļ”āđ‰ āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩāļˆāļ°āļĄāļĩ 5 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļĒāđˆāļ­āļĒāļ”āļąāļ‡āļ™āļĩāđ‰ $ mv libs lib <---- 1. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ lib $ zip -r native-libs.zip lib/ <---- 2. āļ—āļģāļāļēāļĢāđāļžāđ‡āļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ lib āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđ„āļĨāļšāļēāļĢāļĩ adding: lib/ (stored 0%) adding: lib/armeabi/ (stored 0%) adding: lib/armeabi/gdb.setup (deflated 54%) adding: lib/armeabi/gdbserver (deflated 39%) adding: lib/armeabi/libhello-jni.so (deflated 48%) (reverse-i-search)`mv': mv libs lib $ mv native-libs.zip native-libs.jar <---- 3. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āļ™āļēāļĄāļŠāļāļļāļĨāđ„āļŸāļĨāđŒāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ .jar $ ls AndroidManifest.xml! lib! res default.properties! src jni! obj! tests native-libs.jar $ mv lib libs <---- 4. āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ·āđˆāļ­āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļāļĨāļąāļšāļĄāļēāđ€āļ›āđ‡āļ™ libs āđ€āļŠāđˆāļ™āđ€āļ”āļīāļĄ $ mv native-libs.jar libs/ <---- 5. āļĒāđ‰āļēāļĒāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāļāļĨāļąāļšāđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ hello-jni āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ– āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 344 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 345. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ Android Studio āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application name āļ§āđˆāļē “HelloNDK” āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.hellondk” āļĢāļđāļ›āļ—āļĩāđˆ 6.43 āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ NDK āđ€āļĨāļ·āļ­āļāļŠāļ™āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ›āđ‡āļ™ Blank Activity āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Activity āļ§āđˆāļē “MainActivity” āļĢāļđāļ›āļ—āļĩāđˆ 6.44 āļāļģāļŦāļ™āļ” template āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Activity 345 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 346. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ™āļģāđ€āļ‚āđ‰āļēāđ„āļĨāļšāļĢāļēāļĢāļĩ hello-jni āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļĄāļēāļŠāđŒāļĨāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs/ āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ ~/android-ndk-r7b/ samples/hello-jni/ āđāļĨāđ‰āļ§āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāđƒāļ•āđ‰ src/main āļĢāļđāļ›āļ—āļĩāđˆ 6.45 āļāļēāļĢāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3: āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ build.gradle āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļˆāļ°āļ›āļĢāļēāļāļāđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē build.gradle āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāļ—āļĩāđˆāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļ­āļĄ āđ„āļžāļĨāđŒ āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ task nativeLibsToJar, tasks.withType (Compile) āđāļĨāļ° dependencies āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđƒāļŦāđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android' repositories { mavenCentral() } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 7 346 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 347. targetSdkVersion 16 } } task nativeLibsToJar( type: Zip, description: 'create a jar archive of the native libs') { destinationDir file("src/main/libs/native-libs") baseName 'native-libs' extension 'jar' from fileTree(dir: 'src/main/libs', include: '**/*.so') into 'lib/' } tasks.withType (Compile) { compileTask -> compileTask.dependsOn (nativeLibsToJar) } dependencies { compile fileTree(dir: "src/main/libs/native-libs", include: 'native-libs.jar') } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4: āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ MainActivity.java āđāļĨāļ°āđ„āļŸāļĨāđŒ activity_main.xml āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ // MainActivity.java package com.example.hellondk; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); tv =(TextView)findViewById(R.id.hello); tv.setText(stringFromJNI()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } 347 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 348. public native String stringFromJNI(); static { System.loadLibrary("hello-jni"); } } āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ activity_main.xml āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ android:id="@+id/text" āđāļĨāļ° android:textSize="40dp" android:text="No Message..." āļĢāļđāļ›āļ—āļĩāđˆ 6.46 āđāļŠāļ”āļ‡āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ activity_main.xml // activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40dp" android:text="No Message..."/> </RelativeLayout> āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5: āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Android Virtual Device āđāļĨāļ°āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ HelloNDK āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ 348 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 349. āļĢāļđāļ›āļ—āļĩāđˆ 6.47 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļē JAVA NATIVE INTERFACE (JNI) Java Native Interface āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļĒāđˆāļ­āđ†āļ§āđˆāļē JNI āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē JDK (Java Software Development Kit) āļ‹āļķāđˆāļ‡ JNI āļ™āļĩāđ‰āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native (C/ C++) āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āļŦāļĢāļ·āļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆ āļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļŦāļĢāļ·āļ­āđāļĄāđ‰āđāļ•āđˆāļ āļēāļĐāļēāļ­āļ·āđˆāļ™āđ†āđ„āļ”āđ‰ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ­āļ·āđˆāļ™āļāđ‡āļĒāļąāļ‡ āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļēāđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāļœāđˆāļēāļ™ Invocation API āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ JVM (Java virtual machine) āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA (JAVA Code) āļāđ‡āļˆāļ°āļ–āļđāļāļĢāļąāļ™āļšāļ™ Dalvik āļ‹āļķāđˆāļ‡ āđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ€āļŠāļĄāļ·āļ­āļ™ (Virtual Machine) āļ„āļĨāđ‰āļēāļĒāļāļąāļš (āđāļ•āđˆāđ„āļĄāđˆāđ€āļŦāļĄāļ·āļ­āļ™) JVM āļ‚āļ­āļ‡āļšāļĢāļīāļĐāļąāļ— Oracle āđāļ•āđˆāļ•āļąāļ§ Dalvik āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ‚āļ”āļĒāļ™āļąāļāļžāļąāļ’āļ™āļēāļ‚āļ­āļ‡āļāļđāđ€āļāļīāļĨāđ€āļ­āļ‡ āđƒāļ™āļ‚āļ“āļ°āļ—āļĩāđˆāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native (Native Code) āļˆāļ°āļ–āļđāļāļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļ›āđ‡āļ™āđ‚āļ„āđ‰āļ”āđ„āļšāļ™āļēāļĢāļĩ āļ‹āļķāđˆāļ‡āļžāļĢāđ‰āļ­āļĄāļ–āļđāļāđ€āļĢāļĩāļĒāļāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđƒāļ™āļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ JNI āļˆāļķāļ‡āļ—āļģāļ•āļąāļ§āđ€āļ­āļ‡ āđ€āļŦāļĄāļ·āļ­āļ™āļŠāļ°āļžāļēāļ™āđ€āļŠāļ·āđˆāļ­āļĄāļāļąāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļĨāļāļŠāļ­āļ‡āđ‚āļĨāļāļ™āļĩāđ‰ āļ”āļąāļ‡āļĢāļđāļ›āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡ JAVA code, Dalvik VM, native code, āđāļĨāļ° āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ JAVA Code Android System Dalvik VM JNI Native Code āļĢāļđāļ›āļ—āļĩāđˆ 6.48 āđāļŠāļ”āļ‡āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Java āđāļĨāļ° Native C 349 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 350. āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™āļ—āļąāđ‰āļ‡ Dalvik VM āđāļĨāļ° Native Code āļ•āđˆāļēāļ‡āļāđ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļąāļ™ (execution environ- ment) āđāļĨāļ°āļˆāļ°āđ€āļŦāđ‡āļ™āļ§āđˆāļē JNI āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļ­āļĒāļđāđˆāđƒāļ™ Dalvik VM āļ‹āļķāđˆāļ‡āļˆāļ°āļ­āļģāļ™āļ§āļĒāļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļŦāđ‰ Native Code āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ•āļąāļ§āđāļ›āļĢāļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ (Data elds) āđāļĨāļ°āļŠāļĄāļēāļŠāļīāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āļ„āļĨāļēāļŠ (Member func- tions) āđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (Access Permissions) āļ„āļĨāļēāļŠāļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ” JAVA āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ JAVA āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄ native (C/C++) āļ™āļąāđ‰āļ™āļˆāļķāļ‡āđ€āļ›āđ‡āļ™ āļ›āļĢāļ°āđ€āļ”āđ‡āļ™āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆ āļ‹āļķāđˆāļ‡āđƒāļ™ JNI āļ™āļąāđ‰āļ™āļāđ‡āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļ­āļ‡āļĢāļąāļš āļ•āļąāļ§āđāļ›āļĢāļĄāļēāļ•āļĢāļēāļāļēāļ™āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ āļēāļĐāļē āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 6.3 āđāļŠāļ”āļ‡āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāđƒāļ™āļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļ—āļĩāļĒāļšāļāļąāļšāļ•āļąāļ§āđāļ›āļĢāđƒāļ™ JNI J A V A T Y P E J N I J AVA A R R A Y T Y P E J N I byte jbyte byte[] jbyteArray short jshort short[] jshortArray int jint int[] jintArray long jlong long[] jlongArray oat joat oat[] joatArray double jdouble double[] jdoubleArray char jchar char[] jcharArray boolean jboolean boolean[] jbooleanArray void jvoid Object[] jobjectArray Object jobject Class jclass String jstring array jarray Throwable jthrowable āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™ JNI āļĒāļąāļ‡āļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē (denition) āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļ°āļ”āļ§āļāđƒāļ™āļāļēāļĢ āđƒāļŠāđ‰āļ‡āļēāļ™ āđ€āļŠāđˆāļ™ #define JNI_FALSE 0 #define JNI_TRUE 1 typedef jint jsize; 350 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 351. āđ€āļĄāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ native āļˆāļ°āļĄāļĩāļ‚āļšāļ§āļ™āļāļēāļĢāļŦāļ™āļķāđˆāļ‡āļ—āļĩāđˆāļŠāļģāļ„āļąāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđ„āļ›āļāļ§āđˆāļēāļāļąāļ™ āļ„āļ·āļ­āļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ native āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (Native Method Registration) āļ‹āļķāđˆāļ‡āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› JNI āđ€āļ­āļ‡āļˆāļ°āļŠāļēāļĄāļēāļĢāļ– āļ„āđ‰āļ™āļŦāļēāļŠāļģāļĢāļ§āļˆāļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ HelloNDK āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāļ™āļĩāđ‰ āđāļ•āđˆāļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļĄāļĩāļĢāļ°āļšāļšāđāļĨāļ°āļ—āļģāđƒāļŦāđ‰ JNI āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđ€āļŠāļĩāļĒāđ€āļ§āļĨāļēāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļŠāļģāļĢāļ§āļˆāļŠāļ·āđˆāļ­ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āļāđˆāļ­āļ™āļˆāļ°āđ€āļĢāļīāđˆāļĄāļ—āļģāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āđ‚āļ”āļĒāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ āļēāļĒāđƒāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļŦāđ‰āļāļąāļš JNI āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™ Dalvik VM āđ‚āļ”āļĒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡ JNI āļŠāļ·āđˆāļ­ RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods); āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ ... JNINativeMethod nm[2]; nm[0].name = "NativePlus"; nm[0].signature = "(II)I"; nm[0].fnPtr = NativePlus; nm[1].name = "NativeMultiply"; nm[1].signature = "(II)I"; nm[1].fnPtr = NativeMultiply; jclass cls = (*env)->FindClass(env, "com/example/NativeApp/Activity"); // Register methods with env->RegisterNatives. (*env)->RegisterNatives(env, cls, nm, 2); āļ­āļēāļĢāđŒāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ cls (clazz) āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ RegisterNatives(..) āļˆāļ°āļ–āļđāļāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āđ„āļ›āļĒāļąāļ‡āļ„āļĨāļēāļŠāļ—āļĩāđˆāđ€āļāđ‡āļš āļĢāļēāļĒāļāļēāļĢāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ—āļĩāđˆāđ„āļ”āđ‰āļ–āļđāļāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđāļĨāđ‰āļ§ āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ (data struc- ture) nm (JNINativeMethod) āļˆāļ°āđ€āļāđ‡āļšāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ native āļ—āļĩāđˆāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™ āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ”āļąāļ‡āļ™āļĩāđ‰ typedef struct { char *name; <--- āļŠāļ·āđˆāļ­āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (method name) char *signature; <--- āļ•āļąāļ§āļ­āļ˜āļīāļšāļēāļĒāļ„āļļāļ“āļĨāļąāļāļĐāļ“āļ°āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (descriptor) void *fnPtr; <--- āļ•āļąāļ§āļŠāļĩāđ‰āđ„āļŸāļĨāđŒāļĒāļąāļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (function pointer) } JNINativeMethod; āļĢāļđāļ›āđāļšāļšāļ—āļąāđˆāļ§āđ„āļ›āļ‚āļ­āļ‡āļāļēāļĢāļāļģāļŦāļ™āļ” method signature āļ„āļ·āļ­ method-name(argument-types)return-type JVM āļˆāļ°āđƒāļŠāđ‰āļ­āļąāļāļ‚āļĢāļ°āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāđƒāļ™āļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļ•āļēāļĢāļēāļ‡ 6.4 āļ­āļąāļāļ‚āļĢāļ°āđ€āļžāļ·āđˆāļ­āđāļ—āļ™āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāđƒāļŦāđ‰āļāļąāļšāļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ āļēāļĐāļēāļˆāļēāļ§āļē 351 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 352. JVM SIGNATURE JAVA TYPE Z boolean B byte C char S short I int J long F float D double V void Lclass āļŠāļ·āđˆāļ­āļ„āļĨāļēāļŠ [type āļŠāļ™āļīāļ”āļ•āļąāļ§āđāļ›āļĢ (arg-type)ret-type āļŠāļ™āļīāļ”āļ•āļąāļ§āđāļ›āļĢāļ‚āļ­āļ‡āļ­āļēāļāļīāļ§āđ€āļĄāđ‰āļ™āļ•āđŒ āđāļĨāļ°āļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļāļĨāļąāļš āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ SIGNATURE void fun1() fun1()V int fun2(int n, long l) fun2(IJ)I long fun3(int n, String s, int[] arr) fun3(ILjava/lang/String;[I)J boolean fun4(int[] arr) fun4([I)Z double fun5(String s, int n) fun5(Ljava/lang/String;I)D void fun6(int n, String[] arr, char c) fun6(I[Ljava/lang/String;C)V long fun7(int n, String s, int[] arr) fun7(ILjava/lang/String;[I)J āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ JNI METHODS āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native (C/C++) āđ‚āļ”āļĒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļĨāļ‡āļ—āļ°āđ€āļšāļĩāļĒāļ™āđ„āļ›āļĒāļąāļ‡ Dalvik VM āļ”āđ‰āļ§āļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ RegisterNatives āļ‚āļ­āļ‡ JNI āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĐāļēāļˆāļēāļ§āļē āļšāļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āļąāļ‡āļ™āļĩāđ‰ 352 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 353. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ NativeCalculation āđāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāļŠāļ·āđˆāļ­ jni/ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ (.c, .h) āđāļĨāļ° Android.mk āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ mkdir NativeCalculation $ mkdir NativeCalculation/jni $ cd NativeCalculation/jni $ vim Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NativeCalculation LOCAL_SRC_FILES := NativeCalculation.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) $ vim NativeCalculation.h #include <jni.h> #ifndef _Included_foo_Sqrt #define _Included_foo_Sqrt #ifdef __cplusplus extern "C" { #endif #undef foo_Sqrt_EPSILON #define foo_Sqrt_EPSILON 0.05 #ifdef __cplusplus } #endif #endif $ vim NativeCalculation.c #include <jni.h> #include <android/log.h> #include <stdio.h> #include <stdlib.h> #include "NativeCalculation.h" jint NativePlus(JNIEnv *pEnv, jobject pObj, jint pa, jint pb) { return pa+pb; } jint NativeMultiply(JNIEnv *pEnv, jobject pObj, jint pa, jint pb) { return pa*pb; } jdouble NativeSqrt(JNIEnv *pEnv, jobject pObj, jdouble pa) { jdouble x0 = 10.0, x1 = pa, diff; do { 353 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 354. x1 = x0 - (((x0 * x0) - pa) / (x0 * 2)); diff = x1 - x0; x0 = x1; } while (labs(diff) > 0.05); return x1; } jdoubleArray NativeArraySumAndAverage(JNIEnv *pEnv, jobject pObj, jintArray rets) { jboolean isCopy; // Convert rets to C's jint[] jint *intArr = (*pEnv)->GetIntArrayElements(pEnv, rets, &isCopy); __android_log_print(ANDROID_LOG_INFO, "NativeArraySumAndAverage", "a new copy is created: %d", isCopy); if (NULL == intArr) return NULL; jsize len = (*pEnv)->GetArrayLength(pEnv, rets); int i; jint sum = 0; jdouble average = 0.0; for (i = 0; i < len; ++i) { __android_log_print(ANDROID_LOG_INFO, "NativeArraySumAndAverage of ", "%d = %d", i, intArr[i]); sum += intArr[i]; } average = (jdouble)sum / len; (*pEnv)->ReleaseIntArrayElements(pEnv, rets, intArr, 0); jdouble outCArray[] = {sum, average}; // Convert the C's Native jdouble[] to JNI jdoublearray, and then return // allocate array[2] jdoubleArray returnJNIArray = (*pEnv)->NewDoubleArray(pEnv, 2); if (NULL == returnJNIArray) return NULL; // copy outCArray to returnJNIArray (*pEnv)->SetDoubleArrayRegion(pEnv, returnJNIArray, 0 , 2, outCArray); return returnJNIArray; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved) { JNIEnv* env; if ((*pVm)->GetEnv(pVm, (void **)&env, JNI_VERSION_1_6)) { return -1; } JNINativeMethod nm[4]; nm[0].name = "NativePlus"; nm[0].signature = "(II)I"; 354 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 355. nm[0].fnPtr = NativePlus; nm[1].name = "NativeMultiply"; nm[1].signature = "(II)I"; nm[1].fnPtr = NativeMultiply; nm[2].name = "NativeSqrt"; nm[2].signature = "(D)D"; nm[2].fnPtr = NativeSqrt; nm[3].name = "NativeArraySumAndAverage"; nm[3].signature = "([I)[D"; nm[3].fnPtr = NativeArraySumAndAverage; jclass cls = (*env)->FindClass(env, "com/example/NativeCalculation/ MainActivity"); // Register methods with env->RegisterNatives. (*env)->RegisterNatives(env, cls, nm, 4); return JNI_VERSION_1_6; } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio $ ndk-build Compile thumb : NativeCalculation <= NativeCalculation.c SharedLibrary : libNativeCalculation.so Install : libNativeCalculation.so => libs/armeabi/libNativeCalculation.so $ ls Android.mk!! NativeCalculation.c! NativeCalculation.h $ cd .. $ mv libs lib $ zip -r NativeCalculation.zip lib/ adding: lib/ (stored 0%) adding: lib/android-support-v4.jar (deflated 14%) adding: lib/armeabi/ (stored 0%) adding: lib/armeabi/libNativeCalculation.so (deflated 47%) $ mv NativeCalculation.zip NativeCalculation.jar $ mn lib libs $ mv NativeCalculation.jar libs/ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ NativeCalcula- tion āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application name āļ§āđˆāļē “NativeCalculation” āđāļĨāļ° āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.NativeCalculation” āļ”āļąāļ‡āļĢāļđāļ› 355 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 356. āļĢāļđāļ›āļ—āļĩāđˆ 6.49 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄ Calculation NDK āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ™āļģāđ€āļ‚āđ‰āļēāđ„āļĨāļšāļĢāļēāļĢāļĩ NativeCalculation āļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āđ€āļĄāļēāļŠāđŒāļĨāļēāļāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ libs/ āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāļ§āļēāļ‡āđ„āļ§āđ‰āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āļ āļēāļĒāđƒāļ•āđ‰āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ src/main āļ”āļąāļ‡ āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 6.50 āļāļēāļĢāļ™āļģāđ€āļ‚āđ‰āļēāđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ lib āđāļĨāļ°āļĢāļ°āļšāļļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđƒāļ™āđ„āļŸāļĨāđŒ MainActivity.java 356 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 357. āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 3: āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ build.gradle āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„ āļˆāļ°āļ›āļĢāļēāļāļāđ„āļŸāļĨāđŒāļŠāļ·āđˆāļ­āļ§āđˆāļē build.gradle āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļģāļŦāļĢāļąāļšāļ„āļ­āļĄ āđ„āļžāļĨāđŒ āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ task nativeLibsToJar, tasks.withType (Compile) āđāļĨāļ° dependencies āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ build.gradle āđƒāļŦāđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android' repositories { mavenCentral() } android { compileSdkVersion 18 buildToolsVersion "18.1.0" defaultConfig { minSdkVersion 7 targetSdkVersion 16 } } task nativeLibsToJar( type: Zip, description: 'create a jar archive of the native libs') { destinationDir file("src/main/libs/NativeCaculation") baseName 'NativeCaculation' extension 'jar' from fileTree(dir: 'src/main/libs', include: '**/*.so') into 'lib/' } tasks.withType (Compile) { compileTask -> compileTask.dependsOn (nativeLibsToJar) } dependencies { compile fileTree(dir: "src/main/libs/NativeCaculation", include: 'NativeCaculation.jar') } āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 4: āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļ‡āļēāļ™āļ•āļēāļĄāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ 357 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 358. āđƒāļŦāđ‰āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ MainActivity.java āđāļĨāļ°āđ„āļŸāļĨāđŒ activity_main.xml āđƒāļŦāđ‰āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļąāļ‡āļ™āļĩāđ‰ package com.example.NativeCalculation; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv = new TextView(this); this.tv =(TextView)findViewById(R.id.calculation_text); callingNative(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void callingNative() { int a = 2342, b = 452; double c = 2353.0; int d = NativePlus(a, b); this.tv.setText(a + "+" + b + "=" + d); d = NativeMultiply(a, b); this.tv.append("n" + a + "x" + b + "=" + d); double e = NativeSqrt(c); this.tv.append("nSqrt(" + c + ")" + "=" + e); int numbers[] = new int[10000]; for (int i=0; i < numbers.length ; ++i) { numbers[i] = i; } double[] results = this.NativeArraySumAndAverage(numbers); this.tv.append("nSummation of Numbers (1-" + numbers.length + ") = " + re- sults[0]); this.tv.append("nAverage of Numbers (1-" + numbers.length + ") = " + re- sults[1]); } private native int NativePlus(int a, int b); private native int NativeMultiply(int a, int b); private native double NativeSqrt(double a); private native double[] NativeArraySumAndAverage(int[] numbers); static { System.loadLibrary("NativeCalculation"); } } 358 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 359. āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ activity_main.xml āđ‚āļ”āļĒāļāļēāļĢāđ€āļžāļīāđˆāļĄ android:id="@+id/calculation_text" āđāļĨāļ° android:textSize="40dp" android:text="No Message..." <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/calculation_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30dp" android:text="No Message..." /> </RelativeLayout> āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 5: āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ āļœāļĨāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ NativeCalculation āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļāļēāļĢāļšāļ§āļāđ€āļĨāļ‚ āļ„āļđāļ“āđ€āļĨāļ‚ āļŦāļēāļĢāļēāļ āļ—āļĩāđˆāļŠāļ­āļ‡ āļšāļ§āļāđ€āļĨāļ‚āđƒāļ™āļ­āļēāđ€āļĢāļĒāđŒ āđāļĨāļ°āļŦāļēāļ„āđˆāļēāđ€āļ‰āļĨāļĩāđˆāļĒāļ‚āļ­āļ‡āđ€āļĨāļ‚āđƒāļ™āļ­āļēāđ€āļĢāļĒāđŒ āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 6.51 āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļģāļ™āļ§āļ“āļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē ANDROID NDK MULTI-THREADING āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļš Native code āļŠāļēāļĄāļēāļĢāļ–āļ”āļķāļ‡āļĻāļąāļāļĒāļ āļēāļžāļ—āļēāļ‡āļ”āđ‰āļēāļ™ multi-processing tech- nique āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļĄāļēāļāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļĢāļāļ”āđ‰āļ§āļĒāļāļēāļĢāļ™āļģ Posix Thread āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰ āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļēāļĄāļēāļĢāļ–āđāļšāđˆāļ‡āļ‡āļēāļ™āļ­āļ­āļāđ€āļ›āđ‡āļ™āļ‡āļēāļ™āļĒāđˆāļ­āļĒāđ† (thread) āđāļĨāđ‰āļ§āđāļĒāļāļāļąāļ™āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļē multi- 359 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 360. threading programming āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ āļēāļĐāļēāļˆāļēāļ§āļē āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ posix thread āđ„āļ”āđ‰ āđ‚āļ”āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ–āļķāļ‡āļāļēāļĢāđƒāļŠāđ‰ mutex āđ€āļžāļ·āđˆāļ­āļ—āļģāđƒāļŦāđ‰āđ€āļ—āļĢāļ”āđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āļŠāļ­āļ”āļ›āļĢāļ°āļŠāļēāļ™āđ„āļĄāđˆ āļ‚āļąāļ”āđāļĒāđ‰āļ‡āļŦāļĢāļ·āļ­āđāļĒāđ‰āļ‡āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāđƒāļ™āđ€āļ§āļĨāļēāđ€āļ”āļĩāļĒāļ§āļāļąāļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđƒāļ™āļšāļ—āļ—āļĩāđˆ 4 āđ‚āļ”āļĒāļāļēāļĢāļ™āļģāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pthread_mutex āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļĄāļēāđƒāļŠāđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); int pthread_mutex_destroy(pthread_mutex_t *mutex); āļ‹āļķāđˆāļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ mutex āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ—āļĢāļ”āļ™āļģāđ„āļ›āđ€āļ›āđ‡āļ™āđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āđƒāļ™āļāļēāļĢāļ‚āļ­āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļ”āđ‰āļ”āļąāļ‡āļ™āļĩāđ‰ int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_lock_timeout_np(pthread_mutex_t *mutex, unsigned msecs); āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļĄāļĩāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ€āļ—āļĢāļ” āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ NativeThreadMutex āđāļĨāļ°āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļĒāđˆāļ­āļĒāļŠāļ·āđˆāļ­ jni/ āļ‹āļķāđˆāļ‡āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāđ‚āļ„āđ‰āļ” āđ‚āļ›āļĢāđāļāļĢāļĄ (.c, .h) āđāļĨāļ° Android.mk āđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ mkdir NativeThreadsMutex $ mkdir NativeThreadsMutex/jni $ cd NativeThreadsMutex/jni $ vim NativeThreadsMutex.cpp #include <jni.h> #include <unistd.h> #include <pthread.h> #include "mylog.h" void jni_start_threads(); void *run_by_thread1(void *arg); void *run_by_thread2(void *arg); void jni_start_threads_dead(); void *run_by_thread1dead(void *arg); void *run_by_thread2dead(void *arg); jint JNI_OnLoad(JavaVM* pVm, void* reserved) { JNIEnv* env; if (pVm->GetEnv((void **)&env, JNI_VERSION_1_6) != JNI_OK) { 360 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 361. return -1; } JNINativeMethod nm[2]; nm[0].name = "jni_start_threads"; nm[0].signature = "()V"; nm[0].fnPtr = (void*)jni_start_threads; nm[1].name = "jni_start_threads_dead"; nm[1].signature = "()V"; nm[1].fnPtr = (void*)jni_start_threads_dead; jclass cls = env->FindClass("com/example/NativeThreadsMutex/MainActivity"); // Register methods with env->RegisterNatives. env->RegisterNatives(cls, nm, 2); return JNI_VERSION_1_6; } //pthread_mutex_t mux1 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mux1; pthread_mutex_t mux2; void jni_start_threads() { pthread_t th1, th2; int threadNum1 = 1, threadNum2 = 2; int ret; pthread_mutex_init(&mux1, NULL); pthread_mutex_init(&mux2, NULL); ret = pthread_create(&th1, NULL, run_by_thread1, (void*)&threadNum1); if(ret) { LOGE(1, "cannot create the thread %d thread: %d", threadNum1, ret); } LOGI(1, "thread 1 started"); ret = pthread_create(&th2, NULL, run_by_thread2, (void*)&threadNum2); if(ret) { LOGE(1, "cannot create the thread %d: %d", threadNum2, ret); } LOGI(1, "thread 2 started"); ret = pthread_join(th1, NULL); LOGI(1, "thread 1 end %d", ret); ret = pthread_join(th2, NULL); LOGI(1, "thread 2 end %d", ret); pthread_mutex_destroy(&mux1); pthread_mutex_destroy(&mux2); } int cnt = 0; int THR = 10; void *run_by_thread1(void *arg) { int* threadNum = (int*)arg; while (cnt < THR) { pthread_mutex_lock(&mux1); while ( pthread_mutex_trylock(&mux2) ) { pthread_mutex_unlock(&mux1); //avoid deadlock usleep(50000); //if failed to get mux2, release mux1 first 361 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 362. pthread_mutex_lock(&mux1); } ++cnt; LOGI(1, "thread %d: cnt = %d", *threadNum, cnt); pthread_mutex_unlock(&mux1); pthread_mutex_unlock(&mux2); sleep(1); } } void *run_by_thread2(void *arg) { int* threadNum = (int*)arg; while (cnt < THR) { pthread_mutex_lock(&mux2); while ( pthread_mutex_trylock(&mux1) ) { pthread_mutex_unlock(&mux2); //avoid deadlock usleep(50000); //if failed to get mux2, release mux1 first pthread_mutex_lock(&mux2); } ++cnt; LOGI(1, "thread %d: cnt = %d", *threadNum, cnt); pthread_mutex_unlock(&mux2); pthread_mutex_unlock(&mux1); sleep(1); } } void jni_start_threads_dead() { pthread_t th1, th2; int threadNum1 = 1, threadNum2 = 2; int ret; pthread_mutex_init(&mux1, NULL); pthread_mutex_init(&mux2, NULL); ret = pthread_create(&th1, NULL, run_by_thread1dead, (void*)&threadNum1); if(ret) { LOGE(1, "cannot create the thread %d thread: %d", threadNum1, ret); } LOGI(1, "thread 1 started"); ret = pthread_create(&th2, NULL, run_by_thread2dead, (void*)&threadNum2); if(ret) { LOGE(1, "cannot create the thread %d: %d", threadNum2, ret); } LOGI(1, "thread 2 started"); ret = pthread_join(th1, NULL); LOGI(1, "thread 1 end %d", ret); ret = pthread_join(th2, NULL); LOGI(1, "thread 2 end %d", ret); pthread_mutex_destroy(&mux1); pthread_mutex_destroy(&mux2); } 362 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 363. void *run_by_thread1dead(void *arg) { int* threadNum = (int*)arg; while (cnt < THR) { pthread_mutex_lock(&mux1); usleep(50); pthread_mutex_lock(&mux2); ++cnt; LOGI(1, "thread %d: cnt = %d", *threadNum, cnt); pthread_mutex_unlock(&mux2); pthread_mutex_unlock(&mux1); sleep(1); } } void *run_by_thread2dead(void *arg) { int* threadNum = (int*)arg; while (cnt < THR) { pthread_mutex_lock(&mux2); usleep(50); pthread_mutex_lock(&mux1); ++cnt; LOGI(1, "thread %d: cnt = %d", *threadNum, cnt); pthread_mutex_unlock(&mux1); pthread_mutex_unlock(&mux2); sleep(1); } } $ vim mylog.h #ifndef COOKBOOK_LOG_H #define COOKBOOK_LOG_H #include <android/log.h> #define LOG_LEVEL 4 #define LOG_TAG "NativeThreadsMutex" #define LOGU(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_UNKNOWN, LOG_TAG, __VA_ARGS__);} #define LOGD(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEFAULT, LOG_TAG, __VA_ARGS__);} #define LOGV(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__);} #define LOGDE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__);} #define LOGI(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__);} #define LOGW(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__);} #define LOGE(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__);} #define LOGF(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_FATAL, LOG_TAG, __VA_ARGS__);} 363 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 364. #define LOGS(level, ...) if (level <= LOG_LEVEL) {__android_log_print(ANDROID_LOG_SILENT, LOG_TAG, __VA_ARGS__);} #endif $ vim Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NativeThreadsMutex LOCAL_SRC_FILES := NativeThreadsMutex.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄ native āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđƒāļŠāđ‰āđ„āļ”āđ‰āļāļąāļš Android Studio $ ndk-build Compile++ thumb : NativeThreadsMutex <= NativeThreadsMutex.cpp SharedLibrary : libNativeThreadsMutex.so Install : libNativeThreadsMutex.so => libs/armeabi/libNativeThreadsMutex.so $ cd .. $ mv libs lib $ zip -r NativeThreadsMutex.zip lib/ adding: lib/ (stored 0%) adding: lib/android-support-v4.jar (deflated 14%) adding: lib/armeabi/ (stored 0%) adding: lib/armeabi/libNativeThreadsMutex.so (deflated 49%) $ mv NativeThreadsMutex.zip NativeThreadsMutex.jar $ mv lib libs $ mv NativeThreadsMutex.jar libs/ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļˆāļēāļ§āļē āļ”āđ‰āļ§āļĒ Android Studio āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ NativeThreads- Mutex āļ™āļąāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāđ‡āļ„āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ Android Studio āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ File -> New Project āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Application name āļ§āđˆāļē “NativeThreadsMutex” āđāļĨāļ°āļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ Package name āļ§āđˆāļē “com.example.NativeThreadsMutex” 364 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 365. āļĢāļđāļ›āļ—āļĩāđˆ 6.52 āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđ‚āļ›āļĢāđāļāļĢāļĄ NativeThreadsMutex NDK āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ adb āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļ°āđāļŠāļ”āļ‡āļ­āļĒāļđāđˆāđƒāļ™ logcat āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ”āļđāļœāļĨāļĨāļąāļžāļ˜āđŒ āļˆāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ adb logcat āļ”āļąāļ‡ āđāļŠāļ”āļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ $ adb logcat -v time NativeThreadsMutex:I *:S 10-05 19:19:45.469 I/NativeThreadsMutex( 2836): thread 1 started 10-05 19:19:45.469 I/NativeThreadsMutex( 2836): thread 2 started 10-05 19:19:45.479 I/NativeThreadsMutex( 2836): thread 2: cnt = 1 10-05 19:19:45.479 I/NativeThreadsMutex( 2836): thread 1: cnt = 2 10-05 19:19:46.488 I/NativeThreadsMutex( 2836): thread 2: cnt = 3 10-05 19:19:46.492 I/NativeThreadsMutex( 2836): thread 1: cnt = 4 10-05 19:19:47.489 I/NativeThreadsMutex( 2836): thread 2: cnt = 5 10-05 19:19:47.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 6 10-05 19:19:48.490 I/NativeThreadsMutex( 2836): thread 2: cnt = 7 10-05 19:19:48.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 8 10-05 19:19:49.489 I/NativeThreadsMutex( 2836): thread 2: cnt = 9 10-05 19:19:49.499 I/NativeThreadsMutex( 2836): thread 1: cnt = 10 10-05 19:19:50.499 I/NativeThreadsMutex( 2836): thread 1 end 0 10-05 19:19:50.499 I/NativeThreadsMutex( 2836): thread 2 end 0 365 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 366. āļšāļ—āļ—āļĩāđˆ 7 āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ™āļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āđƒāļ™āļšāļ—āļ™āļĩāđ‰āļˆāļ°āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ‚āļ”āļĒāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđƒāļ™āļŠāđˆāļ§āļ™āđāļĢāļāļˆāļ°āđ€āļ›āđ‡āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāļĄāļēāļāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļŠāļ·āđˆāļ­ āļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Raspberry Pi āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļŦāļĄāļ·āļ­āļ™āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ (Single- board computer) āļ—āļĩāđˆāļžāļąāļ’āļ™āļēāđ‚āļ”āļĒāļ™āļēāļĒ Eben Upton āļ‹āļķāđˆāļ‡āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļšāļĢāļīāļĐāļąāļ— Broadcom āđāļĨāļ°āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļē āļŦāļĨāļąāļāļ āļēāļĒāđƒāļ•āđ‰āļ­āļ‡āļ„āđŒāļāļĢāđ„āļĄāđˆāđāļŠāļ§āļ‡āļŦāļēāļāļģāđ„āļĢāļŠāļ·āđˆāļ­āļ§āđˆāļē Raspberry Pi Foundation āđƒāļ™āļ›āļĢāļ°āđ€āļ—āļĻāļ­āļąāļ‡āļāļĪāļĐ āđ‚āļ”āļĒāļĄāļĩ āļ§āļąāļ•āļ–āļļāļ›āļĢāļ°āļŠāļ‡āļ„āđŒāļŦāļĨāļąāļāļ„āļ·āļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļšāļ­āļĢāđŒāļ”āļ•āļąāļ§āļ™āļĩāđ‰āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļāļēāļĢāļŠāļ­āļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ§āļīāļ—āļĒāļēāļĻāļēāļ•āļĢāđŒāđāļĨāļ° āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđƒāļ™āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™ āļ‹āļķāđˆāļ‡āļ„āļ§āļēāļĄāļ•āļąāđ‰āļ‡āđƒāļˆāđ€āļ”āļīāļĄāļ‚āļ­āļ‡āđ‚āļ„āļĢāļ‡āļāļēāļĢ Raspberry Pi āļ„āļ·āļ­āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļĩāļĒāļ‡āļˆāļ°āļ—āļģāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢ āļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ„āļĨāđ‰āļēāļĒāļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āđāļ•āđˆāđƒāļ™āļ—āļĩāđˆāļŠāļļāļ”āļāđ‡āđ„āļ”āđ‰āļ•āļąāļ”āļŠāļīāļ™āđƒāļˆāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ āļĢāļ°āļ”āļąāļšāļšāļ­āļĢāđŒāļ”āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļ—āļ™ āđ€āļžāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŦāđ‰āļ„āļĢāļđāđāļĨāļ°āļ™āļąāļāđ€āļĢāļĩāļĒāļ™āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™ āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļŦāļĄāļ·āļ­āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļąāđˆāļ§āđ„āļ› āļ—āļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢ Raspberry Pi āđ„āļ”āđ‰āļ—āļģāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļ„āļ§āļēāļĄāļĢāđˆāļ§āļĄāļĄāļ·āļ­āļ—āļēāļ‡āļĨāļīāļ‚āļŠāļīāļ—āļ˜āđŒāļĢāđˆāļ§āļĄ āļāļąāļšāļšāļĢāļīāļĐāļąāļ— Element14 āđāļĨāļ°āļšāļĢāļīāļĐāļąāļ— RS Components āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļšāļĢāļīāļĐāļąāļ—āļĒāļąāļāļĐāđŒāđƒāļŦāļāđˆāļ”āđ‰āļēāļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ‹āļ·āđ‰āļ­āļ­āļļāļ›āļāļĢāļ“āđŒ āļ­āļīāđ€āļĨāđ‡āļāļ—āļĢāļ­āļ™āļīāļāļŠāđŒāđāļšāļšāļ­āļ­āļ™āđ„āļĨāļ™āđŒ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļœāļđāđ‰āļœāļĨāļīāļ•āđāļĨāļ°āļœāļđāđ‰āđāļ—āļ™āļˆāļģāļŦāļ™āđˆāļēāļĒāļšāļ­āļĢāđŒāļ” Raspberry Pi āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ”āļąāļ‡āļ™āļĩāđ‰ 1. āđƒāļŠāđ‰ System-on-Chip āļˆāļēāļāļ„āđˆāļēāļĒ Broadcom āļĢāļļāđˆāļ™ BCM2835 āļ‹āļķāđˆāļ‡āļĄāļĩāļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļāļĨāļēāļ‡ ARM1176JZF-S āļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§āļŠāļąāļāļāļēāļ“āļ™āļēāļŽāļīāļāļē 700 MHz āļŠāļēāļĄāļēāļĢāļ–āļ–āļđāļ Over Clock āđ„āļ”āđ‰āļ–āļķāļ‡ 1 GHz 2. āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ SDRAM āļ‚āļ™āļēāļ” 256 MB āđƒāļ™āļĢāļļāđˆāļ™ A āđāļĨāļ° SDRAM 512 MB āđƒāļ™āļĢāļļāđˆāļ™ B 3. āļŠāļēāļĄāļēāļĢāļ–āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āļšāļđāļ• Image le āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđ„āļ”āđ‰āļˆāļēāļ SD Card 4. āļĄāļĩUSB 2.0 āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ 5. āļĄāļĩāļŠāđˆāļ­āļ‡āđ€āļŠāļĩāļĒāļš Video āđāļšāļš Composite RCA āđāļĨāļ° HDMI 6. āļĄāļĩāļŦāļąāļ§āđāļˆāđŠāļ Audio āļ‚āļ™āļēāļ” 3.5 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ 7. āļĄāļĩ Ethernet 10/100 8. āļĄāļĩ GPIO 17 āļžāļīāļ™āđƒāļŦāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ 9. āļĄāļĩāđāļŦāļĨāđˆāļ‡āļˆāđˆāļēāļĒāđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ +3.3 V āđāļĨāļ° +5V 10. āļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” 85.60 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ x 53.98 āļĄāļīāļĨāļĨāļīāđ€āļĄāļ•āļĢ 11. āļ™āđ‰āļģāļŦāļ™āļąāļ 45 āļāļĢāļąāļĄ 366 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 367. āļĢāļđāļ›āļ—āļĩāđˆ 7.1 āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļ•āđˆāļēāļ‡āđ†āļāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāļ•āđˆāļēāļ‡āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļŦāļĨāļēāļāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļšāļ™ āļ‹āļķāđˆāļ‡ āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ—āļĩāđˆāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļ•āđˆāļˆāļ° āļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē C āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄ āđ€āļŸāļīāļĢāđŒāļĄāđāļ§āļĢāđŒ (rmware) āļŠāļģāļŦāļĢāļąāļšāđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒ ATMEL āļ—āļĩāđˆāđˆāđƒāļŠāđ‰āđƒāļ™āļšāļ­āļĢāđŒāļ” Arduino āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļē āļ­āļ·āđˆāļ™āđ† āđ€āļŠāđˆāļ™ āļ āļēāļĐāļēPython āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Python IDE āļ āļēāļĐāļēāđ€āļžāļīāļĢāđŒāļĨ (Perl) āļ āļēāļĐāļēāđ€āļšāļŠāļīāļ (Basic) āļŦāļĢāļ·āļ­ āļ āļēāļĐāļē C++ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļšāļ­āļĢāđŒāļ” Raspberry Pi āļĒāļąāļ‡āļĢāļ­āļ‡āļĢāļąāļšāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāļ™āļīāļĒāļĄāļ­āļĒāļđāđˆāđƒāļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Debian GNU/Linux, Fedora, FreeBSD, NetBSD, Plan 9, Raspbian OS, RISC OS āđāļĨāļ° Slackware Linux āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļšāļ­āļĢāđŒāļ”āļ™āļĩāđ‰āļāđ‡āļĒāļąāļ‡āđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ—āļģāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Media server āļŦāļĢāļ·āļ­ Set-top-box āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĄāļąāļĨāļ•āļīāļĄāļĩāđ€āļ”āļĩāļĒ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„ OpenELEC (Open Embedded 367 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 368. Linux Entertainment Center) āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ™āļģāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļĄāļēāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āđƒāļŠāđˆāđ‚āļ›āļĢāđāļāļĢāļĄ XBMC media center āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āļ‡āļēāļ™āļšāļ­āļĢāđŒāļ” RaspBerry Pi āđƒāļ™āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļŠāļĢāđ‰āļēāļ‡āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāđƒāļŦāđ‰āļāļąāļšāđ€āļ”āđ‡āļ āļŦāļĢāļ·āļ­ āļ™āļąāļāļĻāļķāļāļĐāļē āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļāļēāļĢāļ™āļģāđ„āļ›āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™āļ‚āļ­āļ‡āđ€āļĨāđˆāļ™ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļ•āđˆāļēāļ‡āđ„āļ”āđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 7.2 āļāļēāļĢāļ™āļģ Raspberry Pi āđ„āļ›āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ­āļ™āļ āļēāļĒāđƒāļ™āđ‚āļĢāļ‡āđ€āļĢāļĩāļĒāļ™ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļ‡āļēāļ™āļ”āđ‰āļēāļ™āļ­āļļāļ•āļŠāļēāļŦāļāļĢāļĢāļĄ āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ­āļ‡āļāđ‡āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļˆāļēāļāđ€āļŦāļĨāđˆāļē āļ™āļąāļāļžāļąāļ’āļ™āļē āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĄāļĩāļ„āļ§āļēāļĄāļĒāļ·āļ”āļŦāļĒāļļāđˆāļ™āđƒāļ™āļāļēāļĢāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļˆāļ°āļ™āļģāļĄāļēāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĨāļ‡āļ āļēāļĒāđƒāļ™ āļšāļ­āļĢāđŒāļ”āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩāļžāļīāđ€āļĻāļĐāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļĨāļ‡āđ„āļ›āđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļšāļ­āļĢāđŒāļ” Data Acquisition (DAQ), Mini Super Computer āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 7.3 āļāļēāļĢāļ™āļģ Raspberry Pi āđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‚āļ™āļēāļ™ 368 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 369. āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ•āļąāđ‰āļ‡āđāļ•āđˆāđƒāļ™āļ­āļ”āļĩāļ•āļˆāļ™āļ–āļķāļ‡āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļĄāļĩāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđāļĨāļ°āđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ”āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ (Evaluation Kit) āļ­āļ­āļāļĄāļēāļˆāļģāļ™āļ§āļ™āļĄāļēāļāļĄāļēāļĒ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host) āđ„āļ§āđ‰ āļ­āļĩāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļ•āļīāļ”āļ•āļąāđ‰āļ‡ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļē cross-compiling toolchains āđāļĨāļ°āļŠāļļāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™ āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđˆāļēāļ‡āđ† āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļēāļĒāđ€āļ„āđ€āļšāļīāļĨāđāļšāļšāļŠāļēāļĒāļ­āļ™āļļāļāļĢāļĄ (Serial cable) āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ—āļ„āļ­āļ™āđ‚āļ‹āļĨ (console) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ”āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļˆāļ­āđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļžāļīāļĄāļžāđŒāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļŦāļĢāļ·āļ­āđ€āļžāļ·āđˆāļ­āļ”āļĩāļšāļąāļāđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ āđ„āļ”āđ‰ āđāļ•āđˆāļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢāļ”āļąāļ‡āļ—āļĩāđˆāļāļĨāđˆāļēāļ§āļĄāļēāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļāđ‡āļĒāļąāļ‡āļŠāļĢāđ‰āļēāļ‡āļ„āļ§āļēāļĄāļĒāļļāđˆāļ‡āļĒāļēāļāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāđƒāļŦāđ‰āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆāļ—āļąāđ‰āļ‡āļŦāļĨāļēāļĒ āđāļ•āđˆ āđ€āļĄāļ·āđˆāļ­āļĄāļēāļ–āļķāļ‡āļĒāļļāļ„āļāļēāļĢāļĄāļēāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ—āļģāđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđāļĨāļ°āļ—āļģāļāļēāļĢāļ„āļ­āļĄ āđ„āļžāļĨāđŒāđ‚āļ›āļĢāđāļāļĢāļĄāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ āđ‚āļ”āļĒāđ€āļžāļĩāļĒāļ‡āļ™āļģāļšāļ­āļĢāđŒāļ” Raspberry Pi āļĄāļēāļ•āđˆāļ­āļāļąāļšāļˆāļ­āļĄāļ­āļ™āļīāđ€āļ•āļ­āļĢāđŒ āļ„āļĩāļĒāđŒāļšāļ­āļĢāđŒāļ” āđāļĨāļ°āđ€āļĄāļēāļŠāđŒ āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļāđ‡āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļāļēāļĢ remote āļŦāļ™āđ‰āļēāļˆāļ­ (Remote Desktop) āļœāđˆāļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ (Host) āđ‚āļ”āļĒāđƒāļŠāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄ VNC (āļŦāļĢāļ·āļ­ ssh āđƒāļ™āļāļĢāļ“āļĩ text mode) āđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ„āļ”āđ‰āđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Host Ethernet Hub āļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (Target) āļŠāļēāļĒ RS-232 āļŠāļēāļĒ LAN ARM, PowerPC, MIPS (Linux OS) x86, x86_64 (Desktp OS) āļŠāļēāļĒ LAN āļĢāļđāļ›āļ—āļĩāđˆ 7.4 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļšāļšāļ—āļąāđˆāļ§āđ„āļ› Ethernet Hub āļšāļ­āļĢāđŒāļ” RaspBerry Pi (Target) āļŠāļēāļĒ LAN āļŠāļēāļĒ LAN Remote Desktop (vnc) Remote Login (ssh) āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āļŠāļēāļĒ RS-232 HDMI āļĢāļđāļ›āļ—āļĩāđˆ 7.5 āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ‚āļ­āļ‡ Raspberry Pi 369 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 370. āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Secure Shell (ssh) āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļ›āļīāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ ssh (secure shell) āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ command line āļĢāļ°āļĒāļ°āđ„āļāļĨ āļœāđˆāļēāļ™āļ—āļēāļ‡āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ ssh āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĄāļĩ āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo raspi-config āļĢāļđāļ›āļ—āļĩāđˆ 7.6 āđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡ Raspberry Pi āļœāđˆāļēāļ™āļ„āļģāļŠāļąāđˆāļ‡ raspi-cong āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļāđ€āļĄāļ™āļđ SSH āđāļĨāđ‰āļ§āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ ENABLE āļ–āļąāļ”āđ„āļ› āļ—āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļĒāļ°āđ„āļāļĨāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āļœāđˆāļēāļ™ ssh client āđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi (IP Ad- dress: 10.20.4.222 āļ”āđ‰āļ§āļĒāļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰ pi) (āļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Mac)$ ssh 10.20.4.222 -l pi 370 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 371. āđ€āļ›āļīāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļĒāļ°āđ„āļāļĨāļˆāļēāļāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ­āļ·āđˆāļ™āļœāđˆāļēāļ™ ssh client āđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄ Putty āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Windows āļĢāļđāļ›āļ—āļĩāđˆ 7.7 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ PuTTY āđƒāļ™āļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļēāđāļŠāļ”āļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ•āđˆāļēāļ‡āđ† āļ—āļģāļāļēāļĢāđƒāļŠāđˆāđ„āļ­āļžāļĩāđāļ­āļ”āđ€āļ”āļĨāļŠāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry PI āđāļĨāđ‰āļ§āđ€āļĨāļ·āļ­āļ Open āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļē terminal āđƒāļŦāđ‰āļ—āļģāļāļēāļĢ login : pi āđāļĨāļ° password : raspberry āļ•āđˆāļ­āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŦāļ™āđ‰āļē terminal āļ‚āļ­āļ‡ Raspbian āđ‚āļ”āļĒāļŠāļĄāļšāļđāļĢāļ“āđŒ āļĢāļđāļ›āļ—āļĩāđˆ 7.8 āļŦāļ™āđ‰āļēāļ•āđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Terminal āđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš 371 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 372. āļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āļœāđˆāļēāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ VNC (Remote Desktop) āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ”āđ‰āļ§āļĒāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VNC server āļŠāļ·āđˆāļ­āļ§āđˆāļē tightvncserver āļĨāļ‡āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡āļ”āļąāļ‡āļ™āļĩāđ‰ $ sudo apt-get install tightvncserver āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ”āļšāļĢāļīāļāļēāļĢāđ‚āļ›āļĢāđāļāļĢāļĄ VNC server āļžāļĢāđ‰āļ­āļĄāļĢāļ°āļšāļļāļ‚āļ™āļēāļ”āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāļˆāļ­ Raspberry Pi $ vncserver :1 -geometry 1024x786 -depth 16 -pixelformat rgb565 āļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ VNC viewer (āļĢāļ­āļ‡āļĢāļąāļšāļŦāļĨāļēāļĒāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ) āđāļĨāđ‰āļ§ āļĢāļ°āļšāļļ IP āļ‚āļ­āļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ Raspberry Pi āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ āļĢāļđāļ›āļ—āļĩāđˆ 7.9 āđāļŠāļ”āļ‡āļāļēāļĢ Remote Desktop āđ€āļ‚āđ‰āļēāđ„āļ›āļĒāļąāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi 372 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 373. GPIOs āļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Raspberry PI GPIO āđ€āļ›āđ‡āļ™āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļžāļīāđ€āļĻāļĐāļ—āļĩāđˆāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ›āļīāļ”āđƒāļŦāđ‰āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđāļĄāđ‰āļ§āđˆāļē āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļšāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļĄāļĩāđ„āļĄāđˆāļ„āļĢāļšāđ€āļŦāļĄāļ·āļ­āļ™āļšāļ­āļĢāđŒāļ”āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ›āđāļ•āđˆāļāđ‡āđ€āļžāļĩāļĒāļ‡āļžāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ„āļ”āđ‰āļĄāļēāļāļĄāļēāļĒ āđ€āļžāļĢāļēāļ°āļ•āļąāļ§āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ­āļ‡āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒāļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ„āļ”āđ‰āļšāļ™ āļšāļ­āļĢāđŒāļ”āđ€āļŦāļĄāļ·āļ­āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ Host āđ€āļĄāļ·āđˆāļ­āļšāļ§āļāļāļąāļšāļāļēāļĢāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ GPIOs āļ•āđˆāļēāļ‡āđ†āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ āļāđ‡āļĒāļīāđˆāļ‡āļ—āļģāđƒāļŦāđ‰ āļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­āđƒāļŦāļĄāđˆāļˆāļ™āļ–āļķāļ‡āļĢāļ°āļ”āļąāļšāļāļĨāļēāļ‡āļŠāļ°āļ”āļ§āļāđāļĨāļ°āļ‡āđˆāļēāļĒāļ•āđˆāļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļ”āļĩ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ›āđ‡āļ™āļ­āļĩāļāļŦāļ™āļķāđˆāļ‡āļšāļ­āļĢāđŒāļ”āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļ™āļīāļĒāļĄāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļŠāļđāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 7.10 āļ•āļģāđāļŦāļ™āđˆāļ‡ GPIO āļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ› GPIO (General purpose I/O) āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļˆāļ°āļ­āļĒāļđāđˆāļ•āļĢāļ‡āļŠāđˆāļ§āļ™āļ‚āļē (āļ‚āļē) P1 āļ‹āļķāđˆāļ‡āļĄāļĩ āļˆāļģāļ™āļ§āļ™āļ‚āļ­āļ‡āļ‚āļē 2x13 āļŦāļĢāļ·āļ­ 26 āļ‚āļē āđ‚āļ”āļĒāļ‚āļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ„āļĄāđˆāđ„āļ”āđ‰āļĄāļĩāđāļ„āđˆ GPIO āđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āđāļ•āđˆāļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ SPI, I2C, serial UART, āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 3.3 V, āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 5 V āđāļĨāļ° GND āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi -P1 āļĄāļĩāļˆāļģāļ™āļ§āļ™ 26 āļ‚āļē āļĄāļĩāļĢāļ°āļĒāļ°āļŦāđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ‚āļē 2.54 āļĄāļĄ. (100 mil) -āđ€āļ­āļēāļžāļļāļ•āļ—āđŒāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļ‚āļē āļˆāļ°āļ­āļĒāļđāđˆāđƒāļ™āļŠāđˆāļ§āļ‡ 0-3.3V āđāļĨāļ°āļ­āļīāļ™āļžāļļāļ•āđ„āļĄāđˆāļ„āļ§āļĢāļĄāļēāļāļāļ§āđˆāļē 3.3 V āļ–āđ‰āļē āļĄāļĩāļ­āļīāļ™āļžāļļāļ•āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ 5 V āļ„āļ§āļĢāļœāđˆāļēāļ™āļ§āļ‡āļˆāļĢāļ›āļĢāļąāļšāđāļĢāļ‡āļ”āļąāļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ 3.3V āļāđˆāļ­āļ™āļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļĄāļēāļ—āļĩāđˆāļ‚āļēāļ­āļīāļ™āļžāļļāļ• -āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 3.3 V āļŠāļēāļĄāļēāļĢāļ–āļˆāđˆāļēāļĒāļāļĢāļ°āđāļŠāđ„āļ”āđ‰āđ„āļĄāđˆāđ€āļāļīāļ™ 50 mA -āđ„āļŸāđ€āļĨāļĩāđ‰āļĒāļ‡ 5V āļŠāļēāļĄāļēāļĢāļ–āļˆāđˆāļēāļĒāļāļĢāļ°āđāļŠāđ„āļ”āđ‰āđ„āļĄāđˆāđ€āļāļīāļ™ 100 mA -āļĄāļĩāļ”āļīāļˆāļīāļ•āļ­āļĨ āļ­āļīāļ™āļžāļļāļ•/āđ€āļ­āļēāļžāļļāļ• 8 āļ‚āļē -āļĄāļĩ I2C 2 āļ‚āļē -āļĄāļĩ SPI 5 āļ‚āļē 373 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 374. -āļĄāļĩ UART 2 āļ‚āļē -āļĄāļĩāļ‚āļēāļ—āļĩāđˆāļĒāļąāļ‡āđ„āļĄāđˆāđƒāļŠāđ‰āļ­āļĩāļāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 6 āļ‚āļē āļžāļ·āđ‰āļ™āļāļēāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēPython (Python) āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļžāļąāļ’āļ™āļē GPIO āļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ„āđˆāļēāđƒāļŦāđ‰ GPIO āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™ āļšāļ­āļĢāđŒāļ”āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļ‡āļēāļ™āļˆāļēāļāđ€āļ—āļ­āļĢāđŒāļĄāļīāļ™āļąāļĨ āļŦāļĢāļ·āļ­āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āļŠāļąāđˆāļ‡āļ‡āļēāļ™ āđ‚āļ”āļĒāļ—āļĩāđˆāļŠāđˆāļ§āļ™ āđƒāļŦāļāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ Raspbian āđ„āļ”āđ‰āđ€āļ•āļĢāļĩāļĒāļĄ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ Python IDE āļžāļĢāđ‰āļ­āļĄāļ—āļąāđ‰āļ‡ Python Cross complier āđāļĨāļ° C/C++ Cross complier āđ„āļ§āđ‰āđƒāļŦāđ‰āđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ toolchains āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āļœāđˆāļēāļ™ command line āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āđƒāļ™āļŠāļīāļ—āļ˜āļīāđŒ super user āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āļē GPIO āđ„āļ”āđ‰ $ sudo su export GPIO āļ‚āļē āļˆāļēāļāđ„āļŸāļĨāđŒ /sys/class/gpio/export # echo “4” > /sys/class/gpio/export āļāļģāļŦāļ™āļ”āļŠāļ™āļīāļ”āļ‚āļ­āļ‡ GPIO4 āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļšāđ€āļ­āļēāļžāļļāļ— # echo “out” > /sys/class/gpio/gpio4/direction āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ GPIO4 āļ•āļīāļ”āļŦāļĢāļ·āļ­āļ”āļąāļšāđ„āļ”āđ‰ āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ # echo “1” > /sys/class/gpio/gpio4/value <--- (āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ LED āļ•āļīāļ”) āļŦāļĢāļ·āļ­ # echo “0” > /sys/class/gpio/gpio4/value <--- (āļŠāļąāđˆāļ‡āđƒāļŦāđ‰ LED āļ”āļąāļš) āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļāđ€āļĨāļīāļāđƒāļŠāđ‰āļ‡āļēāļ™ GPIO āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ unexport āđ„āļŸāļĨāđŒ /sys/class/gpio/unexport # echo “4” > /sys/class/gpio/unexport 374 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 375. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļĢāļąāļšāļ„āđˆāļēāļˆāļēāļāļ‚āļē GPIO āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Push button āļœāđˆāļēāļ™ command line āļĢāļđāļ›āļ—āļĩāđˆ 7.11 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāļāļ”āļŠāļ§āļīāļ—āļ‹āđŒāļāļąāļšāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ āļēāļĒāđƒāļ™ Raspberry Pi āđƒāļ™āļŠāļīāļ—āļ˜āļīāđŒ super user āđ€āļžāļ·āđˆāļ­āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āļē GPIO āđ„āļ”āđ‰ $ sudo su export GPIO āļ‚āļē āļˆāļēāļāđ„āļŸāļĨāđŒ /sys/class/gpio/export # echo “4” > /sys/class/gpio/export āļāļģāļŦāļ™āļ”āļŠāļ™āļīāļ”āļ‚āļ­āļ‡ GPIO4 āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āđāļšāļšāđ€āļ­āļēāļžāļļāļ— # echo “in” > /sys/class/gpio/gpio4/direction āļ­āđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ­āļīāļ™āļžāļļāļ— āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ cat # cat /sys/class/gpio/gpio4/value āđ€āļĄāļ·āđˆāļ­āļ•āđ‰āļ­āļ‡āļāļēāļĢāļĒāļāđ€āļĨāļīāļāđƒāļŠāđ‰āļ‡āļēāļ™ GPIO āđƒāļŦāđ‰āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ unexport āđ„āļŸāļĨāđŒ /sys/class/gpio/unexport # echo “4” > /sys/class/gpio/unexport 375 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 376. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āđ€āļžāļ·āđˆāļ­āļ‚āļąāļš LED āļĢāļđāļ›āļ—āļĩāđˆ 7.12 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļ„āļ§āļšāļ„āļļāļĄ LED āļ”āđ‰āļ§āļĒāļšāļ­āļĢāđŒāļ” Raspberry Pi āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ gpio_out_LED.py āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āđ‰āļ”āļ”āļąāļ‡āļ™āļĩāđ‰ import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(12,GPIO.OUT) while (1): GPIO.output(12,GPIO.HIGH) time.sleep(1) GPIO.output(12,GPIO.LOW) time.sleep(1) āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ™āļąāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļēāļ™āļąāđ‰āļ™ āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āđāļšāļšāļ„āļ·āļ­ āđāļšāļšāļ—āļĩāđˆ 1: GPIO.BOARD āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļē GPIO āļ—āļĩāđˆāļ­āļĒāļđāđˆāļšāļ™āļšāļ­āļĢāđŒāļ” Raspberry Pi āđāļšāļšāļ—āļĩāđˆ 2: GPIO.BCM āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļē GPIO āļŦāļ™āđˆāļ§āļĒāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ Broadcom BCM2835 CPU āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ GPIO.BOARD āđ€āļ—āđˆāļēāļāļąāļšāļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚ 12 āđāļ•āđˆāļ–āđ‰āļēāđ€āļ›āđ‡āļ™ GPIO.BCM āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļģāđāļŦāļ™āđˆāļ‡āļ‚āļē āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 18 376 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 377. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļąāđˆāļ‡āđ€āļ­āļēāļžāļļāļ•āļ‚āļē GPIO āđ‚āļ”āļĒāļāļēāļĢāļĢāļąāļšāļˆāļēāļāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ push button āļĢāļđāļ›āļ—āļĩāđˆ 7.13 āļāļēāļĢāļ•āđˆāļ­āļ§āļ‡āļˆāļĢāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļāļēāļĢāļāļ”āļŠāļ§āļīāļ—āļ‹āđŒāļœāđˆāļēāļ™āļ‚āļē 18 āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ gpio_button.py āđ‚āļ”āļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ‚āļ„āđ‰āļ”āļ”āļąāļ‡āļ™āļĩāđ‰ import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP) channel = 12 def check_button(): if(GPIO.input(channel) == GPIO.LOW): print ('Button Pressed.') while (1): check_button() time.sleep(1) āļˆāļēāļāļĢāļđāļ›āļ”āđ‰āļēāļ™āļšāļ™ āļ–āđ‰āļēāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļĩāđˆāļˆāļ°āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ pull-up āļŦāļĢāļ·āļ­ pull-down āļŠāļēāļĄāļēāļĢāļ– āđ€āļžāļīāđˆāļĄāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ pull_up_down āđƒāļ™ GPIO.setup āđ„āļ”āđ‰ āđ€āļŠāđˆāļ™ GPIO.setup(12,GPIO.IN, pull_up_down=GPIO.PUD_UP) (āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™ pull-up ) āļŦāļĢāļ·āļ­ GPIO.setup(12,GPIO.IN, pull_up_down=GPIO.PUD_DOWN) (āļ•āđˆāļ­āļ•āļąāļ§āļ•āđ‰āļēāļ™āļ—āļēāļ™ pull-down ) āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļāļēāļĢāļ•āļĢāļ§āļˆāļˆāļąāļšāļāļēāļĢāļāļ”āļ›āļļāđˆāļĄ āļĄāļĩāļ­āļĒāļđāđˆāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāļ–āļēāļ™āļ° āļ„āļ·āļ­ āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļ•āđˆāļģ (Active Low) āđāļĨāļ° āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļŠāļđāļ‡ (Active High) āļ‹āļķāđˆāļ‡āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ python āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļĩāđ‰ 377 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 378. if(GPIO.input(channel) == GPIO.LOW): (āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļ•āđˆāļģ - Active low) print ('Button Pressed.') āļŦāļĢāļ·āļ­ if(GPIO.input(channel) == GPIO.HIGH): (āļ•āđˆāļ­āļ§āļ‡āļˆāļĢāļ­āļīāļ™āļžāļļāļ•āđāļšāļšāļĻāļąāļāļĒāđŒāļŠāļđāļ‡ - Active high) print ('Button Pressed.') āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄ gpio_button.py āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāđ‚āļ”āļĒāļāļēāļĢāļ§āļ™ āļĢāļ­āļšāđ€āļ‚āđ‰āļēāļĄāļēāļ­āđˆāļēāļ™āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ—āļļāļāđ† 1 āļ§āļīāļ™āļēāļ—āļĩāļ”āđ‰āļ§āļĒāđ€āļ—āļ„āļ™āļīāļ„āđ‚āļžāļĨāļĨāļīāđˆāļ‡ (polling technique) āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāļ­āļēāļˆāļˆāļ° āđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļāļąāļšāļāļēāļĢāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ‡āļēāļ™āļˆāļĢāļīāļ‡ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ­āļēāļˆāļĄāļĩāļ‡āļēāļ™āļ­āļĒāđˆāļēāļ‡āļ­āļ·āđˆāļ™āļ—āļĩāđˆāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āđ‰āļ­āļ‡āļ—āļģāļ”āđ‰āļ§āļĒ āđ„āļĄāđˆāđ€āļžāļĩāļĒāļ‡āđāļ•āđˆāļ§āļ™āļĢāļ­āļš āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļāļēāļĢāļāļ”āļ›āļļāđˆāļĄāđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļāļēāļĢāļ™āļģāđ€āļ—āļ„āļ™āļīāļ„āļ­āļīāļ™āđ€āļ•āļ­āļĢāđŒāļĢāļąāļžāļ—āđŒ (Interrupt technique) āļ—āļĩāđˆāļ™āļīāļĒāļĄāđ€āļ‚āļĩāļĒāļ™āļāļąāļ™āļšāļ™āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļĨāđ‚āļ—āļĢāđ€āļĨāļ­āļĢāđŒāļ—āļąāđˆāļ§āđ„āļ› āļˆāļķāļ‡āđ€āļŦāļĄāļēāļ°āļŠāļĄāļĄāļēāļāļāļ§āđˆāļēāđāļšāļšāđ€āļ—āļ„āļ™āļīāļ„āđ‚āļžāļĨāļĨāļīāđˆāļ‡ āļ‹āļķāđˆāļ‡āļ āļēāļĐāļē Python āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļ™āļĨāļąāļāļĐāļ“āļ° threaded callback āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāļŠāļąāļāļāļēāļ“āļ‚āļ­āļ‡ āļ­āļīāļ™āļžāļļāļ• āđ‚āļ”āļĒāļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ def my_callback(channel): print('Button on press...') GPIO.add_event_detect(12, GPIO.FALLING, callback=my_callback, bounce- time=200) āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP) channel = 12 def my_callback(channel): print('Button on press...') GPIO.add_event_detect(12, GPIO.FALLING, callback=my_callback, bounceti- me=200) while (1): 378 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 379. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļšāļ­āļĢāđŒāļ” Raspberry Pi āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Web Server āļ™āļ­āļāļˆāļēāļāđ€āļ‚āļĩāļĒāļ™āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āđāļĨāđ‰āļ§ āļ™āļąāļāļžāļąāļ’āļ™āļē āļĒāļąāļ‡āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āļ‡āļēāļ™ GPIO āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ (Web Browser) āļ‹āļķāđˆāļ‡āļˆāļ°āļŠāļ°āļ”āļ§āļāļ•āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŠāļēāļĄāļēāļĢāļ– āļŠāļąāđˆāļ‡āļ‡āļēāļ™āļŦāļĢāļ·āļ­āđ€āļāđ‰āļēāļ•āļīāļ”āļ•āļēāļĄāļ”āļđāļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļ•āđˆāļ­āļāļąāļš GPIO āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļˆāļēāļāļĢāļ°āļĒāļ°āđ„āļāļĨāđ„āļ”āđ‰ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ™āļģāđ„āļ›āļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđ€āļŠāđˆāļ™ āļāļēāļĢāļ™āļģāļšāļ­āļĢāđŒāļ” Raspberry Pi āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđ„āļŸāļŸāđ‰āļēāļ āļēāļĒāđƒāļ™āļšāđ‰āļēāļ™ āđāļĨāđ‰āļ§ āļŠāļēāļĄāļēāļĢāļ–āļŠāļąāđˆāļ‡āļ‡āļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļŦāļĢāļ·āļ­āļ”āļđāļŠāļ–āļēāļ™āļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđƒāļŠāđ‰āđ„āļŸāļŸāđ‰āļēāļœāđˆāļēāļ™āļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļˆāļēāļāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Web server āļĨāļ‡āļšāļ­āļĢāđŒāļ” Raspberry Pi āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļąāļ”āļāļēāļĢāđāļžāđ‡āļāđ€āļāđ‡āļ• (pip) āđāļĨāļ° āđ‚āļ›āļĢāđāļāļĢāļĄ Flask āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™ web application frame- work āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāļ—āļĩāđˆāļ–āļđāļāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļ āļēāļĐāļē Python āļĢāļ§āļĄāļāļąāļš Werkzeug WSGI toolkit āđāļĨāļ° Jinja2 engine $ sudo apt-get install python-pip $ sudo pip install Flask āļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļ”āļĨāļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Hello world $ mkdir hello $ cd hello/ $ nano hello.py from flask import Flask app = Flask(__name__) @app.route(“/”) def hello(): return “Hello world!” if __name__ == “__main__”: app.run(‘0.0.0.0’) $ python hello.py * Running on http://0.0.0.0:5000/ āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļšāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒ āđāļĨāđ‰āļ§āļžāļīāļĄāļžāđŒ raspberrypi:5000 āļŠāđˆāļ­āļ‡ URL āļĢāļđāļ›āļ—āļĩāđˆ 7.14 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļĢāļĩāļĒāļāđ„āļŸāļĨāđŒ hello.py āļœāđˆāļēāļ™āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ āļ—āļĩāđˆāļžāļ­āļĢāđŒāļ•āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 5000 379 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 380. āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ„āļŸāļĨāđŒ HTML āđāļĨāļ° CSS āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ hello.py āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­ â€œtemplates/” āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello/ āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ HTML āļŠāļ·āđˆāļ­āļ§āđˆāļē home.html āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ home() āļ™āļąāđ‰āļ™āļˆāļ°āļ„āđ‰āļ™āļŦāļēāđ„āļŸāļĨāđŒ home.html āļ—āļĩāđˆāļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ tem- plates/ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ–āđ‰āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ CSS āļāđ‡āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļ·āđˆāļ­āļ§āđˆāļē static/css/ āđ„āļ§āđ‰āļ āļēāļĒāđƒāļ™ āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ hello/ āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ CSS $ cd hello/ $ mkdir templates $ mkdir static $ mkdir static/css $ cd static/css $ nano main.css body {   margin: 0;   padding: 0;   font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;   color: #444; } /*  * Create dark grey header with a white logo  */ header {   background-color: #2B2B2B;   height: 35px;   width: 100%;   opacity: .9;   margin-bottom: 10px; } header h1.logo {   margin: 0;   font-size: 1.7em;   color: #fff;   text-transform: uppercase;   float: left; } header h1.logo:hover {   color: #fff;   text-decoration: none; } /*  * Center the body content  */  .container {   width: 940px;   margin: 0 auto; } 380 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 381. div.jumbo {   padding: 10px 0 30px 0;   background-color: #eeeeee;   -webkit-border-radius: 6px;      -moz-border-radius: 6px;           border-radius: 6px; } h2 {   font-size: 3em;   margin-top: 40px;   text-align: center;   letter-spacing: -2px; } h3 {   font-size: 1.7em;   font-weight: 100;   margin-top: 30px;   text-align: center;   letter-spacing: -1px;   color: #999; } āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ layout.html āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļĢāļđāļ›āđāļšāļšāļāļēāļĢāđāļŠāļ”āļ‡āļ‚āļ­āļ‡āļŦāļ™āđ‰āļēāđ€āļ§āđŠāļ› $ nano layout.html <!DOCTYPE html> <html>   <head>     <title>Flask</title>        <strong><link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}"></strong>   </head>   <body>     <header>       <div class="container">         <h1 class="logo">Flask App</h1>       </div>      </header>          <div class="container">       {% block content %}       {% endblock %}     </div>   </body> </html> āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ home.html āđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļšāđƒāļ™āđ„āļŸāļĨāđŒ layout.html 381 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 382. $ nano home.html {% extends "layout.html" %} {% block content %}   <div class="jumbo">     <h2>Welcome to the Embedded System<h2>     <h3>This is the home page for the Home Automation<h3>   </div> {% endblock %} āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļŠāļļāļ”āļ—āđ‰āļēāļĒ āļ—āļģāļāļēāļĢāļ—āļ”āļ”āļŠāļ­āļšāđ€āļ›āļīāļ”āļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒāļ—āļĩāđˆāļ•āļģāđāļŦāļ™āđˆāļ‡ localhost:5000 āļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 7.15 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļŦāļ™āđ‰āļēāļšāļĢāļēāļ§āđ€āļ‹āļ­āļĢāđŒ āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļāļģāļŦāļ™āļ” CSS Style āđ„āļ§āđ‰ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļžāļąāļ’āļ™āļēāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļš Android āđāļĨāļ° Arduino Accessory Development Kit (ADK) āļ„āļ·āļ­āļāļēāļĢāļžāļąāļ’āļ™āļēāļ•āđˆāļ­āļĒāļ­āļ”āļ‚āļ­āļ‡āļŪāļēāļĢāđŒāđāļ§āļĢāđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļĄāļ·āļ­ āļŠāļĄāļąāļ„āļĢāđ€āļĨāđˆāļ™ āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđƒāļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļ•āđˆāļēāļ‡āđ† āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš āļ­āļļāļ›āļāļĢāļ“āđŒāđ€āļŠāļĢāļīāļĄāļŠāļģāļŦāļĢāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒāđāļĨāļ°āđāļ—āđ‡āļ›āđ€āļĨāđ‡āļ•āļ—āļĩāđˆāļĄāļĩāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļ™āļąāļšāđ€āļ›āđ‡āļ™āļˆāļļāļ”āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™ āļŠāļģāļ„āļąāļāđƒāļ™āļ§āļ‡āļāļēāļĢāļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļēāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļˆāļ°āđ€āļāļīāļ”āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāļŠāļīāđˆāļ‡āđƒāļŦāļĄāđˆāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āļ‡āļēāļ™ Google I/O 2011 āļ—āļēāļ‡āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨāļāđ‡āđ„āļ”āđ‰āđ€āļ›āļīāļ”āļ•āļąāļ§ ADK āļĢāļļāđˆāļ™āđāļĢāļ āđāļĨāļ°āļ•āđˆāļ­āļĄāļēāļšāļĢāļīāļĐāļąāļ—āđƒāļ™ āļāļĩāđˆāļ›āļļāđˆāļ™āļŠāļ·āđˆāļ­ RT Corporation āđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ” RT-ADK āļ‹āļķāđˆāļ‡āļ–āļ·āļ­āļ§āđˆāļēāđ€āļ›āđ‡āļ™āļšāļ­āļĢāđŒāļ” Arduino (http://www.arduino.cc) āļ—āļĩāđˆāļ–āļđāļāļœāļĨāļīāļ•āļ­āļ­āļāļĄāļē āđ‚āļ”āļĒāļ āļēāļĒāđƒāļ™āđƒāļŠāđ‰āđ„āļĄāđ‚āļ„āļĢāļ„āļ­āļ™āđ‚āļ—āļĢāļĨāđ€āļĨāļ­āļĢāđŒ ATMega 2560 āļžāļĢāđ‰āļ­āļĄ āļāļąāļšāļŠāļļāļ”āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒāļ•āđˆāļēāļ‡āđ† āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ™āļĩāđ‰āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļļāļ”āđ€āļ”āđˆāļ™āļ‚āļ­āļ‡ Arduino āļ„āļ·āļ­āđ„āļ”āđ‰āļ–āļđāļ āļ­āļ­āļāđāļšāļšāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļ‚āļĒāļēāļĒāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ”āđ‚āļĄāļ”āļđāļĨāļ­āļ·āđˆāļ™āđ† āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļ§āđˆāļēāļšāļ­āļĢāđŒāļ” Shield āđ€āļŠāđˆāļ™āļšāļ­āļĢāđŒāļ” Ethernet Shield āļšāļ­āļĢāđŒāļ” WIFI Shield āļšāļ­āļĢāđŒāļ” Bluetooth Shield āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 382 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 383. āļĢāļđāļ›āļ—āļĩāđˆ 7.16 āļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļœāđˆāļēāļ™ ADK āđāļĨāļ°āļšāļ­āļĢāđŒāļ” RT-ADK āļĢāļļāđˆāļ™āđāļĢāļ āļĢāļđāļ›āđāļšāļšāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļˆāļ°āđ€āļ›āđ‡āļ™āđāļšāļš Android Open Accessory (AOA Protocol) āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢ āļ•āļīāļ”āļ•āđˆāļ­āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļ™āđ„āļ”āđ‰āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ (Android Devices) āļœāđˆāļēāļ™āļŠāļēāļĒāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ USB Android Open Accessory Android Open Accessory āđ„āļ”āđ‰āļ–āļđāļāļžāļąāļ’āļ™āļēāļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļŠāļēāļĄāļēāļĢāļ–āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļœāđˆāļēāļ™āļ—āļēāļ‡ USB āđ„āļ›āļĒāļąāļ‡ USB Host āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļ āđāļ•āđˆāļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļˆāļ°āđ„āļĄāđˆ āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļžāļĨāļąāļ‡āļ‡āļēāļ™āđ„āļŸāļŸāđ‰āļēāļˆāļēāļāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļ āļēāļĒāļ™āļ­āļāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāđāļŦāļĨāđˆāļ‡āļˆāđˆāļēāļĒāļžāļĨāļąāļ‡āļ‡āļēāļ™ āđ„āļŸāļŸāđ‰āļēāļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡āđāļĨāļ°āļ•āđ‰āļ­āļ‡āļĄāļĩāļĢāļ°āļ”āļąāļšāļāļĢāļ°āđāļŠāđ„āļĄāđˆāļ™āđ‰āļ­āļĒāļāļ§āđˆāļē 500mA āļ—āļĩāđˆāļ„āļ§āļēāļĄāļ•āđˆāļēāļ‡āļĻāļąāļāļĒāđŒāđ„āļŸāļŸāđ‰āļē 5V āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ– āļŠāļ·āđˆāļ­āļŠāļēāļĢāļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ„āļ”āđ‰ āļŠāļģāļŦāļĢāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āļ™āļąāđ‰āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ‚āļ”āļĒāđƒāļŠāđ‰ āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE (www.arduino.cc) āļŦāļĢāļ·āļ­āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE (āļšāļĢāļīāļĐāļąāļ—āļāļđāđ€āļāļīāļĨ) āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE āļŦāļĨāļąāļāļˆāļēāļāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE āļˆāļēāļ Android ADK āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļĨāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ āļ„āļ­āļĄāļžāļīāļ§āđ€āļ•āļ­āļĢāđŒāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ āļŦāļ™āđ‰āļēāļ•āļēāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ„āļĨāđ‰āļēāļĒ Arduino IDE āđāļ•āđˆāļˆāļ°āļĄāļĩāļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ„āļĨāļšāļēāļĢāļĩāļ—āļēāļ‡āļ”āđ‰āļēāļ™ Us- bAccessory āļ—āļĩāđˆāļāļđāđ€āļāļīāļĨāđ„āļ”āđ‰āļžāļąāļ’āļ™āļēāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļ‚āđ‰āļēāļĄāļēāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļāļēāļĢāļĨāļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļāđ‡āļ—āļģāđ„āļ”āđ‰āđ‚āļ”āļĒāļāļēāļĢāđāļ•āļāđ„āļŸāļĨāđŒāđ„āļĨāļšāļĢāļēāļĢāļĩāđāļĨāđ‰āļ§āļ„āļąāļ”āļĨāļ­āļāđ„āļ›āđƒāļ§āđ‰āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē libraries 383 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 384. āļĢāļđāļ›āļ—āļĩāđˆ 7.17 āļŦāļ™āđ‰āļēāļ•āļēāđ‚āļ›āļĢāđāļāļĢāļĄ ADK2012 IDE āļ›āļąāļˆāļˆāļļāļšāļąāļ™āđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļžāļąāļ’āļ™āļēāļšāļ­āļĢāđŒāļ” Arduino āļ­āļ­āļāļĄāļēāļ”āđ‰āļ§āļĒāļāļąāļ™āļŦāļĨāļēāļĒāļĢāļļāđˆāļ™āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āļ™āļąāļ āļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™āđāļĨāļ°āļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āđ€āļ­āļē āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļĄāļēāđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ•āđ‡āļĄāļ—āļĩāđˆāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāļĄāļēāļ°āļŠāļĄāļāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ•āļēāļĢāļēāļ‡ 7.1 āđāļŠāļ”āļ‡āļĢāļļāđˆāļ™āļ•āđˆāđˆāļēāļ‡āđ†āļ‚āļ­āļ‡ Arduino āļĢāļļāđˆāļ™āļšāļ­āļĢāđŒāļ” ArduinoāļĢāļļāđˆāļ™āļšāļ­āļĢāđŒāļ” Arduino Arduino Uno Arduino BT w/ ATmega328 Arduino Duemilanove w/ ATmega328 Arduino BT w/ ATmega168 Arduino Diecimila or Duemilanove w/ ATmega 168 LilyPad Arduino USB Arduino Nano w/ ATmega328 LilyPad Arduino w/ ATmega328 Arduino Nano w/ ATmega168 LilyPad Arduino w/ ATmega168 Arduino Mega 2560 or Mega ADK Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega328 Arduino Mega (ATmega1280) Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega168 Arduino Leonardo Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega328 Arduino Esplora Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168 Arduino Micro Arduino NG or older w/ ATmega168 Arduino Mini w/ ATmega328 Arduino NG or older w/ ATmega8 384 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 385. Arduino Mini w/ ATmega168 Arduino Robot Control Arduino Ethernet Arduino Robot Motor Arduino Fio āļĢāļđāļ›āļ—āļĩāđˆ 7.18 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļšāļ­āļĢāđŒāļ” Arduino āđāļ•āđˆāļĨāļ°āļĢāļļāđˆāļ™ āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļšāļ­āļĢāđŒāļ” Arduino āļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āļšāļ­āļĢāđŒāļ” Arduino āđ€āļĢāļīāđˆāļĄ āļ—āļģāļ‡āļēāļ™ āļ‚āļķāđ‰āļ™ āđ‚āļ„āđ‰āļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ•āļąāđ‰āļ‡āļ„āđˆāļē Setup() āļāđ‡āļˆāļ°āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļ™āļ„āļĢāļąāđ‰āļ‡āđāļĢāļ āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļ™āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļąāđ‰āļ‡ āļ„āđˆāļēāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļšāļ­āļĢāđŒāļ” āđāļĨāļ°āļāļēāļĢāļāļģāļŦāļ™āļ”āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āļāļąāļšāļžāļ­āļĢāđŒāļ•āļ•āđˆāļēāļ‡āđ† āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™ 385 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 386. āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļĨāļđāļ› loop() āđƒāļ™āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ™āļĩāđ‰āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ§āļ™āļ—āļģāļ‡āļēāļ™āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ loop() āļ™āļĩāđ‰āđ„āļ›āđ€āļĢāļ·āđˆāļ­āļĒāđ†āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļĄāļĩāļ„āļģāļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļĢāļĩāđ€āļ‹āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ”āđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡ (Arduino Reset) āļĢāļđāļ›āļ—āļĩāđˆ 7.19 āđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Android āļāļąāļš Arduino āļœāđˆāļēāļ™ ADK āļ„āļĨāļēāļŠāļŠāļģāļ„āļąāļāļ āļēāļĒāđƒāļ™ ADK2012 IDE āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļœāđˆāļēāļ™ ADK āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđāļĨāļ° Ar- duino āļ™āļąāđ‰āļ™āđ„āļ”āđ‰āđāļāđˆāļ„āļĨāļēāļŠ AndroidAccessory āļ‹āļķāđˆāļ‡āļĄāļĩāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ āļēāļĒāđƒāļ™āļ”āļąāļ‡āļ™āļĩāđ‰ class AndroidAccessory { private:     const char *manufacturer;     const char *model;     const char *description;     const char *version;     const char *uri;     const char *serial; ...     int getProtocol(byte addr);     void sendString(byte addr, int index, const char *str);     bool switchDevice(byte addr);     bool findEndpoints(byte addr, EP_RECORD *inEp, EP_RECORD *outEp);     bool configureAndroid(void); public:     AndroidAccessory(const char *manufacturer,                      const char *model,                      const char *description,                      const char *version,                      const char *uri,                      const char *serial);     void powerOn(void); 386 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 387.     bool isConnected(void);     int read(void *buff, int len, unsigned int nakLimit = USB_NAK_LIMIT);     int write(void *buff, int len); }; āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŦāļĨāļąāļāļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ setup() āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļ›āļīāļ” Android Accessory āļ„āļ·āļ­ pow- erOn(), read() āđāļĨāļ° write() āđ‚āļ”āļĒāļ—āļĩāđˆāļ•āļąāļ§āđāļ›āļĢ buff āļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļŠāđˆāļ‡āļ­āļ­āļāļŦāļĢāļ·āļ­āļĢāļąāļšāđ€āļ‚āđ‰āļē āļĄāļēāļˆāļēāļāļāļąāđˆāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļœāđˆāļēāļ™āļ—āļēāļ‡ USB āļ•āļēāļĄāļ‚āļ™āļēāļ”āļ„āļ§āļēāļĄāļĒāļēāļ§āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (len) āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļąāļš āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ€āļ•āđ‡āļĄāļ„āļ§āļēāļĄāđ€āļĢāđ‡āļ§ (Full Speed USB) āđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ read() āļ™āļąāđ‰āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļ„āđˆāļē NAK āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļšāļ­āļ āļ„āđˆāļēāļŠāļ–āļēāļ™āļ°āļ§āđˆāļēāļ­āļļāļ›āļāļĢāļ“āđŒāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāđ‰āļ™āļąāđ‰āļ™āļĒāļąāļ‡āđ„āļĄāđˆāļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļāļĨāļąāļšāļŦāļĢāļ·āļ­āļĒāļąāļ‡āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āđƒāļŦāđ‰āđƒāļ™āđ€āļ§āļĨāļēāļ™āļĩāđ‰ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļĒāļąāļ‡āļ–āļđāļāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ–āđˆāļēāļĒāđ‚āļ­āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĢāļąāļšāļ§āđˆāļēāđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āđƒāļŦāđ‰āđāļĨāđ‰āļ§ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āđāļĨāđ‰āļ§āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļĄāļēāļˆāļēāļāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ #include <AndroidAccessory.h> AndroidAccessory acc("Google, Inc.", "DemoKit", "DemoKit Arduino Board", "1.0", "http://www.android.com", "0000000012345678"); void Setup(){ acc.powerOn(); // āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ Android Accessory } void loop(){ if (acc.isConnected()) { // āļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļ Android int len = acc.read(msg, sizeof(msg), 1); } } āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāđˆāļ§āļ™āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđƒāļ™āļāļąāđˆāļ‡āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļˆāļ°āđƒāļŠāđ‰āļ„āļĨāļēāļŠāļŦāļĨāļąāļāđ„āļ”āđ‰āđāļāđˆāļ„āļĨāļēāļŠ UsbManager āđāļĨāļ°āļ„āļĨāļēāļŠ UsbAccessory āļ—āļĩāđˆāļāļđāđ€āļāļīāļĨ āđ„āļ”āđ‰āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰āđƒāļŦāđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđāļĨāđ‰āļ§ āđ‚āļ”āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđāļĢāļāļ™āļąāļāļžāļąāļ’āļ™āļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļ„āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ‚āļķāđ‰āļ™āļĄāļēāđāļĨāđ‰āļ§ āļ—āļģāļāļēāļĢāļĢāļ°āļšāļļāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ UsbAccessory āđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āđ„āļŸāļĨāđŒ AndroidManifest.xml āļ”āļąāļ‡āđāļŠāļ”āļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡ <application android:icon="@drawable/icon" android:label="@string/app_name" > <uses-library android:name="com.android.future.usb.accessory" /> ... 387 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 388. ... ... </application> āđ‚āļ„āđ‰āļ”āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļžāļ·āđˆāļ­āļ‚āļ­āđ€āļ›āļīāļ”āđāļĨāļ°āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļāļēāļĢāļĢāļąāļšāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ USB // āđ€āļ›āđ‡āļ™āļāļēāļĢāļāđāļēāļŦāļ™āļ” Intent āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļŠāđāļēāļŦāļĢāļąāļšāļāļēāļĢāļ”āļąāļāļ­āļĩāđ€āļ§āđ‰āļ™āļ—āđŒāļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK private PendingIntent mPermissionIntent; private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; private UsbManager mUsbManager; private UsbAccessory mAccessory; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mUsbManager = UsbManager.getInstance(this); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent( ACTION_USB_PERMISSION), 0); // āļāđāļēāļŦāļ™āļ” filter IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); // register āđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āļĢāļąāļš intent āđ„āļ”āđ‰ registerReceiver(mUsbReceiver, filter); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textView); } /** Called when the activity is resumed from its paused state and immediately after onCreate(). */ @Override public void onResume() { super.onResume(); if (mInputStream != null && mOutputStream != null) { return; } UsbAccessory[] accessories = mUsbManager.getAccessoryList(); UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { // āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒāđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ Accessory if (mUsbManager.hasPermission(accessory)) { openAccessory(accessory); // āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ accessory } else { synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { mUsbManager.requestPermission(accessory, mPermissionIntent); mPermissionRequestPending = true; } } } } else { 388 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 389. Log.d(TAG, "mAccessory is null"); } } /** āđ€āļĄāļ·āđˆāļ­ Application āļ–āļđāļāļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āļ—āđāļēāļāļēāļĢāļ›āļīāļ” Accessory */ @Override public void onPause() { super.onPause(); closeAccessory(); } /** āđ€āļĄāļ·āđˆāļ­āļ›āļīāļ” Application āļˆāļ°āļ—āđāļēāļāļēāļĢ unregister Intent */ @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mUsbReceiver); } āļˆāļēāļāđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āđ‚āļŦāļĄāļ”āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļœāđˆāļēāļ™ USB āļ‹āļķāđˆāļ‡āļŦāļēāļāļĄāļĩāļāļēāļĢ āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‚āđ‰āļēāļĄāļēāļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Arduino āļœāđˆāļēāļ™āļŠāļēāļĒ USB āļāđ‡āļˆāļ°āļ—āļģāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ openAccessory(accessory) āđ€āļĄāļ·āđˆāļ­ āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļĨāđ‰āļ§āļ āļēāļĒāđƒāļ™āļˆāļ°āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Thread āļ‚āļķāđ‰āļ™āļĄāļē āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļ­āļ­āļāļĄāļēāļˆāļēāļ āļšāļ­āļĢāđŒāļ” Arduino āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āļĢāļđāļ›āļ—āļĩāđˆ 7.20 āļœāļĨāļĨāļąāļžāļ˜āđŒāļāļēāļĢāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļšāļ­āļĢāđŒāļ” Arduino āļœāđˆāļēāļ™āļžāļ­āļĢāđŒāļ• USB āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ­āđˆāļēāļ™āđāļĨāļ°āđāļŠāļ”āļ‡āļŠāļąāļāļāļēāļ“āđ„āļŸāļŸāđ‰āļēāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­ (EMG) āļĢāļđāļ›āļ—āļĩāđˆ 7.21 āđāļŠāļ”āļ‡āļ āļēāļžāļĢāļ§āļĄāļ‚āļ­āļ‡āļĢāļ°āļšāļš āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļ§āļąāļ”āļŠāļąāļāļāļēāļ“āļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļˆāļēāļāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļ­āļĢāđŒāļ” Ar- duino āđāļĨāđ‰āļ§āļ–āļđāļāļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļ­āđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļœāđˆāļēāļ™āļŠāļēāļĒ USB āļ”āđ‰āļ§āļĒāļĄāļēāļ•āļĢāļēāļāļēāļ™ AOA Protocol āļŦāļĨāļąāļ‡ āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļķāļ‡āļ™āļģāļĄāļēāđāļŠāļ”āļ‡āļœāļĨāđƒāļ™āļĨāļąāļāļĐāļ“āļ°āļāļĢāļēāļŸāđ€āļŠāđ‰āļ™ āļ‹āļķāđˆāļ‡āļĄāļĩāđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ 2 āļŠāđˆāļ§āļ™āļ”āļąāļ‡āļ™āļĩāđ‰ 389 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 390. āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ‹āļĩāļšāļ™āļšāļ­āļĢāđŒāļ” Arduino āđāļĨāļ°āļāļēāļĢāļ•āđˆāļ­āļāļąāļšāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļĢāļđāļ›āļ—āļĩāđˆ 7.22 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āļŦāļĨāļąāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļ„āļ·āļ­āđāļœāđˆāļ™ EMG āļˆāļ°āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļŠāļ·āđˆāļ­āļ™āļģāđ„āļŸāļŸāđ‰āļēāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ‚āļĒāļąāļšāļĢāđˆāļēāļ‡āļāļēāļĒ āļˆāļ°āđ€āļāļīāļ”āļŠāļąāļāļāļēāļ“āļ—āļēāļ‡āđ„āļŸāļŸāđ‰āļēāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ—āļĩāđˆāđ„āļ›āļ•āļēāļĄāļāļĨāđ‰āļēāļĄāđ€āļ™āļ·āđ‰āļ­āļ‚āļ­āļ‡āļĢāđˆāļēāļ‡āļāļēāļĒ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđāļœāđˆāļ™ EMG āļˆāļ°āļ—āļģāļāļēāļĢāļ‚āļĒāļēāļĒ āļŠāļąāļāļāļēāļ“āļ—āļēāļ‡āđ„āļŸāļŸāđ‰āļēāļ™āļąāđ‰āļ™ āđƒāļŦāđ‰āļ­āļĒāļđāđˆāđƒāļ™āļŠāđˆāļ§āļ‡āļ—āļĩāđˆāļšāļ­āļĢāđŒāļ” Arduino āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļ§āļąāļ”āđ„āļ”āđ‰āđ‚āļ”āļĒāļ„āđˆāļēāļŠāļąāļāļāļēāļ“āļ—āļĩāđˆāđ„āļ”āđ‰āļ­āļ­āļāļĄāļēāļˆāļ° āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļĢāļ°āļ”āļąāļšāđāļĢāļ‡āļ”āļąāļ™āļāļĢāļ°āđāļŠāļ•āļĢāļ‡āļ‚āļ™āļēāļ”āļŠāđˆāļ§āļ‡ 0-5 āđ‚āļ§āļĨāļ—āđŒ āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļšāļ­āļĢāđŒāļ” Arduino āļˆāļ°āļ›āļĢāļ°āļāļ­āļšāđ„āļ›āļ”āđ‰āļ§āļĒ āļĄāļĩāļŠāļ­āļ‡āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļ„āļ·āļ­ āļŠāđˆāļ§āļ™āđāļĢāļāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ āļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē Analog Read Voltage (āļˆāļēāļāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡) āļŠāđˆāļ§āļ™āļ—āļĩāđˆāļŠāļ­āļ‡āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āļāļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ An- droid āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļē Analog āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ­āđˆāļēāļ™āđ„āļ”āđ‰āļœāđˆāļēāļ™ ADK āđ„āļ›āļĒāļąāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ Android āđ€āļžāļ·āđˆāļ­āļ™āļģ āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ•āđˆāļ­āđ„āļ› āļĢāļđāļ›āļ—āļĩāđˆ 7.23 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āđƒāļ™āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļšāļ™āļšāļ­āļĢāđŒāļ” Arduino āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļ›āļīāļ” accessory mode āđāļĨāđ‰āļ§āļ­āđˆāļēāļ™ āļ„āđˆāļēāđāļĢāļ‡āļ”āļąāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāđ€āļ‹āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļāđ‡āļˆāļ°āļ—āļģāļāļēāļĢāļˆāļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļĢāļđāļ›āđāļšāļš â€œE<āļ„āđˆāļēāļ—āļĩāđˆāļ­āđˆāļēāļ™āđ„āļ”āđ‰>” āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡ āļœāđˆāļēāļ™ USB āđ„āļ›āļĒāļąāļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāļ•āđˆāļ­āđ„āļ› āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰ #include <Wire.h> #include <Servo.h> #include <Max3421e.h> #include <Usb.h> #include <AndroidAccessory.h> #define LED3_RED 2 390 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 391. #define LED3_GREEN 4 #define LED3_BLUE 3 #define LED2_RED 5 #define LED2_GREEN 7 #define LED2_BLUE 6 #define LED1_RED 8 #define LED1_GREEN 10 #define LED1_BLUE 9 AndroidAccessory acc("Google, Inc.", "DemoKit", "DemoKit Arduino Board", "1.0", "http://www.android.com", "0000000012345678"); boolean sendData=false; void setup(); void loop(); void init_leds() { digitalWrite(LED1_RED, 1); digitalWrite(LED1_GREEN, 1); digitalWrite(LED1_BLUE, 1); pinMode(LED1_RED, OUTPUT); pinMode(LED1_GREEN, OUTPUT); pinMode(LED1_BLUE, OUTPUT); digitalWrite(LED2_RED, 1); digitalWrite(LED2_GREEN, 1); digitalWrite(LED2_BLUE, 1); pinMode(LED2_RED, OUTPUT); pinMode(LED2_GREEN, OUTPUT); pinMode(LED2_BLUE, OUTPUT); digitalWrite(LED3_RED, 1); digitalWrite(LED3_GREEN, 1); digitalWrite(LED3_BLUE, 1); pinMode(LED3_RED, OUTPUT); pinMode(LED3_GREEN, OUTPUT); pinMode(LED3_BLUE, OUTPUT); } byte b1, b2, b3, b4, c; int value=0; void setup() { pinMode(0, INPUT); 391 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 392. Serial.begin(115200); Serial.print("rnStart"); init_leds(); c = 0; acc.powerOn(); } void loop() { byte err; byte idle; static byte count = 0; byte msg[5]; long touchcount; if (acc.isConnected()) { value = analogRead(0); msg[0] = 'E'; msg[1] = value; acc.write(msg, sizeof(msg)); Serial.println("f"); Serial.println(msg[0]); Serial.println(msg[1]); } } āļžāļąāļ’āļ™āļēāļŠāđˆāļ§āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ ADK āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™āļāļĢāļēāļŸāđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļˆāļ°āļ­āļ˜āļīāļšāļēāļĒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļžāļ·āđˆāļ­āļ™āļģ āļĄāļēāđāļŠāļ”āļ‡āļœāļĨāļ—āļąāļ™āļ—āļĩāļ—āļĩāđˆāļĢāļąāļšāđ„āļ”āđ‰āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļšāļ­āļĢāđŒāļ” Arduino āđ‚āļ”āļĒāļāļēāļĢāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩāļŠāļ·āđˆāļ­āļ§āđˆāļē GraphView āļ‹āļķāđˆāļ‡ āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāđ„āļ”āđ‰āļ—āļąāđ‰āļ‡āđāļšāļšāļŠāļ™āļīāļ”āļāļĢāļēāļŸāđ€āļŠāđ‰āļ™ āđāļĨāļ°āļāļĢāļēāļŸāđāļ—āđˆāļ‡ int num = 150; // āļˆāđāļēāļ™āļ§āļ™āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ GraphViewData[] data = new GraphViewData[num]; double v = 0; for (int i = 0; i < num; i++) { v += 0.2; // āļ„āđāļēāļ™āļ§āļ“āļ„āđˆāļēāđƒāļ™āđāļ•āđˆāļĨāļ°āļˆāļļāļ”āļ—āļĩāđˆāļˆāļ°āļ—āđāļēāļāļēāļĢ plot āļāļĢāļēāļŸ data[i] = new GraphViewData(i, Math.sin(v)); } GraphView graphView = new LineGraphView(this, "AndroidGraph"); graphView.addSeries(new GraphViewSeries(data)); // āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļāļĢāļēāļŸāđƒāļŦāđˆāđ‰āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļˆāļļāļ”āļ—āļĩāđˆ 2 āđƒāļŦāđ‰āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļ—āđˆāļēāļāļąāļš 40 āļŠāđˆāļ­āļ‡ graphView.setViewPort(2, 40); // āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ– Scroll āđ„āļ”āđ‰ graphView.setScrollable(true); 392 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 393. graphView.setScalable(true); LinearLayout layout = (LinearLayout) findViewById(R.id.lay1); layout.addView(graphView); // āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļāļąāļšāđāļāļ™ X graphView.setHorizontalLabels(new String[] {"2 days ago", "yesterday", "today", "to- morrow"}); // āļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŦāđ‰āļāļąāļšāđāļāļ™ Y graphView.setVerticalLabels(new String[] {"high", "middle", "low"}); āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļŠāđ‰āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ GrapViewSeries āđƒāļŦāļĄāđˆāļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ›āđƒāļ™āļāļēāļĢ Graph- View āļ—āļĩāđˆāđ„āļ”āđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļ§āđ‰āđāļĨāđ‰āļāđˆāļ­āļ™āļŦāļ™āđ‰āļēāđ€āļŠāđˆāļ™ // draw sin curve int num = 150; GraphViewData[] data = new GraphViewData[num]; double v = 0; for (int i = 0; i < num; i++) { v += 0.2; data[i] = new GraphViewData(i, Math.sin(v)); } GraphViewSeries seriesSin = new GraphViewSeries(data); // draw cos curve data = new GraphViewData[num]; v=0; for (int i=0; i<num; i++) { v += 0.2; data[i] = new GraphViewData(i, Math.cos(v)); } GraphViewSeries seriesCos = new GraphViewSeries( data); āļˆāļēāļāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļāļĢāļēāļŸāļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļĄāļĩ āđāļ•āđˆāđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļāļēāļĢāļ™āļģāļ„āđˆāļē EMG āļĄāļēāđāļŠāļ”āļ‡āļ™āļąāđ‰āļ™ āđ€āļ›āđ‡āļ™āļāļēāļĢāđāļŠāļ”āļ‡āđāļšāļšāđ€āļ§āļĨāļēāļˆāļĢāļīāļ‡ (Real-time) āļˆāļķāļ‡āļˆāļģāđ€āļ›āđ‡āļ™āļˆāļ°āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āļ‚āļ­āļ‡āđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāļ§āļ™āļĢāļ­āļš āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļāļĢāļēāļŸāļ—āļąāļ™āļ—āļĩāđ€āļĄāļ·āđˆāļ­āđ„āļ”āđ‰āļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļŦāļĄāđˆāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāļĄāļē āđ‚āļ”āļĒāđƒāļŠāđ‰ Handler āđāļĨāļ° Runnable āļ”āļąāļ‡ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ // āđ‚āļ„āđ‰āļ”āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Runnable āļ‚āļķāđ‰āļ™āļĄāļēāđ€āļžāļ·āđˆāļ­āļ—āđāļēāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļąāļ§āļŠāđˆāļ‡āļ„āđˆāļēāļ‚āļķāđ‰āļ™āđ„āļ›āđ€āļžāļ·āđˆāļ­āļ—āđāļēāļāļēāļĢ plot āļāļĢāļēāļŸ āļˆāļēāļāļ™āļąāđ‰āļ™āļˆāļ°āđƒāļŠāđ‰ Handler āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āļĨāļđāļ›āđƒāļ™āļāļēāļĢāļ§āļ™āļ—āļļāļ 1 āļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ Handler mHandler = new Handler(); Runnable mTimer1; mTimer1 = new Runnable() { @Override public void run() { graph2LastXValue += 1d; exampleSeries2.appendData(new GraphViewData(graph2LastXValue, getRandom()), true); mHandler.postDelayed(this, 1); } }; 393 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 394. āđ€āļĄāļ·āđˆāļ­āļ–āļķāļ‡āļˆāļļāļ”āļ™āļĩāđ‰āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļāļĢāļēāļŸāļ—āļĩāđˆāļĄāļĩāļāļēāļĢ plot āđāļšāļš Real-time āđ„āļ”āđ‰āļ•āđˆāļ­āļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđāļšāļš Async Task āđ€āļžāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļ­āđˆāļēāļ™āļ„āđˆāļēāļ—āļĩāđˆāļ–āļđāļāļŠāđˆāļ‡āļœāđˆāļēāļ™āļĄāļēāļ—āļēāļ‡ ADK āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ // āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™ ADK āđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ InputStream āđ€āļžāļ·āđˆāļ­āđ€āļ•āļĢāļĩāļĒāļĄāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ private void openAccessory(UsbAccessory accessory) { mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); new receiveData().execute(); enableControls(true); } } public class receiveData extends AsyncTask<Object, Void, Void> { @Override protected Void doInBackground(Object... params) { while (true) { // āļ—āđāļēāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ array Buffer ret = mInputStream.read(buffer); /* āļ—āđāļēāļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļĨāļ°āđ€āļāđ‡āļšāđ„āļ§āđ‰ āļˆāļēāļāļ™āļąāđ‰āļ™āđƒāļŦāđ‰āļ”āļķāļ‡āļ„āđˆāļēāļ•āļąāļ§āđāļ›āļĢāļ”āļąāļ‡āļāļĨāđˆāļēāļ§āļ™āđāļēāđ„āļ› plot āļāļĢāļēāļŸ */ } } } āļĢāļđāļ›āļ—āļĩāđˆ 7.24 āđāļŠāļ”āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒ EMG āļāļąāļšāļšāļ­āļĢāđŒāļ” Arduino 394 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 395. āļšāļ—āļŠāļĢāļļāļ›āđāļĨāļ°āļāđ‰āļēāļ§āļ•āđˆāļ­āđ„āļ›... āđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĨāđ‰āļ§āļ™āđāļĨāđ‰āļ§āđ„āļ”āđ‰āļĄāļēāļˆāļēāļāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ‚āļ­āļ‡āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ—āļĩāđˆāļžāļĒāļēāļĒāļēāļĄāđ€āļāđ‡āļšāļĢāļ§āļšāļĢāļ§āļĄ āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ•āđˆāļēāļ‡āđ†āđƒāļ™āļ•āļĨāļ­āļ”āļĢāļ°āļĒāļ°āđ€āļ§āļĨāļēāļŦāļĨāļēāļĒāļŠāļīāļšāļ›āļĩ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļĒāļąāļ‡āđ„āļ”āđ‰āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāļĄāļēāļˆāļēāļāļŦāļ™āļąāļ‡āļŠāļ·āļ­ Textbook āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ Embedded Linux Primer A Practical Real World Approach, Pro Linux Embedded Systems, Building Embedded Linux Systems, Embedded Android, An- droid Native Development Kit Cookbook āļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļĄāļĩāļ„āļ§āļēāļĄāļ•āļąāđ‰āļ‡āđƒāļˆāļ­āļĒāļēāļāļˆāļ°āļ—āļģāļāļēāļĢāļ–āđˆāļēāļĒāļ—āļ­āļ”āļ­āļ­āļ āļĄāļēāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ āļēāļĐāļēāđ„āļ—āļĒāđ€āļžāļ·āđˆāļ­āļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ™āđ„āļ—āļĒ āļ‹āļķāđˆāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒāļ™āđˆāļēāļˆāļ°āļžāļ­āļ—āļĩāđˆāļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāļˆāļļāļ”āļ›āļĢāļ°āļāļēāļĒāļ„āļ§āļēāļĄ āļāļąāļ™āđƒāļŦāđ‰āļāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđ„āļ—āļĒāđƒāļŦāđ‰āļŦāļąāļ™āļĄāļēāđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāđƒāļ™āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđ„āļ”āđ‰āđ„āļĄāđˆāļĄāļēāļāļāđ‡āļ™āđ‰āļ­āļĒ āđ‚āļ”āļĒāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āļĢāļ§āļšāļĢāļ§āļĄāļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒ āļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļ•āđˆāļēāļ‡āđ†āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ (C, C++, JAVA, Python) āļĄāļļāļĄāļĄāļ­āļ‡āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩ āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāļ™āļąāļāļžāļąāļ’āļ™āļēāļ„āļ§āļĢāļĢāļđāđ‰ āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļˆāļ°āļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĨāļ‡āđƒāļ™āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ” āđ€āļŠāļīāļ‡āļĨāļķāļāļĄāļēāļāļŠāļąāļāđ€āļ—āđˆāļēāđƒāļ” āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āđ‰āļ­āļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ­āļ‡āļ„āđŒāļ„āļ§āļēāļĄāļĢāļđāđ‰āļˆāļēāļāļĻāļēāļŠāļ•āļĢāđŒāļ”āđ‰āļēāļ™āļ•āđˆāļēāļ‡āđ†āđāļĨāđ‰āļ§āļ™āļģāļĄāļēāđ€āļĢāļĩāļĒāļš āđ€āļĢāļĩāļĒāļ‡āļ­āļĒāļđāđˆāđ„āļ§āđ‰āđƒāļ™āļšāļ—āđāļ•āđˆāļĨāļ°āļšāļ—āđƒāļŦāđ‰āļ„āļĢāļšāļ–āđ‰āļ§āļ™āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļœāļđāđ‰āļ­āđˆāļēāļ™āļŠāļēāļĄāļēāļĢāļ–āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āđāļ•āđˆāļĨāļ°āļŠāđˆāļ§āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāļŠāđˆāļ§āļ™ āđƒāļ”āļšāđ‰āļēāļ‡āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āļ­āđˆāļēāļ™āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļˆāļ°āļāđ‰āļēāļ§āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļĢāļ°āļšāļš āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļˆāļĢāļīāļ‡āļˆāļąāļ‡āđ„āļ”āđ‰āļĄāļĩāđ‚āļ­āļāļēāļŠāļ—āļ”āļĨāļ­āļ‡āđƒāļŠāđ‰āļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ•āđˆāļēāļ‡āđ†āļ—āļąāđ‰āļ‡āļšāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļĨāļ°āļĢāļ°āļšāļš āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āļ—āļģāļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļ„āļļāđ‰āļ™āđ€āļ„āļĒāļĄāļēāļāļĒāļīāđˆāļ‡āļ‚āļķāđ‰āļ™ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āļ„āļ‡āļĄāļĩāđ€āļ™āļ·āđ‰āļ­āļŦāļēāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļ—āļ„āļ™āļīāļ„āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āļ­āļāđāļšāļšāļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āļ—āļĩāđˆāļ™āđˆāļēāļŠāļ™āđƒāļˆāļ­āļĩāļāļĄāļēāļāđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢāļžāļąāļ’āļ™āļēāļ āļēāļĒāđƒāļ•āđ‰āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāđāļšāļšāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™ āļ”āļĢāļ­āļĒāļ”āđŒ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ āļ—āļĩāđˆāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āļ•āļąāđ‰āļ‡āđƒāļˆāđ„āļ§āđ‰āļ§āđˆāļēāļˆāļ° āļžāļĒāļēāļĒāļēāļĄāđ€āļĢāļĩāļĒāļšāđ€āļĢāļĩāļĒāļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđƒāļ™āđ€āļĨāđˆāļĄāļ–āļąāļ”āđ†āđ„āļ› āļ‹āļķāđˆāļ‡āđ„āļ”āđ‰āđāļāđˆ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļŠāļĨāļĨāđŒāļŠāļ„āļĢāļīāļ›āļ—āđŒāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ â€Ē āļāļēāļĢāļ›āļĢāļąāļšāđāļ•āđˆāļ‡āļĨāļĩāļ™āļļāļāļ‹āđŒāđ€āļ„āļ­āļĢāđŒāđ€āļ™āļĨāđāļĨāļ°āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Open Sources â€Ē āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒ āđ€āļŠāđˆāļ™ Web Server, File Server āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āđ€āļžāļ·āđˆāļ­āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Linux Kernel Module āļŠāļģāļŦāļĢāļąāļšāļ‡āļēāļ™āļ›āļĢāļ°āļĒāļļāļāļ•āđŒ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļžāļ·āđˆāļ­āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩ Native C/C++ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄ Qt 5.2 āļŠāļģāļŦāļĢāļąāļšāļ­āļ™āļēāļ„āļ•āļ‚āļ­āļ‡āļ­āļļāļ›āļāļĢāļ“āđŒāļŠāļ™āļīāļ”āļžāļāļžāļē â€Ē āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđāļĨāļ°āļ›āļĢāļąāļšāđāļ•āđˆāļ‡ Android Framework â€Ē āļāļĨāđ„āļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđƒāļ™āļĢāļ°āļ”āļąāļšāļĨāđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļŠāđˆāļ™ Android IPC/Binder Framework, Android Hardware Abstract Layer (HAL) āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļē Android NDK Application â€Ē āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ›āļĢāđāļāļĢāļĄāļ›āļĢāļ°āļĒāļļāļāļ•āđŒāļ”āđ‰āļ§āļĒāļšāļ­āļĢāđŒāļ”āļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļŠāđˆāļ™ BeagleBone, BeagleBoard xM, iMX53 QSB, PandaBoard ES, AM335x Starter Kit, ODROID-X2, RaspBerry Pi, Intel Galileo āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™ 395 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 396. āļ›āļĢāļ°āļ§āļąāļ•āļīāļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ āļœāļđāđ‰āļŠāđˆāļ§āļĒāļĻāļēāļŠāļ•āļĢāļēāļˆāļēāļĢāļĒāđŒāļ§āļīāļĢāļļāļŽāļŦāđŒ āļĻāļĢāļĩāļšāļĢāļīāļĢāļąāļāļĐāđŒ āļ­āļēāļˆāļēāļĢāļĒāđŒāļ›āļĢāļ°āļˆāļģāļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļ—āļģāļ‡āļēāļ™ 2553 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĢāļ­āļ‡āļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāļžāļąāļ’āļ™āļēāļ™āļīāļŠāļīāļ• āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2553 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļāļĢāļĢāļĄāļāļēāļĢāļšāļĢāļīāļŦāļēāļĢāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ (TESA) 2550 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļŦāļąāļ§āļŦāļ™āđ‰āļēāļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļ—āļĪāļĐāļāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđ‰āļ™āļŠāļđāļ‡ (ESTIA) āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2548 - āļ›āļąāļˆāļˆāļļāļšāļąāļ™ āļĢāļ­āļ‡āļ›āļĢāļ°āļ˜āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ§āļīāļˆāļąāļĒāđ‚āļĨāļˆāļīāļŠāļ•āļīāļāļŠāđŒāđāļĨāļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ (āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļŠāļĄāļ­āļ‡ āļāļĨāļāļąāļ‡āļ•āļąāļ§) BAL-LABS āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2550 - 2551 āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļœāļđāđ‰āļ„āļīāļ”āļ„āđ‰āļ™āļ­āļ­āļāđāļšāļšāļĢāļ°āļšāļšāļŠāļ·āđˆāļ­āļŠāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāđ„āļĢāđ‰āļŠāļēāļĒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļĢāļ–āđāļĨāļ°āļŠāļ–āļēāļ™āļĩ RFID Sensor Network āđāļĨāļ°āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŠāļ–āļēāļ™āļĩ RFID Sensor Network āđāļĨāļ° āļĻāļđāļ™āļĒāđŒāļ„āļ§āļšāļ„āļļāļĄāļāļĨāļēāļ‡ 2549 - 2550 āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŪāļēāļĢāđŒāļ”āđāļ§āļĢāđŒāđāļĨāļ°āļ‹āļ­āļŸāļ•āđŒāđāļ§āļĢāđŒāđƒāļŦāđ‰āļāļąāļšāļšāļĢāļīāļĐāļąāļ— Endemol āļœāļđāđ‰ āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļēāļ‚āļ­āļ‡āļĢāļēāļĒāļāļēāļĢ Fear Factor, Survivor āđāļĨāļ° 1 versus 100 2549 - 2551 āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2549 - 2552 āļ„āļ“āļ°āļāļĢāļĢāļĄāļāļēāļĢāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ 2547 - 2548 āļĢāļ­āļ‡āļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāļāļīāļˆāļāļēāļĢāļžāļīāđ€āļĻāļĐ āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2546 - 2547 āļĢāļąāļāļĐāļēāļĢāļēāļŠāļāļēāļĢāđāļ—āļ™āļœāļđāđ‰āļŠāđˆāļ§āļĒāļ„āļ“āļšāļ”āļĩāļāđˆāļēāļĒāđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļŠāļēāļĢāļŠāļ™āđ€āļ—āļĻ āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļē āļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2544 - 2546 āļŦāļąāļ§āļŦāļ™āđ‰āļēāļ—āļĩāļĄ Wireless Sensor Network Team āđ‚āļ„āļĢāļ‡āļāļēāļĢ Korea Brain Project, Korea University, Seoul, Republic of South Korea 396 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē !
  • 397. āļĢāļēāļ‡āļ§āļąāļĨāļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļš 2555 āļĢāļēāļ‡āļ§āļąāļĨāļĢāļąāļ•āļ™āļšāļđāļĢāļžāļē āļŠāļēāļ‚āļēāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŠāļĢāļĢāļ„āđŒāđāļĨāļ°āļ›āļĢāļ°āļ”āļīāļĐāļāđŒāļ„āļīāļ”āļ„āđ‰āļ™ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļĢāļđāļžāļē 2553 āļĢāļēāļ‡āļ§āļąāļĨāļŠāļīāđˆāļ‡āļ›āļĢāļ°āļ”āļīāļĐāļāđŒāļ—āļēāļ‡āļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒāļ—āļĩāđˆāļĄāļĩāļĻāļąāļāļĒāļ āļēāļžāļŠāļđāļ‡āđƒāļ™āļāļēāļĢāļĨāļ‡āļ—āļļāļ™ āđ‚āļ”āļĒāļŠāļģāļ™āļąāļāļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒ āđāļĨāļ°āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NSTDA) āļāļĢāļ°āļ—āļĢāļ§āļ‡āļ§āļīāļ—āļĒāļēāļĻāļēāļŠāļ•āļĢāđŒ 2552 āļĢāļēāļ‡āļ§āļąāļĨāļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđāļŦāđˆāļ‡āļŠāļēāļ•āļīāļ—āļēāļ‡āļ”āđ‰āļēāļ™āđ€āļĻāļĢāļĐāļāļāļīāļˆ āđƒāļ™āļŠāļ·āđˆāļ­ â€œāļĢāļ°āļšāļšāđ€āļ„āļĢāļ·āļ­āļ‚āđˆāļēāļĒāđ€āļ‹āđ‡āļ™āđ€āļ‹āļ­āļĢāđŒāđ„āļĢāđ‰āļŠāļēāļĒ” āđ€āļžāļ·āđˆāļ­āđƒāļŠāđ‰āđƒāļ™āļāļēāļĢ āļ•āļīāļ”āļ•āļēāļĄāļĒāļēāļ™āļžāļēāļŦāļ™āļ°āđāļšāļšāđ€āļĢāļĩāļĒāļĨāđ„āļ—āļĄāđŒ āļŠāļģāļ™āļąāļāļ‡āļēāļ™āļ™āļ§āļąāļ•āļāļĢāļĢāļĄāđāļŦāđˆāļ‡āļŠāļēāļ•āļī (NIA) 2552 āļĢāļēāļ‡āļ§āļąāļĨāļŠāļ™āļ°āđ€āļĨāļīāļĻ āļāļēāļĢāļ­āļ­āļāđāļšāļšāđāļĨāļ°āļžāļąāļ’āļ™āļēāļœāļĨāļīāļ•āļ āļąāļ“āļ‘āđŒāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ āļ›āļĢāļ°āđ€āļ āļ— Intel- ligent Transport System (ITS) and Automotive “Vehicle Identication ITS Solution” āļŠāļĄāļēāļ„āļĄāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļŦāđˆāļ‡āļ›āļĢāļ°āđ€āļ—āļĻāđ„āļ—āļĒ 2549 āļĢāļēāļ‡āļ§āļąāļĨāļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄāđƒāļ™āļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļ™āļģāļŠāļ·āđˆāļ­ E-Learning āļĄāļēāđƒāļŠāđ‰āļ—āļēāļ‡āļ”āđ‰āļēāļ™āļāļēāļĢāļĻāļķāļāļĐāļē āļ—āļĩāđˆ TIT University, āļāļĩāđˆāļ›āļļāđˆāļ™ 2545 Best Paper Award in Wireless Sensor Network, Korea University, Seoul, South Korea 2543 Republic of South Korea Government Scholarship Grantee āļŠāļ–āļēāļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™ āļŦāđ‰āļ­āļ‡āļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ§āļīāļˆāļąāļĒāđāļĨāļ°āļžāļąāļ’āļ™āļēāļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§āđāļĨāļ°āļ—āļĪāļĐāļāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļŠāļąāđ‰āļ™āļŠāļđāļ‡ (ESITA) āļ āļēāļ„āļ§āļīāļŠāļēāļ§āļīāļĻāļ§āļāļĢāļĢāļĄāđ„āļŸāļŸāđ‰āļē āļ„āļ“āļ°āļ§āļīāļĻāļ§āļāļĢāļĢāļĄāļĻāļēāļŠāļ•āļĢāđŒ āļĄāļŦāļēāļ§āļīāļ—āļĒāļēāļĨāļąāļĒāļšāļđāļĢāļžāļē āļ–āļ™āļ™āļĨāļ‡āļŦāļēāļ”āļšāļēāļ‡āđāļŠāļ™ āļ•āđāļēāļšāļĨāđāļŠāļ™āļŠāļļāļ‚ āļ­āđāļēāđ€āļ āļ­āđ€āļĄāļ·āļ­āļ‡āļŠāļĨāļšāļļāļĢāļĩ āļˆāļąāļ‡āļŦāļ§āļąāļ”āļŠāļĨāļšāļļāļĢāļĩ āđ‚āļ—āļĢāļĻāļąāļžāļ—āđŒ 038-10-2222 āļ•āđˆāļ­ 3380 āđ‚āļ—āļĢāļŠāļēāļĢ 038-74-5806 E-mail wiroon@eng.buu.ac.th 397 Embedded Android Development āļŠāļđāđˆāđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē
  • 398. EMBEDDED ANDROID DEVELOPMENT āļ‚āļ­āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļĒāļīāļ™āļ”āļĩāđƒāļ™āļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļ”āđ‰āļēāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­ āđāļĨāđ‰āļ§āļœāļĄāļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ„āļ›āđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­āļĻāļīāļĐāļĒāđŒāđāļĨāļ°āļ•āļ™āđ€āļ­āļ‡... āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļšāļ—āļĩāđˆāđ„āļ”āđ‰āđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļ­āļ­āļāļĄāļē āđ€āļžāļĢāļēāļ°āļ•āļ­āļ™āļ™āļĩāđ‰āļœāļĄāļāđ‡āļ—āļģāļ—āļēāļ‡āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āļ­āļĒāļđāđˆ āđāļ•āđˆāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāđ€āļ‚āđ‰āļēāđƒāļˆāļ–āđˆāļ­āļ‡āđāļ—āđ‰ āđāļĨāļ°āđƒāļ™āđ€āļĄāļ·āļ­āļ‡āđ„āļ—āļĒāļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆ āļ„āđˆāļ­āļĒāļĄāļĩ āļ–āđ‰āļēāđ„āļ”āđ‰āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰āļĄāļēāļ™āļģāļ—āļēāļ‡āđāļĨāļ°āļœāļĄāļāđ‡āļ­āļĒāļēāļāļĄāļēāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āđ„āļ›āļ–āđˆāļēāļĒāļ—āļ­āļ”āđƒāļŦāđ‰āļ™āđ‰āļ­āļ‡āđ†āđ†āđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš... āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāļ„āļĢāļąāļš āļœāļĄāđ€āļ›āđ‡āļ™āļ„āļ™āļ™āļ­āļāļŠāļēāļĒāļ‡āļēāļ™āļ”āđ‰āļēāļ™āļ™āļĩāđ‰ (āđ€āļ”āđ‡āļāļŠāđˆāļēāļ‡āļāļĨ) āļ­āļēāļĻāļąāļĒāļĻāļķāļāļĐāļēāļˆāļēāļāļœāļđāđ‰āļĢāļđāđ‰āļĄāļąāđˆāļ‡ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļĄāļąāđˆāļ‡ āļˆāļēāļ google āļĄāļąāđˆāļ‡ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ‚āļ­āļ‡āļ­āļēāļˆāļēāļĢāļĒāđŒāđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļ„āļ‡āļŠāđˆāļ§āļĒ āđƒāļŦāđ‰āļ„āļ™āļ™āļ­āļāļ§āļ‡āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āļœāļĄāļĄāļĩāđ‚āļ­āļāļēāļĻāđ€āļ‚āđ‰āļēāđƒāļˆāđāļĨāļ°āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āļĄāļēāļāļ‚āļķāđ‰āļ™ āđāļ™āđˆāđ† āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāđ†āļ„āļĢāļąāļš āļ­āļēāļˆāļēāļĢāļĒāđŒ āļ­āļĒāļēāļāđƒāļŦāđ‰āļ›āļĢāļ°āđ€āļ—āļĻāļ™āļĩāđ‰āļĄāļĩāļ„āļ™āđāļšāļšāļ™āļĩāđ‰āđ€āļĒāļ­āļ°āđ†āļ„āļĢāļąāļš āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš... āļ­āļĒāļēāļāđƒāļŦāđ‰āļ­āļēāļˆāļēāļĢāļĒāđŒāļ—āļģāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩ āđ† āđāļšāļšāļ™āļĩāđ‰āļ­āļ­āļāļĄāļēāđ€āļĢāļ·āđˆāļ­āļĒ āđ† āļ„āļĢāļąāļš āļˆāļēāļāļ„āļ§āļēāļĄāļ„āļīāļ”āļŦāļ™āļķāđˆāļ‡āļŠāļđāđˆāļ­āļĩāļāļ„āļ§āļēāļĄāļ„āļīāļ” āļŦāļ™āļķāđˆāļ‡ āļĄāļąāļ™āļˆāļ°āđāļ•āļāļāļīāđˆāļ‡āļ­āļ­āļāđ„āļ›āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļšāļ•āđ‰āļ™āđ„āļĄāđ‰...āļŠāļļāļ”āļ—āđ‰āļēāļĒāđāļĨāđ‰āļ§āļ•āđ‰āļ™āđ„āļĄāđ‰āļ•āđ‰āļ™āļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđ€āļ•āļīāļšāđ‚āļ•āđāļĨāļ°āđƒāļŦāđ‰ āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­ āđ† āđ„āļ› āđāļĨāđ‰āļ§āļœāļĄāļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āđƒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ„āļ›āđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ•āđˆāļ­āļĻāļīāļĐāļĒāđŒāđāļĨāļ°āļ•āļ™āđ€āļ­āļ‡... āļ­āļĒāļēāļāđƒāļŦāđ‰āļŦāļĨāļēāļĒāđ† āļ„āļ™āđ€āļ›āđ‡āļ™āđāļšāļšāļ™āļĩāđ‰āļ™āļ°āļ„āđˆāļ° āđāļšāđˆāļ‡āļšāļąāļ™āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļāļēāļĢāļ“āđŒāđāļĨāļ°āļ„āļ§āļēāļĄāļĢāļđāđ‰āđāļšāļšāļ—āļ­āļ”āđ† āļĄāļąāļ™āļ—āļģāđƒāļŦāđ‰āļĢāļđāđ‰āļŠāļķāļāļ§āđˆāļē .. āļ™āļ­āļāļˆāļēāļāļˆāļ°āļ™āđˆāļēāļŠāļ·āđˆāļ™āļŠāļĄāđƒāļ™āļ„āļ§āļēāļĄāđ€āļāđˆāļ‡āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļģāđ€āļĢāđ‡āļˆāļ‚āļ­āļ‡āđ€āļ„āđ‰āļēāđāļĨāđ‰āļ§ āļĒāļąāļ‡āļĢāļđāđ‰āļŠāļķāļāļ‹āļēāļšāļ‹āļķāđ‰āļ‡āđƒāļˆāļ—āļĩāđˆāļ—āļģāđƒāļŦāđ‰āļ„āļ™āļ­āļĩāļāļŦāļĨāļēāļĒāđ† āļ„āļ™āđ„āļ”āđ‰āļĢāļąāļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ™āļąāđ‰āļ™ āļ‚āļ­āļšāļ„āļļāļ“āļĄāļēāļāļ™āļ°āļ„āđˆāļ° ;) .... āļœāļĄāđ€āļ„āļĒāđ€āļ›āđ‡āļ™āđ€āļ”āđ‡āļāđƒāļ™ HyperCamp āđāļĨāļ° TESATopGun āļ‚āļ­āļŠāļ·āđˆāļ­āļŠāļĄ āļœāļĨāļ‡āļēāļ™āļ‚āļ­āļ‡ āļ­āļēāļˆāļēāļĢāļĒāđŒ āđāļĨāļ° āļˆāļ°āđ€āļ”āļīāļ™āļŠāļēāļĒ Embedded āļ•āđˆāļ­āļ„āļĢāļąāļš ... āļœāļĄāļ„āļĨāļąāđˆāļ‡āđ„āļ„āļĨāđ‰āļ­āļēāļˆāļēāļĢāļĒāđŒāļ•āļąāđ‰āļ‡āđāļ•āđˆāđāļ‚āđˆāļ‡ TopGun āđāļĨāđ‰āļ§āļ„āļĢāļąāļš (āđ‚āļ­āđ€āļ§āļ­āļĢāđŒāļĄāļēāļāđ†āđ† (>.<)) āļ‚āļ­āļšāļ„āļļāļ“ āļ­āļēāļˆāļēāļĢāļĒāđŒāļĄāļēāļāđ†āļ„āļĢāļąāļšāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩāđ†āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļĄāļēāđāļšāđˆāļ‡āļ›āļąāļ™āđƒāļŦāđ‰āđ„āļ”āđ‰āļ­āđˆāļēāļ™āļ„āļĢāļąāļšāļœāļĄ ~(^_^)~ ... āļœāļĄāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļ”āđ‰āļēāļ™āļ™āļĩāđ‰āđāļ•āđˆāļĒāļąāļ‡āļ‚āļēāļ”āļ„āļ§āļēāļĄāļĢāļđāđ‰āļ›āļĢāļ°āļŠāļšāļāļēāļĢāđāļĨāļ°āļ­āđˆāļ­āļ™āđāļ­āđƒāļ™āļ”āđ‰āļēāļ™āļ āļēāļĐāļē āļ™āļąāļšāđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ—āļĩāđˆāļ”āļĩāļĄāļēāļāđ€āļĨāļĒāļ„āļĢāļąāļšāļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāļ™āļĩāđ‰ āļŦāļ™āļąāļ‡āļŠāļ·āļ­āđ€āļĨāđˆāļĄāđ€āļ›āđ‡āļ™āđ€āļŦāļĄāļ·āļ­āļ™ āđāļĢāļ‡āļšāļąāļ™āļ”āļēāļĨāđƒāļˆāđ€āļĨāļĒāļ„āļĢāļąāļš āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš :) ... ã‚ŋã‚Ī詞ãŪ Embedded Android があãĢた、よかãĢた。ïžūïžŋïžū āļ­āļēāļˆāļēāļĢāļĒāđŒāļˆāļ­āļĄāļ„āļĢāļąāļš āļœāļĄāļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļœāļĒāđāļžāļĢāđˆāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļĄāļēāļĒāļ™āļ°āļ„āļĢāļąāļš āđāļĨāļ°āļœāļĄ āļˆāļ°āļ™āļģāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ—āļĩāđˆāđ„āļ”āđ‰āļĄāļēāđƒāļŠāđ‰āđƒāļŦāđ‰āđ€āļāļīāļ”āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāđƒāļŦāđ‰āļĄāļēāļāļ—āļĩāđˆāļŠāļļāļ”āļ™āļ°āļ„āļĢāļąāļš ^__^ āļ‚āļ­āđ€āļ›āđ‡āļ™āļāļģāļĨāļąāļ‡āđƒāļˆāđƒāļŦāđ‰āđ€āļœāļĒāđāļžāļĢāđˆāļšāļ—āļ„āļ§āļēāļĄāļŦāļĢāļ·āļ­āļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ”āļĩāđ†āļ•āđˆāļ­āđ„āļ›āļ„āļĢāļąāļš āđ€āļžāļĢāļēāļ°āļ„āļ™āđ€āļĢāļēāđ„āļĄāđˆāļĄāļĩāđƒāļ„āļĢāļĢāļđāđ‰āļ—āļļāļāđ€āļĢāļ·āđˆāļ­āļ‡ āļŠāļīāđˆāļ‡āļ—āļĩāļ„āļļāļ“āļĢāļđāđ‰āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āļĄāļēāļˆāļēāļāļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ•āļĢāļ‡āļˆāļēāļāļāļēāļĢ āļ—āļģāļ‡āļēāļ™āļŦāļĢāļ·āļ­āļāļēāļĢāļ‚āļ§āļ™āļ‚āļ§āļēāļ™āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļ™āļąāđ‰āļ™āļœāļĄāļ„āļīāļ”āļ§āđˆāļēāļĄāļąāļ™āļ•āđ‰āļ­āļ‡āļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļāļąāļšāļœāļđāđ‰āļ­āļ·āđˆāļ™āļ­āļĒāđˆāļēāļ‡āđāļ™āđˆāļ™āļ­āļ™āđ„āļĄāđˆāļĄāļēāļāļāđ‡āļ™āđ‰āļ­āļĒ āļŠāļļāļ”āļ—āđ‰āļēāļĒāļ­āļĒāļēāļāļˆāļ°āļšāļ­āļāļ§āđˆāļēāļ–āđ‰āļēāđ€āļĢāļēāļĒāļīāđˆāļ‡āļ—āļģāļāđ‡āļĒāļīāđˆāļ‡āđ„āļ”āđ‰ āļĒāļīāđˆāļ‡āđƒāļŦāđ‰āļāđ‡āļĒāļīāđˆāļ‡āļĄāļĩ āļ‚āļ­āļšāļ„āļļāļ“āļ„āļĢāļąāļš... āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļŦāļ™āļąāļ‡āļŠāļ·āļ­āļ„āļļāļ“āļ āļēāļžāļ‚āļ­āļ‡āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™ āļœāļĄāļĄāļĩāļ„āļ§āļēāļĄāļŠāļ™āđƒāļˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļ“āđŒāđāļ­āļ™āļ”āļĢāļ­āļĒāļ”āđŒāđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļ āļ­āļĩāļāļ—āļąāđ‰āļ‡āđ€āļžāļ·āđˆāļ­āđ€āļ›āđ‡āļ™āļāļēāļĢāļžāļąāļ’āļ™āļēāļ„āļ§āļēāļĄāļĢāļđāđ‰ āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāđƒāļ™āļĢāļ°āļšāļšāļŠāļĄāļ­āļ‡āļāļĨāļāļąāļ‡āļ•āļąāļ§ āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļĻāļąāļāļĒāļ āļēāļžāļ‚āļ­āļ‡āļ•āļąāļ§āļœāļĄāđ€āļ­āļ‡āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļ”āļĩāđƒāļ™āļ­āļ™āļēāļ„āļ• āļ‚āļ­āļ‚āļ­āļšāļ„āļļāļ“āļœāļđāđ‰āđ€āļ‚āļĩāļĒāļ™āđ€āļ›āđ‡āļ™āļ­āļĒāđˆāļēāļ‡āļĄāļēāļāļ„āļĢāļąāļš... āļœāļĄāļžāļĒāļēāļĒāļēāļĄāļˆāļ°āļĻāļķāļāļĐāļēāļĄāļēāļ™āļēāļ™ āļ”āđ‰āļ§āļĒāļ­āļēāļĒāļļāđ€āļĒāļ­āļ° āđāļĨāļ°āļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐāđ„āļĄāđˆāļ„āđˆāļ­āļĒāļ”āļĩ āļĄāļĩāļŦāļ™āļąāļ‡āļŠāļ·āđˆāļ­āļ āļēāļĐāļēāđ„āļ—āļĒāļĄāļēāđƒāļŦāđ‰āļ­āđˆāļēāļ™āļ™āļąāļšāļ§āđˆāļēāđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļāļĢāļļāļ“āļēāļ•āđˆāļ­āļœāļĄāļĄāļēāļāđ† āļ‚āļ­āđƒāļŦāđ‰ āļ—āđˆāļēāļ™āļœāļđāđ‰āļˆāļąāļ”āļ—āļģāđ„āļ”āđ‰āļĢāļąāļšāļāļēāļĢāļ•āļ­āļšāđāļ—āļ™āļŠāļīāđˆāļ‡āļ”āļĩāđ† āļˆāļēāļāļžāļĢāļ°āļœāļđāđ‰āđ€āļ›āđ‡āļ™āđ€āļˆāđ‰āļē... āļŦāļ™āļķāđˆāļ‡āđƒāļ™āļŦāļĨāļēāļĒāđ†āļāļģāļĨāļąāļ‡āđƒāļˆāļ–āļķāļ‡āļ™āļąāļāđ€āļ‚āļĩāļĒāļ™ āļˆāļēāļāļœāļđāđ‰āļ­āđˆāļēāļ™ 1,500 āļ—āđˆāļēāļ™āđāļĢāļ