歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發性能優化大總結

Android開發性能優化大總結

日期:2017/3/1 9:54:58   编辑:Linux編程

一.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 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved