大廠安卓面試真題精選,Android開發工程師面試題

A移動端開發 2021-09-20 02:17:53 阅读数:955

android 工程

面試部門 + 崗比特:商業化 - 高級 Android 開發工程師
面試感想:整體面得比較累,基礎面、交叉面、Boss面,前前後後對接了 6 個面試官 (離當初給我說的 3面+HR面 貌似差得有點遠¬_¬) 。算法到 Boss 面都還在寫,不過慶幸的是面試官沒有為難我 (老實交代了算法沒怎麼准備,哎…),算法都不太難。整體項目比基礎問得多。
面試建議:算法、基礎是敲門磚,項目是試金石,良好的面試形象是加分項。
簡曆上列舉的項目多想想,為什麼做這個項目?做這個項目的目標是什麼?我的方案是什麼?相對其他方案我的方案優勢是什麼?項目的收益是什麼?項目的架構圖是否能畫出來?項目中使用的主要框架原理是否前前後後都清楚?(我大概就是項目拯救了自己,基礎准備有點倉促T^T)。
如果是現場或視頻面試,良好的面試形象還是比較有必要的。在部門 TL 面的時候,就提到我相對很多其他面試者比較好的一點就是,整個人的形象狀態比較好,沒有讓人覺得很疲憊。

1面 - 基礎面

  1. 你們 Android 開發的時候,對於 UI 稿的 px 是如何適配的?
  • dpi:屏幕像素密度,指的是在系統軟件上指定的單比特尺寸的像素數量,它往往是寫在系統出廠配置文件的一個固定值;
  • ppi:也是屏幕像素密度,但這個是物理上的概念,它是客觀存在的不會改變。dpi是軟件參考了物理像素密度後,人為指定的一個值,這樣保證了某一個區間內的物理像素密度在軟件上都使用同一個值;
  • dp加上自適應布局和weight比例布局能解决90%的適配問題。因為並不是所有的1080P的手機dpi都是480,比如Google 的Pixel2(1920*1080)的dpi是420;
  • 寬高限定符適配:窮舉市面上所有的Android手機的寬高像素值,設定一個基准的分辨率,其他分辨率都根據這個基准分辨率來計算,在不同的尺寸文件夾內部,根據該尺寸編寫對應的dimens文件。但其有一個致命的缺陷,那就是需要精准命中才能適配,App包體積也會變大
  1. 兩個值相等的 Integer 對象,== 比較,判斷是否相等?

  2. Activity A 跳轉Activity B,Activity B再按back鍵回退,兩個過程各自的生命周期

  • ActivityA跳轉ActivityB的過程中,各自生命周期的執行順序。例如:A.onCreate A.onStart A.onPause A.onStop B.onCreate B.onStart B.onPause B.onStop B.onDestroy?
    ActivityA和ActivityB生命周期執行順序如下: A.onPause -> B.onCreate -> B.onStart-> B.onResume-> A.onStop
  • ActivityB 按back鍵呢?
    按下back鍵後: B.onPause->A.onRestart->A.onStart->A.onResume->B.onStop->B.onDestory
  • ActivityB是個窗口Activity的情况下,1、2的結論呢?
    若ActivityB是個窗口,ActivityA跳轉到ActivityB時,ActivityA失去焦點部分可見,故不會調用onStop,此時生命周期順序: A.onPause -> B.onCreate -> B.onStart-> B.onResume
    按下Back鍵後:B.onPause->A.onResume->B.onStop->B.onDestory
  • 切換橫豎屏時,onCreate會調用嗎?幾次?
    程序在運行時,一些設備的配置可能會改變,如:橫豎屏的切換、鍵盤的可用性或語言的切換等,此時Activity會重新啟動。其中的過程是:在銷毀之前會先調用onSaveInstancestate()去保存應用中的一些數據,然後調用 onDestory(),最後才會去調用onCreate()或者onRestoreInstanceState方法重新啟動Activiy。在切換屏幕時候會重新調用各個生命周期,切橫屏時會執行一次onCreate,切豎屏時會執行兩次onCreate。
  1. 子線程是否可以 context.startActivity() (如ApplicationContext), 會不會有什麼問題?

寫 demo 試了下是可以的。但會有什麼問題還沒弄清楚…

  1. Handler機制整體流程;Looper.loop()為什麼不會阻塞主線程;IdHandler(閑時機制);postDelay()的具體實現;post()與sendMessage()區別;使用Handler需要注意什麼問題,怎麼解决的?

問題很細,能准備多詳細就准備多詳細。人家自己封裝了一套 Handler 來避免內存泄漏問題

  1. Native、H5、RN頁面混合跳轉時,頁面清棧的橋如何實現的?

自己做的一個項目,原理講清楚就行,講不清就畫圖

  1. 怎麼計算一個View在屏幕可見部分的百分比?

  2. ClassLoader 的雙親委派機制

  3. 簡單介紹下 Https 的原理

  4. 什麼情况會導致內存泄漏,如何修複?

  5. 下載一張很大的圖,如何保證不 oom?

  6. 有沒有做過UI方面的優化,做過哪些?

  • 調試GPU過度繪制,將Overdraw降低到合理範圍內;
  • 减少嵌套層次及控件個數,保持view的樹形結構盡量扁平(使用Hierarchy Viewer可以方便的查看),同時移除所有不需要渲染的view;
  • 使用GPU配置渲染工具,定比特出問題發生在具體哪個步驟,使用TraceView精准定比特代碼;
  • 使用標簽,merge减少嵌套層次、viewStub延遲初始化、include布局重用 (與merge配合使用)
  1. WebView 與 JS 交互方式,shouldOverrideUrlLoading、onJsPrompt使用有啥區別

  2. Flutter、Kotlin接觸使用過沒有

  3. 其他項目相關問題

  4. 算法 - 二叉樹輸出第 k 層節點元素

2面 - 項目專項

  1. Native、H5、RN頁面混合跳轉時,頁面清棧的橋實現

  2. 頁面混編框架的設計與難點

  3. RN 通用容器的設計

  4. 用戶行為監控方案設計

  5. JS 錯誤治理方案

  6. RN 頁面對用戶行為的監控與JS錯誤治理,在問題發現有什麼收獲、優化點

  7. 美團 RN 相對於原生 RN 的有什麼優勢

3面 - 基礎加深

  1. 你們公司 Picasso 有使用過沒,介紹下

  2. Picasso 單引擎,在多 Bundle 的情况下怎麼保證數據隔離的?

  3. 美團 RN 與 Picasso 的區別

4.省略若幹項目相關問題…

  1. RN 的頁面追踪埋點如何實現的

  2. 美團首頁是否是 RN 頁面,MTFlexBox 原理

  3. synchronized 修飾 static 方法、普通方法、類、方法塊區別

  4. synchronized 底層實現原理

  5. volatile 的作用和原理

  6. 一個 int 變量用 volatile 修飾,多線程去操作 i++,是否線程安全?如何保證 i++ 線程安全?AtomicInteger 的底層實現原理?

使用 AtomicInteger 可以使 i++ 線程安全

  1. 說下對線程池的理解,以及創建線程池的幾個關鍵參數

  2. Handler 機制又問了一遍…

  3. 介紹下 Binder 機制,與內存共享機制有什麼區別?

  4. Java 集合,介紹下ArrayList 和 HashMap 的使用場景,底層實現原理

  5. ArrayList 與 LinkedList 的區別

  6. 算法 - 兩個有序的鏈錶的合並

  7. 算法 - 輸入一個字符串(不含*和.)、正則(字母、*和.任意組合),判斷字符串是否合法

  8. 簡單介紹下,項目中遇到的一些技術難點

4面 - 交叉面

  1. 下面的代碼, str 值最終為多少?換成 Integer 值又為多少,是否會被改變?
  • 考點:Java 值傳遞 (第 2 題相同)。編寫代碼測試,在 changeValue() 方法中修改入參,並不會改變之前的值;
  • 原理:方法得到的是所有參數值的一個拷貝,即方法不能修改傳遞給它的任何參數變量的內容。基本類型參數傳遞的是參數副本,對象類型參數傳遞的是對象地址的副本;
  • 題解:在 changeValue() 中,對於對象類型參數,直接修改的是對象地址副本的值,所以之前變量的地址並未被修改!若修改的是對象實例裏面的某個值,之前變量則會被修改
public void test() {
String str = "123";
changeValue(str);
System.out.println("str值為: " + str); // str未被改變,str = "123"
}
public changeValue(String str) {
str = "abc";
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  1. 下面的代碼,再次使用對象 student 是否需要判空?

Java 中方法參數的使用情况總結:

  • 一個方法不能修改一個基本數據類型的參數(即數值型或布爾型);
  • 一個方法可以改變一個對象參數的狀態;
  • 一個方法不能讓對象參數引用一個新的對象
public void test() {
Student student = new Student("Bobo", 15);
changeValue1(student); // student值未改變,不為null! 輸出結果 student值為 name:Bobo、age:15
// changeValue2(student); // student值被改變,輸出結果 student值為 name:Lily、age:20
System.out.println("student值為 name: " + student.name + "、age:" + student.age);
}
public changeValue1(Student student) {
student = null;
}
public static void changeValue2(Student student) {
student.name = "Lily";
student.age = 20;
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  1. Java 的幾種引用類型,弱引用的使用場景?

  2. 線程池分類,解釋下幾個核心參數?

  3. APK 的打包過程是什麼?

  • aapt 工具打包資源文件,生成 R.java 文件
  • aidl 工具處理 AIDL 文件,生成對應的 .java 文件
  • javac 工具編譯 Java 文件,生成對應的 .class 文件
  • 把 .class 文件轉化成 Davik VM 支持的 .dex 文件
  • apkbuilder 工具打包生成未簽名的 .apk 文件
  • jarsigner 對未簽名 .apk 文件進行簽名
  • zipalign 工具對簽名後的 .apk 文件進行對齊處理
  1. APK 為什麼要簽名?是否了解過具體的簽名機制?

Android 為了確認 apk 開發者身份和防止內容的篡改,設計了一套 apk 簽名的方案保證 apk 的安全性,即在打包時由開發者進行 apk 的簽名,在安裝 apk 時Android 系統會有相應的開發者身份和內容正確性的驗證,只有驗證通過才可以安裝 apk,簽名過程和驗證的設計就是基於非對稱加密的思想。
Android 在 7.0 以前使用的一套簽名方案:在 apk 根目錄下的 META-INF/ 文件夾下生成簽名文件,然後在安裝時在系統的 PackageManagerService 裏進行簽名文件的驗證。
從 7.0 開始,Android 提供了新的 V2 簽名方案:利用 apk(zip) 壓縮文件的格式,在幾個原始內容區之外增加了一塊用於存放簽名信息的數據區,然後同樣在安裝時在系統的 PackageManagerService 裏進行 V2 版本的簽名驗證,V2 方案會更安全、使校驗更快安裝更快。
當然 V2 簽名方案會向後兼容,如果沒有使用 V2 簽名就會默認走 V1 簽名方案的驗證過程。

  1. 為什麼要分 dex ?SDK 21 不分 dex,直接全部加載會不會有什麼問題?

求路過大神們的正解…

  1. 常見的設計模式有哪些?你提供的 JS 錯誤治理方案,用了哪些設計模式?

  2. 算法 - 二叉樹層序遍曆,奇數層逆序遍曆節點,偶數層正序遍曆

  3. 未來 3~5 年的規劃是什麼?

  4. 你覺得你的優點是什麼?缺點是什麼?

  5. 現在的職級,近期的績效如何

5面 - 部門 TL

  1. 商業化部門相關的業務介紹 (核心大概是商業化部門壁壘高,培養一個人成本高,比做其他業務更有含金量,可以積累很多業務策略知識),然後讓問他問題

  2. 未來幾年的規劃?生活上有什麼規劃?

  3. 你覺得你的優點是什麼?缺點是什麼?

  4. 現在的職級,近期的績效如何

  5. 為什麼給你這麼好的績效?

  6. 有沒有看其他機會?阿裏面試的情况

6面 - 大 Boss

  1. 算法 - 數組插入,考慮擴容

  2. 在項目的遇到的比較有挑戰的事是什麼?

  3. 你在美團負責的業務有哪些?

  4. 未來幾年的規劃是什麼?

  5. 你覺得你的優點是什麼?缺點是什麼?

  6. 現在的職級,近期的績效如何

【HR 面】

  1. 本科和研究生專業都是偏硬件的,是否有相關的軟件經曆?

  2. 研究生是保研的還是自己考的?

  3. 去美團之前有沒有 Android 開發經曆?

  4. 當時為什麼要選擇去美團?為什麼要選擇來北京?

  5. 為什麼要換工作?期望以後的工作是怎樣的?

金句:現在自己的技術成長有點碰到瓶頸,加上一直對您公司欽慕有加

  1. 現在的職級,近期的績效如何?

  2. 這麼好的績效,為什麼不選擇美團內換部門看看機會?

  3. 幾次晋昇中,業績亮點是什麼?

  4. 家是哪裏的,有回家那邊發展的打算沒有?

  5. 有打算再去看看快手之類的工作機會沒有?

  6. 問一些阿裏現在的面試進展和情况

  7. 期望的薪資

總結

最後對於程序員來說,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提昇自己,從來都是我們去適應環境,而不是環境來適應我們!

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

相信它會給大家帶來很多收獲:
大廠安卓面試真題精選,Android開發工程師面試題_Android

大廠安卓面試真題精選,Android開發工程師面試題_Android_02

本文在** CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》**中已收錄,裏面包含不同方向的自學編程路線、面試題集合/面經、及系列技術文章等,資源持續更新中…

當程序員容易,當一個優秀的程序員是需要不斷學習的,從初級程序員到高級程序員,從初級架構師到資深架構師,或者走向管理,從技術經理到技術總監,每個階段都需要掌握不同的能力。早早確定自己的職業方向,才能在工作和能力提昇中甩開同齡人。

版权声明:本文为[A移動端開發]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920021752894w.html