一位普通Android程序員嘔心瀝血八次大小廠的面試覆盤總結,收藏一波擴展知識體系!

寫在前面

(全文約4k字)
總共是面了8家,(2小,4中,2大廠)

小的都拿下了,4中裏3個一輪遊,1個三輪遊。2大的都談薪了。

小公司會比較偏重於業務,面試上也偏重業務,比如做了什麼,大概方案,用了哪些庫,庫的原理。

這些基本上會集中在 圖片處理,網絡封裝,自定義view這幾個部分。

大廠會從業務入手,遞進深入到原理及相關知識點,尤其集中在原理部分,這裏對平時源碼閱讀有一定要求。

或者直接問對xxx源碼有沒有了解。

比如一個handler機制,因其涉及的地方特別多而且很容易展開,想完美答好,真的不是一次兩次就能行的。

建議每次面試完,都及時對面試內容進行回憶記錄,當前這裏不是爲了泄題漏題,以後吹牛逼,這個沒有任何意義。

目的是進行復盤,打磨自己的回答。

目錄

  • 簡歷書寫
  • 面試原題
  • 算法刷題
  • 學習總結

簡歷書寫

強烈建議,把自己的強項,亮點加粗註明放在簡歷前面,大家都很忙,也很煩躁,讓人一眼就看到優點,對雙方都友好。

因爲我對安卓性能優化方面感興趣,平時工作也花了很多時間在這裏,所以我會在簡歷上突出說明,我做了內存優化,熟練掌握使用xxx,內存性能提升xxx。

(因爲這裏的內容是可控的,如果面試官對你感興趣,這裏的回答你也是能提早準備好的)

項目經歷如何寫?建議按照是什麼,做了啥,有啥數據指標佐證的方式去寫。

比如,我做了xx項目,負責xx模塊,使用了xxx框架,可配合xx做xxx,效率提高xxx%

面試—字節

字節一輪

1.先聊簡歷。

2.聊性能優化方面的問題,我這邊體系化展開講卡頓,瘦身,內存,crash等方面的優化經驗。

3.sychronized,volatile區別?
這裏可以體系化的回答,主要從JMM角度去回答,最後深入到字節碼層面的區別。因爲提到了修飾的範圍有差別,就有了下一題。

4.對於鎖的對象的不同,效果會有什麼差別。

5.講一下Handler機制。
這個問題問得太多了,一定要去看一回源碼。
重點答的是MessageQueue這塊,包括什麼時候空閒,阻塞。
發散講了線程相關的ThreadLocal,還有IdleHandler

6.出了一個設計題,當你的服務商出現問題,設計一個網絡請求可用性的兜底方案。
大概從HttpDNS,域名容災等方面回答吧。

7.設計一個方案,apk已經發出去了,java代碼是最新,但是分包下發的so文件是舊版本,如何做一個兼容方案,保證兼容可用。
這裏沒答好,我也忘了怎麼答的了。

8.Java類加載機制。

這是個基礎概念題,沒答好,回答的雙親加載機制。
然後引出PathClassLoader,DexClassLoader的區別,一個dex的加載到一個java類的加載過程。

9.一道算法題。

字節二輪

1.聊簡歷。

2.性能優化,展開講了卡頓,內存。

3.數據結構的題,hashCode的擾動算法,涉及到一個數字,31,這個31是怎麼來的?

4.類的static屬性字段,比如 public static int a = 1,被賦值幾次?
這個需要對類的加載機制有了解。

5.多個Activity共同bind一個service,一個Activity destory,問service的情況。
這裏就是問service的生命週期,考察bind跟start的區別。

6.裝飾器模式,跟代理模式的區別。
考察對常用的設計模式

7.okhttp的緩存邏輯實現。
我以爲是問的 鏈接緩存跟io緩存,我回答的是連接池複用跟 okio的io複用。
後來提醒是cache,就回答CacheInterceptor,及其源碼實現。

8.SharedPreference的commit ,apply區別。

9.SharedPreference的其性能問題。
apply的anr是有一個字段,會block住主線程,需要清理queuedWork隊列。

10.SharedPreference線程安全性,還有是否進程安全,SharedPreference鎖的對象是誰?

11.synchornized鎖對象,彙編實現。volatile的彙編實現。

12.volatile 修飾 boolean能保證原子性麼?

13.Android有哪幾種動畫。

14.設計題,設計一個埋點數據上報庫,需要哪幾個模塊,提供哪樣的接口。

15.算法題,生產消費者模型。

16.ConcurrentHashMap的相關。
包括實現原理,put方法,樹化,擴容,繼承了誰,擴容的時候,其餘桶怎麼感知。

17.安卓打包簽名v1,v2,v3的區別。

字節三輪

1.裝飾器模式,適配器模式區別。舉個Android或java裏的應用例子。
2.單例的優缺點。
3.架構有做過麼。
4.說一下項目,項目中最能體現你能力的事情。
5.平時怎麼學習的。
6.以後的職業規劃
7.離職原因
8.插件化,做過插件化麼,瞭解的主流方案?
9.算法題。

因第三輪掛了,撈出來換崗位再戰。

字節加餐一輪(這輪面了175分鐘,記憶深刻)

基礎題目

1.聊聊平時做過的性能優化。

2.界面卡頓
從ViewStub源碼開始談LayoutInflate的整個過程
包括xml的解析,如何解析tag,細節到裏面哪些特殊tag。

3.xml的解析耗時在哪些方面,反射,讀文件,解析。

4.如何優化這個過程:xml在編譯期就生成爲class文件,那這是gradle編譯的哪個階段做這個事情。

5.checkthread的問題,從Window到ViewRootImpl的創建,幾者之間的關係。

以上這是繪製相關,然後是渲染。

6.矢量圖的原理。

7.canvas怎麼來的。

8.Window跟View的關係。

9.硬件加速原理。

10.雙緩衝機制。

11.丟幀的原因。

12.幀數計算。

13.設計如何檢測過度繪製的工具,要具體到View。

14.blockcanary原理,目的。

15.Listview的滑動優化,比如一個emoji可以用TextView渲染,也可以用ImageView渲染,哪個更優。

16.Toast爲什麼不需要權限就可以顯示。

17. Window BadTokenExcetion的原因。

18.怎麼實現懸浮窗。

啓動加速

1.怎麼做app啓動加速

我的回答說利用IntentService,就是異步加載機制。但是還不夠。

2.引導我從app啓動流程開始講一遍,看從啓動流程上能不能找到方法。

3.zygote的內部實現,zygote.fork有沒有了解。

4.zygote跟ams的通信方式用的是什麼。

5.整個啓動過程中,mHandler做哪些事。

6.設計一個工具,監控啓動時間,粒度要求在方法級別。

內存相關

1.講下內存泄露。以handler匿名內部類做例子講。泄露鏈是怎樣的。

2.looper.prepare幹了啥。

3.ThreadLocalMap的實現。

4.leakcanary原理。

5.爲什麼要做抖動的檢查,有啥用。

6.爲什麼會出現抖動。

7.線上有泄露,怎麼收集,排查,設計方案。

穩定性

1.解決線上穩定性bug的方法論。

2.講個能體現亮點的解決線上bug的案例。

3.給了一個具體案例,讓我現場分析原因。

主要考察思維方式吧。

4.怎麼收集java的crash。

5.怎麼收集native的crash。

6.用線程安全的數據結構,ConcurrentHashMap會出現modifyCountException麼?

ANR相關

1.常見的anr問題怎麼解。

2.不常見的anr,比如 MessageQueue.nativePollOnce都很正常,怎麼去定位,如果是線上,怎麼去收集。

3.ANR的原因

4.IntentService會ANR麼,講內部實現。

保活相關問題

1.殺進程機制的源碼。
2.進程優先級。
3.怎麼提升優先級。
4.常見的保活手段。

我這裏着重講了Tim的保活原理。還有第三方庫Leonic的原理。

APP瘦身相關

1.andRes原理。
2.proguard源碼。
3.Facebook 的redex,字節的bytex原理。
4.multidex原理。
5.很多資源包,如何瘦身。

問了一下我自己維護的github庫相關問題

1.防多開原理
2.檢測模擬器原理
3.查root權限,如果是自編的rom怎麼處理。

聊了下簡歷裏的經歷

1.contentProvider的初始化時機。

這裏主要是問我LeakCanary 1.* 跟2.*有啥不同引出的問題。

2.LocalBroadcast 和Broadcast的區別。

3.xposed的原理。

4.beforeMethodHooked,xposed內部做了什麼事

5.免root hook框架 legend的源碼實現。
記不太清,好像我說的是native方法指針的變更。

6.一道算法。

7.設計一個埋點庫。 需要哪些模塊。

8.設計一個組件,統計activity的前臺時長,fragment的前臺時長。

字節後續的面試我忘了記錄覆盤了,現在也記不住了。這一輪面試反正是把我榨乾了。

最後進入談薪階段。只不過沒談攏,哈哈。

面試—鵝廠

最後就是我一直想去的粵海公仔廠了。

這裏面試具體輪次我就不細說了。題目其實也都是那些題目,重點提供平時要學習的方向吧。

1.聊簡歷,性能優化。

2.view的繪製流程,儘可能越詳細,越全面越好。
因爲有了字節之前的面試經驗,這裏聊了很多view相關的。

大概從ActivityThread講起,到Window,WindowManager,ViewRootImpl,
setContentView內部實現幹了什麼,LayoutInflater。

下發到requestLayout,checkThread,scheduleTraversals ,同步屏障消息
雙緩衝, vsync信號,最後再performSechdules...

這裏真的是要求自己平時除了寫界面,也一定要深入源碼進行學習。
很多奇奇怪怪的業務問題,真的就是靠讀源碼解決。

3.問網絡優化,當網絡帶寬足夠大,信號足夠好,下載大文件,怎麼快?

開多個鏈接,wifi+4G同時,分片下。
協議層 ,udp去下,本地做完整性校驗,我記得qq客戶端時這樣做的。
m3u8的思想去下。

4.apk安全措施,當apk已經被破解了,怎麼處理?
我回答藉助v1簽名思想,本地做對文件md5的校驗。或者藉助v3的思想,連續簽名。

5.兩個設計模式的區別。具體哪兩個我忘了。

6.三道算法題

第一題寫一個必然死鎖的代碼。講一下解決死鎖的方式。鎖對象的不同的區別。

第一個出現的字符。

數組裏的元素,組合起來求最大值。

7.checkThread裏的thread是什麼時候被賦值的。

8.講下數字證書是什麼。

9.解決內存抖動的實際案例。

10.降低bug的實際案例。

11.設計一個如何處理 app接收到服務器髒數據的方案。

12.設計一個雲相冊。

13.classLoader機制的原理。

14.硬件加速的底層實現。

15.操作系統相關問題。

16.如何處理多語言問題。

17.jvm虛擬機相關問題,具體忘了。

18.職業規劃相關。

最後歡迎大家來鵝廠,有一說一不吹牛逼,這裏同事真的很不錯。

關於算法

多說兩句,客戶端要學算法,不是說算法沒用,你知道什麼叫樹的遍歷你就能理解viewTree解析過程。

而且在大家層次不齊的情況下,用算法打回同一層次,看看誰的邏輯性強,代碼書寫風格好,這是對面試篩選有好處的。

誰都會說,買菜要用高數嘛?但是人家會你不會,那就是在面試上喫虧。

正題,我的算法刷題路程。

劍指offer來入門:https://cyc2018.github.io/CS-Notes/#/README

裏面有很多題,你在力扣評論區可以看到各種解法,建議多看各種解法,體會不同的思路。

刷題的方式,一定要自己動手寫代碼,調試,運行。

可以自己創個小庫,督促自己提交。

也順便把常見的設計模式複習了。

差不多刷完了基本的排序,遍歷,貪心,局部最優等思想,也就有個一百來道題了。

此時面對面試,也就有個眼熟了。真心不建議採用突擊的方式,應該要做一個長期寫題的規劃。

學習總結

我把鎖相關,線程相關, Handler機制等Android相關的知識,以題目入手,遞進發散的方式做了一個平時我學習的索引。

Android進階架構師七大專題學習索引

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO
  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化
  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化
  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack
  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發
  • 微信小程序:小程序介紹+UI開發+API操作+微信對接
  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

我把常見的數據結構,也歸納了一個索引

Java學習索引

接下來就是深入到app啓動,繪製渲染,AMS等問題做了一個集中索引。

Android framework學習索引

我自己的Android源碼閱讀

Android源碼學習索引

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

整理的面向面試的閱讀第三方庫筆記

內容詳實,涵蓋了和Android開發相關的各個源碼庫。不僅深入淺出地分析源碼,還記錄了大佬們在使用時遇到的問題,並提供瞭解決的方法。

一共分爲十個章節,包含Glide、LeakCanary、ARouter、EventBus、Retrofit源碼詳細解析,以及它們的使用,和一些容易遇到的問題。

以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 微信 獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章