主頁 > 移動端開發 > android移動應用開發,Android性能優化面試題集錦

android移動應用開發,Android性能優化面試題集錦

2021-06-15 07:21:18 移動端開發

前言

很多人面試之前,可能沒有在互聯網公司作業過或者說作業過但年頭較短,不知道互聯網公司技術面試都會問哪些問題? 再加上可能自己準備也不充分,去面試沒幾個回合就被面試官幾個問題打蒙了,最后以慘敗收場,

下述是我收錄整理的Android面試題匯總,由于篇幅原因,在這只把性能優化部分的題目列舉出來,后續還會更新其余面試題內容,大家可以關注一下我,及時知曉我更新的知識點,同時這份面試集錦的整理也花費了我很多時間,有需要的朋友可以幫忙轉發分享下,點個贊~

性能優化

Android的性能優化,主要是從以下幾個方面進行優化的: 穩定(記憶體溢位、崩潰) 流暢(卡頓) 耗損(耗電、流量) 安裝包(APK瘦身) 影響穩定性的原因很多,比如記憶體使用不合理、代碼例外場景考慮不周全、代碼邏輯不合理等,都會對應用的穩定性造成影響,其中最常見的兩個場景是:Crash 和 ANR,這兩個錯誤將會使得程式無法使用,所以做好Crash全域監控,處理閃退同時把崩潰資訊、例外資訊收集記錄起來,以便后續分析;合理使用主執行緒處理業務,不要在主執行緒中做耗時操作,防止ANR程式無回應發生,

(一)穩定——記憶體優化

(1)Memory Monitor 工具:

它是Android Studio自帶的一個記憶體監視工具,它可以很好地幫助我們進行記憶體實時分析,通過點擊Android Studio右下角的Memory Monitor標簽,打開工具可以看見較淺藍色代表free的記憶體,而深色的部分代表使用的記憶體從記憶體變換的走勢圖變換,可以判斷關于記憶體的使用狀態,例如當記憶體持續增高時,可能發生記憶體泄漏;當記憶體突然減少時,可能發生GC等,如下圖所示,

(2)LeakCanary工具:

LeakCanary是Square公司基于MAT開發的一款監控Android記憶體泄漏的開源框架,其作業的原理是: 監測機制利用了Java的WeakReference和ReferenceQueue,通過將Activity包裝到WeakReference中,被WeakReference包裝過的Activity物件如果被回收,該WeakReference參考會被放到ReferenceQueue中,通過監測ReferenceQueue里面的內容就能檢查到Activity是否能夠被回收(在ReferenceQueue中說明可以被回收,不存在泄漏;否則,可能存在泄漏,LeakCanary是執行一遍GC,若還未在ReferenceQueue中,就會認定為泄漏),

如果Activity被認定為泄露了,就抓取記憶體dump檔案(Debug.dumpHprofData);之后通過HeapAnalyzerService.runAnalysis進行分析記憶體檔案分析;接著通過HeapAnalyzer (checkForLeak—findLeakingReference—findLeakTrace)來進行記憶體泄漏分析,最后通過DisplayLeakService進行記憶體泄漏的展示,

(3)Android Lint 工具:

Android Lint Tool 是Android Sutido種集成的一個Android代碼提示工具,它可以給你布局、代碼提供非常強大的幫助,硬編碼會提示以級別警告,例如:在布局檔案中寫了三層冗余的LinearLayout布局、直接在TextView中寫要顯示的文字、字體大小使用dp而不是sp為單位,就會在編輯器右邊看到提示,

(二)流暢——卡頓優化

卡頓的場景通常是發生在用戶互動體驗最直接的方面,影響卡頓的兩大因素,分別是界面繪制和資料處理,

界面繪制:主要原因是繪制的層級深、頁面復雜、重繪不合理,由于這些原因導致卡頓的場景更多出現在 UI 和啟動后的初始界面以及跳轉到頁面的繪制上,

資料處理:導致這種卡頓場景的原因是資料處理量太大,一般分為三種情況,一是資料在處理 UI 執行緒,二是資料處理占用 CPU 高,導致主執行緒拿不到時間片,三是記憶體增加導致 GC 頻繁,從而引起卡頓,

(1)布局優化

在Android種系統對View進行測量、布局和繪制時,都是通過對View數的遍歷來進行操作的,如果一個View數的高度太高就會嚴重影響測量、布局和繪制的速度,Google也在其API檔案中建議View高度不宜哦過10層,現在版本種Google使用RelativeLayout替代LineraLayout作為默認根布局,目的就是降低LineraLayout嵌套產生布局樹的高度,從而提高UI渲染的效率,

布局復用,使用標簽重用layout; 提高顯示速度,使用延遲View加載; 減少層級,使用標簽替換父級布局; 注意使用wrap_content,會增加measure計算成本; 洗掉控制元件中無用屬性;

(2)繪制優化

過度繪制是指在螢屏上的某個像素在同一幀的時間內被繪制了多次,在多層次重疊的 UI 結構中,如果不可見的 UI 也在做繪制的操作,就會導致某些像素區域被繪制了多次,從而浪費了多余的 CPU 以及 GPU 資源,如何避免過度繪制?

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

自定義View優化,使用 canvas.clipRect() 幫助系統識別那些可見的區域,只有在這個區域內才會被繪制,

(3)啟動優化

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

(三)節省——耗電優化

在 Android5.0 以前,關于應用電量消耗的測驗即麻煩又不準確,而5.0 之后Google專門引入了一個獲取設備上電量消耗資訊的API—— Battery Historian,Battery Historian 是一款由 Google 提供的 Android 系統電量分析工具,直觀地展示出手機的電量消耗程序,通過輸入電量分析檔案,顯示消耗情況,

最后提供一些可供參考耗電優化的方法:

(1)計算優化,演算法、for回圈優化、Switch…case替代if…else、避開浮點運算,

浮點運算:計算機里整數和小數形式就是按普通格式進行存盤,例如1024、3.1415926等等,這個沒什么特點,但是這樣的數精度不高,表達也不夠全面,為了能夠有一種數的通用表示法,就發明了浮點數,浮點數的表示形式有點像科學計數法(.***×10),它的表示形式是0.×10,在計算機中的形式為 . e ±),其中前面的星號代表定點小數,也就是整數部分為0的純小數,后面的指數部分是定點整數,利用這樣的形式就能表示出任意一個整數和小數,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,這就是浮點數,浮點數進行的運算就是浮點運算,浮點運算比常規運算更復雜,因此計算機進行浮點運算速度要比進行常規運算慢得多,

(2)避免 Wake Lock 使用不當,

Wake Lock是一種鎖的機制,主要是相對系統的休眠而言的,,只要有人拿著這個鎖,系統就無法進入休眠意思就是我的程式給CPU加了這個鎖那系統就不會休眠了,這樣做的目的是為了全力配合我們程式的運行,有的情況如果不這么做就會出現一些問題,比如微信等及時通訊的心跳包會在熄屏不久后停止網路訪問等問題,所以微信里面是有大量使用到了Wake_Lock鎖,系統為了節省電量,CPU在沒有任務忙的時候就會自動進入休眠,有任務需要喚醒CPU高效執行的時候,就會給CPU加Wake_Lock鎖,大家經常犯的錯誤,我們很容易去喚醒CPU來作業,但是很容易忘記釋放Wake_Lock,

(3)使用 Job Scheduler 管理后臺任務,

在Android 5.0 API 21 中,google提供了一個叫做JobScheduler API的組件,來處理當某個時間點或者當滿足某個特定的條件時執行一個任務的場景,例如當用戶在夜間休息時或設備接通電源配接器連接WiFi啟動下載更新的任務,這樣可以在減少資源消耗的同時提升應用的效率,

(四)安裝包——APK瘦身

(1)安裝包的組成結構

assets檔案夾,存放一些組態檔、資源檔案,assets不會自動生成對應的 ID,而是通過 AssetManager 類的介面獲取,

res,res 是 resource 的縮寫,這個目錄存放資源檔案,會自動生成對應的 ID 并映射到 .R 檔案中,訪問直接使用資源 ID,

META-INF,保存應用的簽名資訊,簽名資訊可以驗證 APK 檔案的完整性,

AndroidManifest.xml,這個檔案用來描述 Android 應用的配置資訊,一些組件的注冊資訊、可使用權限等,

classes.dex,Dalvik 位元組碼程式,讓 Dalvik 虛擬機可執行,一般情況下,Android 應用在打包時通過 Android SDK 中的 dx 工具將 Java 位元組碼轉換為 Dalvik 位元組碼,

resources.arsc,記錄著資源檔案和資源 ID 之間的映射關系,用來根據資源 ID 尋找資源,

(2)減少安裝包大小

代碼混淆,使用IDE 自帶的 proGuard 代碼混淆器工具 ,它包括壓縮、優化、混淆等功能, 資源優化,比如使用 Android Lint 洗掉冗余資源,資源檔案最少化等, 圖片優化,比如利用 PNG優化工具 對圖片做壓縮處理,推薦目前最先進的壓縮工具Googlek開源庫zopfli,如果應用在0版本以上,推薦使用 WebP圖片格式, 避免重復或無用功能的第三方庫,例如,百度地圖接入基礎地圖即可、訊飛語音無需接入離線、圖片庫Glide\Picasso等, 插件化開發,比如功能模塊放在服務器上,按需下載,可以減少安裝包大小, 可以使用微信開源資源檔案混淆工具——AndResGuard,一般可以壓縮apk的1M左右大,

冷啟動與熱啟動

冷啟動在啟動應用時,系統中沒有該應用的行程,這時系統會創建一個新的行程分配給該應用;

熱啟動在啟動應用時,系統中已有該應用的行程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的行程還是保留在后臺);

區別冷啟動:系統沒有該應用的行程,需要創建一個新的行程分配給應用,所以會先創建和初始化Application類,再創建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上, 熱啟動: 從已有的行程中來啟動,不會創建和初始化Application類,直接創建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上,

冷啟動流程Zygote行程中fork創建出一個新的行程; 創建和初始化Application類、創建MainActivity; inflate布局、當onCreate/onStart/onResume方法都走完; contentView的measure/layout/draw顯示在界面上,

**冷啟動優化 **減少在Application和第一個Activity的onCreate()方法的作業量; 不要讓Application參與業務的操作; 不要在Application進行耗時操作; 不要以靜態變數的方式在Application中保存資料; 減少布局的復雜性和深度;

最后

給大家分享一份移動架構大綱,包含了移動架構師需要掌握的所有的技術體系,大家可以對比一下自己不足或者欠缺的地方有方向的去學習提升;

最后,如果大伙有什么好的學習方法或建議歡迎大家在評論中積極留言哈,希望大家能夠共同學習、共同努力、共同進步,

小編在這里祝小伙伴們在未來的日子里都可以 升職加薪,當上總經理,出任CEO,迎娶白富美,走上人生巔峰!!

不論遇到什么困難,都不應該成為我們放棄的理由!

很多人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,比如學了一段時間感覺沒有方向感,不知道該從那里入手去學習,需要一份小編整理出來的學習資料的關注我主頁或者點擊我的GitHub免費領取~

這里是關于我自己的Android 學習,面試檔案,視頻收集大整理,有興趣的伙伴們可以看看~

D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

這里是關于我自己的Android 學習,面試檔案,視頻收集大整理,有興趣的伙伴們可以看看~

如果你看到了這里,覺得文章寫得不錯就給個贊唄?如果你覺得那里值得改進的,請給我留言,一定會認真查詢,修正不足,謝謝,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287404.html

標籤:其他

上一篇:重裝android studio 始終無法在安裝軟體的時候安裝sdk(解決)

下一篇:android的ViewPager滑動判斷當前停留頁是否是最后一頁

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more