1. 程式人生 > >Android開發效能優化大總結

Android開發效能優化大總結

一.Android相關

1.  採用硬體加速,在androidmanifest.xml中application新增 android:hardwareAccelerated="true"。不過這個需要在android 3.0才可以    使用。android4.0這個選項是預設開啟的。

2.  View中設定快取屬性.setDrawingCache為true.

3.  優化你的佈局。通過Android sdk中tools目錄下的layoutopt 命令檢視你的佈局是否需要優化。

4.  動態載入View. 採用ViewStub 避免一些不經常的檢視長期握住引用.

5.  將Acitivity 中的Window 的背景圖設定為空。getWindow().setBackgroundDrawable(null);android的預設背景是不是為空。

6.  採用<merge> 優化佈局層數。 採用<include >來共享佈局。

7.  檢視Heap 的大小

8.  利用TraceView檢視跟蹤函式呼叫。有的放矢的優化。

9.  cursor 的使用。不過要注意管理好cursor,不要每次開啟關閉cursor.因為開啟關閉Cursor非常耗時。 Cursor.require用於刷cursor.

10. 採用環形Buffer(可以採用連結串列資料結構實現)。可以設定一個連結串列長度的上限,根據手勢的變化來不斷地更新環形Buffer的內容。

11. 採用SurfaceView在子執行緒重新整理UI, 避免手勢的處理和繪製在同一UI執行緒(普通View都這樣做)。

12. 採用JNI,將耗時間的處理放到c/c++層來處理。

13. 有些能用檔案操作的,儘量採用檔案操作,檔案操作的速度比資料庫的操作要快10倍左右。

14. 懶載入和快取機制。訪問網路的耗時操作啟動一個新執行緒來做,而不要再UI執行緒來做。

15. 避免建立不必要的物件

16. 如果方法用不到成員變數,可以把方法申明為static,效能會提高到15%到20%

17. 避免使用getter/setter存取field,可以把field申明為public,直接訪問

18. static的變數如果不需要修改,應該使用static final修飾符定義為常量

19. 使用增強for迴圈

  如:Set<Object> set = new HashSet<Object>();

     // for迴圈遍歷:

     for (Object obj: set) {

       if(obj instanceof Integer){

          int aa= (Integer)obj;

       }else if(obj instanceof String){

           String aa = (String)obj

        } ........

     }

  缺點:在遍歷 集合過程中,不能對集合本身進行操作

      for (String str : set) {

          set.remove(str);//錯誤!

      }

20. 私有內部類要訪問外部類的field或方法時,其成員變數不要用private,因為在編譯時會生成setter/getter,影響效能。可以把外部類的field或方法宣告為包訪問許可權

21. 合理利用浮點數,浮點數比整型慢兩倍;

22.針對ListView的效能優化

item儘可能的減少使用的控制元件和佈局的層次;背景色與cacheColorHint設定相同顏色;ListView中item的佈局至關重要,必須儘可能的減少使用的控制元件,佈局。RelativeLayout是絕對的利器,通過它可以減少佈局的層次。同時要儘可能的複用控制元件,這樣可以減少ListView的記憶體使用,減少滑動時GC次數。ListView的背景色與cacheColorHint設定相同顏色,可以提高滑動時的渲染效能。ListView中getView是效能是關鍵,這裡要儘可能的優化。getView方法中要重用view;getView方法中不能做複雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的效能。

二.JAVA相關

1 不用new關鍵詞建立類的例項,用new關鍵詞建立類的例項時,建構函式鏈中的所有建構函式都會被自動呼叫。但如果一個物件實現了Cloneable介面,我們可以呼叫它的clone()方法。clone()方法不會呼叫任何類建構函式。

在使用設計模式(Design Pattern)的場合,如果用Factory模式建立物件,則改用clone()方法建立新的物件例項非常簡單。例如,下面是Factory模式的一個典型實現:

public static Credit getNewCredit() {

   return new Credit();

}

改進後的程式碼使用clone()方法,如下所示:

private static Credit BaseCredit = new Credit();

   public static Credit getNewCredit() {

      return (Credit) BaseCredit.clone();

   }

上面的思路對於陣列處理同樣很有用。

2 使用非阻塞I/O

版本較低的JDK不支援非阻塞I/O API。為避免I/O阻塞,一些應用採用了建立大量執行緒的辦法(在較好的情況下,會使用一個緩衝池)。這種技術可以在許多必須支援併發I/O流的應用中見到,如Web伺服器、報價和拍賣應用等。然而,建立Java執行緒需要相當可觀的開銷。

JDK 1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,在這裡有一個支援非阻塞I/O的軟體包。

3 慎用異常

異常對效能不利。丟擲異常首先要建立一個新的物件。Throwable介面的建構函式呼叫名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆疊,收集呼叫跟蹤資訊。只要有異常被丟擲,VM就必須調整呼叫堆疊,因為在處理過程中建立了一個新的物件。

異常只能用於錯誤處理,不應該用來控制程式流程。

4 不要重複初始化變數

預設情況下,呼叫類的建構函式時, Java會把變數初始化成確定的值:所有的物件被設定成null,整數變數(byte、short、int、long)設定成0,float和 double變可柚貿.0,邏輯值設定成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞建立一個物件時,建構函式鏈中的所有建構函式都會被自動呼叫。

5 儘量指定類的final修飾符

帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。

另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使效能平均提高50%。

6 儘量使用區域性變數

呼叫方法時傳遞的引數以及在呼叫中建立的臨時變數都儲存在棧(Stack)中,速度較快。其他變數,如靜態變數、例項變數等,都在堆(Heap)中建立,速度較慢。另外,依賴於具體的編譯器/JVM,區域性變數還可能得到進一步優化。請參見《儘可能使用堆疊變數》。

7 乘法和除法

考慮下面的程式碼:

for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }

用移位操作替代乘法操作可以極大地提高效能。下面是修改後的程式碼:

for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

8.不要隨意的使用stingA=StringB+StringC的寫法,有大量拼接操作的地方用StringBuilder代替。

最後:效能差異帶來的影響

Android手機定製化程度太高,價格從600塊至5000塊不等,因此,效能肯定存在差異,無論從GPS還是記憶體角度來講都是如此。

解析度不同的適配

進行資料量比較大的互動設計會出現不同的問題,因此,要做網路差異優化的話,就要保證能夠在價格比較低的Android手機上正常使用。

針對性放棄動畫互動

在iOS平臺上做互動設計很容易,但在Android平臺上則會考慮到崩潰的問題,因此在Android上,我們便針對性地放棄了一些動畫的互動。

資料互動的不同處理

每一條資料有大有小,如果執行時間長的話,資料就比較大一點。在Android上進行互動時,反應可能會比較慢,並且隨時有可能崩潰,因此我們會進行分段資料的處理,點選每一段資料時再讀取詳細的資料。

網路差異的優化

網路差異化主要針對離線和2G/3G網路,網路的差異會影響使用者體驗,使用者在使用2G網路時,減少一些互動次數,在速度上處理得更加緩和,在執行速率和效率上有所保證,一切以使用者體驗為核心。

面臨的問題

Android版本:

GPS硬體差異,Android手機型號眾多,導致GPS硬體參差不齊,定位速度、準確性有較大偏差;

機能差異導致操作流暢度問題,記憶體不足導致崩潰;

Android系統多元化,軟體執行相容性不強;

解析度的不統一,造成工作量的增加;

iOS版本:

系統版本升級帶來的新特性;

機型換代造成的影響,解析度、尺寸、效能等;

相關推薦

Android開發效能優化總結

一.Android相關 1.  採用硬體加速,在androidmanifest.xml中application新增 android:hardwareAccelerated="true"。不過這個需要在android 3.0才可以    使用。android4.0這個選項

Android開發效能優化總結(一)

安卓開發應用首先要講究良好的使用者體驗,如果一款軟體卡頓現象嚴重,不流暢,經常崩潰,那麼將給使用者帶來極不良好的體驗,從而損失使用者。 在實際開發和學習中,我總結了一下關於安卓效能的優化,供大家參考交流。 應用程式的效能問題體現在很多方面, 比如第一次啟動速

Android開發效能優化(記錄、自用)

雖然做Android開發已經有一段時間了,但是開發過程中經常是忙著實現功能,卻忽略了效能上的優化。以下都是來自於各位前輩的總結。特此總結記錄一下。  一、Android效能優化之佈局優化技巧 佈局優化就是用最少的view實現一樣的效果layout。最少的view也就是

Android APP效能優化(最新總結)

導語 安卓大軍浩浩蕩蕩,發展已近十個年頭,技術優化日異月新,如今Android 8.0 Oreo 都發布了,Android系統性能已經非常流暢了。但是,到了各大廠商手裡,改原始碼自定系統,使得An

android app效能優化彙總

效能指標: (1)使用流暢度:    圖片處理器每秒重新整理的幀數(FPS),可用來指示頁面是否平滑的渲染。高的幀率可以得到更流暢,更逼真的動畫,不過幀率達到60fps以上,人眼主觀感受到的差別就不大了。所以以60fps作為衡量標準,即要求每一幀重新整理的時間小於16

Android效能優化----經典總結

Android 效能優化典範(一):主要從 Android 的渲染機制、記憶體與 GC、電量優化三個方面展開,介紹了 Android 中效能問題的底層工作原理,以及如何通過工具來找出效能問題及提升效能的建議。 Android 效能優化典範(二):主要內容為:電量優化、網路優化、Android W

Android效能優化工具之Hierarchy Viewer使用總結

概述 Hierarchy Viewer提供了一個視覺化的介面來觀測佈局的層級, 讓我們可以優化佈局層級, 刪除多餘的不必要的View層級, 提升佈局速度. 應用Hierarchy Viewer 目前Hierarchy Viewer只能在root過的機器才能使用. 主要是在沒有ro

Android應用開發效能優化完全分析

1 背景 其實有點不想寫這篇文章的,但是又想寫,有些矛盾。不想寫的原因是隨便上網一搜一堆關於效能的建議,感覺大家你一總結、我一總結的都說到了很多優化注意事項,但是看過這些文章後大多數存在一個問題就是隻給出啥啥啥不能用,啥啥啥該咋用等,卻很少有較為系統的進行真正

[推薦]Android APP效能優化的四個方面最全總結

熱文導讀 | 點選標題閱讀作者:斜槓Allen原文:http://www.jianshu.com

Android APP效能優化方案

Android系統的手機市場佔有率目前來說還是最大的,因此基於Android開發的App數量也是很龐大的。那麼,如何能開發出更高效能的Android App?相信是軟體開發公司以及廣大程式設計師們頭疼的一大難題。今天,就給大家提供幾個提高Android App效能的技巧。

android開發佈局優化—include、merge、viewstub原始碼分析總結

儘管Android SDK為開發者提供了各種各樣的小部件來提供小型且可重用的互動元素,但開發者可能仍然需要重新使用特殊佈局的較大元件。這就是我們所謂的佈局複用。要有效地重新使用完整的佈局,可以使用和標籤在當前佈局中嵌入另一個佈局。 重複使用佈局非常有用,因為它

Android效能優化工具之TraceView使用總結

概述 TraceView是Android平臺配備一個很好的效能分析工具,它可以通過圖形化的方式讓我們瞭解我們要跟蹤的程式的效能,並且能具體到method。主要用於分析Android中應用程式中的hotspot,TraceView 本身只是一個數據分析工具,而資

數據庫SQL優化總結之 百萬級數據庫優化方案

存儲過程 語句 數字 運行 eat 小型 明顯 where 不能 1.對查詢進行優化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而

MySQL優化總結

tab 批量 subst 連續 占用 nvarchar src 最好 較差 1.要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃

數據庫SQL優化總結之 百萬級數據庫優化方案

打開 一個 否則 table html 處理 必須 substr ext 作者:雲霏霏 網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查找資料、修改、

【數據庫】百萬級數據庫SQL優化總結

roc 2個 exist sele 數字 between tween 一個表 發送 網上關於SQL優化的教程很多,但是比較雜亂。近日有空整理了一下,寫出來跟大家分享一下,其中有錯誤和不足的地方,還請大家糾正補充。 這篇文章我花費了大量的時間查找資料、修改、排版,希望大家閱讀

Android性能優化問題總結

自定義 stream 靜態內部類 left move 容易 過渡 分析 async   性能優化這塊,分為UI性能優化、內存優化、數據庫優化、網絡優化、耗電優化等等。可以從1.如何發現問題,2.怎麽解決問題,3.解決效果對比,這幾個方面去描述。舉個簡單例子——UI優化,可以

Android效能優化

Android的效能優化 寫在前面: 公司給了我一週的時間去學習Android效能的優化,參考了張明雲老師的一片文章,並且用公司的實際專案進行測試(附有截圖),還進行了一些知識點,注意事項以及很多網址連結的補充,希望這篇博文能讓做效能測試的朋友們少走一些彎路。

【Big Data 每日一題】Spark開發效能調優總結

1. 分配資源調優 Spark效能調優的王道就是分配資源,即增加和分配更多的資源對效能速度的提升是顯而易見的,基本上,在一定範圍之內,增加資源與效能的提升是成正比的,當公司資源有限,能分配的資源達到頂峰之後,那麼才去考慮做其他的調優 如何分配及分配哪些資源 在生產環境中,提交spark作

Android效能優化

眾所周知,android裝置作為一種移動裝置,不管是cpu還是記憶體都無法跟pc裝置相提並論。這就意味著我們不能無限制地使用記憶體和cpu的資源,過多地使用記憶體會導致oom,過多地使用cpu資源,做大量的耗時任務,會導致手機變得異常卡頓,甚至無法響應出現ANR。所以我們在平常做開發時,一定要注意效