Android應(yīng)用程序快速啟動的8大秘技
51CTO編者按:我們給大家介紹過51CTO的獨家專題:Android開發(fā)應(yīng)用詳解。本文將向大家介紹Android應(yīng)用開發(fā)快速啟動的8大秘技,告訴大家Android效率為什么這么的高!
Android系統(tǒng)框架和上層應(yīng)用是類Java(不是正統(tǒng)的sun Java)開發(fā)的,實現(xiàn)了自己的Java虛擬機(jī)Dalvik,既然用Java虛擬機(jī)和Java開發(fā),一般都會認(rèn)為效率低下。其實不然,在基本主流的智能手機(jī)的軟件平臺上,Android的執(zhí)行速度是最快的。
那么Android效率為什么這么的高呢?特別是一個應(yīng)用程序的啟動時間很短,本文主要從以下八個方面進(jìn)行分析:
資源文件的優(yōu)化讀取
我們知道Android在UI開發(fā)時有個很大的好處是xml文件來描述UI,這樣有個好處是只要修改UI不用修改代碼就可以修改界面的布局、顯示風(fēng)格和字體大小等。界面定義變得靈活方便。xml配置UI在qtopia運用也有但是這么強(qiáng)大并且也不廣泛,因為xml文件有個不足是解析xml的效率很低。
Android是怎么做的呢?
Android在編譯的時候就把xml文件進(jìn)行了優(yōu)化,Android應(yīng)用程序在解析時變得非常的高效。我們看到APK文件解壓后會有個優(yōu)化過的資源文件。
安裝時進(jìn)行優(yōu)化dex文件
Android的應(yīng)用程序都打包成一個APK文件,實際上就是一個zip文件。系統(tǒng)第一次起來或應(yīng)用程序第一次安裝時,系統(tǒng)就把APK文件解壓了,把可執(zhí)行文件dex優(yōu)化成odex文件并放在/data/Dalvik-cache目錄下。優(yōu)化后的dex文件啟動速度會加快。這解釋了為什么 Android系統(tǒng)第一次啟動是比較慢,以后起來很快了。
可能有人會問:為什么不在編譯時直接優(yōu)化呢?第⑤項會回答這個問題。
制作數(shù)據(jù)庫
Android的圖形應(yīng)用是加載整個sd卡內(nèi)的所有圖像的,但是為什么很快呢?其實Android提前把數(shù)據(jù)做成了數(shù)據(jù)庫,所以不用每次掃描整個這個sd卡,大大加快了啟動速度。
高效的虛擬機(jī)
Android是基于類Java虛擬機(jī)Dalvik,一般的Java虛擬機(jī)是基于棧的,而Dalvik是基于寄存器的。實事求是說我對兩者的區(qū)別了解不是很深入,不過網(wǎng)上有專門的相關(guān)文論進(jìn)行分析。我的簡單理解是棧的實現(xiàn)方式相對容易,相關(guān)數(shù)據(jù)是在內(nèi)存中的棧里,而操作寄存器里數(shù)據(jù)的速度明顯快與內(nèi)存里的數(shù)據(jù)處理。
充分挖掘CPU的性能
Android剛出來的時候雖然支持arm cpu,實際上只支持armv5te的指令集的,因為Android系統(tǒng)專門為armv5te 進(jìn)行了優(yōu)化,充分利用armv5te的執(zhí)行流水線來提高執(zhí)行的效率,這也是在500M的三星2440運行效果不是很好,而在200M的omap cpu上運行比較流暢的原因了,所以在最新的代碼中有專門針對x86和armv4的優(yōu)化部分。
優(yōu)化和裁剪的libc庫
Libc庫幾乎是所以庫和程序的基礎(chǔ),但是Android沒有直接利用libc庫,而是自己開發(fā)了一個庫:bionic,它實現(xiàn)了libc庫的絕大多數(shù)的函數(shù)并根據(jù)平臺進(jìn)行了優(yōu)化,但是有系統(tǒng)很少用并且消耗資源的少數(shù)函數(shù)是不支持的。它只有幾百k,節(jié)省了空間同時也提高了執(zhí)行效率。實際上體現(xiàn)了 20-80原則,抓住少數(shù)重要的適當(dāng)舍棄不必要的。
充分利用linux系統(tǒng)特性
分析過linux內(nèi)核的朋友知道,linux fork一個新的進(jìn)程是非常高效的,利用了COW機(jī)制。Android是每個進(jìn)程是個獨立的虛擬機(jī)(聽說這么設(shè)計是為安全考慮,某個時候進(jìn)程崩潰了不會影響這個系統(tǒng)和其他進(jìn)程。)Android里每個進(jìn)程都是基于虛擬機(jī)的,并且也要加載基本的庫,實際上這些都是共享。所以Android啟動一個新的程序?qū)嶋H上并不消耗很多的內(nèi)存和cpu資源。
同時Android在后臺有個empty process運行,實際上就是運行一個虛擬機(jī),當(dāng)要啟動一個應(yīng)用時就直接在其上繼續(xù)運行,qtopia也有這個機(jī)制。
Android系統(tǒng)在開機(jī)流程中:啟動虛擬機(jī)—》啟動system server ?》啟動launcher。當(dāng)初分析代碼時疑惑為什么不直接啟動system server?(qtopia就是直接啟動server),實際上也利用了linux的這個特性。
這個特性說的比較簡略,不過要真的把他解釋清楚可能需要很大的篇幅。
高效的paint機(jī)制
這個特性可能跟啟動關(guān)系不大,但是也是Android高效的特性之一。界面變化時大部分實際上不是全屏內(nèi)容變化的,只是局部變化,Android 會根據(jù)變化的內(nèi)容只是跟新局部的內(nèi)容,也提高了效率。這個也提醒我們在開發(fā)應(yīng)用程序時,重載paint方法時盡量不要paint全屏內(nèi)容。
Phone Club——51CTO移動開發(fā)線下技術(shù)沙龍
本期主題:Android應(yīng)用開發(fā)技術(shù)進(jìn)階
地點:北京市海淀區(qū)中關(guān)村南大街30號東聯(lián)藝術(shù)工社
演講講師:范懷宇(網(wǎng)易)
【編輯推薦】
- 多圖詳解Android 2.3 SDK安裝教程
- Android 2.3 SDK開發(fā)文檔同步更新 附下載
- Android平臺SQLite快速入門實踐
- Android 2.3六大革新 劍鋒直指iOS 4.2
- Android 2.3正式發(fā)布 11大特性全新改進(jìn)