前言
金三四銀的春天,三月份的尾巴,你是否面上了自己理想的公司,薪資達到心中理想的高度?
還在為理想的生活而奔波在面試的路上嗎?
今天給大家分享下我整理的Android面試專題及答案,其中大部分都是大企業面試常問的面試題,可以對照這查漏補缺,當然了,這裡所列的肯定不可能覆蓋全部方式,不過也希望能對即將找工作的朋友起到一些幫助!
面試常問的面試專題
一、Java篇
1.多執行緒併發;
- sleep 和 wait 區別
- join 的用法
- 執行緒同步:synchronized 關鍵字等
- 執行緒通訊
- 執行緒池
- 手寫死鎖
2.Java 中的引用方式,及各自的使用場景
3.HashMap 的原始碼
4.GC(垃圾回收)是什麼?如何工作的?回收演算法有哪些
5.Error 和 Exception 區別?
6.反射和註解瞭解嗎?專案中有使用過嗎?
7.網路相關:
- http 狀態碼
- http 與 https 的區別?https 是如何工作的?
8.Java 中 LRUCache 是如何實現的(原始碼角度)?為什麼要用 LinkedHashmap?
9.設計模式:
- 手寫單例,volitate 關鍵字的原理
- 手寫生產者消費者模式
- 專案中都使用過哪些設計模式?
- 編碼常遵循的設計原則:單一職責、開閉原則、里氏替換等
10.ArrayList 和 LinkedList 區別?
二、Android
1.原始碼相關:
- Activity 啟動過程
- 事件分發原始碼,以及由此衍生的事件攔截如何實現
- 訊息機制:Handler 原始碼(結合Looper、MessageQueue),以及取不到訊息時會怎樣?
- View.post 為什麼可以拿到寬高?
2.自定義 View;
- 流程:onMeasure, onLayout, onDraw
- onMeasure 中的 MeasureSpec 是如何計算的?
3.Dalvik執行的是自定義的.dex位元組碼格式。
4.如何捕獲應用全域性異常?
5.Service 是使用,bind 和 start 的區別?
6.Android 中的 IPC 機制有哪些?(接著往下問)
7.屬性動畫原始碼?
8.大圖載入
9.ANR 如何定位,如何分析?(trace 日誌)
10.專案中使用了哪些開源庫?挑一個說說原始碼?
11.MVC 和 MVP 區別?
12.Activity:
- A 啟動 B,生命週期是怎麼走的?(注意區分B是否是透明的)
- 啟動模式
13.AsyncTask 原理?
三、效能優化
1.Android UI適配;
字型使用sp,使用dp,多使用match_parent,wrap_content,weight
圖片資源,不同圖片的的解析度,放在相應的資料夾下可使用百分比代替。
2.app優化:(工具:Hierarchy Viewer 分析佈局 工具:TraceView 測試分析耗時的)
3.App啟動優化
4.佈局優化(儘量不要過於複雜的巢狀。)
5.響應優化
- Android系統每隔16ms會發出VSYNC訊號重繪我們的介面(Activity)
- 頁面卡頓的原因:(1)過於複雜的佈局.(2)UI執行緒的複雜運算(3)頻繁的GC
- 導致頻繁GC有兩個原因:
(1)、記憶體抖動, 即大量的物件被建立又在短時間內馬上被釋放.(2)、瞬間產生大量的物件會嚴重佔用記憶體區域。
6.記憶體優化:參考記憶體洩露和記憶體溢位部分
7.電池使用優化(使用工具:Batterystats & bugreport);
優化網路請求
定位中使用GPS, 請記得及時關閉
8.網路優化(網路連線對使用者的影響:流量,電量,使用者等待)可在Android studio下方logcat旁邊那個工具Network Monitor檢測
- API設計:App與Server之間的API設計要考慮網路請求的頻次, 資源的狀態等. 以便App可以以較少的請求來完成業務需求和介面的展示.
- Gzip壓縮:使用Gzip來壓縮request和response, 減少傳輸資料量, 從而減少流量消耗.
- 圖片的Size:可以在獲取圖片時告知伺服器需要的圖片的寬高, 以便伺服器給出合適的圖片, 避免浪費.
- 網路快取:適當的快取, 既可以讓我們的應用看起來更快, 也能避免一些不必要的流量消耗.
9.圖片優化;
- 對圖片本身進行操作。儘量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource來設定一張大圖,因為這些方法在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體.
- 圖片進行縮放的比例,SDK中建議其值是2的指數值,值越大會導致圖片不清晰。
- 不用的圖片記得呼叫圖片的recycle()方法
四、NDK和前沿技術
1.談談你對 JNI 和 NDK 的理解;
- JNI 是 Java Native Interface 的縮寫,即 Java 的本地介面。
- 目的是使得 Java 與本地其他語言(如 C/C++)進行互動。
- JNI 是屬於 Java 的,與 Android 無直接關係。
- NDK 是 Native Development Kit 的縮寫,是 Android 的工具開發包。
- 作用是更方便和快速開發 C/C++ 的動態庫,並自動將動態庫與應用一起打包到 apk。
- NDK是屬於 Android 的,與 Java 無直接關係。
總結:
JNI 是實現的目的,NDK 是 Android 中實現 JNI 的手段。
2.談談你對 JNIEnv 和 JavaVM 理解;
- JavaVM 是虛擬機器在 JNI 層的代表
- 一個程式只有一個 JavaVM。(重要!)
- 所有的執行緒共用一個 JavaVM。(重要!)
- JNIEnv 表示 Java 呼叫 native 語言的環境,封裝了幾乎全部 JNI 方法的指標。
- JNIEnv 只在建立它的執行緒生效,不能跨執行緒傳遞,不同執行緒的 JNIEnv 彼此獨立。(重要!)
注意:
在 native 環境下建立的執行緒,要想和 java 通訊,即需要獲取一個 JNIEnv 物件。我們通過 AttachCurrentThread 和 DetachCurrentThread 方法將 native 的執行緒與 JavaVM 關聯和解除關聯。
3.怎麼定位 NDK 中的問題和錯誤;
- 一般在開發階段的話,我們可以通過 log 來定位和分析問題
- 如果是上線狀態(即關閉了基本的 log),我們可以藉助 NDK 提供的 addr2line 工具和 objdump 工具來定位錯誤
- 其它還可以使用 C/C++ 的一些分析工具
- 靜態註冊和動態註冊;
- 靜態註冊;通過
JNIEXPORT
和JNICALL
兩個巨集定義宣告,Java + 包名 + 類名 + 方法名
形式的函式名。不好的地方就是方法名太長了。 - 動態註冊;通常在 JNI_OnLoad 方法中通過 RegisterNatives 方法註冊,可以不再遵從固定的命名寫法(當然為了程式碼容易理解,名稱還是儘量和 Java 中保持一致)
5.API
有的變態題目還是會考驗你一些 API 的運用,比如怎麼在 JNI 裡面呼叫 Java 的方法,怎麼在 JNI 裡面拋異常等等。所以一些 API 還是要熟悉一下的,大致都是什麼功能,名字大致是啥呀,這個太多了,就不詳細介紹了。
五、跨平臺混合開發
1.weex框架;
- 如何搭建weex的開發環境(node,webpack,Android,iOS,weextoolkit)
- 構建的工具和基礎用法(npm的使用,webpack基礎用法)
- 編寫ui介面的幾種方式(vuejs指令碼編寫,css樣式編寫,tpl模板編寫)
- weex的內建能力?(weex例項子變數,weex內建元件,weex內建模組,weex事件,有無此方面的專案實戰?)
- weex ui架構(weex ui安裝與配置,使用layout佈局元件,使用navigator導航元件,使用utils工具方法)
2.flutter;
flutter開發環境的搭建
flutter編碼語言dart的認識?
dart物件導向的原理
dart中變數,函式,操作符,異常語法與Java原理的異同
類的機制
初始化列表的規則
命名構造方法
mixinflutter框架的原理,以及使用技巧(佈局分析,如何自定義view? 動畫/手勢互動,多執行緒開發原理,有無實戰釋出過自己的flutter庫)