寫在前面
(全文約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源碼詳細解析,以及它們的使用,和一些容易遇到的問題。
以上內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。或者關注主頁掃描加 微信 獲取。