雖然Android智能手機和平板電腦的速度一天比一天快,但是開發者必須記住一點:他們開發的應用程序仍在一種資源緊張的環境下運行,這種環境主要依賴性能與最新的台式機或筆記本電腦無法比擬的電池和處理器。下面介紹的一些方法可以幫助你的應用程序“瘦身”或者說“Android提升開發性能十大要點”,以便它們在今天和明天的Android設備上最順暢地運行。
先來說說確保應用程序響應迅即的幾個編程要點。
第一個要點:首先要有良好的編程習慣
要成為一名優秀的資源管理員;既要運用常識,還要使用公認的算法和標准的設計模式。在資源使用方面,如果你打開了資源,要記得關閉資源。要盡量晚地獲取,盡量早地釋放。這些由來已久的編程准則同樣適用於你的Android應用程序,如果它們使用底層的設備服務,更是如此。
比如說,假設你編寫的一個應用程序依賴基於位置的服務。除非你絕對有必要,否則不要開始注冊、獲取位置最新信息;而且要確保,一旦你不再需要這些信息,就要取消獲取最新信息的注冊。這將幫助你避免不必要地耗費設備電池電量或占用系統資源。
第二個要點:讓阻塞操作遠離主用戶界面線程
想確保你的應用程序運行起來很靈活,就要使用AsyncTask、線程、IntentService或自定義後台服務來處理髒活。應使用裝入器來簡化裝入時間長的數據(如游標)的狀態管理。你無法容忍你的應用程序在某個操作正在處理的時候出現滯後或停頓。 如果某個操作很費時間和資源,
就要卸載這部分操作、對它進行異步處理,那樣你的應用程序仍保持響應迅即,用戶可以處理他們的事務。這個原則適用於下列操作:磁盤讀寫,訪問內容提供方、數據庫和互聯網,以及解析和其他長時間的任務。
為了確定是否需要優化,優化後性能是否得到提升,針對性能進行度量是非常必要的。
1. 時間測量-----------Java和Android提供了以下的API,讓應用可以測量時間及性能:
System.currentTimeMillis
System.nanoTime
Debug.threadCpuTimeNanos
SystemClock.currentThreadTimeMills
SystemClock.elapsedRealtime
SystemClock.uptimeMillis
以上函數即使有些方法返回時間用納秒表示,並不意味著精度是納秒級的。實際精度取決於平台。毫秒精度的一樣的道理。測試時間的典型代碼
long startTime = System.nanoTime();
//這裡進行待測量的操作
long duration = System.nanoTime() -startTime;
System.out.println("Duration:"+ duration);
這段代碼全引用的java類,因此可以用在Android以外的平台。而Debug和SystemClock類是Android獨有的。盡管System.currentTimeMillis()可以作為測量時間的手段,但不建議使用這種方法,原因如下:
1)其精度和准確度不夠
2)更改系統時間會影響其結果
最好使用System.nanoTime(),因為它提供了更好的精度和准確度System.nanoTime()沒有定義參考時間,只能用來測量時間間隔。而System.currentTimeMilis()返回值是UTC時間1970年1月1日00:00:00到現在的毫秒數。
給出測試System.nanoTime()本身需要耗費的時間的代碼。本身的執行時間在750納秒的數量級上。注意進行測量的操作可能因為多線程而被中斷幾次,來讓出CPU時間給別的線程。因此,測量結果可能包括一些執行其他代碼的時間,這可能會得出不正確的時間測量結果,產生誤導。可以使用Android的Debug.threadCpuTimeNano()方法測量代碼的執行時間,這個方法更好些。因為Debug.threadCpuTimeNanos()只測量在當前線程中所花費的時間,所以它的結果更准確。不過,如果要測量的部分運行在多個線程上,只調用一次Debug.threadCpuTimeNanos()不會給出准確的估值,必須在所有涉及的線程調用此方法並把結果相加。
給出用Debug.threadCpuTimeNanos() 測量運行時間的代碼。
2. 方法調用跟蹤---------------
一旦確定在哪兒花費了過多時間,就需要了解更多細節,找出罪魁禍首的方法。可以利用跟蹤工具創建方法跟蹤文件,之後用Traceview工具進行分析。
Android提供了Debug.startMethodTracing()方法來創建跟蹤文件,然後用Traceview工具調試和分析應用。代碼如下:Debug.startMethodTracing("/sdcard/awesometrace.trace");
// 需要跟蹤的操作
Debug.stopMethodTracing();
現在在/mnt/sdcard/ 目錄下會有名為awesometrace.trace的文件,在Eclipse DDMS中可以取到。然後用tools目錄下的Traceview工具進行分析。Traceview中的信息包括:
Name:方法名
Incl %: 此方法中占的時間百分比(包含子方法)
Inclusive: 此方法所花毫秒數(包含子方法)
Excl %:此方法所占時間百分比(不包含子方法)
Exclusive: 此方法所花毫秒數(不包含子方法)
Calls+RecurCalls/Total: 調用和遞歸調用次數
Time/Call: 平均每次調用時間。
因為VM啟用跟蹤會減緩運行速度,不要把這個時間值當做最終的結果。這些時間值只是為了確定哪個方法或運行方式速度更快。如果點擊一個方法的名稱,Traceview會告訴你該方法的更詳細的信息。另一種跟蹤調用及使用Traceview的方式是直接從Eclipse DDMS視圖中生成跟蹤文件。選定一個線程後,可以點擊Start Method Profiling ,然後再次單擊就停止剖析,開始分析。另外,給出本地方法跟蹤的辦法。NDK本地方法利用QEMU進行跟蹤。如何生成QEMU的跟蹤文件,將其轉換成traceview可以處理的文件等。需要用到tracedump工具。
3. 日志-------日志函數在NDK中也可以使用,可以用logcat來記錄C/C++代碼的消息
第三個要點:使用最新的Android軟件開發工具包(SDK)版本、應用編程接口(API)和最佳實踐
確保你開發的應用程序是最新的,因而要使用Android平台提供的最新工具。隨著Android平台不斷發展,它也在不斷改進。一些功能可能已被棄用,或者換成了更好的功能。核心API得到了修正版
(bug fix)和性能改進。已經引入了裝入器等新的API,幫助開發者編寫出運行更穩定、響應更迅即的應用程序。你知道可以啟用Android3.0應用程序中的硬件加速功能嗎?趕緊啟用吧!要明白最佳實踐會隨著時間的變化而變化。明智的開發者密切關注Android平台的新功能、哪些功能不再被推薦。
第四個要點:考慮使用限制模式(Strict Mode)
你可以使用名為限制模式(StrictMode)的AndroidAPI,幫助你查明哪裡違反了幾個良好的編程習慣。StrictMode會幫助你確認你的應用程序是不是存在內存洩漏,並且檢測你的應用程序是不是在試圖執行長時間的阻塞操作,這些操作應該被卸載到線程或別的渠道(參閱第二個要點)。 Android2.3裡面引入StrictMode類(android.os.StrictMode).
第五個要點:在發布應用程序之前,禁用或盡量少用調試和診斷
如果你的Android應用程序開發起來需要一些時間,你可能已將一些日志和調試代碼嵌入到了應用程序中。寫入到日志及其他此類輸出系統給性能帶來了影響。確保在發布應用程序之前,盡量少用或完全禁用這些功能。現在不妨說說如何運用良好的用戶界面設計原則,讓你應用程序的屏幕更快速地裝入:
第六個要點:確保你設計的布局簡單、簡練和淺層
簡單的屏幕有助於閱讀起來最輕松,而簡單的布局裝入起來最快速。你不應該過於深層地嵌套你的布局,或者用不必要的過多視圖(View)控件塞滿屏幕。花些時間來開發用戶可以高效使用的簡練用戶界面,而不是試圖把太多功能塞入到單單一個屏幕上。這不但有助於提升應用程序的性能,還有助於讓你的應用程序對用戶來說更高效。Fragments有助於在不影響靈活地針對不同類型的設備進行設計的情況下,劃分用戶界面功能。
布局優化-------- 1. setContentView調用花費的時間取決於布局的復雜性:資源數據越大解析越慢,而更多的類也讓布局實例化變慢 2. 調用setContentView()幾乎占用了從onCreate()開始到onResume()結束之間所有時間的99% 3. 要節約時間,大多數基於同樣的原則:減少創建對象的數量。消除不必要的對象,或者推遲創建對象 4. 采用嵌套的線性布局會深化布局層次,從而導致布局和按鍵處理變慢。 5. 合並布局。另一種減少布...局層次的技巧是用<merge />標簽來合並布局。 Android布局的父視圖是一個FrameLayou,如果你的布局的最上層也是一個FrameLayout,就可以用<merge />標簽代替它,減少一層布局6. 重用布局,Android支持在XML布局中使用<include /> 標簽,用來包含另一個布局。<include /> 標簽可用於兩個目的: 1) 多次使用相同的布局 2) 布局有一個通用的組成部分,或有部分依賴於設置配置(例如,屏幕方向縱向或橫向)7. ViewStub推遲初始化是個方便的技術,可以推遲實例化,提高性能,還可能會節省內存(如果對象從未創建過)ViewStub是輕量級且不可見的視圖,當需要時,在自己的布局中可以用它來推遲展開布局。下次遇到相關代碼後,將代碼整理在這裡布局工具--------
1.hierarchyviewer 用來查看布局的
2.layoutopt 用於檢測布局文件質量的
第七個要點:讓你應用程序的資源適合目標設備
添加適合特定設備配置的資源,那樣它們就能盡可能高效地裝入。我們在談論圖形資源時,
這點尤為重要。如果你添加了可利用的龐大圖像資源,需要裝入和調整大小,就無法有效地使用其他的應用程序資源。另一個要點就是,如果你准備你的應用程序可以在許多設備上運行,為了讓應用程序軟件包文件保持合理的大小,應該最初只添加運行應用程序所需要的核心資源,然後讓應用程序下載適合該設備的內容。
第八個要點:使用Hierarchy Viewer工具
Hierarchy Viewer工具可以幫助你調試你的應用程序布局。它還提供了寶貴的分析信息,以便了解布局裡面的每一個視圖控件測量、渲染和繪制要花多少時間。只有准確找到了問題的根源,問題解決起來才容易。
第九個要點:使用layoutopt工具
Layoutopt工具是一款簡單的命令行工具,它可以幫助你找到不必要的控件嵌套以及縮減布局資源的其他方法,以便盡量減少資源的使用。它讓你可以了解哪些布局控件可能是多余的或不必要的。控件越少、布局層次越淺,性能就越好。最後,你認為你的應用程序做到了最好嗎?現在該對它測試一下了。
第十個要點:使用Traceview及其他Android工具進行分析
Android SDK隨帶了許多工具,可用來對你的應用程序進行分析。其中最流行的工具恐怕莫過於
Traceview,這款圖形化工具可以幫助你調試和找到應用程序中的性能瓶頸。不妨看看
Android說明文檔中介紹的一些調試工具。現在最熱門的2款智能手機操作系統為安卓和
ios。安卓是Google出的開放式手機系統,IPHONE是Mac出的封閉手機系統。