當前位置:首頁 » 安卓系統 » android優化方案

android優化方案

發布時間: 2022-04-25 08:31:13

A. 手機太卡了,怎麼辦

如果您使用的是華為手機,手機升級系統後短時間內出現卡頓,屬於正常現象,如果並非剛升級完出現,請按照以下方案排查:
溫馨提醒:升級系統後卡頓原因:由於系統升級後剛開始使用時,系統會對手機中的應用程序進行優化,此時手機負載較高,使用時可能會出現卡頓情況。建議升級完成後將手機滅屏充電2小時以上,然後重啟手機以保證手機內已安裝的應用優化完成。
1. 檢查手機是否正在下載、復制、傳輸等操作
如果手機正在執行上傳下載(文件、圖片、視頻、應用等)、復制(文件管理拷貝數據等)、傳輸(手機克隆、Huawei Share等)等操作時感覺到卡頓,建議您等待任務結束或停止此操作。
提示:您可以下拉狀態欄查看上傳、下載、傳輸文件的進度。
2. 重啟手機
請您重啟手機後嘗試。建議您2~3天重啟一次手機,重啟能有效的清理緩存,緩解卡頓現象。
3. 檢查手機是否發熱或者充電時使用
手機發熱嚴重時性能下降出現卡頓。建議您盡量避免充電時使用手機,適當降低屏幕亮度,關閉不使用或異常耗電應用與功能,如「藍牙」,NFC等。
4. 檢查存儲
(1)可能是存儲卡存儲的文件過多(建議預留10%以上空間),導致讀寫速度慢,建議您清理存儲卡空間,或備份重要數據(QQ、微信等第三方應用需單獨備份)後格式化存儲卡。
(2)可能是存儲卡硬體異常,是否曾提示「存儲卡異常」,若是,建議您盡快更換存儲卡。
(3)若手機的默認存儲位置為存儲卡,建議您將默認存儲位置更改為「內部存儲」後嘗試。
5. 關閉省電模式、保持電量充足
如果您開啟了省電模式,建議您關閉(設置 > 電池 > 省電模式和 超級省電),並保持電量充足(20%以上)。省電模式和低電量情況下,手機會降低性能以節省電量。
6. 清理存儲空間
手機運行內存和存儲空間不足時會導致應用卡頓,建議您進入手機管家進行清理:
(1)進入手機管家點擊一鍵優化/立即優化,優化完畢後,手機管家會顯示優化結果以及設置建議。根據提示,完成相應的設置。
(2)進入手機管家點擊清理加速,待掃描完畢後,點擊清理項後的立即清理,根據提示刪除多餘的文件,並卸載不常用的應用,保持存儲空間充足(建議預留20%以上)。
7. 卸載第三方手機管家類軟體
如果您的手機裝有第三方手機管理類型的軟體,請卸載此類應用後嘗試。通常此類軟體與手機自帶的手機管家存在沖突,會導致運行卡頓。
8. 升級系統版本
(1)如果手機已經 Root,請恢復成官方穩定版本使用,詳情請致電華為客服咨詢。
(2)建議您及時進行手機系統更新,並將應用升級到最新版本。新版本會對系統性能進行優化提升。更新方法:進入手機設置,搜索進入軟體更新,點擊檢查更新。
提示:恢復版本和升級系統版本會造成數據丟失,請您提前備份好數據(QQ、微信等第三方應用需單獨備份)。
9. 恢復出廠設置
請您備份重要數據(QQ、微信等第三方應用需單獨備份),將手機恢復出廠設置後重試。
如果問題仍然存在,請您備份好數據後(QQ、微信等第三方應用需單獨備份)攜帶購機憑證前往華為客戶服務中心進行檢測處理。
溫馨提醒:您可以選擇夜間充電(或滅屏充電40min以上),可以一定程度上整理手機內存碎片,緩解卡頓現象。

B. 在Android開發中,有哪些好的內存優化方式

1. 使用更加輕量的數據結構

例如,我們可以考慮使用ArrayMap/SparseArray而不是HashMap等傳統數據結構。通常的HashMap的實現方式更加消耗內存,因為它需要一個額外的實例對象來記錄Mapping操作。另外,SparseArray更加高效,在於他們避免了對key與value的自動裝箱(autoboxing),並且避免了裝箱後的解箱。
2. 避免在Android裡面使用Enum
Android官方培訓課程提到過「Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.」,具體原理請參考《Android性能優化典範(三)》,所以請避免在Android裡面使用到枚舉。
3. 減小Bitmap對象的內存佔用
Bitmap是一個極容易消耗內存的大胖子,減小創建出來的Bitmap的內存佔用可謂是重中之重,,通常來說有以下2個措施:
inSampleSize:縮放比例,在把圖片載入內存之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異
4.Bitmap對象的復用
縮小Bitmap的同時,也需要提高BitMap對象的復用率,避免頻繁創建BitMap對象,復用的方法有以下2個措施
LRUCache : 「最近最少使用演算法」在Android中有極其普遍的應用。ListView與GridView等顯示大量圖片的控制項里,就是使用LRU的機制來緩存處理好的Bitmap,把近期最少使用的數據從緩存中移除,保留使用最頻繁的數據,
inBitMap高級特性:利用inBitmap的高級特性提高Android系統在Bitmap分配與釋放執行效率。使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經存在的內存區域,新解碼的Bitmap會嘗試去使用之前那張Bitmap在Heap中所佔據的pixel data內存區域,而不是去問內存重新申請一塊區域來存放Bitmap。利用這種特性,即使是上千張的圖片,也只會僅僅只需要佔用屏幕所能夠顯示的圖片數量的內存大小
4. 使用更小的圖片
在涉及給到資源圖片時,我們需要特別留意這張圖片是否存在可以壓縮的空間,是否可以使用更小的圖片。盡量使用更小的圖片不僅可以減少內存的使用,還能避免出現大量的InflationException。假設有一張很大的圖片被XML文件直接引用,很有可能在初始化視圖時會因為內存不足而發生InflationException,這個問題的根本原因其實是發生了OOM。

5.StringBuilder
在有些時候,代碼中會需要使用到大量的字元串拼接的操作,這種時候有必要考慮使用StringBuilder來替代頻繁的「+」。
6.避免在onDraw方法裡面執行對象的創建
類似onDraw等頻繁調用的方法,一定需要注意避免在這里做創建對象的操作,因為他會迅速增加內存的使用,而且很容易引起頻繁的gc,甚至是內存抖動。
7. 避免對象的內存泄露
類的靜態變數持有大數據對象
靜態變數長期維持到大數據對象的引用,阻止垃圾回收。
非靜態內部類存在靜態實例
非靜態內部類會維持一個到外部類實例的引用,如果非靜態內部類的實例是靜態的,就會間接長期維持著外部類的引用,阻止被回收掉。
資源對象未關閉
資源性對象比如(Cursor,File文件等)往往都用了一些緩沖,我們在不使用的時候,應該及時關閉它們, 以便它們的緩沖及時回收內存。它們的緩沖不僅存在於java虛擬機內,還存在於java虛擬機外。 如果我們僅僅是把它的引用設置為null,而不關閉它們,往往會造成內存泄露。
解決辦法: 比如SQLiteCursor(在析構函數finalize(),如果我們沒有關閉它,它自己會調close()關閉), 如果我們沒有關閉它,系統在回收它時也會關閉它,但是這樣的效率太低了。 因此對於資源性對象在不使用的時候,應該調用它的close()函數,將其關閉掉,然後才置為null. 在我們的程序退出時一定要確保我們的資源性對象已經關閉。 程序中經常會進行查詢資料庫的操作,但是經常會有使用完畢Cursor後沒有關閉的情況。如果我們的查詢結果集比較小, 對內存的消耗不容易被發現,只有在常時間大量操作的情況下才會復現內存問題,這樣就會給以後的測試和問題排查帶來困難和風險,記得try catch後,在finally方法中關閉連接
Handler內存泄漏
Handler作為內部類存在於Activity中,但是Handler生命周期與Activity生命周期往往並不是相同的,比如當Handler對象有Message在排隊,則無法釋放,進而導致本該釋放的Acitivity也沒有辦法進行回收。

C. android 大量多線程怎麼優化

在程序開發的實踐當中,為了讓程序表現得更加流暢,我們肯定會需要使用到多線程來提升程序的並發執行性能。但是編寫多線程並發的代碼一直以來都是一個相對棘手的問題,所以想要獲得更佳的程序性能,我們非常有必要掌握多線程並發編程的基礎技能。
眾所周知,Android 程序的大多數代碼操作都必須執行在主線程,例如系統事件(例如設備屏幕發生旋轉),輸入事件(例如用戶點擊滑動等),程序回調服務,UI 繪制以及鬧鍾事件等等。那麼我們在上述事件或者方法中插入的代碼也將執行在主線程。

一旦我們在主線程裡面添加了操作復雜的代碼,這些代碼就很可能阻礙主線程去響應點擊/滑動事件,阻礙主線程的 UI 繪制等等。我們知道,為了讓屏幕的刷新幀率達到 60fps,我們需要確保 16ms 內完成單次刷新的操作。一旦我們在主線程裡面執行的任務過於繁重就可能導致接收到刷新信號的時候因為資源被佔用而無法完成這次刷新操作,這樣就會產生掉幀的現象,刷新幀率自然也就跟著下降了(一旦刷新幀率降到 20fps 左右,用戶就可以明顯感知到卡頓不流暢了)。

為了避免上面提到的掉幀問題,我們需要使用多線程的技術方案,把那些操作復雜的任務移動到其他線程當中執行,這樣就不容易阻塞主線程的操作,也就減小了出現掉幀的可能性。

那麼問題來了,為主線程減輕負的多線程方案有哪些呢?這些方案分別適合在什麼場景下使用?Android 系統為我們提供了若干組工具類來幫助解決這個問題。
AsyncTask: 為 UI 線程與工作線程之間進行快速的切換提供一種簡單便捷的機制。適用於當下立即需要啟動,但是非同步執行的生命周期短暫的使用場景。
HandlerThread: 為某些回調方法或者等待某些任務的執行設置一個專屬的線程,並提供線程任務的調度機制。
ThreadPool: 把任務分解成不同的單元,分發到各個不同的線程上,進行同時並發處理。
IntentService: 適合於執行由 UI 觸發的後台 Service 任務,並可以把後台任務執行的情況通過一定的機制反饋給 UI。
了解這些系統提供的多線程工具類分別適合在什麼場景下,可以幫助我們選擇合適的解決方案,避免出現不可預期的麻煩。雖然使用多線程可以提高程序的並發量,但是我們需要特別注意因為引入多線程而可能伴隨而來的內存問題。舉個例子,在 Activity 內部定義的一個 AsyncTask,它屬於一個內部類,該類本身和外面的 Activity 是有引用關系的,如果 Activity 要銷毀的時候,AsyncTask 還仍然在運行,這會導致 Activity 沒有辦法完全釋放,從而引發內存泄漏。所以說,多線程是提升程序性能的有效手段之一,但是使用多線程卻需要十分謹慎小心,如果不了解背後的執行機制以及使用的注意事項,很可能引起嚴重的問題。

D. 安卓軟體對於硬體的優化是如何進行的

首先,通過題主給的例子是無法證明Android上的游戲對硬體優化有問題的。

i9500的GPU是SGX544MP3;iPhone 5的GPU是SGX543MP3。
這兩者的差別據我所知僅在與對DirectX的支持。
i9500上GPU的實際運行頻率為480MHz(跑分或運行一部分自帶應用時會「超頻」到533MHz);iPhone 5上則大概在333MHz左右。從這一點上來看GS4確實還是有明顯的優勢。

最重要的一點在於,GS4的有著一塊解析度為1920*1080的屏幕,一共有2073600個像素,iPhone 5的解析度僅為1136*640,像素數目是727040,只比GS4像素數目的1/3多那麼一點。

在理想的極端條件下,同樣的3D渲染對GS4的GPU施加的壓力三倍於對iPhone 5的壓力;在現實中,更高的像素數目對內存帶寬比對GPU本身相更為敏感。

Exynos 5410的內存帶寬高達12.8GB/s,確實相當高,但iPhone 5雖然只有1/3於GS的像素數目也有不低的8.5GB/s帶寬。

事實上,即使是iPad 4,配備了明顯更為強大的SGX554MP4 GPU,並具備其他移動設備難望其項背的17GB/s內存帶寬,在2048*1536=3145728個像素的重壓下,以原生解析度運行大型3D游戲的時候表現也只能說差強人意。

然後,我就談談Android上的游戲對硬體優化到底有什麼問題。

我覺得可能是唯一也是最大的問題,碎片化——所有iOS設備使用的都是PowerVR系列的GPU,但是Android上的GPU,光是常見的就有:PowerVR,Adreno,Mail和GeForce四家,游戲很難全面地優化。

比如說,去年年底之前Android市場上最強大的GPU是Exynos 4上的Mail 400MP4,不論是Tegra 3還是Adreno 225在性能上都要弱很多。於是乎當時的游戲幾乎都只給Exynos 4優化,反正因為性能問題在其他的GPU上跑高畫質也不可能流暢。到了年底APQ8064上市,Adreno 320成為了新的王者,但是不少游戲在Adreno 320上的畫質卻還不如Mail 400。到現在,用Adreno 320的設備越來越多,也有越來越多的游戲為其優化,尷尬的一方變成了i9500上的PowerVR——Android市場上的上一款流行的PowerVR GPU是性能連SGX544MP3的零頭都趕不上的SGX540。

Android 4.3率先支持OpenGL ES 3.0標准可以看做是Google對GPU碎片化所提出的解決方案。OpenGL ES 3.0使得不同系列的GPU都可以使用統一的ETC2貼圖格式,降低了分裂的程度。但是Android 4.3離普及還非常遙遠,另一方面硬體對OpenGL ES 3.0的支持也比較少,比如說PowerVR 5系列就只支持OpenGL ES 2.0,6系列才能支持3.0。而且就算API統一了,想要「完美」地優化每一款GPU也是不可能的任務,不同的設計會有不同的專長。比如說Adreno系列GPU的Shader性能特別的強,如果一個游戲特別注重運用Shader的話在Adreno系列上的表現會明顯比在同檔次其他GPU上好。現實是,多數游戲還是優先為iOS設備上的PowerVR設計的,並不會運用那麼多的Shader特效。

E. 如何對Android客戶端性能優化

為什麼我們的App需要優化,最顯而易見的時刻:用戶say,什麼狗屎,刷這么久都沒反應,取關卸載算了。
這跟什麼有關,我們先蒼白的反駁下,尼瑪用戶設備老舊網又爛,關我屁事,根本不用優化。可是,老闆拍板了,施壓給CTO,然後CTO又來找你:Y的今天必須給我想辦法優化了,不然不準回家。
好吧,為什麼從UI的表象上看,App又卡又慢而且還錯亂。我們試著來剖析下吧。
題外話:把minSDK改到4.0+,去特么的low用戶,連手機都不願意換,還能指望它能給你帶來多少營收么,直接pass掉吧。4.0前的系統bug不少,不能為了彌補這些bug而降低了整體的高性能。
好了,讓我們先從UI說起:
首先要明白的是UI的繪制流程:measure-layout-draw,measure與layout都需要for loop所有的子控制項,匯集起來才能完成繪制,布局。所以子控制項越多,所消耗的時間越長(inflate,layout_weight,relative,多層嵌套等),減少不必要的子控制項或層級,是相當有必要的。你可以通過merge,viewstub這些標簽來減少層級嵌套。如果你的空間觀念沒那麼好,可以用HierarchyViewer工具來檢查。
對於Listview或者GridView這種多item的組件來說,復用item可以減少inflate次數,通過setTag,getTag的ViewHolder方式實現復用,這里要注意的是,holder中的控制項最好reset後再賦值,避免圖片,文字錯亂。
對於ViewPager第一次顯示時卡頓以及左右滑動卡頓,有以下幾種優化方式:

ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。
每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費
圖片顯示不出來或者載入時間太長,怎麼辦?分兩部分,下載速度,載入速度。

對於下載,要控制好同時下載的最大任務數(平均速度慢),同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)。
對於載入速度,我們要知道一點,雖然下載的圖片可能只有幾百K,但是decode成bitmap所佔用的內存可是成倍的,盡可能的減小圖片size是根本因素,讓服務端提供不同解析度的圖片才是最好的解決方案,內存總有耗盡的時刻,別老想著大解析度會更清晰,實際就只有150*150的空間,非給弄張1000*1000的圖片是不恰當的。另外論載入速度:內存>硬碟>網路,合理的使用內存緩存也是關鍵。假如自己寫不好,沒關系,有那麼多開源的圖片緩存框架,不用自己操心。
再說緩存
有很多種緩存方式,也不用Stay列舉了,我們要說的是搭配使用。

比方說,以前我們一直在用強引用,HashMap,後來我們發現占內存,我們就用軟引用,弱引用來及時回收,再後來因為回收機制不可控,所以又有了lrucache,disklrucache通過演算法來平衡內存與硬碟緩存。隨著android版本的推進與演化,我們也應該擁抱變化。如果你的App里還有軟引用,弱引用的地方,不妨再check下。
比方說網路+資料庫。網路我們一般都是去主動獲取,而非被動接受。那如果說數據是重復的或者未更改的呢?那我們去取一次網路數據有什麼意義呢?我的解決方案是給每個activity或fragment或每個組件設置一個最大請求間隔,比如一個listview,第一次請求數據時,保存一份到資料庫,並記下時間戳,當下次重新初始化時,判斷是否超過最大時間間隔(如5分鍾),如果沒有,只載入資料庫數據,不需要再做網路請求。當然,還有一些隱式的http請求框架會緩存伺服器數據,在一定時間內不再請求網路,或者當伺服器返回304時將之前緩存的數據直接返回。
反正也說到網路了,那我們也來說說

現在有很多現成HTTP框架供我們使用,我們幾乎只用寫配置就可以搞定一個url請求,但是這里有很多需要服務端配合的,比如:json數據格式,WebP代替jpg,支持斷點續傳,多個請求合並成一個,盡量不做重定向,伺服器緩存以及負載均衡等。
對客戶端本身,除了上述的實現,我們還需要合理的緩存,控制最大請求並發量,及時取消已失效的請求,過濾重復請求,timeout時間設置,請求優先順序設置等。
優化可不是一個人的事,實現一個功能簡單,但是想優化重構,那是很不容易的事。需要多方面的預判與聯調。合理的假設與實踐是優化最重要的手段。
說完這些具體的點,我們再來說說一些常識,或者稱之為代碼規范。

你要知道for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。
明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)
合理使用數據類型,比如StringBuilder代替String,(筆試題最常見的是str+="str"中有幾個對象) ,少用枚舉enum,少用父類聲明(List,Map)
如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。
你要知道單例的好處,並正確的使用它。
多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。
如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。
當然還有很多很多,Stay所說的也只是一個大的輪廓,還是需要自己不斷的嘗試。會開發寫代碼跟會做產品的區別還是蠻大的,僅僅是態度就能刷死80%的碼農了。當你碰到一些需要優化的地方,耐心的去分析,時間的累積會讓你成為真正的工程師。
另外優化也沒有絕對的完美,每一次優化都是基於當前的環境來做的,要明白溝通是最好的優化,不盲從,不隨便,三思而後行。
Android上如何做性能優化的?大概寫三年代碼就能差不多知道了。

F. Android應用性能優化的內容簡介

今天的Android應用開發者經常要想盡辦法來提升程序性能。由於應用越來越復雜,這個問題也變得越來越棘手。本書主要介紹如何快速高效地優化應用,讓應用變得穩定高效。你將學會利用Android SDK和NDK來混合或單獨使用Java、C/C++來開發應用。書中還特別講解了如下內容:
· 一些OpenGL的優化技術以及RenderScript(Android的新特性)的基礎知識;
· 利用SDK來優化應用的Java代碼的技巧;
· 通過高效使用內存來提升性能的技巧;
· 延長電池使用時間的技巧;
· 使用多線程的時機及技巧;
· 評測剖析代碼的技巧。
把本書的內容學以致用,你的編程技術就會得到關鍵性的提升,寫出的應用就會更為健壯高效,從而廣受用戶好評,並最終獲得成功。
目錄
第1章Java代碼優化1.1Android如何執行代碼1.2優化斐波納契數列1.2.1從遞歸到迭代1.2.2BigInteger1.3緩存結果1.4API等級1.5數據結構1.6響應能力1.6.1推遲初始化1.6.2StrictMode1.7SQLite1.7.1SQLite語句1.7.2事務1.7.3查詢
第1章Java代碼優化1.1Android如何執行代碼1.2優化斐波納契數列1.2.1從遞歸到迭代1.2.2BigInteger1.3緩存結果1.4API等級1.5數據結構1.6響應能力1.6.1推遲初始化1.6.2StrictMode1.7SQLite1.7.1SQLite語句1.7.2事務1.7.3查詢1.8總結
第2章NDK入門2.1NDK里有什麼2.2混合使用Java和C/C++代碼2.2.1聲明本地方法2.2.2實現JNI粘合層2.2.3創建Makefile2.2.4實現本地函數2.2.5編譯本地庫2.2.6載入本地庫2.3Application.mk2.3.1為(幾乎)所有設備優化2.3.2支持所有設備2.4Android.mk2.5使用C/C++改進性能2.6本地Acitivity2.6.1構建缺失的庫2.6.2替代方案2.7總結
第3章NDK進階3.1匯編3.1.1最大公約數3.1.2色彩轉換3.1.3並行計算平均值3.1.4ARM指令3.1.5ARM NEON3.1.6CPU特性3.2C擴展3.2.1內置函數3.2.2向量指令3.3技巧3.3.1內聯函數3.3.2循環展開3.3.3內存預讀取3.3.4用LDM/STM替換LDR/STD3.4總結
第4章高效使用內存4.1說說內存4.2數據類型4.2.1值的比較4.2.2其他演算法4.2.3數組排序4.2.4定義自己的類4.3訪問內存4.4排布數據4.5垃圾收集4.5.1內存泄漏4.5.2引用4.6API4.7內存少的時候4.8總結
第5章多線程和同步5.1線程5.2AsyncTask5.3Handler和Looper5.3.1Handler5.3.2Looper5.4數據類型5.5並發5.6多核5.6.1為多核修改演算法5.6.2使用並發緩存5.7Activity生命周期5.7.1傳遞信息5.7.2記住狀態5.8總結
第6章性能評測和剖析6.1時間測量6.1.1System.nanoTime()6.1.2Debug.threadCpuTimeNanos()6.2方法調用跟蹤6.2.1Debug.startMethodTracing()6.2.2使用Traceview工具6.2.3DDMS中的Traceview6.2.4本地方法跟蹤6.3日誌6.4總結
第7章延長電池續航時間7.1電池7.2禁用廣播接收器7.3網路7.3.1後台數據7.3.2數據傳輸7.4位置7.4.1注銷監聽器7.4.2更新頻率7.4.3多種位置服務7.4.4篩選定位服務7.4.5最後已知位置7.5感測器7.6圖形7.7提醒7.8WakeLock7.9總結
第8章圖形8.1布局優化8.1.1相對布局8.1.2合並布局8.1.3重用布局8.1.4ViewStub8.2布局工具8.2.1層級視圖8.2.2layoutopt8.3OpenGL ES8.3.1擴展8.3.2紋理壓縮8.3.3Mipmap8.3.4多APK8.3.5著色8.3.6場景復雜性8.3.7消隱8.3.8渲染模式8.3.9功耗管理8.4總結
第9章RenderScript9.1概覽9.2Hello World9.3Hello Rendering9.3.1創建渲染腳本9.3.2創建RenderScriptGL Context9.3.3展開RSSurfaceView9.3.4設置內容視圖9.4在腳本中添加變數9.5HelloCompute9.5.1Allocation9.5.2rsForEach9.5.3性能9.6自帶的RenderScript API9.6.1rs_types.rsh9.6.2rs_core.rsh9.6.3rs_cl.rsh9.6.4rs_math.rsh9.6.5rs_graphics.rsh9.6.6rs_time.rsh9.6.7rs_atomic.rsh9.7RenderScript與NDK對比9.8總結

G. 針對Android的性能優化集中哪些方面

一、概要:

本文主要以Android的渲染機制、UI優化、多線程的處理、緩存處理、電量優化以及代碼規范等幾方面來簡述Android的性能優化

二、渲染機制的優化:

大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。

Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染, 如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。

*關於JobScheler的更多知識可以參考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html

七、代碼規范

1)for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。

2)明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)

3)合理使用數據類型,StringBuilder代替String,少用枚舉enum,少用父類聲明(List,Map)

4)如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。

5)你要知道單例的好處,並正確的使用它。

6)多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。

7)如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。

8)View中設置緩存屬性.setDrawingCache為true.

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

10)採用SurfaceView在子線程刷新UI,避免手勢的處理和繪制在同一UI線程(普通View都這樣做)

11)採用JNI,將耗時間的處理放到c/c++層來處理

12)有些能用文件操作的,盡量採用文件操作,文件操作的速度比資料庫的操作要快10倍左右

13)懶載入和緩存機制。訪問網路的耗時操作啟動一個新線程來做,而不要再UI線程來做

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

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

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

17)合理利用浮點數,浮點數比整型慢兩倍

18)針對ListView的性能優化,ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能。ListView中getView是性能是關鍵,這里要盡可能的優化。

getView方法中要重用view;getView方法中不能做復雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的性能

19)不用new關鍵詞創建類的實例,用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。

clone()方法不會調用任何類構造函數。在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:

20)public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。

21)乘法和除法

考慮下面的代碼:

  • 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; }

  • 22)ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。

    23)每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費

    24)提高下載速度:要控制好同時下載的最大任務數,同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)

    25)提供載入速度:讓服務端提供不同解析度的圖片才是最好的解決方案。還有合理使用內存緩存,使用開源的框架

    引用:Android性能優化的淺談

    H. Android 性能優化的方法是什麼請從開發者的角度回答!

    常我們寫程序,都是在項目計劃的壓力下完成的,此時完成的代碼可以完成具體業務邏輯,但是性能不一定是最優化的。一般來說,優秀的程序員在寫完代碼
    之後都會不斷的對代碼進行重構。重構的好處有很多,其中一點,就是對代碼進行優化,提高軟體的性能。下面我們就從幾個方面來了解Android開發過程中
    的代碼優化。
    1)靜態變數引起內存泄露

    在代碼優化的過程中,我們需要對代碼中的靜態變數特別留意。靜態變數是類相關的變數,它的生命周期是從這個類被聲明,到這個類徹底被垃圾回收器回收
    才會被銷毀。所以,一般情況下,靜態變數從所在的類被使用開始就要一直佔用著內存空間,直到程序退出。如果不注意,靜態變數引用了佔用大量內存的資源,造
    成垃圾回收器無法對內存進行回收,就可能造成內存的浪費。

    先來看一段代碼,這段代碼定義了一個Activity。

    復制代碼 代碼如下:

    private static Resources mResources;
    @Override

    protected void onCreate(Bundle state) {

    super.onCreate(state);

    if (mResources == null) {

    mResources = this.getResources();

    }

    }

    這段代碼中有一個靜態的Resources對象。代碼片段mResources =
    this.getResources()對Resources對象進行了初始化。這時Resources對象擁有了當前Activity對象的引
    用,Activity又引用了整個頁面中所有的對象。
    如果當前的Activity被重新創建(比如橫豎屏切換,默認情況下整個Activity會被重新創建),由於Resources引用了第一次創建
    的Activity,就會導致第一次創建的Activity不能被垃圾回收器回收,從而導致第一次創建的Activity中的所有對象都不能被回收。這個
    時候,一部分內存就浪費掉了。

    經驗分享:

    在實際項目中,我們經常會把一些對象的引用加入到集合中,如果這個集合是靜態的話,就需要特別注意了。當不需要某對象時,務必及時把它的引用從集合中清理掉。或者可以為集合提供一種更新策略,及時更新整個集合,這樣可以保證集合的大小不超過某值,避免內存空間的浪費。

    2)使用Application的Context

    在Android中,Application
    Context的生命周期和應用的生命周期一樣長,而不是取決於某個Activity的生命周期。如果想保持一個長期生命的對象,並且這個對象需要一個
    Context,就可以使用Application對象。可以通過調用Context.getApplicationContext()方法或者
    Activity.getApplication()方法來獲得Application對象。

    依然拿上面的代碼作為例子。可以將代碼修改成下面的樣子。

    復制代碼 代碼如下:

    private static Resources mResources;
    @Override

    protected void onCreate(Bundle state) {

    super.onCreate(state);

    if (mResources == null) {

    // mResources = this.getResources();

    mResources = this.getApplication().getResources();

    }

    }

    在這里將this.getResources()修改為
    this.getApplication().getResources()。修改以後,Resources對象擁有的是Application對象的引
    用。如果Activity被重新創建,第一次創建的Activity就可以被回收了。

    I. 安卓手機性能差怎麼辦 優化方法都有哪些

    安卓手機優化可以藉助一些優化軟體來對手機進行優化,可以通過騰訊手機管家上面的手機優化功能來對手機進行優化,進入主頁面,點擊一鍵優化,就可以關閉後台運行程序,清理手機內存,和檢測開機自啟軟體等,優化手機的額性能。

    熱點內容
    和存儲字長 發布:2025-05-15 21:54:09 瀏覽:513
    用什麼寫c語言 發布:2025-05-15 21:35:56 瀏覽:418
    linux讀取u盤 發布:2025-05-15 21:32:13 瀏覽:508
    c語言dos 發布:2025-05-15 21:18:17 瀏覽:664
    sci編譯英文 發布:2025-05-15 21:16:57 瀏覽:383
    大貓如何設置密碼 發布:2025-05-15 21:15:32 瀏覽:765
    什麼叫蘋果版的和安卓版的手機 發布:2025-05-15 21:05:18 瀏覽:254
    編程找點 發布:2025-05-15 20:43:10 瀏覽:588
    php上傳臨時文件夾 發布:2025-05-15 20:43:00 瀏覽:658
    impala資料庫 發布:2025-05-15 20:42:12 瀏覽:650