2010年8月27日 星期五

Android 心得感想

還記的一年前Android大張旗鼓出現,偶當時也具有高度的興趣,因為base on linux而且open source.
而且google也在Android上導入open source所缺乏的重要軟體,例如Web Browser, 穩定的Java VM等.
這一年來偶接觸過兩個Android platform分別是TI OMAP 3530 & Samsung S3C6410, 軟體的部份有修改一些driver以符合Android的要求,簡單的JNI及Android application.偶嘗試以技術的角度將這些與Android的經歷紀錄下來.

1.Linux kernel

Linux kernel必須加上一些Android fix & driver才能跑Android.
例如,比較奇特的像是pmem driver,用來保留memory給Android使用.
坦白說為了特定application保留memory這件事偶個人覺得非常不妥,
一般都是保留給其他hardware使用像是DSP而且也不需要額外的driver來處理,
只要在kernel param設定mem=XXX就能保留剩下的memory,甚至是保留特定memory region也可透過類似方式達到.是效率或著是security issue非得用如此的作法不可嗎 ?

這只是冰山一角,還有其他特異的程式碼在系統中運作著.
事實上Linux Kernel的維護者已經在年初宣佈移除所有Android相關的程式碼.

2.Where is linux ?

第一次順利booting kernel啟動Android進入console之後偶發現一切都很陌生.
是的,的確有個shell,很難用的shell... OK,Android自己搞的shell.

每個指令的功能都陽春到不行,backspace & tab key都不能用.進入/etc目錄之後更是大吃一驚,在UNIX系統沿用多年的許多系統檔案都不見了,全部被Android一手包辦.

在Android 中init.rc這個檔案負責系統初始化的設定,如mount file system, init network 及週邊初始化.其中的script語法並非shell script而是Android自訂的key word所組成.

嗯,這真的不是Linux更不是UNIX like system.
Android是以linux kernel為核心基礎也僅只於此了.

3.Porting Android

Android 具有跨平台在不同CPU上工作的能力,但porting的工作則是各憑本事.
目前Embedded ARM CPU往往有許多特殊硬體的功能,例如2D, 3D graphic engine, video coder及camera interface等.

這些功能在linux kernel driver端常常就有許多新增的ioctl及操作流程,porting的困難是需要對driver及Android都有相當程度的了解才能進行的下去.

在開發環境上以往熟悉的Makefile已經被Android.mk取代,完全不同於傳統Embedded System.

Android對自身系統設計的文件並不多,但光從source code的量來看要能有詳細的文件確實是很難.
所以想要porting Android到產品等級絕對不是幾個有經驗的工程師就能作到其中的know how真的非常多.

4.Java VM

Android提供一個Java VM Engine - dalvik,我相當喜歡這樣的設計.dalvik提供一個可以達到同一個application java binary在不同平台執行,而且其效能不見得比native binary來的差.不過這不是絕對的,例如Android允許使用JNI的方式撰寫直接控制硬體或是連結close source binary.許多商業軟體就會透過這種方式達到保護自身利益.java binary跨平台的特性也因此弱化了.但不可否認的是使用Java 單一語言來開發application的確是很大的好處,尤其是Graphic Interface.如果是c/c++因為語言開放特性的關係就算有完整library也不是一件容易的事(例如QT, gtk).


沒有留言:

張貼留言