天天看點

五年 Android 開發面經彙總

轉眼就到了開學季的9月,而我畢業走出學校已有五年了。真想在回到大學時代,去談一場轟轟烈烈的戀愛…… 而不會像現在是一個沒人疼沒人愛的單身狗!

在這個五年的時光裡,我一直在Android 行業摸爬滾打,待過的公司差不多有五六家了,待得最久的一家時長好像是一年多,基本都是中大型的公司。在進入這些公司前,少不了的肯定是面試環節,而在這些年内去面試的公司也比較多。如何要說具體多少家公司的話,說實話我自己也記得不是很清楚了。但是近一年中我去面試的公司,我是有所簡單的記錄。

想在金九銀十面試的這個季度,通過這篇文章分享給大家做個參考,失敗和成功的面經案例都有,我們一起往下看吧。

五年 Android 開發面經彙總

相信大家在面試前都會一個備戰的預習期,因為大家都想把Offer拿到手,然後自己進行去挑選公司,這個周期的長短不宜過長。其實在這個期間最重要的是,給自己做好一份優質的履歷,HR或者面試官第一眼見的就是你的履歷,從履歷中進行篩選确定是否通知你來面試,這個是最關鍵的一步。二就是對自己履歷中所記錄熟知的技術點和項目進行複習,從網絡上去找相關的面試題進行刷。還有就是回想之前做的項目中遇到的一些問題,自己是如何卻解決,這個是面試官跟你聊項目中可能會問道的。

一面

兩個面試官(一個我們小組Android的leader,一個是同僚),上來先當着他們的面寫了一個筆試題(都是很基礎的題沒啥難度,算法題也就是一個list的反轉,但是小米比較注重手寫代碼的一些細節,是以要考慮好該判空的判空,還有防止越界啥的問題),然後就開始問,90%都在問Java基礎(GC的機制,GC算法,記憶體相關的問的比較多,多線程線程安全問題是如何發生的,HashMap的原理)

二面

我們組的主管(全程聊項目,沒有問技術相關的了,然後介紹了一下這個部門的工作内容啊之類的)

三面:

本來應該有三面…三面是我們部門的上司,但是因為一些其他的原因吧,三面就沒有面直接過了

感受:

其實自已算是運氣好,遇到的問題算是偏容易的,要多看看算法方面的視訊

面試内容:

1.activity和service的生命周期與使用場景 2.thread和服務的差别,單例的類型,多少種?優缺點說一下死鎖的原因,與場景,單例的使用場景 3.使用過啥來源架構,有啥特點,為什麼,從中學到了什麼。 4.kotlin的特點與java的差别, 5.三種架構的差別handler和view的原理, 6.線程池原理與種類 7.javastackoverflow的原因 8.性能優化和卡頓優化的實際案例 9.虛拟機的構成與原理 10.熱修複和插件化的差別與原理 11.rxjava源碼 12.多線程應該注意的問題 13.databinding原理 14.binder原理 15.網絡方面知識 16.平時解決問題的流程

感受:

掌握基礎知識很重要,算法也有問到,還有就是開放式問題,他想知道我怎麼解決問題的一個過程,怎麼發現和定位,平時學習的方法。

1.java的話static變量各種通路可見性,final關鍵字的作用,封裝繼承多态展開問,多線程通訊,線程池原理,線程同步方式,jvm記憶體模型,常見的gc算法,類加載過程 2.網絡的話主要是問的https,http1/2/3的差別特性 Android問了一些常見的handler原理,recycleview緩存機制,view事件的分發 3.glide緩存機制 4.然後引申如何實作我LRU。記憶體洩露和如何預防處理, 5.算法的話,有top-k排序(堆排序,位圖法),旋轉輸出矩陣,連結清單逆序,hashmap concurrenthashmap原理,線程安不安全,它的鎖機制等等
1.冒泡排序,堆排序算法 2.平衡二叉樹和紅黑樹的差別 3.多線程,用過哪些并發api?踩過哪些坑? 4.C++的 指針和引用的差別 5.手寫對指派運算符重載 6.GC 會不會把所有線程暫停? 7.GC不同時期有何差別? 8.說一下Handler Looper的休眠機制 9.設計一個算法,已知某年某月某日是星期幾,求另外年月日對應的星期幾。
1.多線程 2.handler 3.網絡請求 4.性能優化 5.view繪制 6.opengl部分 7.camera相關 8.自定義view 9.asyncTask 10.圖檔加載架構原理
1.線程池的工作原理 2.synchronized鎖方法和鎖靜态方法有什麼差別 3.鎖的了解,什麼是樂觀鎖,悲觀鎖,可重入鎖。 4.View的事件分發流程 5.View的三種測量模式了解,什麼時候會發生Excatly 6.HashMap的工作原理。 7.怎麼實作多線程下載下傳,斷點續傳怎麼實作。 8.rxjava的背壓了解嗎 9.kotlin的協程,怎麼做到和rxjava的zip操作一樣,等待所有結果後再處理。
1.bitmap在記憶體中的大小計算 2.系統級的全局異常如何捕獲列印堆棧? 3.APT技術原理(這個居然忘了?) 4.如何中斷一個線程?AsyncTask如何中斷?(加标記位中斷) 5.CoordinatorLayout滑動機制?兩個CoordinatorLayout嵌套如何通過事件分發傳遞處理滑動? 父View中嵌套子View,快速滑動fling狀态,如何處理在父View到頂部停止滑動,子View繼續滑動? 6.Flutter熱重載原理 7.元件化用了什麼技術?實作原理是什麼? 8.如何分析主線程中的消息隊列耗時情況 9.繪制優化、APP啟動優化,activity跳轉啟動速度優化?(網絡請求可不可以放在setContentView之前?) 10.如何實作旋轉動畫?(幀動畫、屬性動畫、gif、Lottie動畫架構) 11.GC分代回收介紹?Eden和survivor為什麼是8:1?老年代存活下來的會進入永久代麼? 12.如何修改JVM記憶體配置設定?(AS中在vmoptions修改,gradle.properties) 13.Android9.0隐藏的屬性方法是咋反射擷取的 (原理居多)
(1)concurrentHashMap 如何加鎖的 (2)measure參數詳解,view設定wrap不起作用 (3)Bind service,如何實作保活 (4)兩個程序act,如何加快啟動速度 (5)性能優化(面試官老插嘴,都說不上話) (6)Eventbus如何實作線程的切換 (7)jetpack的Navigation的xml引用,在什麼時候調用的? (8)Inflater.inflate如何實作xml轉java的(framework),方法中的各個參數含義。
(1)如何設計子產品,元件,sdk,如何考慮 (2)說說你項目的架構,為何這麼設計或這麼考慮 (3) 說說記憶體洩漏,越多越好 (4) 說說你的技術難點,如何解決,如何思考 (5)apk安全,你如何考慮 (6)act+fragment的完全生命周期(不是單個說哦) (7)京東北辰:recyclerView源碼,必會,包括緩存如何實作,哪幾個緩存,運作流程等;各種notifyXX的原理,觸發哪些重繪;如何實作下半部分item不移動,上半部分的item高度變化的實作?
(1)手拖動View,手松開後完成一個泡泡破裂的動畫效果(本質是view事件分發機制+動畫選型,分發機制哪個方法處理什麼參數,之後怎麼觸發動畫效果等,問的灰常具體,吐了) (2) 自定義view相關,invalidate,postInvalidate,requestLayout,深入的說說framework層的流程原理 (3)kotlin 協程深層原理如何實作的 (4)dcl是否線程安全?哪一塊出問題,為什麼volatile能實作防止指令重排,指令級别如何實作的,對象的建立過程等(多家都問了,很深入)

shopee一面:

1.java的四種引用分析 2.synchronize和volatile各自的機制是怎樣的 3.handler源碼原理相關的問題 4.自定義view的繪制,事件分發機制,怎麼解決滑動沖突,activity啟動的過程 5.https單向認證,對稱加密和非對稱加密,在浏覽器輸入url發生了什麼 6.jvm相關,如new一個對象的過程發生了什麼,垃圾回收機制 8.問了關于線程池的一些問題 9.跨程序通信有什麼方案 10.binder機制 11.hashmap源碼 12.用什麼方案縮小apk體積 13.recyclerview和listview對比 14.做過什麼記憶體優化,性能優化 15.okhttp源碼設計原理 16.手寫一道算法題,關于DFS+回溯算法的

shopee二面:

1.問了之前的一些項目經曆,在團隊做了什麼,主要負責哪一塊,選擇一兩塊自己認為做得最好的展開講講,過程中會打斷問問題 2.有沒有做過插件化,做到什麼程度,講講原理 3.由于我之前項目有用到mvvm和jetpack,問了一些jetpack元件相關的源碼,和mvvm跟mvp的對比 4.又問了okhttp,緩存攔截器原理是怎樣的 5.項目中做過什麼性能優化,具體說說 6.平時項目中用到什麼設計模式,挑幾個常用講講 7.聊人生聊職業規劃
1.線程切換(handler機制) 2.多線程,幾種鎖,有什麼差別 3.如何實作線程排隊 4.Https加密機制 5.項目經驗 6.Okhttp原理 7.設計一個線上日志收集系統 8.項目經驗 9.Activity啟動流程 10.性能優化 11.Viewstub實作原理,自己設計一個類似的 12.Https如何保證安全的,如何防止中間人攻擊,可以僞造證書嗎 13.Looper死循環為什麼不會導緻主線程卡死 14.epoll機制是怎麼樣子的 15.熱修複資源id沖突怎麼解決 16.AIDL如何實作的 17.Binder原理

一面:

1.SharedPreferences線程安全嗎 2.SharedPreferences多程序調用會有問題嗎?如果需要多程序調用,怎麼實作 3.自己在項目代碼中寫一個java.lang.String類會有問題嗎 4.記憶體洩漏除了用LeakCanary還有沒有其他辦法檢測 5.如何監控線上記憶體洩漏 6.native的記憶體洩漏怎麼監控 7.如何監控線上OOM,如何知道是哪裡造成的OOM 8.Error和Exception的差別 9.怎麼監控應用中的線程,都是在哪建立的(AOP) 10.post一個延遲5秒的消息,怎麼做到5秒後才執行的 11.同步屏障原理 12.ContentProvider初始化的時機 13.元件化-A元件要調用B元件的某個功能,怎麼調用(回答了接口下沉,AutoService等等) 14.元件化-如果不用接口下沉,沒有任何依賴,怎麼友善的調用(不讓用反射,太麻煩) 15.A程序調用B程序的b方法(AIDL實作的,B程序有個服務),B程序沒有建立的情況下,B程序中是b方法先執行還是Application的onCreate方法先執行?16.如果b方法很耗時,A程序會被阻塞住嗎 17.算法:寫一個二叉樹的層序周遊 18.資料庫的索引原理 19.B+樹和二叉樹的差別,性能對比 20.HashMap的缺點,怎麼解決 21.ArrayMap的原理,為什麼記憶體消耗低 22.flutter與其他跨平台方案對比,flutter為什麼好(除了跨平台),跟原生的性能比怎麼樣 23.硬體加速的原理

二面:

1.觸摸事件中的cancel事件什麼時候觸發 2.handler延時消息怎麼實作的 3.主線程有好多handler,分發消息的時候怎麼知道給哪個handler 4.主線程每5秒鐘發一個需要執行10秒的消息到子線程,會發生什麼 5.實作了AIDL接口的服務的方法是運作在哪個線程?有多個方法,是不是運作在同一個線程? 6.Binder通訊中,用戶端調用服務端是阻塞的嗎?怎麼做到不阻塞? 7.bitmap的像素資料在哪裡?一直申請bitmap會oom嗎? 8.view的繪制重新整理機制是怎麼樣的?vsync信号發出後怎麼觸發繪制邏輯的? 9.頁面靜止的時候,onDraw會執行嗎?vsync信号會發嗎? 10.vsync信号發出的時候,怎麼控制需不需要onDraw? 11.用canvas怎麼繪制一個倒影 12.對canvas做矩陣變換的matrix有哪些參數配置 13.做過哪些性能相關的優化 14.怎麼分析anr問題 15.如果是死鎖導緻的anr,在日志上怎麼看 16.應用啟動速度怎麼優化 17.沒有記憶體洩漏的情況下,應用占用記憶體比業内其他應用記憶體要多,怎麼分析優化 18.布局層級太多怎麼優化 19.頁面内有一些不需要每次都顯示的view,怎麼優化 20.recyclerview裡面的圖檔顯示速度比較慢,怎麼優化 21.做過的最複雜的項目 22.工作幾年中自身提升比較大的地方 23.JavaScript中bind,call,apply的差別 24.RxJava中的背壓是什麼意思 25.flutter有了解嗎 26.最近有學習什麼 27.mvvm與mvp的差別 28.裝飾模式和代理模式的差別
1.介紹在上一家公司做的app,app的crash率是多少 2.詳細介紹最有技術難度的項目 3.應用crash的本質原因是什麼 4.重寫和重載的差別,應用場景 5.hybrid開發中遇到了什麼問題 6.線性布局和相對布局那個性能更優 7.js和java之間傳遞大對象會怎麼樣,怎麼保證傳輸性能 8.activity橫豎屏切換會發生什麼?怎麼避免

其實還有幾家小型公司的面試,我就不在此一一的說明了,因為文章篇幅長度有限,是以就挑選了幾個自己覺得面的還不錯的公司進行跟大家分享,大家可以參考這些面試題,去進行記錄學習,可能對你将來面試是有幫助的。

之前在做面試準備的時候,從網上查找收集整理了一些 Android 開發相關的學習筆記、面試題等等,進行刷題複習 Android 相關的知識,通過這次的面試效果檢測,也體驗出了結果。這次面試能通過一半原因是自己的技術還過的去。

是以我想拿出來跟大家進行分享,希望能幫助到大家學習提升,在面試中能順利通過。如有需要參考的可以直接去我 ​​GitHub​​

五年 Android 開發面經彙總
五年 Android 開發面經彙總
五年 Android 開發面經彙總