精選!Android 大廠 OPPO 面試題及經驗小結

android高級架構師 發佈 2020-02-07T19:24:10+00:00

我說 PMS 會解析所有 apk 的 AndroidManifest.xml ,如果解析過會存到 package.xml 中不會反覆解析,PMS 有了它就能找到了。

寫在前面

關於疫情

今天我看了一下疫情數據,已經確診了24363例了,增長的速度超過我的想像,大家一定要做好疫情防護措施。總會有一些不重視的人,這裡再次提醒大家

  • 出門戴口罩,勤洗手,打噴嚏或咳嗽時請捂住口鼻
  • 避免接觸或者宰殺野生或禽類動物,不吃生食
  • 注意保持室內環境衛生和空氣流通,儘量減少到人員密集場所活動
  • 必要時,在家用醫用酒精消毒
  • 不要參加聚集活動
  • 保證睡眠,增強免疫力
  • 不信謠,不傳謠

疫情病毒肆虐,我們能做的就是做好疫情個人防護,幫助家人做好疫情防護!

今天來分享一下之前面試OPPO的一些小經驗和整理出來的一些比較常碰到的問題,但是我們簡歷經歷不一樣問的問題也會不一樣,且大廠面試光靠背幾個面試題就想過還是比較難的。因此在這裡提醒一下大家不要臨時抱佛腳,你花幾天能背下的東西,別人花幾天一定能超過你的,但我們花幾年沉澱的東西,人家花幾個月就未必能趕上,希望大家不飛則已,一飛沖天。

面試整個流程下來非常爽,總共三輪面試,兩輪技術面(每輪2個面試官),一輪 HR 面。

技術一面

1.mmap + native 日誌優化?

講了傳統日誌列印的兩個性能問題,一個是反覆操作文件描述符表,一個是反覆進入內核態,然後講了 mmap 的原理機制。

2.講講 Android 開機啟動的流程

講了一大堆,其中說到 ServiceManager 進程是用來管理系統服務的,面試官說你確定?不是 SystemServer 進程來管理系統服務的嗎?討論了一番面試官懵逼了,提到了 SystemUI 服務,提到了桌面進程,問到了怎麼替換開機啟動的動畫?

3.系統是怎麼幫我們啟動找到桌面應用的

我說通過意圖,他說怎麼找到是哪個意圖? 我說 PMS 會解析所有 apk 的 AndroidManifest.xml ,如果解析過會存到 package.xml 中不會反覆解析,PMS 有了它就能找到了。

4.講講動態狀態頁的加載,為什麼要這麼弄?

我說為了減少 xml 解析和反射創建對象的時間,避免同時創建多個用不上的對象,我就寫了個框架用代碼動態添加的。這時面試官誤解了我的意思,以為所有的介面都是用代碼寫的,那得多麻煩呀,後來解釋清楚了。

5.講講頁面的刷新機制,GPU 調試工具幾個顏色值分別代表什麼?

講到了 Surface 底層管理的其實是 IBPQ , 講了異步信號的由來是 SurfaceFlinger 由硬體和軟體機制發出來的,講了我們 app 介面繪製的內容是怎麼提交傳遞到 SurfaceFlinger 的。GPU 調試工具幾種顏色的意思也大概講了下。

6.說說 ConcurrentHashMap 的實現原理說下

是線程安全的,實現原理採用的是分段鎖。

7.你知道 okhttp 是怎麼復用連接的嗎?

這是個網絡優化的問題,同一個 ip 同一個埠能復用一個連接,後面問道了 http 2.0 的多路復用,我說一個 tcp 可以多個請求,原理呢?我說不知道。後面讓我說了下 https 。

8.數組和鍊表的區別說下

9.快排和遞歸

技術二面

1.講一講動態註冊和靜態註冊

靜態註冊是通過包名和函數名去找方法,動態註冊是通過註冊方法表,其中還被問到了具體是調用哪個函數註冊方法表。

2.so 的加載流程是怎樣的,生命周期是怎樣的

這個要從 java 層去看源碼分析,是從 ClassLoader 的 PathList 中去找到目標路徑加載的,同時 so 是通過 mmap 加載映射到虛擬空間的。生命周期加載庫和卸載庫時分別調用 JNI_OnLoad 和 JNI_OnUnload() 方法。

3.native 層怎麼檢測內存泄漏

我說按道理可以 hook 函數,開闢內存和釋放內存的次數應該是一樣的,如果不一樣可以懷疑內存泄漏。面試官接著問有沒有什麼第三方工具或者庫可以檢測?我說我在公司其實也寫的不多,不知道引擎組集成的是啥框架,主要擅長應用層開發。

4.leakcanary 的原理,哪些對象可以用來做 gc-root

好,你說你主要擅長應用層開發,那 Java 層的內存泄漏怎麼檢測,我說我們用的 leakcanary,讓我說說原理,說完原理又問我是不是所有對象泄漏 leakcanary 都能檢測得到,他的引用鏈是怎麼管理的?後面問到你剛說弱引用對象在 gc 的時候會被釋放,那什麼時候不會被釋放?我這時懵逼了,其實就是有內存泄漏的時候不會被釋放,我當時腦子短路了居然沒反應過來。

5.ui 怎麼優化的?

我主要從底層講了一下 UI 刷新機制的流程,又把一面的 SurfaceFlinger 底層機制講了一遍,原理搞清了就可以做很多優化,巴拉巴拉說了一大堆,最後講了怎麼去監聽 UI 卡頓。

6.線程耗時卡頓怎麼監聽的?

主要用工具去檢測,當時只提到了 systrace + 函數插樁的方式。

7.說說你看的 Tinker 的原理?

8.你遇到的最難解決的問題?

我說我們公司項目沒有採用動態加載框架,但是後面集成 U3D 項目需要動態加載,但只需要用到 so 和資源動態加載,功能上第三庫也不支持我們的需求,我就自己硬著頭皮看了各大版本的源碼,支持動態修復替換加載 so 和 assets 資源動態修復加載,然後把具體的細節說了一遍。

9.常見數據結構你都熟悉哪些?不是本專業算法你是怎麼學的?

數組,鍊表,堆,二叉樹,隊列,棧,平衡二叉樹,紅黑樹,霍夫曼樹,圖。自己看書算法通過刷題,這裡沒具體問算法細節。

10.線上有人反饋問題你一般怎麼處理的?

開發過程中記錄關鍵日誌,線上獲取用戶日誌來分析。

個人體會

不用凡是都抱著得到的心態去做,就好比學習我就一定是為了進 BAT,如果是這樣那當我們進了 BAT 又該如何,就好比死亡並不是代表生命的結束,學習這件事應該是終身的。只要我們能靜下心來該來的自然會來,作人無甚高遠事業,擺脫得俗情,便入名流;為學無甚增益工夫,減除得物累,便超聖境

不要凡是都抱著利益的心態去做,一直以來我都是崇尚成就自己的同時去成就別人。只要自己不抱著利益的心態去做,那麼便能拿得起放得下,當我想講的時候便可以講,不想講的時候便可以不講。過程中肯定會有各種疑問和懷疑,若堅持不了就放棄,但心中若有掛礙就銘記。

最後

通過不同的面試,記錄下自己的面試過程從而才能更好的提升自己的。

最後在這裡小編分享一份自己收錄整理上述技術體系圖相關的幾十套騰訊、頭條、阿里、美團等公司19年的面試題,把技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,這裡以圖片的形式給大家展示一部分。

還有 高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料 幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習。

【Android開發核心知識點筆記】

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

【Android核心高級技術PDF文檔,BAT大廠面試真題解析】

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

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

【Android進階學習視頻】、【全套Android面試秘籍PDF】、【Android開發核心知識點筆記】可以 私信我【安卓】免費獲取!

關鍵字: