
前言
很多人面試之前,可能沒有在互聯網公司作業過或者說作業過但年頭較短,不知道互聯網公司技術面試都會問哪些問題? 再加上可能自己準備也不充分,去面試沒幾個回合就被面試官幾個問題打蒙了,最后以慘敗收場,
下述是我收錄整理的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
標籤:其他
