Android 應用程序快速啓動的祕訣

Android 系統 框架和上層應用 是類 java( 不是正統的 sun java) 開發 的,實現了自己的 java 虛擬機 dalvik ,既然用 java 虛擬機和 java 開發,一般都會認爲效率低下。其實不然,在基本主流的智能手機軟件 平臺 上, android 的執行速度是最快的。

 

那麼 android 效率爲什麼這麼的高呢 ? 特別是一個應用程序 的啓動時間很短,本文主要從以下個八方面進行分析:

 

1 資源 文件 的優化讀取。

我們知道 android UI 開發時有個很大的好處是 xml 文件來描述 UI ,這樣有個好處是隻要修改 UI 不用修改代碼 就可以修改界面 的佈局、顯示風格和字體大小等。界面定義 變得靈活方便。 xml 配置 UI qtopia 運 用也有但是這麼強大並且也不廣泛,因爲 xml 文 件有個不足是解析 xml 的效率很低。

Android 是怎麼做的呢 ?

Android 編譯 的時候就把 xml 文件進行了優化, android 應用程序 在解析時變得非常的高效。我們看到 apk 文件解壓後會有個優化過的資源文件。

 

2 安裝時進行優化 dex 文件

Android 的應用程序都打包成一個 apk 文件,實際上就是一個 zip 文件。系統第一次起來或應用程序第一次安裝時,系統就把 apk 文件解壓了,把可執行文件 dex 優化成 odex 文 件並放在 /data/dalvik-cache 目錄下。優化後的 dex 文件啓動速 度會加快。這解釋了爲什麼 android 系 統第一次啓動是比較慢,以後起來很快了。

可能有人會問:爲什麼不在編譯時直接優化呢 ? 第⑤項會回答這個問題。

 

3 製作數據庫

Android 的圖形應用是加載 整個 sd 卡內的所有圖像的,但是爲什麼很快呢 ? 其實 android 提前把數據 做成了數據庫,所以不用每次掃描整個這個 sd 卡,大大加快了啓動速度。

 

4 高效的虛擬機

Android 是基於類 java 虛 擬機 dalvik ,一般的 java 虛擬機是基於棧的,而 dalvik 是基於寄存器的。實事求是說我對兩者的區別瞭解不是很深 入,不過網上有專門的相關文論進行分析。我的簡單理解是棧的實現方式相對容易,相關數據是在內存中的棧裏,而操作寄存器裏數據的速度明顯快與內存裏的數據 處理。

 

5 充分挖掘 CPU 的性能

Android 剛出來的時候雖然支持 arm cpu ,實際上只支持 armv5te 的指令集的,因爲 android 系統專門爲 armv5te 進行了優化,充分利用 armv5te 的執行流水線來提高執行的效率,這也是在 500M 的三星 2440 運行 效果 不是很好,而在 200M omap cpu 上運行比較流暢的原因了,所以在最新的代碼中有專門針對 x86 armv4 的優化部分。

 

6 優化和裁剪的 libc

Libc 庫幾乎是所以庫和程序的基礎,但是 android 沒有直接利用 libc 庫,而是自己開發了一個庫: bionic ,它實現了 libc 庫的絕大多數的 函數並根據平臺進行了優化,但是有系統很少用並且消耗資源的少數函數是不支持的。它只有幾百 k ,節省了空間同時也提高了執行效率。實際上體現了 20-80 原則,抓住少數重要的適當捨棄不必要的。

 

7 充分利用 linux 系統特性

分析過 linux 內核的朋友知道, linux fork 一個新的進程是非常高效的,利用了 COW 機制。 Android 是每個進程是個獨立的虛擬機 ( 聽說這麼設計 是爲安全考慮,某個時候進程崩潰了不會影響這個系統 和其他進程。 )android 裏每個進程 都是基於虛擬機的,並且也要加載基本的庫,實際上這些都是共享。所以 android 啓動一個新的程序實際上並不消耗很多的內存和 cpu 資源。

同時 android 在後臺有個 empty process 運行,實際上就是運行一個虛擬機,當要啓 動一個應用時就直接在其上繼續運行, qtopia 也有這個機制。

Android 系統在開機流程中:啓動虛擬機—》啓動 system server ? 》啓動 launcher 。當初分析代碼時疑惑爲什麼不直接啓動 system server?(qtopia 就是直接啓動 server) ,實際上也利用了 linux 的這個特性。

這個特性說的比較簡略,不過要真的把他解釋清楚可能 需要很大的篇幅。

 

8 高效的 paint 機制

這個特性可能跟啓動關係不大,但是也是 android 高效的特性之一。界面變化時大部分實際上不是全屏內 容變化的,只是局部變化, android 會 根據變化的內容只是跟新局部的內容,也提高了效率。這個也提醒我們在開發應用程序時,重載 paint 方法時儘量不要 paint 全屏內容。

http://www.eoeandroid.com/thread-28579-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章