注:由於實際開發與參考答案會有所不一樣,再者怕誤導你們,因此這些面試題答案仍是本身去理解!面試官會針對簡歷中提到的知識點由淺入深提問,因此不要背答案,多理解。
1.組件化中路由、埋點的實現
參考回答:
由於在組件化中,各個業務模塊之間是各自獨立的, 並不會存在相互依賴的關係, 因此一個業務模塊是訪問不了其餘業務模塊的代碼的, 若是想從 A 業務模塊的 A 頁面跳轉到 B 業務模塊的 B 頁面, 光靠模塊自身是不能實現的,這就須要一種跨組件通訊方案—— 路由(Router)android
路由主要有如下兩種場景:面試
- 第一種是組件之間的頁面跳轉 (Activity 到 Activity, Fragment 到 Fragment, Activity 到 Fragment, Fragment 到 Activity) 以及跳轉時的數據傳遞 (基礎數據類型和可序列化的自定義類類型)
- 第二種是組件之間的自定義類和自定義方法的調用(組件向外提供服務)
其原理在於將分佈在不一樣組件module中的某些類按照必定規則生成映射表(數據結構一般是Map,Key爲一個字符串,Value爲類或對象),而後在須要用到的時候從映射表中根據字符串從映射表中取出類或對象,本質上是類的查找算法
埋點則是在應用中特定的流程收集一些信息,用來跟蹤應用使用的情況編程
- 代碼埋點:在某個事件發生時調用SDK裏面相應的接口發送埋點數據,百度統計、友盟、TalkingData、Sensors Analytics等第三方數據統計服務商大都採用這種方案
- 全埋點:全埋點指的是將Web頁面/App內產生的全部的、知足某個條件的行爲,所有上報到後臺服務器
- 可視化埋點:經過可視化工具(例如Mixpanel)配置採集節點,在Android端自動解析配置並上報埋點數據,從而實現所謂的自動埋點
- 無埋點:它並非真正的不須要埋點,而是Android端自動採集所有事件並上報埋點數據,在後端數據計算時過濾出有用數據
2.Hook以及插樁技術後端
參考回答:api
Hook是一種用於改變API執行結果的技術,可以將系統的API函數執行重定向(應用的觸發事件和後臺邏輯處理是根據事件流程一步步地向下執行。而Hook的意思,就是在事件傳送到終點前截獲並監控事件的傳輸,像個鉤子鉤上事件同樣,而且可以在鉤上事件時,處理一些本身特定的事件,例如逆向破解App)緩存
Android 中的 Hook 機制,大體有兩個方式:安全
- 要 root 權限,直接 Hook 系統,能夠幹掉全部的 App。
- 無 root 權限,可是隻能 Hook 自身app,對系統其它 App 無能爲力。
插樁是以靜態的方式修改第三方的代碼,也就是從編譯階段,對源代碼(中間代碼)進行編譯,然後從新打包,是靜態的篡改; 而Hook則不須要再編譯階段修改第三方的源碼或中間代碼,是在運行時經過反射的方式修改調用,是一種動態的篡改服務器
3.Android的簽名機制?數據結構
參考回答:
Android的簽名機制包含有消息摘要、數字簽名和數字證書
- 消息摘要:在消息數據上,執行一個單向的 Hash 函數,生成一個固定長度的Hash值
- 數字簽名:一種以電子形式存儲消息簽名的方法,一個完整的數字簽名方案應該由兩部分組成:簽名算法和驗證算法
- 數字證書:一個經證書受權(Certificate Authentication)中心數字簽名的包含公鑰擁有者信息以及公鑰的文件
4.Android5.0~10.0之間大的變化
參考回答:
4.1.Android5.0新特性
- MaterialDesign設計風格
- 支持64位ART虛擬機(5.0推出的ART虛擬機,在5.0以前都是Dalvik。他們的區別是:Dalvik,每次運行,字節碼都須要經過即時編譯器轉換成機器碼(JIT)。 ART,第一次安裝應用的時候,字節碼就會預先編譯成機器碼(AOT))
- 通知詳情能夠用戶本身設計
4.2.Android6.0新特性
- 動態權限管理
- 支持快速充電的切換
- 支持文件夾拖拽應用
- 相機新增專業模式
4.3.Android7.0新特性
- 多窗口支持
- V2簽名
- 加強的Java8語言模式
- 夜間模式
4.4.Android8.0(O)新特性
- 優化通知:通知渠道 (Notification Channel) 通知標誌 休眠 通知超時 通知設置 通知清除
- 畫中畫模式:清單中Activity設置android:supportsPictureInPicture
- 後臺限制
- 自動填充框架
- 系統優化
- 等等優化不少
4.5.Android9.0(P)新特性
- 室內WIFI定位
- 「劉海」屏幕支持
- 安全加強
- 等等優化不少
4.6.Android10.0(Q)新特性
- 夜間模式:包括手機上的全部應用均可覺得其設置暗黑模式。
- 桌面模式:提供相似於PC的體驗,可是遠遠不能代替PC。
- 屏幕錄製:經過長按「電源」菜單中的"屏幕快照"來開啓。
5.說下Measurepec這個類
參考回答:
做用:經過寬測量值widthMeasureSpec和高測量值heightMeasureSpec決定View的大小
組成:一個32位int值,高2位表明SpecMode(測量模式),低30位表明SpecSize( 某種測量模式下的規格大小)。
三種模式:
- UNSPECIFIED:父容器不對View有任何限制,要多大有多大。經常使用於系統內部。
- EXACTLY(精確模式):父視圖爲子視圖指定一個確切的尺寸SpecSize。對應LyaoutParams中的match_parent或具體數值。
- AT_MOST(最大模式):父容器爲子視圖指定一個最大尺寸SpecSize,View的大小不能大於這個值。對應LayoutParams中的wrap_content。
決定因素:值由子View的佈局參數LayoutParams和父容器的MeasureSpec值共同決定。具體規則見下圖:
6.請例舉Android中經常使用佈局類型,並簡述其用法以及排版效率
參考回答:
Android中經常使用佈局分爲傳統佈局和新型佈局
- 對於嵌套多層View而言,其排版效率:LinearLayout = FrameLayout >> RelativeLayout
7.區別Animation和Animator的用法,概述其原理
參考回答:
- 動畫的種類:前者只有透明度,旋轉,平移,伸縮4種屬性,而對於後者,只要是該控件的屬性,且有setter該屬性的方法就均可以對該屬性執行一種動態變化的效果。
- 可操做的對象:前者只能對UI組件執行動畫,但屬性動畫幾乎能夠對任何對象執行動畫(無論它是否顯示在屏幕上)。
- 動畫播放順序:在Animator中,AnimatorSet正是經過playTogether()、playSequentially()、animSet.play().with()、before()、after()這些方法來控制多個動畫協同工做,從而作到對動畫播放順序的精確控制
8.使用過什麼圖片加載庫?Glide的源碼設計哪裏很微妙?
參考回答:
圖片加載庫:Fresco、Glide、Picasso等
Glide的設計微妙在於:
- Glide的生命週期綁定:能夠控制圖片的加載狀態與當前頁面的生命週期同步,使整個加載過程隨着頁面的狀態而啓動/恢復,中止,銷燬
- Glide的緩存設計:經過(三級緩存,Lru算法,Bitmap複用)對Resource進行緩存設計
- Glide的完整加載過程:採用Engine引擎類暴露了一系列方法供Request操做
9.如何繞過9.0限制?
參考回答:
10.對於應用更新這塊是如何作的? (灰度,強制更新、分區域更新)
參考回答:
10.1.內部更新:
- 經過接口獲取線上版本號,versionCode
- 比較線上的versionCode 和本地的versionCode,彈出更新窗口
- 下載APK文件(文件下載)
- 安裝APK
10.2.灰度更新:
- 找單一渠道投放特別版本。
- 作升級平臺的改造,容許針對部分用戶推送升級通知甚至版本強制升級。
- 開放單獨的下載入口。
- 是兩個版本的代碼都打到app包裏,而後在app端植入測試框架,用來控制顯示哪一個版本。測試框架負責與服務器端api通訊,由服務器端控制app上A/B版本的分佈,能夠實現指定的一組用戶看到A版本,其它用戶看到B版本。服務端會有相應的報表來顯示A/B版本的數量和效果對比。最後能夠由服務端的後臺來控制,所有用戶在線切換到A或者B版本~
- 不管哪一種方法都須要作好版本管理工做,分配特別的版本號以示區別。 固然,既然是作灰度,數據監控(常規數據、新特性數據、主要業務數據)仍是要作到位,該打的數據樁要打。 還有,灰度版最好有收回的能力,通常就是強制升級下一個正式版。
10.3.強制更新:
通常的處理就是進入應用就彈窗通知用戶有版本更新,彈窗能夠沒有取消按鈕並不能取消。這樣用戶就只能選擇更新或者關閉應用了,固然也能夠添加取消按鈕,可是若是用戶選擇取消則直接退出應用。
10.4.增量更新:
二進制差分工具bsdiff是相應的補丁合成工具,根據兩個不一樣版本的二進制文件,生成補丁文件.patch文件。經過bspatch使舊的apk文件與不定文件合成新的apk。 注意經過apk文件的md5值進行區分版本。
11.會用Kotlin、Fultter嗎? 談談你的理解
參考回答:
- Kotlin是一種具備類型推斷的跨平臺,靜態類型的通用編程語言。 Kotlin旨在與Java徹底互操做,其標準庫的JVM版本依賴於Java類庫,但類型推斷容許其語法更簡潔。
- Flutter是由Google建立的開源移動應用程序開發框架。它用於開發Android和iOS的應用程序,以及爲Google Fuchsia建立應用程序的主要方法
- 關於kotlin的重要性,相信你們在平常開發能夠體會到,應用到實際開發中,須要避免語法糖(例如單列模式、空值判斷、高階函數等)
- 至於Flutter,目前Google官方文檔還不完善,市面上採用此語言編寫的項目較少,如須要具體深刻,請參考官方文檔
Android中級面試題目彙總解答到此就結束了。想獲取更多Android方面的技術知識或者面試資料的能夠添加
QQ羣:925019412