2019 金三銀四:阿里P9架構的Android大廠面試題總結
職場的金三銀四跳槽季又來了,不同的是今年比往年「冷」一些,形式更加嚴峻一些,大家多多少少可能都聽到或看到一些資訊,就是好多公司在優化裁員,代表的就是滴滴、京東這種大型網際網路公司,已經官宣了。在這種情況下,3、4月份有一波離職、求職潮。作為求職者來說,面試是一道坎,很多人會恐懼面試,即使是工作很多年的老鳥,可能仍存在面試的焦慮。
這些題目是我之前的面試以及在金三銀四中去百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐等一線網際網路公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的機率。
由於涉及到的面試題較多導致篇幅較長,我根據這些面試題所涉及到的常問範圍總結了並做出了一份學習進階路線圖、視訊資料及面試題答案免費分享給大家,文末有領取!
主要分為以下幾部分:
- Android面試題
- 高階開發技術面試題
- 跨平臺Hybrid 開發
一、Android面試題
Android面試題包括Android基礎,還有一些原始碼級別的、原理這些等。所以想去大公司面試,一定要多看看原始碼和實現方式,常用框架可以試試自己能不能手寫實現一下,鍛鍊一下自己。
(一)Android基礎知識點
- 四大元件是什麼
- 四大元件的生命週期和簡單用法
- Activity之間的通訊方式
- Activity各種情況下的生命週期
- 橫豎屏切換的時候,Activity 各種情況下的生命週期
- Activity與Fragment之間生命週期比較
- Activity上有Dialog的時候按Home鍵時的生命週期
- 兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
- 前臺切換到後臺,然後再回到前臺,Activity生命週期回撥方法。彈出* * Dialog,生命值週期回撥方法。
- Activity的四種啟動模式對比
- Activity狀態保存於恢復
- fragment各種情況下的生命週期
- Fragment狀態儲存startActivityForResult是哪個類的方法,在什麼情況下使用?
- 如何實現Fragment的滑動?
- fragment之間傳遞資料的方式?
- Activity 怎麼和Service 繫結?
- 怎麼在Activity 中啟動自己對應的Service?
- service和activity怎麼進行資料互動?
- Service的開啟方式
- 請描述一下Service 的生命週期
- 談談你對ContentProvider的理解
- 說說ContentProvider、ContentResolver、ContentObserver 之間的關係
- 請描述一下廣播BroadcastReceiver的理解
- 廣播的分類
- 廣播使用的方式和場景
- 在manifest 和程式碼中如何註冊和使用BroadcastReceiver?
- 本地廣播和全域性廣播有什麼差別?
- BroadcastReceiver,LocalBroadcastReceiver 區別
- AlertDialog,popupWindow,Activity區別
- Application 和 Activity 的 Context 物件的區別
- Android屬性動畫特性
- 如何匯入外部資料庫?
- LinearLayout、RelativeLayout、FrameLayout的特性及對比,並介紹使用場景。
- 談談對介面與回撥的理解
- 回撥的原理
- 寫一個回撥demo
- 介紹下SurfView
- RecycleView的使用
- 序列化的作用,以及Android兩種序列化的區別
- 差值器
- 估值器
- Android中資料儲存方式
(二)Android原始碼相關分析
- Android動畫框架實現原理
- Android各個版本API的區別
- Requestlayout,onlayout,onDraw,DrawChild區別與聯絡
- invalidate和postInvalidate的區別及使用
- Activity-Window-View三者的差別
- 談談對Volley的理解
- 如何優化自定義View
- 低版本SDK如何實現高版本api?
- 描述一次網路請求的流程
- HttpUrlConnection 和 okhttp關係
- Bitmap物件的理解
- looper架構
- ActivityThread,AMS,WMS的工作原理
- 自定義View如何考慮機型適配
- 自定義View的事件
- AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
- LaunchMode應用場景
- AsyncTask 如何使用?
- SpareArray原理
- 請介紹下ContentProvider 是如何實現資料共享的?
- AndroidService與Activity之間通訊的幾種方式
- IntentService原理及作用是什麼?
- 說說Activity、Intent、Service 是什麼關係
- ApplicationContext和ActivityContext的區別
- SP是程序同步的嗎?有什麼方法做到同步?
- 談談多執行緒在Android中的使用
- 程序和 Application 的生命週期
- 封裝View的時候怎麼知道view的大小
- RecycleView原理
- AndroidManifest的作用與理解
(三)常見的一些原理性問題
- Handler機制和底層實現
- Handler、Thread和HandlerThread的差別
- handler發訊息給子執行緒,looper怎麼啟動?
- 關於Handler,在任何地方new Handler 都是什麼執行緒下?
- ThreadLocal原理,實現及如何保證Local屬性?
- 請解釋下在單執行緒模型中Message、Handler、Message Queue、* Looper之間的關係
- 請描述一下View事件傳遞分發機制
- Touch事件傳遞流程
- 事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?
- View和ViewGroup分別有哪些事件分發相關的回撥方法
- View重新整理機制
- View繪製流程
- 自定義控制元件原理
- 自定義View如何提供獲取View屬性的介面?
- Android程式碼中實現WAP方式聯網
- AsyncTask機制
- AsyncTask原理及不足
- 如何取消AsyncTask?
- 為什麼不能在子執行緒更新UI?
- ANR產生的原因是什麼?
- ANR定位和修正
- oom是什麼?
- 什麼情況導致oom?
- 有什麼解決方法可以避免OOM?
- Oom 是否可以try catch?為什麼?
- 記憶體洩漏是什麼?
- 什麼情況導致記憶體洩漏?
- 如何防止執行緒的記憶體洩漏?
- 記憶體洩露場的解決方法
- 記憶體洩漏和記憶體溢位區別?
- LruCache預設快取大小
- ContentProvider的許可權管理(解答:讀寫分離,許可權控制-精確到表級,URL控制)
- 如何通過廣播攔截和abort一條簡訊?
- 廣播是否可以請求網路?
- 廣播引起anr的時間限制是多少?
- 計算一個view的巢狀層級
- Activity棧
- Android執行緒有沒有上限?
- 執行緒池有沒有上限?
- ListView重用的是什麼?
- Android為什麼引入Parcelable?
- 有沒有嘗試簡化Parcelable的使用?
(四)開發中常見的一些問題
- ListView 中圖片錯位的問題是如何產生的?
- 混合開發有了解嗎?
- 知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解* 答:比如:RN,weex,H5,小程式,WPA等。做Android的瞭解一些前- 端js等還是很有好處的);
- 螢幕適配的處理技巧都有哪些?
- 伺服器只提供資料接收介面,在多執行緒或多程序條件下,如何保證資料的有序到達?
- 動態佈局的理解
- 怎麼去除重複程式碼?
- 畫出 Android 的大體架構圖
- Recycleview和ListView的區別
- ListView圖片載入錯亂的原理和解決方案
- 動態許可權適配方案,許可權組的概念
- Android系統為什麼會設計ContentProvider?
- 下拉狀態列是不是影響activity的生命週期
- 如果在onStop的時候做了網路請求,onResume的時候怎麼恢復?
- Bitmap 使用時候注意什麼?
- Bitmap的recycler()
- Android中開啟攝像頭的主要步驟
- ViewPager使用細節,如何設定成每次只初始化當前的Fragment,其他的不初始化?
- 點選事件被攔截,但是想傳到下面的View,如何操作?
- 微信主頁面的實現方式
- 微信上訊息小紅點的原理
CAS介紹(這是阿里巴巴的面試題,我不是很瞭解,可以參考部落格: CAS簡介)
二、高階開發技術面試題
這裡講的是大公司需要用到的一些高階Android技術,這裡專門整理了一個文件,希望大家都可以看看。這些題目有點技術含量,需要好點時間去研究一下的。
(一)圖片
- 圖片庫對比
- 圖片庫的原始碼分析
- 圖片框架快取實現
- LRUCache原理
- 圖片載入原理
- 自己去實現圖片庫,怎麼做?
- Glide原始碼解析
- Glide使用什麼快取?
- Glide記憶體快取如何控制大小?
(二)網路和安全機制
- 網路框架對比和原始碼分析
- 自己去設計網路請求框架,怎麼做?
- okhttp原始碼
- 網路請求快取處理,okhttp如何處理網路快取的
- 從網路載入一個10M的圖片,說下注意事項
- TCP的3次握手和四次揮手
- TCP與UDP的區別
- TCP與UDP的應用
- HTTP協議
- HTTP1.0與2.0的區別
- HTTP報文結構
- HTTP與HTTPS的區別以及如何實現安全性
- 如何驗證證書的合法性?
- https中哪裡用了對稱加密,哪裡用了非對稱加密,對加密演算法(如RSA)等是否有了解?
- client如何確定自己傳送的訊息被server收到?
- 談談你對WebSocket的理解
- WebSocket與socket的區別
- 談談你對安卓簽名的理解。
- 請解釋安卓為啥要加簽名機制?
- 視訊加密傳輸
- App 是如何沙箱化,為什麼要這麼做?
- 許可權管理系統(底層的許可權是如何進行 grant 的)?
(三)資料庫
- sqlite升級,增加欄位的語句
- 資料庫框架對比和原始碼分析
- 資料庫的優化
- 資料庫資料遷移問題
(四)演算法
- 排序演算法有哪些?
- 最快的排序演算法是哪個?
- 手寫一個氣泡排序
- 手寫快速排序程式碼
- 快速排序的過程、時間複雜度、空間複雜度
- 手寫堆排序
- 堆排序過程、時間複雜度及空間複雜度
- 寫出你所知道的排序演算法及時空複雜度,穩定性
- 二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
- 給阿里2萬多名員工按年齡排序應該選擇哪個演算法?
- GC演算法(各種演算法的優缺點以及應用場景)
- 蟻群演算法與蒙特卡洛演算法
- 子串包含問題(KMP 演算法)寫程式碼實現
- 一個無序,不重複陣列,輸出N個元素,使得N個元素的和相加為M,給出時間複雜度、空間複雜度。手寫演算法
- 萬億級別的兩個URL檔案A和B,如何求出A和B的差集C(提示:Bit對映->hash分組->多檔案讀寫效率->磁碟定址以及應用層面對定址的優化)
- 百度POI中如何試下查詢最近的商家功能(提示:座標映象+R樹)。
兩個不重複的陣列集合中,求共同的元素。 - 兩個不重複的陣列集合中,這兩個集合都是海量資料,記憶體中放不下,怎麼求共同的元素?
- 一個檔案中有100萬個整數,由空格分開,在程式中判斷使用者輸入的整數是否在此檔案中。說出最優的方法
- 一張Bitmap所佔記憶體以及記憶體佔用的計算
- 2000萬個整數,找出第五十大的數字?
- 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
- 求1000以內的水仙花數以及40億以內的水仙花數
- 5枚硬幣,2正3反如何劃分為兩堆然後通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
- 時針走一圈,時針分針重合幾次
- N*N的方格紙,裡面有多少個正方形
- x個蘋果,一天只能吃一個、兩個、或者三個,問多少天可以吃完?
(五)外掛化、模組化、元件化、熱修復、增量更新、Gradle
- 對熱修復和外掛化的理解
- 外掛化原理分析
- 模組化實現(好處,原因)
- 熱修復,外掛化
- 專案元件化的理解
- 描述清點選 Android Studio 的 build 按鈕後發生了什麼
(六)架構設計和設計模式
- 談談你對Android設計模式的理解
- MVC MVP MVVM原理和區別
- 你所知道的設計模式有哪些?
- 專案中常用的設計模式
- 手寫生產者/消費者模式
- 寫出觀察者模式的程式碼
- 介面卡模式,裝飾者模式,外觀模式的異同?
- 用到的一些開源框架,介紹一個看過原始碼的,內部實現過程。
- 談談對RxJava的理解
- RxJava的功能與原理實現
- RxJava的作用,與平時使用的非同步操作來比的優缺點
- 說說EventBus作用,實現方式,代替EventBus的方式
- 從0設計一款App整體架構,如何去做?
- 說一款你認為當前比較火的應用並設計(比如:直播APP,P2P金融,小視訊等)
- 談談對java狀態機理解
- Fragment如果在Adapter中使用應該如何解耦?
- Binder機制及底層實現
- 對於應用更新這塊是如何做的?(解答:灰度,強制更新,分割槽域更新)?
- 實現一個Json解析器(可以通過正則提高速度)
- 統計啟動時長,標準
(七)效能優化
- 如何對Android 應用進行效能分析以及優化?
- ddms 和 traceView
- 效能優化如何分析systrace?
- 用IDE如何分析記憶體洩漏?
- Java多執行緒引發的效能問題,怎麼解決?
- 啟動頁白屏及黑屏解決?
- 啟動太慢怎麼解決?
- 怎麼保證應用啟動不卡頓?
- App啟動崩潰異常捕捉
- 自定義View注意事項
- 現在下載速度很慢,試從網路協議的角度分析原因,並優化(提示:網路的5層都可以涉及)。
- Https請求慢的解決辦法(提示:DNS,攜帶資料,直接訪問IP)
- 如何保持應用的穩定性
- RecyclerView和ListView的效能對比
- ListView的優化
- RecycleView優化
- View渲染
- Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
- java中的四種引用的區別以及使用場景
- 強引用置為null,會不會被回收?
(八)NDK、jni、Binder、AIDL、程序通訊有關
- 請介紹一下NDK
- 什麼是NDK庫?
- jni用過嗎?
- 如何在jni中註冊native函式,有幾種註冊方式?
- Java如何呼叫c、c++語言?
- jni如何呼叫java層程式碼?
- 程序間通訊的方式?
- Binder機制
- 簡述IPC?
- 什麼是AIDL?
- AIDL解決了什麼問題?
- AIDL如何使用?
- Android 上的 Inter-Process-Communication 跨程序通訊時如何工作的?
- 多程序場景遇見過麼?
- Android程序分類?
- 程序和 Application 的生命週期?
- 程序排程
- 談談對程序共享和執行緒安全的認識
- 談談對多程序開發的理解以及多程序應用場景
- 什麼是協程?
(九)framework層、ROM定製、Ubuntu、Linux之類的問題
- java虛擬機器的特性
- 談談對jvm的理解
- JVM記憶體區域,開執行緒影響哪塊記憶體
- 對Dalvik、ART虛擬機器有什麼瞭解?
- Art和Dalvik對比
- 虛擬機器原理,如何自己設計一個虛擬機器(記憶體管理,類載入,雙親委派)
- 談談你對雙親委派模型理解
- JVM記憶體模型,記憶體區域
- 類載入機制
- 談談對ClassLoader(類載入器)的理解
- 談談對動態載入(OSGI)的理解
- 記憶體物件的迴圈引用及避免
- 記憶體回收機制、GC回收策略、GC原理時機以及GC物件
- 垃圾回收機制與呼叫System.gc()區別
- Ubuntu編譯安卓系統
- 系統啟動流程是什麼?(提示:Zygote程序 –> SystemServer程序 –> 各種系統服務 –> 應用程序)
- 大體說清一個應用程式安裝到手機上時發生了什麼
- 簡述Activity啟動全部過程
- App啟動流程,從點選桌面開始
- 邏輯地址與實體地址,為什麼使用邏輯地址?
- Android為每個應用程式分配的記憶體大小是多少?
- Android中程序記憶體的分配,能不能自己分配定額記憶體?
- 程序保活的方式
- 如何保證一個後臺服務不被殺死?(相同問題:如何保證service在後臺不被kill?)比較省電的方式是什麼?
- App中喚醒其他程序的實現方式
四、跨平臺Hybrid 開發
- flutter
- Html5專案實戰
- HTML&CSS&JavaScript 實戰
- WordPress搭建網站專案實戰
- 前端Vue架構
- 前端樣式開發
- Weex內建能力
- Weex原生應用
- Weex擴充套件框架
- WeexUI架構
- 介紹你做過的哪些專案
- 都使用過哪些框架、平臺?
- 都使用過哪些自定義控制元件?
- 研究比較深入的領域有哪些?
- 對業內資訊的關注渠道有哪些?
- 最近都讀哪些書?
- 有沒有什麼開源專案?
- 自己最擅長的技術點,最感興趣的技術領域和技術點
- 專案中用了哪些開源庫,如何避免因為引入開源庫而導致的安全性和穩定性問題
- 實習過程中做了什麼,有什麼產出?
五、小結
由於題目很多整理答案的工作量太大,所以僅限於提供知識點,如果你正在找工作,建議逐個過一遍,不懂的可以群裡提問討論,但是請先自行上網查閱相關知識點,對於已經掌握的可以忽略以節省時間。
希望我這些面試總結可以幫助還沒有找到工作的夥伴們,傳遞一份溫暖~
文末福利:
架構師不是天生的,是在專案中磨練起來的,所以,我們學了技術就需要結合專案進行實戰訓練,那麼在Android裡面最常用的架構無外乎 MVC,MVP,MVVM,但是這些思想如果和模組化,層次化,元件化混和在一起,那就不是一件那麼簡單的事了,我們需要一個真正身經百戰的架構師才能講解透徹其中蘊含的深理。

移動架構師

系統學習技術大綱
一線網際網路Android面試題總結含詳解(初級到高階專題)

image
資料領取: 點贊+加群免費獲取Android IOC架構設計
有Android開發1-10年基礎,希望突破瓶頸,成為架構師的小夥伴,可以加入高階架構群:Android IOC架構設計(185873940),免費提供視訊和資料,一起學習,相互討論。