當前位置:首頁 » 安卓系統 » android性能優化pdf

android性能優化pdf

發布時間: 2023-05-16 04:57:06

1. Android性能優化總結

常用的Android性能優化方法:

一、布局優化:

1)盡量減少布局文件的層級。

層級少了,繪制的工作量也就少了,性能自然提高。

2)布局重用 <include標簽>

3)按需載入:使用ViewStub,它繼承自View,一種輕量級控制項,本身不參與任何的布局和繪制過程。他的layout參數里添加一個替換的布局文件,當它通過setVisibility或者inflate方法載入後,它就會被內部布局替換掉。

二、繪制優化:

基於onDraw會被調用多次,該方法內要避免兩類操作:

1)創建新的局部對象,導致大量垃圾對象的產生,從而導致頻繁的gc,降低程序的執行效率。

2)不要做耗時操作,搶CPU時間片,造成繪制很卡不流暢。

三、內存泄漏優化:

1)靜態變數導致內存泄漏   比較明顯

2)單例模式導致的內存泄漏 單例無法被垃圾回收,它持有的任何對象的引用都會導致該對象不會被gc。

3)屬性動畫導致內存泄漏  無限循環動畫,在activity中播放,但是onDestroy時沒有停止的話,動畫會一直播放下去,view被動畫持有,activity又被view持有,導致activity無法被回收。

四、響應速度優化:

1)避免在主線程做耗時操作 包括四大組件,因為四大組件都是運行在主線程的。

2)把一些創建大量對象等的初始化工作放在頁面回到前台之後,而不應該放到創建的時候。

五、ListView的優化:

1)使用convertView,走listView子View回收的一套:RecycleBin 機制

主要是維護了兩個數組,一個是mActiveViews,當前可見的view,一個是mScrapViews,當前不可見的view。當觸摸ListView並向上滑動時,ListView上部的一些OnScreen的View位置上移,並移除了ListView的屏幕范圍,此時這些OnScreen的View就變得不可見了,不可見的View叫做OffScreen的View,即這些View已經不在屏幕可見范圍內了,也可以叫做ScrapView,Scrap表示廢棄的意思,ScrapView的意思是這些OffScreen的View不再處於可以交互的Active狀態了。ListView會把那些ScrapView(即OffScreen的View)刪除,這樣就不用繪制這些本來就不可見的View了,同時,ListView會把這些刪除的ScrapView放入到RecycleBin中存起來,就像把暫時無用的資源放到回收站一樣。

當ListView的底部需要顯示新的View的時候,會從RecycleBin中取出一個ScrapView,將其作為convertView參數傳遞給Adapter的getView方法,從而達到View復用的目的,這樣就不必在Adapter的getView方法中執行LayoutInflater.inflate()方法了。

RecycleBin中有兩個重要的View數組,分別是mActiveViews和mScrapViews。這兩個數組中所存儲的View都是用來復用的,只不過mActiveViews中存儲的是OnScreen的View,這些View很有可能被直接復用;而mScrapViews中存儲的是OffScreen的View,這些View主要是用來間接復用的。

2)使用ViewHolder避免重復地findViewById

3)快速滑動不適合做大量非同步任務,結合滑動監聽,等滑動結束之後載入當前顯示在屏幕范圍的內容。

4)getView中避免做耗時操作,主要針對圖片:ImageLoader來處理(原理:三級緩存)

5)對於一個列表,如果刷新數據只是某一個item的數據,可以使用局部刷新,在列表數據量比較大的情況下,節省不少性能開銷。

六、Bitmap優化:

1)減少內存開支:圖片過大,超過控制項需要的大小的情況下,不要直接載入原圖,而是對圖片進行尺寸壓縮,方式是BitmapFactroy.Options 采樣,inSampleSize 轉成需要的尺寸的圖片。

2)減少流量開銷:對圖片進行質量壓縮,再上傳伺服器。圖片有三種存在形式:硬碟上時是file,網路傳輸時是stream,內存中是stream或bitmap,所謂的質量壓縮,它其實只能實現對file的影響,你可以把一個file轉成bitmap再轉成file,或者直接將一個bitmap轉成file時,這個最終的file是被壓縮過的,但是中間的bitmap並沒有被壓縮。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);

七、線程優化:

使用線程池。為什麼要用線程池?

1、從「為每個任務分配一個線程」轉換到「在線程池中執行任務」

2、通過重用現有的線程而不是創建新線程,可以處理多個請求在創建銷毀過程中產生的巨大開銷

3、當使用線程池時,在請求到來時間 ,不用等待系統重新創建新的線程,而是直接復用線程池中的線程,這樣可以提高響應性。

4、通過和適當調整線程池的大小 ,可以創建足夠多的線程以使處理器能夠保持忙碌狀態,同時還可以防止過多線程相互競爭資源而使應用程序耗盡內存或者失敗。

5、一個App裡面所有的任務都放在線程池中執行後,可以統一管理 ,當應用退出時,可以把程序中所有的線程統一關閉,避免了內存和CPU的消耗。

6、如果這個任務是一個循環調度任務,你則必須在這個界面onDetach方法把這個任務給cancel掉,如果是一個普通任務則可cancel,可不cancel,但是最好cancel

7、整個APP的總開關會在應用退出的時間把整個線程池全部關閉。

八、一些性能優化建議:

1)避免創建過多對象,造成頻繁的gc

2)不要過多使用枚舉,枚舉佔用的空間比整型大很多

3)字元串的拼接使用StringBuffer、StringBuilder來替代直接使用String,因為使用String會創建多個String對象,參考第一條。

4)適當使用軟引用,(弱引用就不太推薦了)

5)使用內存緩存和磁碟緩存。

2. Android流暢度評估及卡頓優化

Google定義:界面呈現是指從應用生成幀並將其顯示在屏幕上的動作。要確保用戶能夠流暢地與應用互動,應用呈現每幀的時間不應超過16ms,以達到每秒60幀的呈現速度(為什麼是60fps?)。
如果應用存在界面呈現緩慢的問題,系統會不得不跳過一些幀,這會導致用戶感覺應用不流暢,我們將這種情況稱為卡頓。

來源於: Google Android的為什麼是60fps?

16ms意味著1000/60hz,相當於60fps。這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。12fps大概類似手動快速翻動書籍的幀率, 這明顯是可以感知到不夠順滑的。24fps使得人眼感知的是連續線性的運動,這其實是歸功於運動模糊的效果。 24fps是電影膠圈通常使用的幀率,因為這個幀率已經足夠支撐大部分電影畫面需要表達的內容,同時能夠最大的減少費用支出。 但是低於30fps是 無法順暢表現絢麗的畫面內容的,此時就需要用到60fps來達到想要的效果,超過60fps就沒有必要了。如果我們的應用沒有在16ms內完成屏幕刷新的全部邏輯操作,就會發生卡頓。

首先要了解Android顯示1幀圖像,所經歷的完整過程。

如圖所示,屏幕顯示1幀圖像需要經歷5個步驟:

常見的丟幀情況: 渲染期間可能出現的情況,渲染大於16ms和小於16ms的情況:

上圖中應該繪制 4 幀數據 , 但是實際上只繪制了 3 幀 , 實際幀率少了一幀

判斷APP是否出現卡頓,我們從通用應用和游戲兩個緯度的代表公司標准來看,即Google的Android vitals性能指標和地球第一游戲大廠騰訊的PrefDog性能指標。

以Google Vitals的卡頓描述為准,即呈現速度緩慢和幀凍結兩個維度判斷:

PerfDog Jank計算方法:

幀率FPS高並不能反映流暢或不卡頓。比如:FPS為50幀,前200ms渲染一幀,後800ms渲染49幀,雖然幀率50,但依然覺得非常卡頓。同時幀率FPS低,並不代表卡頓,比如無卡頓時均勻FPS為15幀。所以平均幀率FPS與卡頓無任何直接關系)

當了解卡頓的標准以及渲染原理之後,可以得出結論,只有丟幀情況才能准確判斷是否卡頓。

mpsys 是一種在設備上運行並轉儲需要關注的系統服務狀態信息的 Android 工具。通過向 mpsys 傳遞 gfxinfo 命令,可以提供 logcat 格式的輸出,其中包含與錄制階段發生的動畫幀相關的性能信息。

藉助 Android 6.0(API 級別 23),該命令可將在整個進程生命周期中收集的幀數據的聚合分析輸出到 logcat。例如:

這些總體統計信息可以得到期間的FPS、Jank比例、各類渲染異常數量統計。

命令 adb shell mpsys gfxinfo <PACKAGE_NAME> framestats 可提供最近120個幀中,渲染各階段帶有納秒時間戳的幀時間信息。

關鍵參數說明:

通過gfxinfo輸出的幀信息,通過定時reset和列印幀信息,可以得到FPS(幀數/列印間隔時間)、丟幀比例((janky_frames / total_frames_rendered)*100 %)、是否有幀凍結(幀耗時>700ms)。
根據第2部分的通用應用卡頓標准,可以通過丟幀比例和幀凍結數量,准確判斷當前場景是否卡頓。並且通過定時截圖,還可以根據截圖定位卡頓的具體場景。

如上圖所示,利用gfxinfo開發的檢查卡頓的小工具,圖中參數和卡頓說明如下:

根據上面對gfxinfo的幀信息解析,可以准確計算出每一幀的耗時。從而可以開發出滿足騰訊PerfDog中關於普通卡頓和嚴重卡頓的判斷。

依賴定時截圖,即可准確定位卡頓場景。如下圖所示(此處以PerfDog截圖示例):

通過第3部分的卡頓評估方法,我們可以定位到卡頓場景,但是如何定位到具體卡頓原因呢。

首先了解卡頓問題定位工具,然後再了解常見的卡頓原因,即可通過復現卡頓場景的同時,用工具去定位具體卡頓問題。

重點就是,充分利用gfxinfo輸出的幀信息,對卡頓問題進行分類。

了解了高效定位卡頓的方法和卡頓問題定位工具,再熟悉一下常見的卡頓原因,可以更熟練的定位和優化卡頓。

SurfaceFlinger 負責 Surface 的合成,一旦 SurfaceFlinger 主線程調用超時,就會產生掉幀。
SurfaceFlinger 主線程耗時會也會導致 hwc service 和 crtc 不能及時完成,也會阻塞應用的 binder 調用,如 dequeueBuffer、queueBuffer 等。

後台進程活動太多,會導致系統非常繁忙,cpu io memory 等資源都會被佔用,這時候很容易出現卡頓問題,這也是系統這邊經常會碰到的問題。
mpsys cpuinfo 可以查看一段時間內 cpu 的使用情況:

當線程為 Runnable 狀態的時候,調度器如果遲遲不能對齊進行調度,那麼就會產生長時間的 Runnable 線程狀態,導致錯過 Vsync 而產生流暢性問題。

system_server 的 AMS 鎖和 WMS 鎖 , 在系統異常的情況下 , 會變得非常嚴重 , 如下圖所示 , 許多系統的關鍵任務都被阻塞 , 等待鎖的釋放 , 這時候如果有 App 發來的 Binder 請求帶鎖 , 那麼也會進入等待狀態 , 這時候 App 就會產生性能問題 ; 如果此時做 Window 動畫 , 那麼 system_server 的這些鎖也會導致窗口動畫卡頓。

Android P 修改了 Layer 的計算方法 , 把這部分放到了 SurfaceFlinger 主線程去執行, 如果後台 Layer 過多,就會導致 SurfaceFlinger 在執行 rebuildLayerStacks 的時候耗時 , 導致 SurfaceFlinger 主線程執行時間過長。

主線程執行 Input Animation Measure Layout Draw decodeBitmap 等操作超時都會導致卡頓 。

Activity resume 的時候, 與 AMS 通信要持有 AMS 鎖, 這時候如果碰到後台比較繁忙的時候, 等鎖操作就會比較耗時, 導致部分場景因為這個卡頓, 比如多任務手勢操作。

應用裡面涉及到 WebView 的時候, 如果頁面比較復雜, WebView 的性能就會比較差, 從而造成卡頓。

如果屏幕幀率和系統的 fps 不相符 , 那麼有可能會導致畫面不是那麼順暢. 比如使用 90 Hz 的屏幕搭配 60 fps 的動畫。

由上面的分析可知對象分配、垃圾回收(GC)、線程調度以及Binder調用 是Android系統中常見的卡頓原因,因此卡頓優化主要以下幾種方法,更多的要結合具體的應用來進行:

在計算機和通信領域,幀是一個包括「幀同步串列」的數字數據傳輸單元或數字數據包。
在視頻領域,電影、電視、數字視頻等可視為隨時間連續變換的許多張畫面,其中幀是指每一張畫面。

3. Android TextView使用及性能優化

TextView 是Android中最常用的控制項,在這里記錄下TextView 的用法;

在Android中可以使用系統自帶的4種字體:

在XML中使用 android:typeface="normal" 進行設置

將字體文件放到main/assets/fonts目錄下,使用Asset讀取字體後進行設置

使用 android:drawableLeft="@mipmap/ic_launcher" 可以設置一張圖片顯示在文字的上下左右,減少布局層級

使用Span能夠在一段TextView中設置不同顏色的字體,鏈接,圖片等內容

使用ClickableSpan 能夠設置一段文字的點擊事件

創建自己的MyClickableSpan:

之後使用SpannableStringBuilder來創建字元串,並使用setSpan來為字元串的一部分設置Span對象

其中setSpan()方法的最後一個參數標識有以下常量,這些常量標識著在 對SpannableStringBuilder進行insert時 添加的字元適用的規則:

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

Spanned.SPAN_EXCLUSIVE_INCLUSIVE

Spanned.SPAN_INCLUSIVE_EXCLUSIVE

Spanned.SPAN_INCLUSIVE_INCLUSIVE

前一個 EXCLUSIVE / INCLUSIVE 標識著在設置了Span的一段字元之前(緊挨著)插入字元時,被不被包含到Span范圍中, EXCLUSIVE 表示包含, INCLUSIVE 表示不包含;

第二個 EXCLUSIVE / INCLUSIVE 同理表示插入這段字元之後的效果;

ImageSpan用於在TextView中插入圖片,可以用來實現圖文混排

使用方法:

這樣實現的效果是文字與圖片底部進行對齊,如果需要圖片中線與文字中線對其,需要自己重寫ImageSpan

​ Android 中的TextView中存在著很多EditText中的特性,在setText()方法中會涉及到很多Span相關的操作,比如設置TextWatcher,重新構造Spannable等操作,在我們僅僅顯示靜態文本的時候這些操作都是沒有必要的(通過使用普通的TextView進行Debug來驗證普通的TextView的確是Span的);

​ 在大量顯示靜態文本的時候就可以通過StaticLayout來計算出TextView的布局信息,這項工作可以放到非UI線程來進行,能夠減少在setText()的時候UI線程的耗時,達到優化TextView性能的目的;

​ StaticLayout是TextView中用於顯示多行靜態文本的Layout,也是能夠支持SpannableString的,只是不能在Span變化之後重新Layout,所以在大部分場景下已經適用;

通過這個自定義的View來顯示Text,在onDraw()的時候直接使用layout來進行繪制,而設置需要顯示的文本則直接使用setLayout()來實現

使用下面給出的參考鏈接中的測試Demo在 ZTE A2017 Android7.1.1 高通820設備上,普通TextView在ListView中連續滾動的幀數是55幀,使用StaticLayout的結果為60幀

可以作為在APP使用CPU資源較多的情況下的優化手段

參考鏈接: TextView預渲染研究

在Android中,TextView的測量消耗了大量的時間,Android P中提供了PrecomputedText能夠將測量這個過程放到後台來執行,減輕對於UI線程的卡頓;

非Android P時,使用AppCompatTextView控制項,使用setTextFeature()方法來將文本的measure過程放到其他線程來執行,而不是直接將text應用於TextView;

在調用了這個方法之後如果對TextView進行邊距,文字大小等的設置都將會報錯;

Prefetch Text Layout in RecyclerView

PrecomputedTextCompat

在ListView中僅替換設置Text的方法時未測試出性能與普通方法有什麼優勢,猜測是ListView沒有在getView和顯示之間預留時間,

測試項目地址:

https://github.com/GavynZhang/PrecomuptedTextViewTest

4. 針對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性能優化的淺談

    5. 《基於Android與iOS平台的實踐》pdf下載在線閱讀全文,求百度網盤雲資源

    《音視頻開發進階指南:基於Android與iOS平台的實踐》網路網盤pdf最新全集下載:
    鏈接: https://pan..com/s/1_XWVI4OhWHxU7WJc0qqicA

    ?pwd=5wmv 提取碼: 5wmv
    簡介:書中首先通過介紹音視頻的物理現象與基礎概念,銀洞幫助讀者建立模擬信號到數字信號轉化的過程,然後重點介紹了如何在移動端開發音視頻項目,其中包括開發中所需要了解的各種知識,如音視頻的解碼與渲染,採集與編碼,音視頻的搭巧處理與性能優化等;在此基礎上最後綜合當下*流行的直播場景,知搏鍵介紹如何將書中的已有項目改造、適配成為一個直播產品,進一步幫助讀者自由、有效的開發出功能豐富、性能一流的音視頻App。

    6. Android-ViewPager源碼解析與性能優化

    ViewPager高度設置為wrap_content或者具體的高度值無效,是因為ViewPager的onMeasure方法在度量寬高的時候,在方法體的最開始就直接調用了setMeasuredDimension()方法將自身的寬高度量,但是並沒有在其onMeasure()計算完其具體的子View的寬高之後,重新度量一次自身的寬高

    從這里我們可以看到,ViewPager的寬高會受其父容器的寬高的限制,但是並不會因為自身子View的寬高而影響ViewPager的寬高。

    看setMeasuredDimension的源碼調用可以看出,當父容器的高度確定時,ViewPager的寬高其實就是父容器的寬高,ViewPager就是在onMeasure方法一進來的時候就直接填充滿整個父容器的剩餘空間。在計算孩子節點之前,就已經計算好了ViewPager的寬高,在計算完孩子節點之後,並不會再去重新計算ViewPager的寬高。

    自定義一個ViewPager,根據子View的寬高重新度量ViewPager的寬高。其實做法就是在自定義onMeasure的super.onMeasure(widthMeasureSpec, heightMeasureSpec);之前重新計算heightMeasureSpec,將原本ViewPager接收的父容器的限定的heightMeasureSpec替換成我們自定義的heightMeasureSpec。

    但是這樣的做法,會有種問題,即在ViewPager的子View是採用LinearLayout作為根布局的時候,並且給LinearLayout設置了固定的高度值,那麼會出現ViewPager動態高度無效的問題
    其實具體的做法,就是仿造measureChild的做法,自定義子View的heightMeasureSpec然後度量整個子View,其實子View的寬度也可以這樣做。

    這里其實是源碼層做了限制,在setOffscreenPageLimit中設置了一個默認值,而這個默認值的大小為1

    所以從這里可以看出,ViewPager的最小緩存的limit是1,而不能小於1,當小於1的時候就會被強制的設置為1。
    而populate()函數就是用來處理ViewPager的緩存的。
    populate()的生命周期是與Adapter的生命周期綁定的。
    其實在setOffscreenPageLimit()的時候,調用的populate(),而populate()內部調用的

    而pupulate(int newCurrentItem)方法在另一處調用的地方就是在setCurrentItem。
    其實ViewPager緩存都是基於ItemInfo這個類來進行的,

    看下ViewPager.addNewItem的源碼
    其實ViewPager.addNewItem就是通過調用Adapter.instantiateItem來創建對應的View,並且將View保存到ItemInfo中的object屬性,並且判斷ViewPager緩存中是否已經有ItemInfo,如果沒有,則添加,如果有則做修改替換

    從分析FragmentStatePagerAdapter來看,setUserVisibleHint方法會優先於Fragment的生命周期函數 執行。因為在FragmentStatePagerAdapter中提交事務,是在調用finishUpdate方法中進行的,只有提交事務的時候,才會去執行Fragment的生命周期。
    FragmentStatePagerAdapter中的instantiateItem和destroyItem都實現了對fragment的事務的添加和刪除,而finishUpdate實現了事務的提交,所以在實現FragmentStatePagerAdapter的時候,並不需要重寫instantiateItem和destroyItem

    7. 安卓系統優化方法


    目前智能手機市場兩大系統分別是iOS和Android,並且已經形成了對立的陣營,Android用戶並不理會iOS用戶所謂的體驗好應用好是怎麼個好法,而iOS用戶則更不理解Android用戶刷機重啟摳電池的樂趣。在iOS用戶眼中,Android的形象幾乎可以用一個「卡」字來代替。其實Android經過了這幾年的發展,硬體水平已經有了很大的提高,再加上目前的優化,Android卡的情況已經有了很大程度的緩解,目前的雙核機型硬體配置十分強大,如帶告果還要說卡,也就是因為廠商定製ROM的優化原因。
    其實Android的「卡」,可以得到徹底的解決,這就關繫到了Android的優化問題,而今天我們就探討下如何優化我們手中的Android機型。在這里筆者也要提醒大家,選購Android機型一定要選擇熱門機型,只有熱門機型才有足夠豐富的優化資宏行激源供我們選擇,切忌為了個性選擇偏門機型,Android熱門機型再是街機,也不會比iPhone還街吧?
    刷機重啟摳電池
    刷機是Android用戶的一大樂趣,部分用戶刷機是為了得到更好的易用性,比如小米的MIUI ROM,非常符合中國人的使用習慣,也有著足夠豐富的個性化設蔽襪定,是圖省事的朋友刷機的好選擇,不過對於追求高性能的朋友來說,MIUI的優化還有很大提升空間,人們紛紛選擇了對於ROM優化更加出色的CyanogenMod作為刷機的第一選擇。
    MIUI ROM特色
    CyanogenMod系列目前主打的ROM有CM 7.2和CM 9兩個,CM 7.2基於Android 2.3.7,而CM 9則基於Android 4.0.4,其中CM 7.2已經基本成熟,完美支持的機型很多,是大部分機友刷機的第一選擇,CM 9官方的ROM支持機型並不多,民間高手也都進行了各個機型的移植,官方支持的機型兼容性相當不錯,而移植情況並不樂觀。
    CyanogenMod的LOGO
    CM系列ROM忠實於AOSP,在底層驅動方面做了很多努力,刷入之後就會感覺手機流暢了許多,同時也支持了更多的美化和手機自定義能力,比如我們可以對手機的震動回饋做細致的調整,包括按下震動的強度,抬起震動的強度等,讓手機虛擬按鍵給我們更為真實的回饋,在CM ROM中,類似的設定非常多。
    CM9 ROM截圖
    目前大部分的ROM都是使用CM進行定製的,還有一部分是對官方原版ROM進行修改,僅有少部分的ROM是修改的AOSP的源碼,這些ROM指向都是谷歌Nexus系列的機型,比如GALAXY Nexus和Nexus S上的Codename和AOKP,就針對源碼做了很多修改,讓手機變得更流暢。
    刷內核效果很好
    僅僅刷手機的ROM是不夠的,雖然多了很多自定義的功能,流暢度已經高於官方的ROM,但依舊有很大提升的空間,這時候我們就需要通過刷內核來進一步優化,刷內核所能帶來的提升是相當明顯的,但是對於刷內核大家還是要謹慎。
    國外著名論壇的內核發布區
    刷內核相比刷ROM,是一個很小的工程,你的手機不必要Wipe,也就是說不用刪除手機內部的數據,刷一下也就幾分鍾的功夫,所以刷內核的時候,大家完全可以多下幾個內核,逐個進行測試,看看哪個內核更適合自己,就保留哪個內核。同時刷內核時我們要注意,內核需對應自己的手機版本,對應自己所刷的ROM,否則會造成手機無法啟動的現象,如果遇到無法啟動的現象,再刷其他可用內核就可以恢復。
    Android機器人
    大家會問了,說了這么半天,刷內核到底都有什麼作用呢?首先就是超頻,大部分內核會默認提供降壓超頻,並擁有多種超頻策略,來保證超頻的情況下更省電。其次,還提供更多調整,比如內存虛擬機的大小,顏色管理等等,甚至一個內核可以包括一些新的Linux的補丁,比如最新的Linux 3.3所集成的CPU頻率補丁等等。
    刷內核工具
    事實上,一般的第三方ROM已經修改了手機的內核,達到了更流暢的目的,但ROM的製作速度遠遠比不上內核的調整速度,有時候一個ROM適用的內核在一天之內可能多次更新,所以我們可以嘗試不同的新內核,看看他們的超頻是不是能給我們帶來性能上質的提升,是不是能更省電,是不是能通過顏色調整讓我們看到更棒的畫面等等。
    精簡內置應用
    我相信Android用戶通過不斷的更換ROM和刷內核已經在流暢度上有了質的飛躍了,如果這時候你的手機已經比iPhone更流暢、更省電,那麼我們就可以收手了,如果你還不滿意,我們還有其他的路可選,精簡內置應用,就是一個可以大幅度提升流暢度的方法。像Google的服務就是大部分人精簡的對象。
    跑分是性能的體現
    Android系統和iOS與Windows Phone不同,這個系統擁有真正的後台運行能力,雖然iOS在推送方面做得很好,彌補了後台方面的不足,但是仍然無法與Android的真後台相比,但是由於Android的程序優先順序並不像iOS和Windows Phone那樣,為了流暢讓當前界面擁有最高優先順序,所以我們就要把Android手機後台不必要的進程關掉,以獲得最佳的性能。
    RE管理器截圖
    那麼精簡內部應用就是很好的選擇,因為在我們使用過程中,有許多Android內部應用程序是不必要的,而這些程序會在我們不用的時候悄悄的後台打開,對我們的使用造成影響。在精簡時,我們需要用到root文件管理器,同時需要保證手機已經開啟root許可權。
    RE管理器截圖
    進入system/app就可以進行精簡了,我們需要把root管理器的當前許可權設置成讀寫,並且修改需要刪除的軟體許可權,打開軟體執行操作的許可權,就可以對刪除內置軟體了,在精簡前,大家需要對軟體進行備份,或者備份整個ROM,如果你精簡掉系統程序,可能會造成無法開機的情況,重刷ROM可以解決,所以大家最好找到該機型、該ROM的精簡列表,以避免重復勞動。
    還有其他優化
    經過以上多方面的優化,我相信大家都已經得到了一個較為干凈、運行流暢的Android了,不過在很多程序中,我們還是會遇到卡頓的情況,對於一個極端追求流暢度的玩家來說,這樣的情況是絕對不允許發生的,因為我們還有進一步優化的空間。
    CM超頻選項
    之前我們介紹了CM系列ROM,而CM的ROM中有兩個選項的勾選可以進一步的提高流暢度,但是會損失一些畫面這些選項是貼圖差值抖動和16位透明度,貼圖差值抖動這個選項需要關閉,這個選項關閉後可以提高流暢度,但是在滑動菜單時會有不容易被發現的畫面損失,而16位透明度這個選項開啟會大幅度提高流暢度,但是一些純色的透明效果畫質會下降,比如Android滑動到邊緣的越界效果。
    CM性能設置選項
    在Android 4.0的ROM中,也有不少選項可以提高程序的流暢度,比如程序的GPU加速,使用GPU對2D程序的界面進行渲染,有效減輕界面滑動對於CPU的負擔,同時還能讓界面得到更好地渲染效果,不過這個選項會讓有些程序出現兼容性問題,而Android也不能單獨為某個程序開關GPU加速,所以GPU加速這個功能讓人又愛又恨。
    Android 4.0強制GPU加速
    在提到刷內核時,我們也提到了超頻內核,超頻內核在刷完後,會在ROM設置中提供給你多種內核超頻策略選擇,在大部分機型中,超頻不會增加CPU的耗電,因為廠商在CPU出廠前,為了保證CPU的穩定,為CPU設置了很安全的電壓和頻率,這顯得過於保守,而在同等的電壓下,CPU根據體質不同或多或少還有可以壓榨的空間,所以我們在保證穩定運行的情況下,還可以繼續對CPU進行超頻。
    優化策略總結
    本文我們從刷ROM開始提到了一些Android系統的優化,對於Android系統來說,流暢度是它相比其他系統最大的短板,其實Android的大部分手機有著相當好的硬體,所以流暢度大幅度提升完全不是難事,而各個廠商在Android手機出廠前給手機定製的ROM並沒有達到最優的優化效果,或多或少都有可提升的空間。
    三星 GALAXY Nexus
    所以我們也可以根據自己用手機的需要對手機進行徹頭徹尾的優化,從ROM開始讓手機變得徹底流暢起來,這里要跟大家囑咐的,也是我們多次重申的一點:一定要選擇普及率較高的Android機型,尤其是在國外的高普及度,像谷歌的Nexus系列手機被譽為親兒子,也是因為它開放了源代碼,在其他手機為第三方ROM撓頭的時候,Nexus系列已經早早的開始各種優化了。
    ClockworkMod的LOGO
    其次,除了ROM資源,我們也要考慮到其他資源,比如內核,各大手機廠商的熱門機型,內核資源也是不一樣的,早期摩托羅拉的里程碑很開放,所以有著大量可刷的內核,而到了後來摩托羅拉機型很封閉,可刷的內核資源就相當匱乏,雖然ROM很多,但刷來刷去都大同小異,刷機的樂趣銳減。這里谷歌的Nexus系列再一次做了表率。
    AOSP網頁截圖
    再加上一些精簡和設置操作,你會發現,你的手機流暢度完全可以翻幾番,即使是官方有新的升級你可能都懶得去理,因為你知道,官方的升級不可能帶來刷機所給你的流暢度。這也是iOS玩家所不理解的刷機重啟扣電池的樂趣。他們更不理解的是Android的流暢度怎麼能超越iOS呢?如果您按照小編交給你的這些方法,安卓手機不會再出現卡殼的現象了。

    8. 《高性能Android應用開發》pdf下載在線閱讀,求百度網盤雲資源

    《高性能Android應用開發》([美] Doug Sillars)電子書網盤下載免費在線閱讀

    資源鏈接:

    鏈接:https://pan..com/s/15apBngXi9wT-iEkLWCLbPA

    提取碼:0qkc

    書名:高性能Android應用開發

    作者:[美] Doug Sillars

    譯者:王若蘭

    豆瓣評分:7.3

    出版社:人民郵電出版社

    出版年份:2016-10

    頁數:220

    內容簡介:

    性能問題在很大程度上決定了用戶是否會使用一款App,本書正是Android性能方面的關鍵性指南。全書共8章,主要從電池、內存、CPU和網路方面講解了電池管理、工作效率和速度這幾個方面的性能優化問題,並介紹了一些有助於確定和定位性能問題所屬類型的工具。同時也會探討開發人員面臨的一些主要問題,進而提出一些可行的補救措施。全書旨在通過提高App性能完善App,以便用戶可以獲得極致體驗。

    作者簡介:

    Doug Sillars

    是 AT&T 開發者計劃中的性能推廣領導者。他幫助了成千上萬的移動開發人員將性能的最佳實踐應用到 App 上。他開發的工具和總結的最佳實踐,幫助開發人員使 App 運行得更快,同時使用了更少的數據和電量。他和妻子生活在華盛頓州的一個小島上,並在家教育三個孩子。

    9. Android App性能優化之耗電優化

    在移動設備中,電池的重要性不言而喻,沒有電什麼都幹不成。對於操作系統和設備開發商來說,去追求更長的待機時間,耗電優化一直沒有停止。而對於一款應用來說,並不能忽略耗電問題,特別是那些被歸為「電池殺手」的應用,最終的結果是被卸載。因此,應用開發者在實現需求的同時,需要盡量減少電量的消耗(本文針對Android App進行分析)。

    App耗電的原因其實很多,這里我就講以下幾種優化方案,優化方案的反面就是他的原因了,幾種優化方案如下:

    1.合理的使用wake_lock鎖,wake_lock鎖主要是相對系統的休眠(這里就是為了省電,才做休)而言的,意思就是我的程序給CPU加了這個鎖那系統就不會休眠歲脊了,這樣做的目的是為了全力配合我們程序的運行。有的情況如果不這么做就會出現一些問題,比如微信乎襲滲等及時通訊的心跳包會在禪世熄屏不久後停止網路訪問等問題。所以微信裡面是有大量使用到了wake_lock鎖。

    2.使用jobScheler2,集中處理一些網路請求,有些不用很及時的處理可以放在充電的時候處理,比如,圖片的處理,APP下載更新等等;

    3.計算優化,避開浮點運算等。

    4.數據在網路上傳輸時,盡量壓縮數據後再傳輸,建議用FlatBuffer序列化技術,這個比json效率高很多倍,不了解FlatBuffer,建議找資料學習一下。

    App耗電分析所用到的工具

    App耗電高說到底無非是因為代碼不合理造成的,其中存在的一些問題,我們通過調試也很難定位到。在這里,我給大家分享一款工具,那就是「友盟+u-apm」應用性能監控平台了,是為了幫助開發者監測app應用使用的。它可以實時監測到app性能方面的問題,定位到問題所在處,開發者可以針對問題進行解決並修復。

    友盟還通過輕量級的集成接入即可擁有實時、可靠、全面的應用崩潰、ANR、自定義異常等捕獲能力,及卡頓、啟動分析等性能能力,支持多場景、多通道智能告警監控,幫助開發者高效還原異常、卡頓用戶的訪問路徑和業務現場,縮短故障排查時間。

    另外,友盟還提供了雲真機測試能力,提供了海量Android、iOS真機,通過資源集中管理,合理調度分配,為開發者提供發版前測試、發現線上問題後復現等場景使用,助力開發者平衡成本與需求,提升研發效率。助力開發者從研發測試質量驗收到線上問題復現排查,保障應用品質,提升測試效率。在雲真機測試期間自動採集崩潰信息,提供詳盡的崩潰報告協助篩查,真正實現監控測試全流程深度打通。為移動開發者提供了靈活地測試操作界面,支持ADB調試、WEB遠程調試、掃碼、抓包、虛擬定位等測試功能,並提供了測試報告供開發者後續查看。

    友盟作為一款監測工具,可以幫助各位開發者監測app性能問題,還可以減輕開發者的負擔和壓力,簡直就是開發者的「得力小幫手」!

    熱點內容
    ubuntupython3安裝 發布:2025-02-14 00:14:45 瀏覽:661
    和平精英怎麼更新比較快安卓 發布:2025-02-14 00:14:35 瀏覽:974
    怎麼改密碼鎖 發布:2025-02-13 23:47:39 瀏覽:852
    androidbitmap獲取大小 發布:2025-02-13 23:47:38 瀏覽:559
    怎麼把升級鴻蒙系統變回安卓 發布:2025-02-13 23:36:07 瀏覽:595
    偶校驗c語言 發布:2025-02-13 23:22:52 瀏覽:937
    芒果如何提取離線緩存視頻 發布:2025-02-13 23:16:12 瀏覽:793
    王者榮耀微信區安卓哪裡分低 發布:2025-02-13 23:14:10 瀏覽:658
    安裝linuxvmwaretools 發布:2025-02-13 22:56:02 瀏覽:8
    浪潮伺服器如何引導系統安裝光碟 發布:2025-02-13 22:56:02 瀏覽:112