android app如何做到快速啟動
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全屏內容。
其他:android是個優秀、複雜、龐大的系統,還有很多內容在效能方面有獨特的設計,如overlay、雙framebuffer等機制在這裡就不一一列出,還有部分由於本人能力不足還沒有發現,希望大家交流討論,不對的地方請指正.
那麼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全屏內容。
其他:android是個優秀、複雜、龐大的系統,還有很多內容在效能方面有獨特的設計,如overlay、雙framebuffer等機制在這裡就不一一列出,還有部分由於本人能力不足還沒有發現,希望大家交流討論,不對的地方請指正.
全文轉貼自: http://hi.baidu.com/zhouhanqing/blog/item/a4d1c2453f8d8e45500ffe07.html
相關文章
- APP如何做到快速流量變現?我想我找到了答案APP
- Android 中如何計算 App 的啟動時間?AndroidAPP
- Android中如何計算App的啟動時間?AndroidAPP
- Android App啟動過程AndroidAPP
- Android APP 冷啟動流程AndroidAPP
- android app啟動流程解析AndroidAPP
- android APP開機自動啟動AndroidAPP
- Manico for Mac APP快速啟動及切換神器MacAPP
- Mac APP快速啟動及切換神器:ManicoMacAPP
- win10快速啟動怎麼改正常啟動_win10快速啟動設定為正常啟動如何操作Win10
- Android App應用啟動流程(一)AndroidAPP
- [譯]Android Application 啟動流程分析AndroidAPP
- win10啟用快速啟動不見了 win10快速啟動欄如何恢復Win10
- Application Wizard for Mac應用程式快速啟動工具APPMac
- win10快速啟動怎麼關閉_win10如何關閉快速啟動Win10
- APP訊息推送,如何做到精推?APP
- android app 啟動第一個頁面AndroidAPP
- win10怎麼設定快速啟動_win10快速啟動功能如何設定Win10
- 如何取消win10的快速啟動_win10怎麼完全關閉快速啟動Win10
- 原始碼閱讀之Activity啟動與App啟動流程 - Android 9.0原始碼APPAndroid
- 原始碼閱讀之Activity啟動與App啟動流程 – Android 9.0原始碼APPAndroid
- 如何關閉win10快速啟動_win10系統快速啟動怎麼關閉Win10
- Android App應用啟動分析與優化AndroidAPP優化
- win10快速啟動軟體怎麼操作_win10快速啟動軟體如何設定Win10
- win10快速啟動開啟開機黑屏怎麼辦 win10開啟快速啟動開機黑屏如何解決Win10
- HBase 快速啟動教程
- Dubbo快速啟動示例
- 看板快速啟動指南
- win10快速啟動項灰色怎麼修復_win10快速啟動項灰色如何解決Win10
- 面試Tip:Android優化之APP啟動優化面試Android優化APP
- Android 開發之 App 啟動時間統計AndroidAPP
- 在阿里雲快速啟動Appsmith搭建前端頁面阿里APPMIT前端
- App啟動流程APP
- App啟動白屏APP
- Android 開啟其他 appAndroidAPP
- Windows server 2012 R2 如何啟用快速啟動WindowsServer
- Quora 是如何做到高質量的快速開發的?
- win10快速啟動打不開怎麼辦_win10打不開快速啟動如何解決Win10