面試騰訊Android研發崗,已拿到 offer,我是如何準備 Android 技術面試的?

本篇文章給大家分享一下筆者面試的一些感受和經驗。

筆者從前期準備到所有面試結束,花費了差不多3個月的時間。真可謂“面試造航母,工作擰螺絲”,面試過程真的很累很辛苦。

筆者面了很多公司,最終拿下了騰訊、網易和快手的offer,最後選擇了騰訊。

有面試交流羣小夥伴問我是怎麼準備面試的,我也想談談我最近的一些想法和計劃,大家一起討論。因此寫下了這篇文章。

整體分爲以下兩個方面:

  • 自我介紹 & 項目經驗
  • 知識儲備
  • 自我介紹

1、結合招聘崗位,只講重點。
簡歷內容這麼多,實際的你,更有很多很多可以描述的東西。但時間有限,沒有面試官會聽你說個沒完。
根據你求職的崗位,說重點即可。
其實簡歷製作的原則,也是一樣。只是自我介紹時間更短,內容更精華。
2、有理有據,少說空話。
如果你說“自己學習能力強”,這就是一句假大空的話。誰都可以說自己學習能力強。
你如果真的在這方面有突出,就要舉一個例子,比如是1個月從0到1考了什麼證書等。
3、有開頭有結尾,有邏輯。
開頭問候,結尾總結。中間1、2、3條理清楚。
4、特別提醒。
自我介紹中的內容,很可能是面試官後續發問的內容。所以,一是要引起重視,講最重要的,你最想讓面試官知道的內容。 而是做好準備,揚長避短,不要給自己挖坑。

比如前面你說自己學習能力強,但是沒有舉例子。

面試官很可能,順着你的話問你,怎麼證明你學習能力強呢? 結果你答不上來,或者是非常普通的成績,根本不能算是“學習能力強”。 那你就是給自己挖坑了。

其實自我介紹也是每個人各有不同,說起來也只能提供大致的思路。和你具體的求職崗位、經歷、個人風格有很大的關係。

  • 項目經驗

項目經驗這塊因人而異,把覺得做的有亮點的東西挑出來,從四個方面來準備:

  • 功能模塊的實現
  • 達到了什麼效果
  • 遇到了什麼問題,是如何解決的
  • 涉及到的相關知識點

項目經驗和知識點 其實是一個雙向的過程,要 試圖去找到它們之間的聯繫:

  • 談到項目經驗的時候,可以說:做完 xx 之後,我還去了解了一下 yy 背後的原理,xxx,這裏體現的是 你是否有求知慾 。
  • 談到知識點的時候,可以說:yy 的原理是這樣的,在 xx 項目中我是如何應用它來解決問題的,這裏體現的是 你是否具備把知識付諸實踐的能力。

知識儲備

很多人準備面試的時候,大多數就會這樣的,打開牛客網,查找 “Android 面經”,找幾個多的開始看。以及從各大技術交流平臺搜索Android面試題。開始刷題複習。

這雖然看起來很自然,但是並不是一種 健康的方式,面試題的作用應當是查缺補漏,上學的時候也不是直接發習題冊然後對着答案學習吧?

知乎上有個問題,叫做 如何高效學習,裏面有一個回答我覺得很符合我自己的觀點,就是 建立起自己的知識體系,建立知識體系的目的在於:

  • 鞏固記憶。
  • 認識自己,找到自己的優勢及不足。
  • 把握複習的進度。
  • 經驗總結。

目前我參考和自己整理的總結的會分爲以下幾個大點:

1 Java 相關

  1. 容器(HashMap、HashSet、LinkedList、ArrayList、數組等)

  2. 內存模型

  3. 垃圾回收算法(JVM)

  4. 類加載過程(需要多看看,重在理解,對於熱修復和插件化比較重要)

  5. 反射

  6. 多線程和線程池

  7. HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次揮手過程

計算機網絡部分:

TCP 有哪些狀態
三次握手、四次揮手。爲啥不是三次不是兩次
HTTPS 和 HTTP 的區別,HTTPS 2.0 3.0?
瀏覽器輸入一個 URL 按下回車網絡傳輸的流程?
問的深一點的可能涉及到網絡架構,每層有什麼協議,FTP 相關原理,例:TCP 建立連接後,發包頻率是怎麼樣的?

  1. 設計模式(六大基本原則、項目中常用的設計模式、手寫單例等)

生產者模式和消費者模式的區別?
單例模式雙重加鎖,爲什麼這樣做?
知道的設計模式有哪些?
項目中常用的設計模式有哪些?
手寫生產者、消費者模式。
手寫觀察者模式代碼。
適配器模式、裝飾者模式、外觀模式的異同?
談談對 java 狀態機的理解。
談談應用更新(灰度、強制更新、分區更新?)

9.斷點續傳

  1. Java 四大引用

  2. Java 的泛型, 和 的區別

問到泛型、泛型擦除、通配符相關的東西

  1. final、finally、finalize 的區別

  2. 接口、抽象類的區別

2 Android 相關

  1. 自定義 View

ViewGroup 繪製順序 (例:自定義 ViewGroup 如何實現 FlowLayout?如何實現 FlowLayout 調換順序)
自定義 View 如何實現打桌球效果;
自定義 View 如何實現拉弓效果,貝瑟爾曲線原理實現?

  1. 事件攔截分發

事件分發已經不是直接讓你講了,會給你具體的場景,比如 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發的過程,這裏面肯定會有 ACTION_CANCEL 的相關調用時機。

  1. 解決過的一些性能問題,在項目中的實際運用。

  2. 性能優化工具

(TraceView、Systrace、調試 GPU 過度繪製 & GPU 呈現模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)

  1. 性能優化 (講講你自己項目中做過的性能優化)

網絡:API 優化、流量優化、弱網優化
內存:OOM 處理、內存泄漏、內存檢測、分析、Bitmap 優化 ,LeakCanary 原理,什麼檢測內存泄漏需要兩次?
繪製
電量:WeakLock 機制、JobScheduler 機制
APK 瘦身 (APK 瘦身是怎麼做的,只用 armabi-v7a 沒有什麼問題麼?
APK 瘦身這個基本是 100% 被面試問到,可能是我簡歷上提到的原因。)
內存抖動
內存泄漏
卡頓 {如何檢測卡頓,卡頓原理是什麼,怎麼判斷頁面響應卡頓還是邏輯處理造成的卡頓} ,BlockCanary 的原理
佈局優化、過度渲染處理、ANR 處理、監控、埋點、Crash 上傳。
啓動優化

  1. Http[s]請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP)

  2. 緩存自己如何實現(LRUCache 原理)

  3. 圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關

  4. SurfaceView、TextureView、GLSurfaceView 區別及使用場景

  5. 動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)

屬性動畫、補間動畫、幀動畫的區別和使用場景

  1. MVC、MVP、MVVM

相互間的區別和各種使用場景,如何選擇適合自己的開發架構。

  1. Handler、ThreadLocal、AsyncTask、IntentService 原理及應用

Handler 機制原理,IdleHandler 什麼時候調用。

  1. Gradle(Groovy 語法、Gradle 插件開發基礎)

  2. 熱修復、插件化

談談對 ClassLoader 的理解
雙親委託機制的好處
自定義 ClassLoader
插件化爲什麼會出現,如何代碼加載,資源加載,代理 Hook)

  1. 組件化架構思路

如何從一個老項目一步步實現組件化,主要問思路,考察架構能力和思考能力。(需要考慮很多,每一步做什麼,順序很重要)
組件化和模塊化的理解與區別?

  1. 系統打包流程

  2. Android 有哪些存儲數據的方式。

  3. SharedPrefrence 源碼和問題點;

  4. sqlite 相關

sqlite 升級,增加字段的語句
數據庫框架對比和源碼分析
數據庫優化及數據遷移問題
getWritableDatabase 和 getReadableDatabase 的區別

  1. 如何判斷一個 APP 在前臺還是後臺?

  2. 混合開發

Hybrid 做過嗎? 例:Android 通過WebView調用 JS 代碼 例:JS 通過WebView調用 Android 代碼;
Hybrid 通信原理是什麼,有做研究嗎?
說說你用過的混合開發技術有哪些?各有什麼優缺點?

3 Android Framework

  1. AMS 、PMS

  2. Activity 啓動流程,App 啓動流程

  3. Binder 機制(IPC、AIDL 的使用)

講講 Linux 上的 IPC 通信,Binder 有什麼優勢,Android 上有哪些多進程通信機制?

項目中遇見了什麼多進程場景?
AIDL 是什麼?解決了什麼問題?
談談對進程共享和線程安全的認知?

  1. 爲什麼使用 Parcelable,好處是什麼?

  2. Android 圖像顯示相關流程,Vsync 信號等

4 三方源碼

  1. Glide :加載、緩存、LRU 算法
    (如何自己設計一個大圖加載框架)
    (LRUCache 原理)

  2. EventBus

  3. LeakCanary

  4. ARouter

重點:Router 原理,如何實現組件間的通信,組件化平級調用數據的方式。

  1. 插件化(不同插件化機制原理與流派,優缺點。侷限性)

  2. 熱修復

  3. RXJava
    (RxJava 的線程切換原理)

  4. Retrofit
    (Retrofit 在 OkHttp 上做了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的)

  5. OkHttp

1、OkHttp 源碼,網絡緩存
2、如果從網絡加載一個 10M 的圖片,說下注意事項

5 算法與數據結構

  1. 單鏈表:反轉、插入、刪除

  2. 雙鏈表:插入、刪除

  3. 手寫常見排序、歸併排序、堆排序

  4. 二叉樹前序、中序、後序遍歷

  5. 最大 K 問題

  6. 廣度、深度優先搜索算法

  7. String 轉 int。

核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負數、Integer 的最大最小值邊界等;

  1. 如何判斷一個單鏈表有環?

  2. 鏈表翻轉;

  3. 快排;

  4. 100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;

  5. 鏈表每 k 位逆序;

  6. 鏡像二叉樹;

  7. 找出一個無序數組中出現超過一半次數的數字;

  8. 計算二叉樹的最大深度,要求非遞歸算法。

  9. String 方式計算加法。

6 項目&HR

  1. 項目開發中遇到的最大的一個難題和挑戰,你是如何解決的。(95% 會問到)

  2. 說說你開發最大的優勢點(95% 會問到)

  3. 你爲什麼會離開上家公司

  4. 你的缺點是什麼?

  5. 你能給公司帶來什麼效益?

  6. 你對未來的職業規劃?

騰訊三輪面試

一面:

  • 算法題 通電小球
  • Android 沉浸式狀態欄 怎麼實現的
  • 事件處理函數有哪幾個,父View 子View 監聽同一個事件,重寫哪些方法。在哪個View重寫?
  • ViewRootImpl接受事件嗎?
  • apk編譯打包流程 V1,V2 簽名區別
  • 利用logging監聽方法耗時,會不會讓app增大延遲。
  • eventbus爲什麼要用CopyOnWriteList?
  • 插件化怎麼加載資源的?
  • JVM怎麼保證gc效率跟線程運行效率的 ?
  • 如果android沒用對應的view,flutter能運行嗎?手寫單例模式,volatile 跟 synchronized區別?
  • 接口暴露,但是不讓別人調用,有哪些辦法?

二面:

  • 爲什麼採用flatbuffer? 比Json好在哪裏?
  • 如何處理Crash,NativeCrash呢?Google是怎麼做到的?如果上報過程中再次產生Crash能不能捕捉到?
  • uncaughtException是被誰調用的,如果再次崩潰能不能捕獲到?
  • Linux是怎麼知道app崩潰的,如果想要在被kill前 做一些耗時操作,該怎麼做?
  • 考慮設計一個crash捕捉模塊。
  • 100萬個數字求100個最大值。
  • 手寫快速排序算法。

三面 (GM面):

  • kotlin比Java好在哪裏,是函數式編程嗎?
  • 如何防止DNS劫持?
  • 如果讓你實現一個調試器,你會怎麼設計?靜態調試?動態調試呢?

總結

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

然而Android架構學習進階是一條漫長而艱苦的道路,不能靠一時激情,更不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。所以:貴在堅持!

上面分享的騰訊、頭條、阿里、美團、字節跳動等公司2020年的面試真題解析大全,筆者還把這些技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,下面只是以圖片的形式給大家展示一部分。

【Android思維腦圖(技能樹)】

知識不體系?這裏還有整理出來的Android進階學習的思維腦圖,給大家參考一個方向。

【Android高級架構視頻學習資源】

**Android部分精講視頻領取學習後更加是如虎添翼!**進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員氾濫,這套教程針對Android開發工程師1-6年的人員、正處於瓶頸期,想要年後突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!

【Android進階學習視頻】、【全套Android面試祕籍】可以私信我【學習】查看免費領取方式!

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