go to http://oracle.in.th

Friday, May 7, 2010

Android กับ Java


Android เป็น OS บนมือถือที่มีพื้นฐานจาก Linux โดยใช้ภาษา Java เป็น ภาษาที่ไว้ใช้พัฒนา application บน Android แต่จะบอกว่าใช้ Java ตรงๆก็ไม่ถูกนัก เพราะ android มันใช้ Java เพียงแค่ interface (syntax) เท่านั้น เพราะว่า VM (Visual Machine) ที่ใช้นั้นเป็น VM (Dalvik) ที่ถูกสร้างขึ้นมาโดยเฉพาะ โดย Dalvik นั้นก็เป็น VM คล้าย java ทำหน้าที่ compile source code java และรัน java เช่นเดียวกัน แต่ Dalvik ได้พัฒนาต่อยอดมาจาก Project ของ Apache Harmony โดย Apache Harmony นั้นเป็น JVM ของ java ที่เป็น open source แต่ JVM ตัวนี้ความสามารถยังไม่เทียบเท่ากับ JVM official ของ SUN ดังนั้นจึงต้องมาพัฒนาต่อจนกลายเป็น Dalvik นั่นเอง

Dalvik VM
แต่เมืออ่านถึงตรงนี้คงจะมีคำถามว่าทำไมไม่ใช้ JVM ของ SUN เลยหละ มันมีเหตุผลอยู่เพราะว่าการ interpreter ของแต่ละอันนั้นต่างกัน โดยของ JVM นั้นจะเป็น stack machines และของ Dalvik นั้นเป็น register-based ซึ่งการทำงานทั้งสองต่างกัน โดย stack machines นั้นจะอ่าน byte code (class) ของ java แล้วแปล byte code เหล่านั้นเป็น instructions (คำสั่งต่างๆ) แล้วโหลดไปกองไว้ในหน่วยความจำแบบ stack ส่วน register-based นั้นก็มีการทำงานคล้ายๆกันเพียงแต่จะโหลด instructions เข้าไปในหน่วยความจำแบบ register แทน ซึ่งทั้งสองตัวนี้ดูเหมือนคล้ายๆกันเพียงแต่ว่า stack machines นั้นจะสร้าง instructions ออกมามากกว่า register-based ถึงแม้จะเป็น byte code ตัวเดียว ทำให้ไม่เหมาะกับการนำไปใช้ในอุปกรณ์มือถือที่มี CPU และ RAM น้อยกว่า computer มาก

อีกเหตุผลหนึ่งที่ไม่สามารถนำ JVM ไปใช้ได้เพราะ JVM ของ SUN นั้นไม่ใช่ open source ดังนั้นการไปปรับแต่งหรือการแก้ไขนั้นทำไม่ได้จึงต้องหันไปใช้ Dalvik แทน

โดย Android นั้นถูกผลักดันโดยกลุ่มๆหนึ่งที่มีชื่อว่า Open Handset Alliance โดยที่กลุ่มๆนั้นคล้าย JCP (Java Community Process) ของ java มาก เป็นกลุ่มที่คอยสนับสนุน วางแผน ออกแบบ และทิศทางของ Android ซึ่งสามารถเข้าไปดูกลุ่มผู้สนับสนุนได้ตาม link นี้ ถ้าใครลองเข้าไปดูจะพบว่า นอกจากจะมีกลุ่มของผู้ผลิตมือถือแล้วยังมีกลุ่มของผู้ผลิต processor ของมือถือด้วย โดยเริ่มแรกกลุ่มของผู้ผลิต processor เป็นผู้วางสถาปัตยกรรมต่างๆของ Android ให้

แต่ข้อเสียมันก็คือ มันรันบน VM ทำให้มันช้า ลองนึกจินตนาการดูในสมัยที่ใครๆเค้าว่า java ช้ากัน (ช่วงนั้น CPU ใคร 1 Ghz ถือว่าหรูมาก) เพราะเมื่อเรา compile source code เราจะไม่ได้ native เหมือนภาษาอื่น แต่จะได้เป็น bytecode โดย bytecode จะเป็น code ที่เกือบจะเทียบเคียงกับภาษาเครื่องแล้ว (เกือบคล้ายๆ native) เมื่อเวลานำ bytecode ไปรันต้องเสียเวลาตีความอีก แต่ ณ ตอนนี้ปัญหานี้ได้ถูกแก้โดย JVM ที่มีประสิทธิภาพมากขึ้นและ hardware ที่ก้าวกระโดดไปไกล

แต่การแก้ปัญหาของ Android ณ ตอนนี้เหมือนจะไปแก้ที่ปลายเหตุ ไปแก้ที่ hardware แทน โดยสังเกตุ spec ของมือถือ android รุ่นหลังๆ CPU และ RAM จะสูงขึ้นมาก แต่ใช่ว่าจะไม่ได้แก้ปัญหาที่ต้นเหตุ โดยมีบริษัทที่อยู่ในกลุ่มของ Open Handset Alliance ได้มีการสร้าง Dalvik ตัวใหม่ขึ้นชื่อ Dalvik Turbo ซึ่งถ้าหากเอาไปวางแทนที่ Dalvik ตัวเก่าจะทำให้ Android เร็วขึ้น 2-3 เท่า แต่ Dalvik Turbo จะไม่มีให้โหลดมาใช้ตรงๆ แต่จะขายให้กับผู้ผลิตแทน

หรือถ้าใครไม่อยากรอ Dalvik Turbo ก็มีอีกทางเลือกตอนนี้ Android ยังเปิดตัว Development Kits ตัวใหม่คือ NDK ซึ่ง Google ได้เปิดช่องทางอีกช่องหนึ่งให้นักพัฒนาที่ถนัดภาษา C หรือ C++ สามารถเขียน Android ได้โดย NDK จะได้เปรียบกว่า SDK ตรงที่มันไม่ได้ run ผ่าน VM เลยแต่มัน run ผ่านตัว Linux ตรงๆทำให้มันทำงานได้เร็วกว่าการพัฒนาบน SDK

Android กับ Java
Android กับ java นั้นใช้ VM คนละตัวกันทำให้เราจำเป็นที่จะต้องใช้ SDK ที่เป็นของ Android โดยเฉพาะเท่านั้น ทำให้เราไม่สามารถใช้ library (jar) ที่มีอยู่มากมายใน java มาใช้ในการพัฒนา android ไม่ได้ เพราะว่าเราใช้ SDK กันคนละตัวทำให้ bytecode ที่ได้มาจาก SDK ย่อมแตกต่างกัน ดังนั้น library ต่างๆจากภายนอกจึงไม่สามารถนำเข้ามาใช้ใน Android ได้ ยกตัวอย่าง เช่น jFreeChart หากคิดจะเอามาใช้ทำ chart ใน Android หมดสิทธิครับ

ถึงแม้ว่า Dalvik จะมี tool ที่ชื่อว่า dx ทำหน้าที่ในการ compress class java ให้กลายเป็น .dex แต่ว่ามันไม่สามารถทำได้ทุก class ทำให้จึงไม่สามารถนำ class java มาใช้ได้
โดย Android SDK นั้นมี package ให้ใช้ดังนี้ (อ้างอิงจาก Android SDK 1.5)

Top-Level Package
Purpose
android.*
Android application fundamentals
com.google.android.map
Google Map Interface (requires additional terms of service and an apiKey)
dalvik.*
Dalvik Virtual Machine support for debugging and such
java.*
Core classes and familiar generic utilities for networking, security, math, and such
javax.*
Encryption support
junit.*
Unit testing support
org.apache.http.*
HTTP protocol support
org.json
JSON support
org.w3c.dom
W3C Java bindings for the Document Object Model Core (XML and HTML)
org.xml.sax.*
Simple API for XML (SAX) support for XML
org.xmlpull.*
High-performance XML parsing

Reference: Android Wireless Application Development (ขอบคุณ @neogravity ที่ให้ยืมมาอ่าน)
จะสังเกตว่า package java นั้นมีติดมาด้วย ที่มีติดมาด้วยเพราะ Dalvik นั้นพัฒนาต่อยอดมาจาก Apache Harmony ทำให้ package พื้นฐานของ java ติดมา นอกจากนั้น android ยังรองรับกราฟฟิก 2D และ 3D ผ่าน OpenGL library ที่ติดมากับ kernel ของ Linux ส่วน database ที่รองรับคือ SQLLite

Credit by @pluamkamon
ข้อเขียนนี้ช่วยฉัน:  

No comments:

Post a Comment