一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Android系統(tǒng)APP性能優(yōu)化在開發(fā)應用程序時應該注意的點有哪些

Dbwd_Imgtec ? 來源:未知 ? 作者:易水寒 ? 2018-05-05 11:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

說到 Android 系統(tǒng)手機,大部分人的印象是用了一段時間就變得有點卡頓,有些程序在運行期間莫名其妙的出現(xiàn)崩潰,打開系統(tǒng)文件夾一看,發(fā)現(xiàn)多了很多文件,然后用手機管家 APP 不斷地進行清理優(yōu)化 ,才感覺運行速度稍微提高了點,就算手機在各種性能跑分軟件面前分數(shù)遙遙領先,還是感覺無論有多大的內(nèi)存空間都遠遠不夠用。相信每個使用 Android 系統(tǒng)的用戶都有過以上類似經(jīng)歷,確實,Android 系統(tǒng)在流暢性方面不如 IOS 系統(tǒng),為何呢,明明在看手機硬件配置上時,Android 設備都不會輸于 IOS 設備,甚至都強于它,關鍵是在于軟件上。

造成這種現(xiàn)象的原因是多方面的,簡單羅列幾點如下:

其實近年來,隨著 Android 版本不斷迭代,Google 提供的Android 系統(tǒng)已經(jīng)越來越流暢,目前最新發(fā)布的版本是 Android 8.0 Oreo 。但是在國內(nèi)大部分用戶用的 Android 手機系是各大廠商定制過的版本,往往不是最新的原生系統(tǒng)內(nèi)核,可能絕大多數(shù)還停留在 Android 5.0 系統(tǒng)上,甚至 Android 6.0 以上所占比例還偏小,更新存在延遲性。

由于 Android 系統(tǒng)源碼是開放的,每個人只要遵從相應的協(xié)議,就可以對源碼進行修改,那么國內(nèi)各個廠商就把基于 Android 源碼改造成自己對外發(fā)布的系統(tǒng),比如我們熟悉的小米手機 Miui 系統(tǒng)、華為手機 EMUI 系統(tǒng)、Oppo 手機 ColorOS 系統(tǒng)等。由于每個廠商都修改過 Android 原生系統(tǒng)源碼,這里面就會引發(fā)一個問題,那就是著名的Android 碎片化問題,本質(zhì)就是不同 Android 系統(tǒng)的應用兼容性不同,達不到一致性。

由于存在著各種 Android 碎片化和兼容性問題,導致 Android 開發(fā)者在開發(fā)應用時需要對不同系統(tǒng)進行適配,同時每個 Android 開發(fā)者的開發(fā)水平參差不齊,寫出來的應用性能也都存在不同類型的問題,導致用戶在使用過程中用戶體驗感受不同,那么有些問題用戶就會轉(zhuǎn)化為 Android 系統(tǒng)問題,進而影響對Android 手機的評價。

性能優(yōu)化

今天想說的重點是Android APP 性能優(yōu)化,也就是在開發(fā)應用程序時應該注意的點有哪些,如何更好地提高用戶體驗。一個好的應用,除了要有吸引人的功能和交互之外,在性能上也應該有高的要求,即時應用非常具有特色,在產(chǎn)品前期可能吸引了部分用戶,但是用戶體驗不好的話,也會給產(chǎn)品帶來不好的口碑。

那么一個好的應用應該如何定義呢?主要有以下三方面:

業(yè)務/功能

符合邏輯的交互

優(yōu)秀的性能

眾所周知,Android 系統(tǒng)作為以移動設備為主的操作系統(tǒng),硬件配置是有一定的限制的,雖然配置現(xiàn)在越來越高級,但仍然無法與 PC 相比,在 CPU 和內(nèi)存上使用不合理或者耗費資源多時,就會碰到內(nèi)存不足導致的穩(wěn)定性問題、CPU 消耗太多導致的卡頓問題等。

面對問題時,大家想到的都是聯(lián)系用戶,然后查看日志,但殊不知有關性能類問題的反饋,原因也非常難找,日志大多用處不大,為何呢?因為性能問題大部分是非必現(xiàn)的問題,問題定位很難復現(xiàn),而又沒有關鍵的日志,當然就無法找到原因了。這些問題非常影響用戶體驗和功能使用,所以了解一些性能優(yōu)化的一些解決方案就顯得很重要了,并在實際的項目中優(yōu)化我們的應用,進而提高用戶體驗。

四個方面

可以把用戶體驗的性能問題主要總結(jié)為4個類別:

流暢

穩(wěn)定

省電、省流量

安裝包小

性能問題的主要原因是什么,原因有相同的,也有不同的,但歸根到底,不外乎內(nèi)存使用、代碼效率、合適的策略邏輯、代碼質(zhì)量、安裝包體積這一類問題,整理歸類如下:

Android系統(tǒng)APP性能優(yōu)化在開發(fā)應用程序時應該注意的點有哪些

從圖中可以看到,打造一個高質(zhì)量的應用應該以4個方向為目標:快、穩(wěn)、省、小。

快:使用時避免出現(xiàn)卡頓,響應速度快,減少用戶等待的時間,滿足用戶期望。

穩(wěn):減低 crash 率和 ANR 率,不要在用戶使用過程中崩潰和無響應。

省:節(jié)省流量和耗電,減少用戶使用成本,避免使用時導致手機發(fā)燙。

?。喊惭b包小可以降低用戶的安裝成本。

要想達到這4個目標,具體實現(xiàn)是在右邊框里的問題:卡頓、內(nèi)存使用不合理、代碼質(zhì)量差、代碼邏輯亂、安裝包過大,這些問題也是在開發(fā)過程中碰到最多的問題,在實現(xiàn)業(yè)務需求同時,也需要考慮到這點,多花時間去思考,如何避免功能完成后再來做優(yōu)化,不然的話等功能實現(xiàn)后帶來的維護成本會增加。

一、卡頓優(yōu)化

Android 應用啟動慢,使用時經(jīng)常卡頓,是非常影響用戶體驗的,應該盡量避免出現(xiàn)??D的場景有很多,按場景可以分為4類:UI 繪制、應用啟動、頁面跳轉(zhuǎn)、事件響應,如圖:

Android系統(tǒng)APP性能優(yōu)化在開發(fā)應用程序時應該注意的點有哪些

這4種卡頓場景的根本原因可以分為兩大類:

? 界面繪制。主要原因是繪制的層級深、頁面復雜、刷新不合理,由于這些原因?qū)е驴D的場景更多出現(xiàn)在 UI 和啟動后的初始界面以及跳轉(zhuǎn)到頁面的繪制上。

? 數(shù)據(jù)處理。導致這種卡頓場景的原因是數(shù)據(jù)處理量太大,一般分為三種情況:

數(shù)據(jù)在處理 UI 線程,

數(shù)據(jù)處理占用 CPU 高,導致主線程拿不到時間片,

內(nèi)存增加導致 GC 頻繁,從而引起卡頓。

引起卡頓的原因很多,但不管怎么樣的原因和場景,最終都是通過設備屏幕上顯示來達到用戶,歸根到底就是顯示有問題,所以,要解決卡頓,就要先了解 Android 系統(tǒng)的顯示原理。

Android系統(tǒng)顯示原理

Android 顯示過程可以簡單概括為:Android 應用程序把經(jīng)過測量、布局、繪制后的 surface 緩存數(shù)據(jù),通過 SurfaceFlinger 把數(shù)據(jù)渲染到顯示屏幕上, 通過 Android 的刷新機制來刷新數(shù)據(jù)。也就是說應用層負責繪制,系統(tǒng)層負責渲染,通過進程間通信把應用層需要繪制的數(shù)據(jù)傳遞到系統(tǒng)層服務,系統(tǒng)層服務通過刷新機制把數(shù)據(jù)更新到屏幕上。

我們都知道在 Android 的每個 View 繪制中有三個核心步驟:Measure、Layout、Draw。具體實現(xiàn)是從 ViewRootImp 類的performTraversals() 方法開始執(zhí)行,Measure 和 Layout都是通過遞歸來獲取 View 的大小和位置,并且以深度作為優(yōu)先級,可以看出層級越深、元素越多、耗時也就越長。

真正把需要顯示的數(shù)據(jù)渲染到屏幕上,是通過系統(tǒng)級進程中的 SurfaceFlinger 服務來實現(xiàn)的,那么這個SurfaceFlinger 服務主要做了哪些工作呢?如下:

響應客戶端事件,創(chuàng)建 Layer 與客戶端的 Surface 建立連接。

接收客戶端數(shù)據(jù)及屬性,修改 Layer 屬性,如尺寸、顏色、透明度等。

將創(chuàng)建的 Layer 內(nèi)容刷新到屏幕上。

維持 Layer 的序列,并對 Layer 最終輸出做出裁剪計算。

既然是兩個不同的進程,那么肯定是需要一個跨進程的通信機制來實現(xiàn)數(shù)據(jù)傳遞,在 Android 顯示系統(tǒng)中,使用了 Android 的匿名共享內(nèi)存:SharedClient,每一個應用和 SurfaceFlinger 之間都會創(chuàng)建一個SharedClient ,然后在每個 SharedClient 中,最多可以創(chuàng)建 31 個 SharedBufferStack,每個 Surface 都對應一個 SharedBufferStack,也就是一個 Window。

一個 SharedClient 對應一個Android 應用程序,而一個 Android 應用程序可能包含多個窗口,即 Surface 。也就是說 SharedClient 包含的是 SharedBufferStack的集合,其中在顯示刷新機制中用到了雙緩沖和三重緩沖技術(shù)。最后總結(jié)起來顯示整體流程分為三個模塊:應用層繪制到緩存區(qū),SurfaceFlinger 把緩存區(qū)數(shù)據(jù)渲染到屏幕,由于是不同的進程,所以使用 Android 的匿名共享內(nèi)存 SharedClient 緩存需要顯示的數(shù)據(jù)來達到目的。

除此之外,我們還需要一個名詞:FPS。FPS 表示每秒傳遞的幀數(shù)。在理想情況下,60 FPS 就感覺不到卡,這意味著每個繪制時長應該在16 ms 以內(nèi)。但是 Android 系統(tǒng)很有可能無法及時完成那些復雜的頁面渲染操作。Android 系統(tǒng)每隔 16ms 發(fā)出 VSYNC 信號,觸發(fā)對 UI 進行渲染,如果每次渲染都成功,這樣就能夠達到流暢的畫面所需的 60FPS。如果某個操作花費的時間是 24ms ,系統(tǒng)在得到 VSYNC 信號時就無法正常進行正常渲染,這樣就發(fā)生了丟幀現(xiàn)象。那么用戶在 32ms 內(nèi)看到的會是同一幀畫面,這種現(xiàn)象在執(zhí)行動畫或滑動列表比較常見,還有可能是你的 Layout 太過復雜,層疊太多的繪制單元,無法在 16ms 完成渲染,最終引起刷新不及時。

卡頓根本原因

根據(jù)Android 系統(tǒng)顯示原理可以看到,影響繪制的根本原因有以下兩個方面:

繪制任務太重,繪制一幀內(nèi)容耗時太長。

主線程太忙,根據(jù)系統(tǒng)傳遞過來的 VSYNC 信號來時還沒準備好數(shù)據(jù)導致丟幀。

繪制耗時太長,有一些工具可以幫助我們定位問題。主線程太忙則需要注意了,主線程關鍵職責是處理用戶交互,在屏幕上繪制像素,并進行加載顯示相關的數(shù)據(jù),所以特別需要避免任何主線程的事情,這樣應用程序才能保持對用戶操作的即時響應。

總結(jié)起來,主線程主要做以下幾個方面工作:

UI 生命周期控制

系統(tǒng)事件處理

消息處理

界面布局

界面繪制

界面刷新

除此之外,應該盡量避免將其他處理放在主線程中,特別復雜的數(shù)據(jù)計算和網(wǎng)絡請求等。

性能分析工具

性能問題并不容易復現(xiàn),也不好定位,但是真的碰到問題還是需要去解決的,那么分析問題和確認問題是否解決,就需要借助相應的的調(diào)試工具,比如查看 Layout 層次的 Hierarchy View、Android 系統(tǒng)上帶的 GPU Profile 工具和靜態(tài)代碼檢查工具 Lint 等,這些工具對性能優(yōu)化起到非常重要的作用,所以要熟悉,知道在什么場景用什么工具來分析。

1. Profile GPU Rendering

在手機開發(fā)者模式下,有一個卡頓檢測工具叫做:Profile GPU Rendering,如圖:

Android系統(tǒng)APP性能優(yōu)化在開發(fā)應用程序時應該注意的點有哪些

它的功能特點如下:

一個圖形監(jiān)測工具,能實時反應當前繪制的耗時

橫軸表示時間,縱軸表示每一幀的耗時

隨著時間推移,從左到右的刷新呈現(xiàn)

提供一個標準的耗時,如果高于標準耗時,就表示當前這一幀丟失

2.TraceView

TraceView 是 Android SDK 自帶的工具,用來分析函數(shù)調(diào)用過程,可以對 Android 的應用程序以及 Framework 層的代碼進行性能分析。它是一個圖形化的工具,最終會產(chǎn)生一個圖表,用于對性能分析進行說明,可以分析到每一個方法的執(zhí)行時間,其中可以統(tǒng)計出該方法調(diào)用次數(shù)和遞歸次數(shù),實際時長等參數(shù)維度,使用非常直觀,分析性能非常方便。

3.Systrace UI 性能分析

Systrace 是 Android 4.1及以上版本提供的性能數(shù)據(jù)采樣和分析工具,它是通過系統(tǒng)的角度來返回一些信息。它可以幫助開發(fā)者收集 Android 關鍵子系統(tǒng),如 surfaceflinger、WindowManagerService 等 Framework 部分關鍵模塊、服務、View系統(tǒng)等運行信息,從而幫助開發(fā)者更直觀地分析系統(tǒng)瓶頸,改進性能。Systrace 的功能包括跟蹤系統(tǒng)的 I/O 操作、內(nèi)核工作隊列、CPU 負載等,在 UI 顯示性能分析上提供很好的數(shù)據(jù),特別是在動畫播放不流暢、渲染卡等問題上。

優(yōu)化建議

1.布局優(yōu)化

布局是否合理主要影響的是頁面測量時間的多少,我們知道一個頁面的顯示測量和繪制過程都是通過遞歸來完成的,多叉樹遍歷的時間與樹的高度h有關,其時間復雜度 O(h),如果層級太深,每增加一層則會增加更多的頁面顯示時間,所以布局的合理性就顯得很重要。

那布局優(yōu)化有哪些方法呢,主要通過減少層級、減少測量和繪制時間、提高復用性三個方面入手。

總結(jié)如下:

減少層級。合理使用 RelativeLayout 和 LinerLayout,合理使用Merge。

提高顯示速度。使用 ViewStub,它是一個看不見的、不占布局位置、占用資源非常小的視圖對象。

布局復用??梢酝ㄟ^ 標簽來提高復用。

盡可能少用wrap_content。wrap_content 會增加布局 measure 時計算成本,在已知寬高為固定值時,不用wrap_content 。

刪除控件中無用的屬性。

2.避免過度繪制

過度繪制是指在屏幕上的某個像素在同一幀的時間內(nèi)被繪制了多次。在多層次重疊的 UI 結(jié)構(gòu)中,如果不可見的 UI 也在做繪制的操作,就會導致某些像素區(qū)域被繪制了多次,從而浪費了多余的 CPU 以及 GPU 資源。

如何避免過度繪制呢,如下:

布局上的優(yōu)化。移除 XML 中非必須的背景,移除 Window 默認的背景、按需顯示占位背景圖片

自定義View優(yōu)化。使用 canvas.clipRect()來幫助系統(tǒng)識別那些可見的區(qū)域,只有在這個區(qū)域內(nèi)才會被繪制。

3.啟動優(yōu)化

通過對啟動速度的監(jiān)控,發(fā)現(xiàn)影響啟動速度的問題所在,優(yōu)化啟動邏輯,提高應用的啟動速度。啟動主要完成三件事:UI 布局、繪制和數(shù)據(jù)準備。

因此啟動速度優(yōu)化就是需要優(yōu)化這三個過程:

UI 布局。應用一般都有閃屏頁,優(yōu)化閃屏頁的 UI 布局,可以通過 Profile GPU Rendering 檢測丟幀情況。

啟動加載邏輯優(yōu)化??梢圆捎梅植技虞d、異步加載、延期加載策略來提高應用啟動速度。

數(shù)據(jù)準備。數(shù)據(jù)初始化分析,加載數(shù)據(jù)可以考慮用線程初始化等策略。

4.合理的刷新機制

在應用開發(fā)過程中,因為數(shù)據(jù)的變化,需要刷新頁面來展示新的數(shù)據(jù),但頻繁刷新會增加資源開銷,并且可能導致卡頓發(fā)生,因此,需要一個合理的刷新機制來提高整體的 UI 流暢度。

合理的刷新需要注意以下幾點:

盡量減少刷新次數(shù)。

盡量避免后臺有高的 CPU 線程運行。

縮小刷新區(qū)域。

5.其他

在實現(xiàn)動畫效果時,需要根據(jù)不同場景選擇合適的動畫框架來實現(xiàn)。有些情況下,可以用硬件加速方式來提供流暢度。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3973

    瀏覽量

    130275
  • APP
    APP
    +關注

    關注

    33

    文章

    1587

    瀏覽量

    74272
  • 應用程序
    +關注

    關注

    38

    文章

    3337

    瀏覽量

    59042
  • 性能優(yōu)化

    關注

    0

    文章

    18

    瀏覽量

    7530

原文標題:Android APP 性能優(yōu)化的一些思考(一)

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    跨不同CPU開發(fā)應用程序時面臨哪些挑戰(zhàn)

    將Arm CPU設備(電路板和軟件)上開發(fā)應用程序輕松快速地移植到RISC-V CPU設備,這一任務頗具挑戰(zhàn)性。那么,跨不同CPU開發(fā)應用程序時面臨哪些挑戰(zhàn)?
    發(fā)表于 10-14 10:45 ?1220次閱讀

    ModuStoolBox環(huán)境之外開發(fā)應用程序時應該考慮哪些因素?

    停留在了我認為是安全的引導加載程序/ROM啟動上。 我正在逃跑 FLASH。 我幾個問題: 是否可能在此平臺上禁用 ROM 啟動? 如果禁用 ROM 啟動不是一種選擇,那么 M
    發(fā)表于 01-25 06:38

    飛凌嵌入式開發(fā)Android應用程序開發(fā)-入門級

    簡介:隨著Android系統(tǒng)的普及,越來越多的學生,工程師開始步入了Android開發(fā)的行列。那么對于一個從來沒有接觸過Android
    發(fā)表于 05-20 14:41

    AM335X開發(fā)Android 應用程序獲得system權(quán)限的方法

    Android應用程序開發(fā)中,有些操作的實現(xiàn),會發(fā)現(xiàn)單純添加了相應的功能語句卻不能實現(xiàn)想要的效果,這個時候就可能是因為這些功能必須使apk
    發(fā)表于 05-20 17:55

    4412開發(fā)Android教程——Android平臺簡介

    的Web瀏覽器引擎,驅(qū)動Android 瀏覽器和內(nèi)嵌的web視圖等等Application Framework:使用核心應用程序所使用的框架API,為了簡化最終應用APP開發(fā)的框架。
    發(fā)表于 10-20 11:43

    分享高性能Android應用開發(fā)超清版PDF

    Android技術(shù)內(nèi)幕.系統(tǒng)ANDROID經(jīng)典項目開發(fā)實戰(zhàn)_清華大學出版社Android經(jīng)典應用程序
    發(fā)表于 08-13 10:40

    對嵌入式應用程序進行性能優(yōu)化

    嵌入式系統(tǒng)由于受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與桌面系統(tǒng)處理器相比也存在較大差距,故嵌入式系統(tǒng)程序運行的空間和時間要求更為苛刻。通常,需要對嵌入式
    發(fā)表于 12-22 07:46

    android應用程序AP模式下與esp8266通信,如何開發(fā)arduino代碼?

    問題。 3- 接入:在這種情況下,設備必須通過 WIFI 與 android 應用程序合作。我的問題就在這里!我的 android 應用程序
    發(fā)表于 05-16 07:45

    ANDROID開發(fā)應用程序的方法和技巧

    本文檔以200多個經(jīng)典應用范例的實現(xiàn)郭恒,詳細講解了開發(fā)各類Android應用程序的方法和技巧。從UI界面布局實戰(zhàn)講起,依次講解了基本控件應用、事件處理實戰(zhàn)、界面顯示實戰(zhàn)、文件操作和數(shù)據(jù)存儲實戰(zhàn)等等,幾乎涵蓋了
    發(fā)表于 09-11 15:48 ?7次下載

    基于Android系統(tǒng)自啟動程序設計

    Android移動設備上執(zhí)行應用程序的環(huán)境,自啟動應用程序會給用戶帶來便利。通過對Android
    發(fā)表于 12-12 19:20 ?5次下載

    Android性能優(yōu)化之Java內(nèi)存

    Android開發(fā)中,一些不好的編程習慣會導致我們的開發(fā)app存在內(nèi)存泄露的情況。下面介紹一些
    發(fā)表于 04-26 15:38 ?1110次閱讀
    <b class='flag-5'>Android</b><b class='flag-5'>性能</b><b class='flag-5'>優(yōu)化</b>之Java內(nèi)存

    Android應用程序開發(fā)及USB數(shù)據(jù)采集系統(tǒng)的設計

    協(xié)議。本文結(jié)合兩者的突出優(yōu)點設計了一種新型數(shù)據(jù)采集系統(tǒng),以下將詳細闡述Android 3. 1平臺下的USB 應用程序開發(fā)的完整過程,以及與LPC2142之間的USB 通信功能。
    的頭像 發(fā)表于 11-09 09:10 ?4414次閱讀
    <b class='flag-5'>Android</b><b class='flag-5'>應用程序</b><b class='flag-5'>開發(fā)</b>及USB數(shù)據(jù)采集<b class='flag-5'>系統(tǒng)</b>的設計

    Android開發(fā)APP應該如何省電

    AndroidManifest.xml中加上DEVICE_POWER的權(quán)限??墒羌恿藱?quán)限之后,ADT又提示錯誤“Permission is only granted to system apps”。這下傻眼了,怎么會說“權(quán)限只授予系統(tǒng)
    發(fā)表于 07-30 17:35 ?0次下載
    <b class='flag-5'>Android</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>APP</b><b class='flag-5'>應該</b>如何省電

    開發(fā)java應用程序的基本步驟是

    ava是一種面向?qū)ο蟮木幊陶Z言,廣泛用于開發(fā)各種類型的應用程序。開發(fā)Java應用程序時一些
    的頭像 發(fā)表于 11-28 16:52 ?2286次閱讀

    android手機上emulate應用程序的方法

    Android手機上模擬(emulate)應用程序的方法通常涉及到使用Android模擬器(Emulator)或類似的工具來模擬Android
    的頭像 發(fā)表于 12-05 15:33 ?1218次閱讀