下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 5/5Android 性能優(yōu)化方法和匯總方案 Android 性能優(yōu)化方法 對于一些Android項(xiàng)目,影響性能瓶頸的主要是Android自己內(nèi)存管理機(jī)制問題,目前手機(jī)廠商對RAM都比較吝嗇,對于軟件的流暢性來說RAM對性能的影響十分敏感,除了優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配外,我們還可以強(qiáng)制定義自己軟件的對內(nèi)存大小,我們使用Dalvik提供的 dalvik.system.VMRuntime類來設(shè)置最小堆內(nèi)存為例: 1.private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 1.VMRuntime.getRuntime().setM
2、inimumHeapSize(CWJ_HEAP_SIZE); /設(shè)置最小heap內(nèi)存為6MB大小。當(dāng)然對于內(nèi)存吃緊來說還可以通過手動干涉GC去處理 bitmap 設(shè)置圖片尺寸,避免內(nèi)存溢出 OutOfMemoryError的優(yōu)化方法 android 中用bitmap 時很容易內(nèi)存溢出,報(bào)如下錯誤:http:/./doc/1e69380a001ca300a6c30c22590102020740f2ec.html ng.OutOfMemoryError : bitmap size exceeds VM budget 主要是加上這段: 1.BitmapFactory.Options options
3、= new BitmapFactory.Options(); 2. options.inSampleSize = 2; eg1:(通過Uri取圖片) 1.private ImageView preview; 2.BitmapFactory.Options options = new BitmapFactory.Options(); 3. options.inSampleSize = 2;/圖片寬高都為原來的二分之 一,即圖片為原來的四分之一 4. Bitmap bitmap = BitmapFactory.decodeStream(cr 5. .openInputStream(uri), nu
4、ll, options); 6. preview.setImageBitmap(bitmap); 以上代碼可以優(yōu)化內(nèi)存溢出,但它只是改變圖片大小,并不能徹底解決內(nèi)存溢出。 eg2:(通過路徑去圖片) 1.private ImageView preview; 2.private String fileName= /sdcard/DCIM/Camera/2010-05-14 16.01.44.jp g; 3.BitmapFactory.Options options = new BitmapFactory.Options(); 4. options.inSampleSize = 2;/圖片寬高都為
5、原來的二分之一,即 圖片為原來的四分之一 5. Bitmap b = BitmapFactory.decodeFile(fileName , options); 6. preview.setImageBitmap(b); 7. filePath.setText(fileName); Android 還有一些性能優(yōu)化的方法: 首先內(nèi)存方面,可以參考 Android堆內(nèi)存也可自己定義大小和優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配 基礎(chǔ)類型上,因?yàn)镴ava沒有實(shí)際的指針,在敏感運(yùn)算方面還是要借助NDK來完成。這點(diǎn)比較有意思的是Google 推出NDK可能是幫助游戲開發(fā)人員,比如OpenGL ES的支持有明
6、顯的改觀,本地代碼操作圖形界面是很必要的。 圖形對象優(yōu)化,這里要說的是Android上的Bitmap對象銷毀,可以借助recycle()方法顯示讓GC回收一個Bitmap對象,通常對一個不用的Bitmap可以使用下面的方式,如 1.if(bitmapObject.isRecycled()=false) /如果沒有回收 2. bitmapObject.recycle(); 目前系統(tǒng)對動畫支持比較弱智對于常規(guī)應(yīng)用的補(bǔ)間過渡效果可以,但是對于游戲而言一般的美工可能習(xí)慣了GIF方式的統(tǒng)一處理,目前Android系統(tǒng)僅能預(yù)覽GIF的第一幀,可以借助J2ME中通過線程和自己寫解析器的方式來讀取GIF89格
7、式的資源。 對于大多數(shù)Android手機(jī)沒有過多的物理按鍵可能我們需要想象下了做好手勢識別GestureDetector 和重力感應(yīng)來實(shí)現(xiàn)操控。通常我們還要考慮誤操作問題的降噪處理。 Android堆內(nèi)存也可自己定義大小 對于一些大型Android項(xiàng)目或游戲來說在算法處理上沒有問題外,影響性能瓶頸的主要是Android自己內(nèi)存管理機(jī)制問題,目前手機(jī)廠商對RAM都比較吝嗇,對于軟件的流暢性來說RAM對性能的影響十分敏感,除了上次Android開發(fā)網(wǎng)提到的優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配外,我們還可以強(qiáng)制定義自己軟件的對內(nèi)存大小,我們使用Dalvik提供的dalvik.system.VMRunt
8、ime類來設(shè)置最小堆內(nèi)存為例: 1.private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 1.VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); /設(shè)置最小heap內(nèi)存為6MB大小。當(dāng)然對于內(nèi)存吃緊來說還可以通過手動干涉GC去處理,我們將在下次提到具體應(yīng)用。 優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配 對于Android平臺來說,其托管層使用的Dalvik JavaVM從目前的表現(xiàn)來看還有很多地方可 以優(yōu)化處理,比如我們在開發(fā)一些大型游戲或耗資源的應(yīng)用中可能考慮手動干涉GC處理,
9、使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強(qiáng)程序堆內(nèi)存的處理效率。當(dāng)然具體原理我們可以參考開源工程,這里我們僅說下使用方 法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate 時就可以調(diào)用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。 Android布局的優(yōu)化方案匯總 層級觀察器(Hierarchy Viewer):
10、Android SDK tools目錄下提供一個觀察布局的工具,層級觀察器(Hierarchy Viewer)。Hierarchy Viewer工具是一個非常好的布局優(yōu)化工具,同時,你也可以通過它學(xué)習(xí)他人的布局。應(yīng)該說是一個非常實(shí)用的工具。 上面寫有控件名稱和id等信息,下方的圓形表示這個節(jié)點(diǎn)的渲染速度,從左至右分別為測量大小,布局和繪制。綠色最快,紅色最慢。右下角的數(shù)字為子節(jié)點(diǎn)在父節(jié)點(diǎn)中的索引,如果沒有子節(jié)點(diǎn)則為0。點(diǎn)擊可以查看對應(yīng)控件預(yù)覽圖、該節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)(為6則有5個子節(jié)點(diǎn))以及具體渲染時間。雙擊可以打開控件圖。右側(cè)是樹形結(jié)構(gòu)的預(yù)覽、控件屬性和應(yīng)用界面的結(jié)構(gòu)預(yù)覽。點(diǎn)擊相應(yīng)的樹形圖中的控
11、件可以在右側(cè)看到他在布局中的位置和屬性。工具欄有一系列的工具,保存為png或者psd等工具。 (http:/./doc/1e69380a001ca300a6c30c22590102020740f2ec.html /Linux/2012-01/52263.htm) layoutopt使用: 創(chuàng)建好看的Android布局是個不小的挑戰(zhàn),當(dāng)你花了數(shù)小時調(diào)整好它們適應(yīng)多種設(shè)備后,你通常不想再重新調(diào)整,但笨重的嵌套布局效率往往非常低下,幸運(yùn)的是,在Android SDK中有一個工具可以幫助你優(yōu)化布局,以減少內(nèi)存消耗,提高應(yīng)用程序運(yùn)行性能。 layoutoptimization 優(yōu)化是需要一定技巧的,性能
12、良好的代碼固然重要,但寫出優(yōu)秀代碼的成本往往也很高,你可能不會過早地貿(mào)然為那些只運(yùn)行一次或臨時功能代碼實(shí)施優(yōu)化,如果你的應(yīng)用程序反應(yīng)遲鈍,并且賣得很貴,或使系統(tǒng)中的其它應(yīng)用程序變慢,用戶一定會有所響應(yīng),你的應(yīng)用程序下載量將很可能受到影響。 在開發(fā)期間盡早優(yōu)化你的布局是節(jié)省成本,提高性能的簡單方法,Android SDK帶來了一個工具,它可以自動分析你的布局,發(fā)現(xiàn)可能并不需要的布局元素,以降低布局復(fù)雜度。 第一步:準(zhǔn)備工作 如果想使用Android SDK中提供的優(yōu)化工具,你需要在開發(fā)系統(tǒng)的命令行中工作,如果你不熟悉使用命令行工具,那么你得多下功夫?qū)W習(xí)了。 我們強(qiáng)烈建議你將Android工具所在
13、的路徑添加到操作系統(tǒng)的環(huán)境變量中,這樣就可以直接敲名字運(yùn)行相關(guān)的工具了,否則每次都要在命令提示符后面輸入完整的文件路徑,現(xiàn)在在Android SDK中有兩個工具目錄:/tools和/platform-tools,本文主要使用位于/tools 目錄中的layoutopt工具,另外我想說的是,ADB工具位于/platform-tools目錄下。 運(yùn)行l(wèi)ayoutopt 運(yùn)行l(wèi)ayoutopt工具是相當(dāng)簡單的,只需要跟上一個布局文件或布局文件所在目錄作為參數(shù),需要注意的是,這里你必須包括布局文件或目錄的完整路徑,即使你當(dāng)前就位于這個目錄。我們來看一個簡單的例子: D:dtoolseclipseart
14、icle_wsNothingreslayoutlayoutopt D:dtoolseclipsearticle_wsNothingreslayoutmain.xml D:dtoolseclipsearticle_wsNothingreslayoutmain.xml D:dtoolseclipsearticle_wsNothingreslayout 注意,在上面的示例中,包含了文件的完整路徑,如果不指定完整路徑,不會輸出任何內(nèi)容,例如: D:dtoolseclipsearticle_wsNothingreslayoutlayoutopt main.xml D:d toolseclipsearti
15、cle_wsNothingreslayout 因此,如果你看不任何東西,則很可能是文件未被解析,也就是說文件可能未被找到。 使用layoutopt輸出 Layoutopt的輸出結(jié)果只是建議,你可以有選擇地在你的應(yīng)用程序中采納這些建議,下面來看幾個使用layoutopt輸出建議的例子。 無用的布局 在布局設(shè)計(jì)期間,我們會頻繁地移動各種組件,有些組件最終可能會不再使用,如: 1. 2. 3. android 4. 5. android:layout_width=match_parent 6. 7. android:layout_height=match_parent 8. 9.android:or
16、ientation=horizontal 10. 11. 12. 13. android:layout_height=wrap_content 14. 15. android:layout_width=wrap_content 16. 17. android:orientation=vertical 18. 19. 26. 27. 工具將會很快告訴我們LinearLayout內(nèi)的LinearLayout是多余的: 11:17 This LinearLayout layout or its LinearLayout parent is usele ss 輸出結(jié)果每一行最前面的兩個數(shù)字表示建議的行
17、號。 根可以替換 Layoutopt的輸出有時是矛盾的,例如: 1. 1 0:21 This LinearLayout layout or its FrameLayout parent is useless 第一行的建議雖然可行,但不是必需的,我們希望兩個TextView垂直放置,因此LinearLayout應(yīng)該保留,而第二行的建議則可以采納,可以刪除無用的FrameLayout。 有趣的是,這個工具不是全能的,例如,在上面的例子中,如果我們給FrameLayout 添加一個背景屬性,然后再運(yùn)行這個工具,第一個建議當(dāng)然會消失,但第二個建議仍然會顯示,工具知道我們不能通過合并控制背景,但檢查了L
18、inearLayout后,它似乎就忘了我們還給FrameLayout添加了一個LinearLayout不能提供的屬性。 太多的視圖 每個視圖都會消耗內(nèi)存,在一個布局中布置太多的視圖,布局會占用過多的內(nèi)存,假設(shè)一個布局包含超過80個視圖,layoutopt可能會給出下面這樣的建議: -1:-1 This layout has too many views: 83 views, it should have = 80! -1:-1 This layout has too many views: 82 views, it should have = 80! -1:-1 This layout has too many views: 81 views, it sh ould have = 80! 上面給出的建議是視圖數(shù)量不能超過80,當(dāng)然最新的設(shè)備有可能能夠支持這么多視圖,但如果真的出現(xiàn)性能不佳的情況,最好采納這個建議。 嵌套太多 布局不應(yīng)該有太多的嵌套,layoutopt(和Android團(tuán)隊(duì))建議布局保持在10級以內(nèi),即使是最大的平板電腦屏幕,布局也不應(yīng)該超過10級,RelativeLayout可能是一個解決辦法,但它的用法更復(fù)雜,好在Eclipse中的Gr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型環(huán)保材料租賃經(jīng)營合同模板4篇
- 二零二五年度商業(yè)活動場地借用及宣傳合同2篇
- 二零二五年度體育產(chǎn)業(yè)普通合伙企業(yè)合作協(xié)議范本4篇
- 2025年度5G產(chǎn)業(yè)投資理財(cái)協(xié)議
- 2025年三方知識產(chǎn)權(quán)轉(zhuǎn)讓還款協(xié)議書范本及內(nèi)容說明3篇
- 個性化定制2024年版民間資金借貸協(xié)議范本版B版
- 2025年酒店住宿賠償協(xié)議范本
- 個人股份轉(zhuǎn)讓協(xié)議書
- 2025年標(biāo)準(zhǔn)植樹承包合同模板:森林碳匯項(xiàng)目專用3篇
- 個人汽車出租公司用協(xié)議細(xì)則(2024版)版B版
- 2024-2030年中國海泡石產(chǎn)業(yè)運(yùn)行形勢及投資規(guī)模研究報(bào)告
- 動物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 2024年同等學(xué)力申碩英語考試真題
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 非遺文化走進(jìn)數(shù)字展廳+大數(shù)據(jù)與互聯(lián)網(wǎng)系創(chuàng)業(yè)計(jì)劃書
- 2024山西省文化旅游投資控股集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 科普知識進(jìn)社區(qū)活動總結(jié)與反思
- 加油站廉潔培訓(xùn)課件
- 現(xiàn)金日記賬模板(帶公式)
- 消化內(nèi)科專科監(jiān)測指標(biāo)匯總分析
- 混凝土結(jié)構(gòu)工程施工質(zhì)量驗(yàn)收規(guī)范
評論
0/150
提交評論