編輯:高級開發
android系統框架和上層應用是類Java(不是正統的sun Java)開發的,實現了自己的Java虛擬機Dalvik,既然用Java虛擬機和Java開發,一般都會認為效率低下。其實不然,在基本主流的智能手機的軟件平台上,android的執行速度是最快的。
那麼android效率為什麼這麼的高呢?特別是一個應用程序的啟動時間很短,本文主要從以下八個方面進行分析:
我們知道android在UI開發時有個很大的好處是xml文件來描述UI,這樣有個好處是只要修改UI不用修改代碼就可以修改界面的布局、顯示風格和字體大小等。界面定義變得靈活方便。xml配置UI在qtopia運用也有但是這麼強大並且也不廣泛,因為xml文件有個不足是解析XML的效率很低。
android是怎麼做的呢?
android在編譯的時候就把XML文件進行了優化,android應用程序在解析時變得非常的高效。我們看到APK文件解壓後會有個優化過的資源文件。
Android的應用程序都打包成一個APK文件,實際上就是一個zip文件。系統第一次起來或應用程序第一次安裝時,系統就把APK文件解壓了,把可執行文件dex優化成odex文件並放在/data/Dalvik-cache目錄下。優化後的dex文件啟動速度會加快。這解釋了為什麼 android系統第一次啟動是比較慢,以後起來很快了。
可能有人會問:為什麼不在編譯時直接優化呢?第⑤項會回答這個問題。
Android的圖形應用是加載整個sd卡內的所有圖像的,但是為什麼很快呢?其實android提前把數據做成了數據庫,所以不用每次掃描整個這個sd卡,大大加快了啟動速度。
android是基於類Java虛擬機Dalvik,一般的Java虛擬機是基於棧的,而Dalvik是基於寄存器的。實事求是說我對兩者的區別了解不是很深入,不過網上有專門的相關文論進行分析。我的簡單理解是棧的實現方式相對容易,相關數據是在內存中的棧裡,而操作寄存器裡數據的速度明顯快與內存裡的數據處理。
Android剛出來的時候雖然支持arm cpu,實際上只支持armv5te的指令集的,因為android系統專門為armv5te 進行了優化,充分利用armv5te的執行流水線來提高執行的效率,這也是在500M的三星2440運行效果不是很好,而在200M的omap cpu上運行比較流暢的原因了,所以在最新的代碼中有專門針對x86和armv4的優化部分。
Libc庫幾乎是所以庫和程序的基礎,但是android沒有直接利用libc庫,而是自己開發了一個庫:bionic,它實現了libc庫的絕大多數的函數並根據平台進行了優化,但是有系統很少用並且消耗資源的少數函數是不支持的。它只有幾百k,節省了空間同時也提高了執行效率。實際上體現了 20-80原則,抓住少數重要的適當捨棄不必要的。
分析過linux內核的朋友知道,Linux fork一個新的進程是非常高效的,利用了COW機制。android是每個進程是個獨立的虛擬機(聽說這麼設計是為安全考慮,某個時候進程崩潰了不會影響這個系統和其他進程。)Android裡每個進程都是基於虛擬機的,並且也要加載基本的庫,實際上這些都是共享。所以android啟動一個新的程序實際上並不消耗很多的內存和cpu資源。
同時android在後台有個empty process運行,實際上就是運行一個虛擬機,當要啟動一個應用時就直接在其上繼續運行,qtopia也有這個機制。
android系統在開機流程中:啟動虛擬機—》啟動system server ?》啟動launcher。當初分析代碼時疑惑為什麼不直接啟動system server?(qtopia就是直接啟動server),實際上也利用了Linux的這個特性。
這個特性說的比較簡略,不過要真的把他解釋清楚可能需要很大的篇幅。
這個特性可能跟啟動關系不大,但是也是Android高效的特性之一。界面變化時大部分實際上不是全屏內容變化的,只是局部變化,android 會根據變化的內容只是跟新局部的內容,也提高了效率。這個也提醒我們在開發應用程序時,重載paint方法時盡量不要paint全屏內容。
/ul> Activity棧 上面提到開發者是無法控制Activity的狀態的,那Activity的狀態又是按照何種邏輯來運作的呢?這就要知道 Activit
Google已經發布了android SDK 2.3版本,大家應該都在等android 2.3的升級吧?在51CTO獨家公布了android SDK 2.3下載地址後.
盡管蘋果聯合創始人承認:android將取得最終勝利,不過很多人認為過於開放的環境依然不利於android,無差異的應用體驗正在制約Android超過iPhone。日前
在前面已經學會了 Android 的意圖(Intent),這是落實意圖,即一個對象。來自一個部件的消息傳遞到另一個組件使用 - 在應用程序或應用程序之外。因此這裡不需要從