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。所以我們在平常做開發時,一定要注意效