說一說Android的性能優(yōu)化

1,UI
UI是最直觀的反映APP卡頓的因素胁艰,Android系統(tǒng)中,應(yīng)用程序把經(jīng)過測量,布局腾么、繪制后的 surface 緩存數(shù)據(jù)杈湾,通過 SurfaceFlinger 把數(shù)據(jù)渲染到顯示屏幕上, 通過 Android 的刷新機制來刷新數(shù)據(jù)殴泰。簡單來說就是應(yīng)用層負責繪制于宙,系統(tǒng)層負責渲染進程間通信把應(yīng)用層需要繪制的數(shù)據(jù)傳遞到系統(tǒng)層服務(wù)悍汛,系統(tǒng)層服務(wù)通過刷新機制把數(shù)據(jù)更新到屏幕上。

理想的情況下离咐,讓人的眼睛不覺的卡頓,每秒傳遞的幀數(shù)要達到60昆著,Android系統(tǒng)每隔16ms發(fā)送一次VSYNC信號,1000(1秒)/16=62.5凑懂,在這種情況下人的眼睛便不會覺得卡頓梧宫,也就是說16ms的繪制時長是符合要求的。如果某一操作的繪制耗時30ms疤坝,就會發(fā)生丟幀現(xiàn)象兆解,這種現(xiàn)象在動畫或者列表滑動中比較常見。

解決方法

  • 布局優(yōu)化
    • include merge viewstub的合理使用
    • 減少嵌套锅睛,推薦使用ConstraintLayout
    • 合理使用背景色
    • 不能使用ScrollView包裹ListView/GridView/ExpandableListView,因為這樣會把ListView的所有Item都加載到內(nèi)存中现拒,要消耗巨大的內(nèi)存和cpu去繪制圖面。為了較好的UI體驗勋桶,推薦使用NestedcrollView
  • 繪制優(yōu)化
    • onDraw 中不要創(chuàng)建新的局部對象
    • onDraw 方法中不要做耗時的任務(wù)

2侥猬,關(guān)于啟動

  • 冷啟動
    冷啟動是指安裝 apk 后首次啟動應(yīng)用程序,或者應(yīng)用程序上次結(jié)束退唠,進程被殺死后重新打開app。
    冷啟動后系統(tǒng)需要做一下三個任務(wù):
    1屎债,加載并啟動應(yīng)用程序
    2,啟動后立即顯示應(yīng)用程序的空白啟動窗口
    3盆驹,創(chuàng)建應(yīng)用程序進程
    應(yīng)用程序創(chuàng)建之后,會執(zhí)行以下操作:
    • application的初始化
    • 啟動UI線程
    • 創(chuàng)建activity
    • inflate view
    • onMesure
    • onLayout
    • onDraw
  • 暖啟動
    暖啟動比冷啟動時間更短运褪。在暖啟動中,系統(tǒng)都會把你的 Activity 帶到前臺玖瘸。如果應(yīng)用程序的 Activity 仍然駐留在內(nèi)存中秸讹,那么應(yīng)用程序可以避免重復(fù)對象初始化、布局加載和渲染雅倒,但系統(tǒng)依然會展示閃屏頁璃诀,直到第一個 Activity 的內(nèi)容呈現(xiàn)為止。比如:當應(yīng)用中的 Activities 被銷毀蔑匣,但在內(nèi)存中常駐時劣欢,應(yīng)用的啟動方式就會變?yōu)榕瘑?。
  • 熱啟動
    熱啟動的啟動時間比暖啟動還要更短裁良。你比如凿将,我用戶 Back 退出應(yīng)用程序,然后又重新啟動价脾,應(yīng)用程序會再次執(zhí)行 Activity 的 onCreate()牧抵。
    解決方法
    application 的創(chuàng)建過程中盡量減少耗時的操作,非必須的操作可在異步線程中執(zhí)行侨把。

3,內(nèi)存優(yōu)化

  • 匿名內(nèi)部類/非靜態(tài)內(nèi)部類获枝,可以使用android引用機制解決
  • 集合類及時置空
  • 資源及時關(guān)閉(廣播省店,service笨触,文件,eventbus谎脯,bitmap)
  • context生命周期
  • 圖片處理(Glide采用的是Lrucache和LruDiskCache)
  • 線程池處理多線程
  • 集合如果是插入和刪除用的多源梭,建議使用 LinkList,如果修改用的多废麻,建議 ArrayList
  • 對常量使用 static final烛愧,適用于基本類型和 String 常量
  • 使用增強的 for 循環(huán)語法(foreach)
  • 數(shù)據(jù)量比較大或者內(nèi)存比較寬粤耍考慮 HashMap,其他建議使用 SpareArray
  • 避免在Service#onStartCommand()/onBind()方法中執(zhí)行耗時操作蚁堤,如果有需求但狭,應(yīng)改為IntentService立磁,或采用其他異步機制完成。
  • 避免在BroadcastReceiver#onReceive()中執(zhí)行耗時操作宪摧,如果有耗時工作绍刮,應(yīng)該創(chuàng)建IntentService完成挨摸,而不應(yīng)該在BroadcastReceiver內(nèi)創(chuàng)建子線程去做得运。
  • 不要在Android的Application地對象中緩存數(shù)據(jù)熔掺》翘辏基礎(chǔ)組件之間的數(shù)據(jù)共享使用Intent機制备绽,也可以使用SharedPreferences等數(shù)據(jù)持久化機制鬓催。
  • 在Activity中顯示對話框或彈出浮層時宇驾,盡量使用DialogFragment课舍,而非Dialog/AlertDialog筝尾,這樣便于隨Activity生命周期管理對話框/彈出浮層的生命周期办桨。
  • 不要通過Intent在Android基礎(chǔ)組件之間傳遞大數(shù)據(jù),可能導致OOM贸街。
  • png圖片使用tinypng或者類似工具壓縮處理薛匪,減少包體積逸尖。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娇跟,一起剝皮案震驚了整個濱河市太颤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吃谣,老刑警劉巖岗憋,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仔戈,死亡現(xiàn)場離奇詭異监徘,居然都是意外死亡,警方通過查閱死者的電腦和手機飞蚓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門趴拧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著榴,“玉大人脑又,你說我怎么就攤上這事问麸〕瑁” “怎么了布轿?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵汰扭,是天一觀的道長萝毛。 經(jīng)常有香客問我,道長鲁冯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任秧了,我火速辦了婚禮验毡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晶通。我一直安慰自己狮辽,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布椰苟。 她就那樣靜靜地躺著舆蝴,像睡著了一般洁仗。 火紅的嫁衣襯著肌膚如雪性锭。 梳的紋絲不亂的頭發(fā)上篷店,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天疲陕,我揣著相機與錄音蹄殃,去河邊找鬼。 笑死讳苦,一個胖子當著我的面吹牛鸳谜,可吹牛的內(nèi)容都是我干的咐扭。 我是一名探鬼主播蝗肪,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辛馆,長吁一口氣:“原來是場噩夢啊……” “哼豁延!你這毒婦竟也來了术浪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硕蛹,失蹤者是張志新(化名)和其女友劉穎硕并,沒想到半個月后倔毙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡卵蛉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年傻丝,在試婚紗的時候發(fā)現(xiàn)自己被綠了葡缰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡泛释,死狀恐怖温算,靈堂內(nèi)的尸體忽然破棺而出注竿,到底是詐尸還是另有隱情宇智,我是刑警寧澤蔓搞,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布喂分,位于F島的核電站,受9級特大地震影響蒲祈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梆掸,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徒恋。 院中可真熱鬧,春花似錦欢伏、人聲如沸径筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侄刽,卻和暖如春州丹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亲怠。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工团秽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叭首,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓图毕,卻偏偏與公主長得像眷唉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厢破,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 用兩張圖告訴你笆焰,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料嚷掠? 從這篇文章中你...
    hw1212閱讀 12,728評論 2 59
  • 面試必背 會舍棄不皆、總結(jié)概括——根據(jù)我這些年面試和看面試題搜集過來的知識點匯總而來 建議根據(jù)我的寫的面試應(yīng)對思路中的...
    luoyangzk閱讀 6,756評論 6 173
  • 第一天我們的內(nèi)容是讀懂孩子霹娄。 孩子只是借由我們而來鲫骗,他們是獨立的個體执泰,有他們自己的人生术吝。要想幫助孩子改變茸苇,父母自己...
    雋嫕閱讀 1,165評論 0 2
  • 見到他時,我有點落魄潦倒,在穿得光鮮亮麗的他面前遗增,顯得特別狼狽不堪。眼看他就要發(fā)現(xiàn)我了,這時有點情急饰及,四下張望宾濒,希...
    枚橙roro閱讀 372評論 3 2