面試阿里Android研發崗,已拿到offer,這些知識點該放出來了

目錄:

1.Android基礎前端

2.網絡java

3.Java 基礎&數據結構&設計模式c++

4.Android 性能優化&Frameworkgit

5.Android 模塊化&熱修復&熱更新&打包&混淆&壓縮程序員

6.音視頻&FFmpeg&播放器github

7.項目&HR面試

1.Android基礎

一、什麼是ANR 如何避免它?算法

答:在Android 上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR 給用戶。不一樣的組件發生ANR 的時間不同,主線程(Activity、Service)是5 秒,BroadCastReceiver 是10 秒。解決方案:將全部耗時操做,好比訪問網絡,Socket 通訊,查詢大量SQL 語句,複雜邏輯計算等都放在子線程中去,而後經過handler.sendMessage、runonUITread、AsyncTask 等方式更新UI。不管如何都要確保用戶界面操做的流暢度。若是耗時操做須要讓用戶等待,那麼能夠在界面上顯示進度條。json

二、View的繪製流程;自定義View如何考慮機型適配;自定義View的事件三、分發機制;View和ViewGroup分別有哪些事件分發相關的回調方法;自定義View如何提供獲取View屬性的接口;小程序

三、Art和Dalvik對比;虛擬機原理,如何本身設計一個虛擬機(內存管理,類加載,雙親委派);JVM內存模型及類加載機制;內存對象的循環引用及避免;

四、ddms 和 traceView;

五、內存回收機制與GC算法(各類算法的優缺點以及應用場景);GC原理時機以及GC對象;內存泄露場景及解決方法;

六、四大組件及生命週期;ContentProvider的權限管理(讀寫分離,權限控制-精確到表級,URL控制);Activity的四種啓動模式對比;Activity狀態保存於恢復;

七、什麼是AIDL 以及如何使用;

八、請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關係;

九、Fragment生命週期;Fragment狀態保存startActivityForResult是哪一個類的方法,在什麼狀況下使用,若是在Adapter中使用應該如何解耦;

十、AsyncTask原理及不足;ntentService原理;

十一、Activity 怎麼和Service 綁定,怎麼在Activity 中啓動本身對應的Service;

十二、請描述一下Service 的生命週期;

1三、AstncTask+HttpClient與AsyncHttpClient有什麼區別;

1四、如何保證一個後臺服務不被殺死;比較省電的方式是什麼;

1五、如何經過廣播攔截和abort一條短信;廣播是否能夠請求網絡;廣播引發anr的時間限制;

1六、進程間通訊,AIDL;

1七、事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?

1八、說說ContentProvider、ContentResolver、ContentObserver 之間的關係;

19**、**請介紹下ContentProvider 是如何實現數據共享的;

20、Handler機制及底層實現;

2一、Binder機制及底層實現;

2二、ListView 中圖片錯位的問題是如何產生的;

2三、在manifest 和代碼中如何註冊和使用BroadcastReceiver;

2四、說說Activity、Intent、Service 是什麼關係;

2五、ApplicationContext和ActivityContext的區別;

2六、一張Bitmap所佔內存以及內存佔用的計算;

2七、Serializable 和Parcelable 的區別;

2八、請描述一下BroadcastReceiver;

2九、請描述一下Android 的事件分發機制;

30、請介紹一下NDK;

3一、什麼是NDK庫,如何在jni中註冊native函數,有幾種註冊方式;

3二、AsyncTask 如何使用;

3三、對於應用更新這塊是如何作的?(灰度,強制更新,分區域更新);

3四、混合開發,RN,weex,H5,小程序(作Android的瞭解一些前端js等仍是頗有好處的);

3五、什麼狀況下會致使內存泄露;

3六、如何對Android 應用進行性能分析以及優化;

3七、說一款你認爲當前比較火的應用並設計(直播APP);

3八、OOM的避免異常及解決方法;

3九、屏幕適配的處理技巧都有哪些;

40、兩個Activity 之間跳轉時必然會執行的是哪幾個方法?

答:通常狀況下好比說有兩個activity,分別叫A,B,當在A 裏面激活B 組件的時候, A 會調用onPause()方法,而後B 調用onCreate() ,onStart(), onResume()。
這個時候B 覆蓋了窗體, A 會調用onStop()方法. 若是B 是個透明的,或者是對話框的樣式, 就不會調用A 的
onStop()方法。

2.網絡

網絡協議模型

應用層:負責處理特定的應用程序細節 HTTP、FTP、DNS

傳輸層:爲兩臺主機提供端到端的基礎通訊 TCP、UDP

網絡層:控制分組傳輸、路由選擇等 IP

鏈路層:操做系統設備驅動程序、網卡相關接口

TCP 和 UDP 區別

TCP 鏈接;可靠;有序;面向字節流;速度慢;較重量;全雙工;適用於文件傳輸、瀏覽器等

  • 全雙工:A 給 B 發消息的同時,B 也能給 A 發
  • 半雙工:A 給 B 發消息的同時,B 不能給 A 發

UDP 無鏈接;不可靠;無序;面向報文;速度快;輕量;適用於即時通信、視頻通話等

TCP 三次握手

A:你能聽到嗎? B:我能聽到,你能聽到嗎? A:我能聽到,開始吧

A 和 B 兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。因此須要三次握手

TCP 四次揮手

A:我說完了 B:我知道了,等一下,我可能還沒說完 B:我也說完了 A:我知道了,結束吧

B 收到 A 結束的消息後 B 可能還沒說完,無法當即回覆結束標示,只能等說完後再告訴 A :我說完了。

POST 和 GET 區別

Get 參數放在 url 中;Post 參數放在 request Body 中 Get 可能不安全,由於參數放在 url 中

HTTPS

HTTP 是超文本傳輸協議,明文傳輸;HTTPS 使用 SSL 協議對 HTTP 傳輸數據進行了加密

HTTP 默認 80 端口;HTTPS 默認 443 端口

優勢:安全 缺點:費時、SSL 證書收費,加密能力仍是有限的,可是比 HTTP 強多了

3.Java基礎&數據結構&設計模式

一、集合類以及集合框架;HashMap與HashTable實現原理,線程安全性,hash衝突及處理算法;ConcurrentHashMap;

二、進程和線程的區別;

三、Java的併發、多線程、線程模型;

四、什麼是線程池,如何使用?

答:線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用new 線程而是直接去池中拿線程便可,節省了開闢子線程的時間,提升的代碼執行效率。

五、數據一致性如何保證;Synchronized關鍵字,類鎖,方法鎖,重入鎖;

六、Java中實現多態的機制是什麼;

七、如何將一個Java對象序列化到文件裏;

八、說說你對Java反射的理解;

答:Java 中的反射首先是可以獲取到Java 中要反射類的字節碼, 獲取字節碼有三種方法,
1.Class.forName(className)

2.類名.class

3.this.getClass()。

而後將字節碼中的方法,變量,構造函數等映射成相應的Method、Filed、Constructor 等類,這些類提供了豐富的方法能夠被咱們所使用。

四、同步的方法;多進程開發以及多進程應用場景;

五、在Java中wait和seelp方法的不一樣;

答:最大的不一樣是在等待時wait 會釋放鎖,而sleep 一直持有鎖。wait 一般被用於線程間交互,sleep 一般被用於暫停執行。

synchronized 和volatile 關鍵字的做用;

答:1)保證了不一樣線程對這個變量進行操做時的可見性,即一個線程修改了某個變量的值,這新值對其餘線程來講是當即可見的。

2)禁止進行指令重排序。

volatile 本質是在告訴jvm 當前變量在寄存器(工做內存)中的值是不肯定的,須要從主存中讀取;synchronized 則是鎖定當前變量,只有當前線程能夠訪問該變量,其餘線程被阻塞住。
1.volatile 僅能使用在變量級別;synchronized 則可使用在變量、方法、和類級別的
2.volatile 僅能實現變量的修改可見性,並不能保證原子性;synchronized 則能夠保證變量的修改可見性和原子性
3.volatile 不會形成線程的阻塞;synchronized 可能會形成線程的阻塞。
4.volatile 標記的變量不會被編譯器優化;synchronized 標記的變量能夠被編譯器優化

六、服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達;

七、ThreadLocal原理,實現及如何保證Local屬性;

八、String StringBuilder StringBuffer對比;

九、你所知道的設計模式有哪些;

答:Java 中通常認爲有23 種設計模式,咱們不須要全部的都會,可是其中經常使用的幾種設計模式應該去掌握。下面列出了全部的設計模式。須要掌握的設計模式我單獨列出來了,固然能掌握的越多越好。
整體來講設計模式分爲三大類:
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

十、Java如何調用c、c++語言;

十一、接口與回調;回調的原理;寫一個回調demo;

十二、泛型原理,舉例說明;解析與分派;

1三、抽象類與接口的區別;應用場景;抽象類是否能夠沒有方法和屬性;

1四、靜態屬性和靜態方法是否能夠被繼承?是否能夠被重寫?以及緣由?

1五、修改對象A的equals方法的簽名,那麼使用HashMap存放這個對象實例的時候,會調用哪一個equals方法;

1六、說說你對泛型的瞭解;

1七、Java的異常體系;

1八、如何控制某個方法容許併發訪問線程的個數;

1九、動態代理的區別,什麼場景使用;

數據結構與算法

一、堆和棧在內存中的區別是什麼(數據結構方面以及實際實現方面);

二、最快的排序算法是哪一個?給阿里2萬多名員工按年齡排序應該選擇哪一個算法?堆和樹的區別;寫出快排代碼;鏈表逆序代碼;

三、求1000之內的水仙花數以及40億之內的水仙花數;

四、子串包含問題(KMP 算法)寫代碼實現;

五、萬億級別的兩個URL文件A和B,如何求出A和B的差集C,(Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應用層面對尋址的優化)

6蟻羣算法與蒙特卡洛算法;

七、寫出你所知道的排序算法及時空複雜度,穩定性;

八、百度POI中如何試下查找最近的商家功能(座標鏡像+R樹)。

4.Android性能優化&Framwork

Activity 啓動模式

  • standard 標準模式
  • singleTop 棧頂複用模式, 推送點擊消息界面
  • singleTask 棧內複用模式, 首頁
  • singleInstance 單例模式,單獨位於一個任務棧中 撥打電話界面
    細節: taskAffinity:任務相關性,用於指定任務棧名稱,默認爲應用包名 allowTaskReparenting:容許轉移任務棧

View 工做原理

  • DecorView (FrameLayout) LinearLayout titlebar Content 調用 setContentView 設置的 View

ViewRoot 的 performTraversals 方法調用觸發開始 View 的繪製,而後會依次調用:

  • performMeasure:遍歷 View 的 measure 測量尺寸
  • performLayout:遍歷 View 的 layout 肯定位置
  • performDraw:遍歷 View 的 draw 繪製

事件分發機制

  • 一個 MotionEvent 產生後,按 Activity -> Window -> decorView -> View 順序傳遞,View 傳遞過程就是事件分發,主要依賴三個方法:
  • dispatchTouchEvent:用於分發事件,只要接受到點擊事件就會被調用,返回結果表示是否消耗了當前事件
  • onInterceptTouchEvent:用於判斷是否攔截事件,當 ViewGroup 肯定要攔截事件後,該事件序列都不會再觸發調用此 ViewGroup 的 onIntercept
  • onTouchEvent:用於處理事件,返回結果表示是否處理了當前事件,未處理則傳遞給父容器處理
  • 細節: 一個事件序列只能被一個 View 攔截且消耗 View 沒有 onIntercept 方法,直接調用 onTouchEvent 處理 OnTouchListener 優先級比 OnTouchEvent 高,onClickListener 優先級最低 requestDisallowInterceptTouchEvent 能夠屏蔽父容器 onIntercet 方法的調用

Window 、 WindowManager、WMS、SurfaceFlinger

  • Window:抽象概念不是實際存在的,而是以 View 的形式存在,經過 PhoneWindow 實現
  • WindowManager:外界訪問 Window 的入口,內部與 WMS 交互是個 IPC 過程
  • WMS:管理窗口 Surface 的佈局和次序,做爲系統級服務單獨運行在一個進程
  • SurfaceFlinger:將 WMS 維護的窗口按必定次序混合後顯示到屏幕上

View 動畫、幀動畫及屬性動畫

View 動畫:

  • 做用對象是 View,可用 xml 定義,建議 xml 實現比較易讀
  • 支持四種效果:平移、縮放、旋轉、透明度

幀動畫:

  • 經過 AnimationDrawable 實現,容易 OOM

屬性動畫:

  • 可做用於任何對象,可用 xml 定義,Android 3 引入,建議代碼實現比較靈活
  • 包括 ObjectAnimator、ValuetAnimator、AnimatorSet
  • 時間插值器:根據時間流逝的百分比計算當前屬性改變的百分比
  • 系統預置勻速、加速、減速等插值器
  • 類型估值器:根據當前屬性改變的百分比計算改變後的屬性值
  • 系統預置整型、浮點、色值等類型估值器
  • 使用注意事項:
  • 避免使用幀動畫,容易OOM
  • 界面銷燬時中止動畫,避免內存泄漏
  • 開啓硬件加速,提升動畫流暢性 ,硬件加速:
  • 將 cpu 一部分工做分擔給 gpu ,使用 gpu 完成繪製工做
  • 從工做分攤和繪製機制兩個方面優化了繪製速度

Handler、MessageQueue、Looper

  • Handler:開發直接接觸的類,內部持有 MessageQueue 和 Looper
  • MessageQueue:消息隊列,內部經過單鏈表存儲消息
  • Looper:內部持有 MessageQueue,循環查看是否有新消息,有就處理,沒就阻塞
  • 如何實現阻塞:經過 nativePollOnce 方法,基於 Linux epoll 事件管理機制
  • 爲何主線程不會由於 Looper 阻塞:系統每 16ms 會發送一個刷新 UI 消息喚醒

MVC、MVP、MVVM

  • MVP:Model:處理數據;View:控制視圖;Presenter:分離 Activity 和 Model
  • MVVM:Model:處理獲取保存數據;View:控制視圖;ViewModel:數據容器 使用 Jetpack 組件架構的 LiveData、ViewModel 便捷實現 MVVM

Serializable、Parcelable

  • Serializable :Java 序列化方式,適用於存儲和網絡傳輸,serialVersionUID 用於肯定反序列化和類版本是否一致,不一致時反序列化回失敗
  • Parcelable :Android 序列化方式,適用於組件通訊數據傳遞,性能高,由於不像 Serializable 同樣有大量反射操做,頻繁 GC

Binder

  • Android 進程間通訊的中流砥柱,基於客戶端-服務端通訊方式
  • 使用 mmap 一次數據拷貝實現 IPC,傳統 IPC:用戶A空間->內核->用戶B空間;mmap 將內核與用戶B空間映射,實現直接從用戶A空間->用戶B空間
  • BinderPool 可避免建立多 Service

IPC 方式

  • Intent extras、Bundle:要求傳遞數據能被序列化,實現 Parcelable、Serializable ,適用於四大組件通訊
  • 文件共享:適用於交換簡單的數據實時性不高的場景
  • AIDL:AIDL 接口實質上是系統提供給咱們能夠方便實現 BInder 的工具 Android Interface Definition Language,可實現跨進程調用方法 服務端:將暴漏給客戶端的接口聲明在 AIDL 文件中,建立 Service 實現 AIDL 接口並監聽客戶端鏈接請求 客戶端:綁定服務端 Service ,綁定成功後拿到服務端 Binder 對象轉爲 AIDL 接口調用 RemoteCallbackList 實現跨進程接口監聽,同個 Binder 對象作 key 存儲客戶端註冊的 listener 監聽 Binder 斷開:1.Binder.linkToDeath 設置死亡代理;2. onServiceDisconnected 回調
  • Messenger:基於 AIDL 實現,服務端串行處理,主要用於傳遞消息,適用於低併發一對多通訊
  • ContentProvider:基於 Binder 實現,適用於一對多進程間數據共享
  • Socket:TCP、UDP,適用於網絡數據交換

Android 系統啓動流程

  • 按電源鍵 -> 加載引導程序 BootLoader 到 RAM -> 執行 BootLoader 程序啓動內核 -> 啓動 init 進程 -> 啓動 Zygote 和各類守護進程 ->
  • 啓動 System Server 服務進程開啓 AMS、WMS 等 -> 啓動 Launcher 應用進程

App 啓動流程

Launcher 中點擊一個應用圖標 -> 經過 AMS 查找應用進程,若不存在就經過 Zygote 進程 fork

進程保活

  • 進程優先級:1.前臺進程 ;2.可見進程;3.服務進程;4.後臺進程;5.空進程
  • 進程被 kill 場景:1.切到後臺內存不足時被殺;2.切到後臺廠商省電機制殺死;3.用戶主動清理
  • 保活方式: 1.Activity 提權:掛一個 1像素 Activity 將進程優先級提升到前臺進程 2.Service 提權:啓動一個前臺服務(API>18會有正在運行通知欄) 3.廣播拉活 4.Service 拉活 5.JobScheduler 定時任務拉活 6.雙進程拉活

網絡優化及檢測

  • 速度:1.GZIP 壓縮(okhttp 自動支持);2.Protocol Buffer 替代 json;3.優化圖片/文件流量;4.IP 直連省去 DNS 解析時間
  • 成功率:1.失敗重試策略;
  • 流量:1.GZIP 壓縮(okhttp 自動支持);2.Protocol Buffer 替代 json;3.優化圖片/文件流量;5.文件下載斷點續傳 ;6.緩存
  • 協議層的優化,好比更優的 http 版本等
  • 監控:Charles 抓包、Network Monitor 監控流量

UI卡頓優化

  • 減小布局層級及控件複雜度,避免過分繪製
  • 使用 include、merge、viewstub
  • 優化繪製過程,避免在 Draw 中頻繁建立對象、作耗時操做

內存泄漏場景及規避

1.靜態變量、單例強引跟生命週期相關的數據或資源,包括 EventBus 2.遊標、IO 流等資源忘記主動釋放 3.界面相關動畫在界面銷燬時及時暫停 4.內部類持有外部類引用致使的內存泄漏

  • handler 內部類內存泄漏規避:1.使用靜態內部類+弱引用 2.界面銷燬時清空消息隊列
  • 檢測:Android Studio Profiler

LeakCanary 原理

  • 經過弱引用和引用隊列監控對象是否被回收
  • 好比 Activity 銷燬時開始監控此對象,檢測到未被回收則主動 gc ,而後繼續監控

OOM 場景及規避

  • 加載大圖:減少圖片
  • 內存泄漏:規避內存泄漏

5.Android 模塊化&熱修復&熱更新&打包&混淆&壓縮

Dalvik 和 ART

  • Dalvik 谷歌設計專用於 Android 平臺的 Java 虛擬機,可直接運行 .dex 文件,適合內存和處理速度有限的系統 JVM 指令集是基於棧的;Dalvik 指令集是基於寄存器的,代碼執行效率更優
  • ART Dalvik 每次運行都要將字節碼轉換成機器碼;ART 在應用安裝時就會轉換成機器碼,執行速度更快 ART 存儲機器碼佔用空間更大,空間換時間

APK 打包流程

1.aapt 打包資源文件生成 R.java 文件;aidl 生成 java 文件 2.將 java 文件編譯爲 class 文件 3.將工程及第三方的 class 文件轉換成 dex 文件 4.將 dex 文件、so、編譯過的資源、原始資源等打包成 apk 文件 5.簽名 6.資源文件對齊,減小運行時內存

App 安裝過程

  • 首先要解壓 APK,資源、so等放到應用目錄
  • Dalvik 會將 dex 處理成 ODEX ;ART 會將 dex 處理成 OAT;
  • OAT 包含 dex 和安裝時編譯的機器碼

組件化路由實現

ARoute:經過 APT 解析 @Route 等註解,結合 JavaPoet 生成路由表,即路由與 Activity 的映射關係

6.音視頻&FFmpeg&播放器

FFmpeg

基於命令方式實現了一個音視頻編輯 App: https://github.com/yhaolpz/FFmpegCmd

集成編譯了 AAC、MP三、H264 編碼器

播放器原理

視頻播放原理:(mp四、flv)-> 解封裝 -> (mp3/aac、h264/h265)-> 解碼 -> (pcm、yuv)-> 音視頻同步 -> 渲染播放

音視頻同步:

  • 選擇參考時鐘源:音頻時間戳、視頻時間戳和外部時間三者選擇一個做爲參考時鐘源(通常選擇音頻,由於人對音頻更敏感,ijk 默認也是音頻)
  • 經過等待或丟幀將視頻流與參考時鐘源對齊,實現同步

IjkPlayer 原理

集成了 MediaPlayer、ExoPlayer 和 IjkPlayer 三種實現,其中 IjkPlayer 基於 FFmpeg 的 ffplay

音頻輸出方式:AudioTrack、OpenSL ES;視頻輸出方式:NativeWindow、OpenGL ES

 

7.項目&HR

1. 項目開發中遇到的最大的一個難題和挑戰,你是如何解決的。(95% 會問到)

2. 說說你開發最大的優點點(95% 會問到)

3. 你爲何會離開上家公司

4. 你的缺點是什麼?

5. 你能給公司帶來什麼效益?

6. 你對將來的職業規劃?

文末

對於程序員來講,要學習的知識內容、技術有太多太多,要想不被環境淘汰就只有不斷提高本身,歷來都是咱們去適應環境,而不是環境來適應咱們!

近期咱們蒐集了 N 套阿里、騰訊、美團、網易等公司 19 年的面試題,把技術點梳理成一份大而全的「Android高級工程師」面試題庫(實際上比預期多花了很多精力),包含標準答案解析,因爲篇幅有限,這裏以圖片的形式給你們展現一部分。

這份資料尤爲適合:

1.近期想跳槽,要面試的Android程序員,查漏補缺,以便儘快彌補短板;

2.想了解「一線互聯網公司」最新技術要求,對比找出自身的長處和弱點所在,評估本身在現有市場上的競爭力如何;

3.作了幾年Android開發,但還沒造成系統的Android知識體系,缺少清晰的提高方向和學習路徑的程序員。

相信它會給你們帶來不少收穫。++++維信,(壹叄貳零叄壹陸叄陸零玖)就能夠免費領取了

除面試資料外,這裏還整理了一份最近剛錄製的視頻——BAT大牛解密Android面試,對於面試,是個不錯的補充。

視頻圍繞「BAT大牛解密Android面試?」的主題,內容由淺入深,同時,對於開源框架相關面試問題也做出重點解讀。

視頻具體內容以下:

  • 第1章 課程介紹
  • 第2章 一線互聯網公司初中高Android開發工程師的技能要求
  • 第3章 Android基礎相關面試題
  • 第4章 異步消息處理機制相關面試問題
  • 第5章 View相關面試問題
  • 第6章 Android項目構建相關面試問題
  • 第7章 開源框架相關面試問題
  • 第8章 Android異常與性能優化相關面試問題
  • 第9章 熱門前沿知識相關面試問題

須要獲取更全面的面試資料,或專題視頻,++++維信:(壹叄貳零叄壹陸叄陸零玖)。前往免費領取!

相關文章
相關標籤/搜索