天天看點

面試位元組跳動Android研發崗,已拿到offer,這些知識點該放出來了

目錄:

1.Android基礎

2.網絡

3.Java 基礎&資料結構&設計模式

4.Android 性能優化&Framework

5.Android 子產品化&熱修複&熱更新&打包&混淆&壓縮

6.音視訊&FFmpeg&播放器

7.項目&HR

面試位元組跳動Android研發崗,已拿到offer,這些知識點該放出來了

1、什麼是ANR 如何避免它?

答:在Android 上,如果你的應用程式有一段時間響應不夠靈敏,系統會向使用者顯示一個對話框,這個對話框稱作應用程式無響應(ANR:Application Not Responding)對話框。使用者可以選擇讓程式繼續運作,但是,他們在使用你的應用程式時,并不希望每次都要處理這個對話框。是以,在程式裡對響應性能的設計很重要,這樣,系統不會顯示ANR 給使用者。不同的元件發生ANR 的時間不一樣,主線程(Activity、Service)是5 秒,BroadCastReceiver 是10 秒。解決方案:将所有耗時操作,比如通路網絡,Socket 通信,查詢大量SQL 語句,複雜邏輯計算等都放在子線程中去,然後通過handler.sendMessage、runonUITread、AsyncTask 等方式更新UI。無論如何都要確定使用者界面操作的流暢度。如果耗時操作需要讓使用者等待,那麼可以在界面上顯示進度條。

2、View的繪制流程;自定義View如何考慮機型适配;自定義View的事件3、分發機制;View和ViewGroup分别有哪些事件分發相關的回調方法;自定義View如何提供擷取View屬性的接口;

3、Art和Dalvik對比;虛拟機原理,如何自己設計一個虛拟機(記憶體管理,類加載,雙親委派);JVM記憶體模型及類加載機制;記憶體對象的循環引用及避免;

4、ddms 和 traceView;

5、記憶體回收機制與GC算法(各種算法的優缺點以及應用場景);GC原理時機以及GC對象;記憶體洩露場景及解決方法;

6、四大元件及生命周期;ContentProvider的權限管理(讀寫分離,權限控制-精确到表級,URL控制);Activity的四種啟動模式對比;Activity狀态儲存于恢複;

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

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

9、Fragment生命周期;Fragment狀态儲存startActivityForResult是哪個類的方法,在什麼情況下使用,如果在Adapter中使用應該如何解耦;

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

11、Activity 怎麼和Service 綁定,怎麼在Activity 中啟動自己對應的Service;

12、請描述一下Service 的生命周期;

13、AstncTask+HttpClient與AsyncHttpClient有什麼差別;

14、如何保證一個背景服務不被殺死;比較省電的方式是什麼;

15、如何通過廣播攔截和abort一條短信;廣播是否可以請求網絡;廣播引起anr的時間限制;

16、程序間通信,AIDL;

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

18、說說ContentProvider、ContentResolver、ContentObserver 之間的關系;

19、請介紹下ContentProvider 是如何實作資料共享的;

20、Handler機制及底層實作;

21、Binder機制及底層實作;

22、ListView 中圖檔錯位的問題是如何産生的;

23、在manifest 和代碼中如何注冊和使用BroadcastReceiver;

24、說說Activity、Intent、Service 是什麼關系;

25、ApplicationContext和ActivityContext的差別;

26、一張Bitmap所占記憶體以及記憶體占用的計算;

27、Serializable 和Parcelable 的差別;

28、請描述一下BroadcastReceiver;

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

30、請介紹一下NDK;

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

32、AsyncTask 如何使用;

33、對于應用更新這塊是如何做的?(灰階,強制更新,分區域更新);

34、混合開發,RN,weex,H5,小程式(做Android的了解一些前端js等還是很有好處的);

35、什麼情況下會導緻記憶體洩露;

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

37、說一款你認為目前比較火的應用并設計(直播APP);

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

39、螢幕适配的處理技巧都有哪些;

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

答:一般情況下比如說有兩個activity,分别叫A,B,當在A 裡面激活B 元件的時候, A 會調用onPause()方法,然後B 調用onCreate() ,onStart(), onResume()。

這個時候B 覆寫了窗體, A 會調用onStop()方法. 如果B 是個透明的,或者是對話框的樣式, 就不會調用A 的

onStop()方法。

網絡協定模型

應用層:負責處理特定的應用程式細節 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基礎&資料結構&設計模式

1、集合類以及集合架構;HashMap與HashTable實作原理,線程安全性,hash沖突及處理算法;ConcurrentHashMap;

2、程序和線程的差別;

3、Java的并發、多線程、線程模型;

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

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

5、資料一緻性如何保證;Synchronized關鍵字,類鎖,方法鎖,重入鎖;

6、Java中實作多态的機制是什麼;

7、如何将一個Java對象序列化到檔案裡;

8、說說你對Java反射的了解;

答:Java 中的反射首先是能夠擷取到Java 中要反射類的位元組碼, 擷取位元組碼有三種方法,

1.Class.forName(className)

2.類名.class

3.this.getClass()。

然後将位元組碼中的方法,變量,構造函數等映射成相應的Method、Filed、Constructor 等類,這些類提供了豐富的方法可以被我們所使用。

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

5、在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 标記的變量可以被編譯器優化

6、伺服器隻提供資料接收接口,在多線程或多程序條件下,如何保證資料的有序到達;

7、ThreadLocal原理,實作及如何保證Local屬性;

8、String StringBuilder StringBuffer對比;

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

答:Java 中一般認為有23 種設計模式,我們不需要所有的都會,但是其中常用的幾種設計模式應該去掌握。下面列出了所有的設計模式。需要掌握的設計模式我單獨列出來了,當然能掌握的越多越好。

總體來說設計模式分為三大類:

建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

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

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

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

13、抽象類與接口的差別;應用場景;抽象類是否可以沒有方法和屬性;

14、靜态屬性和靜态方法是否可以被繼承?是否可以被重寫?以及原因?

15、修改對象A的equals方法的簽名,那麼使用HashMap存放這個對象執行個體的時候,會調用哪個equals方法;

16、說說你對泛型的了解;

17、Java的異常體系;

18、如何控制某個方法允許并發通路線程的個數;

19、動态代理的差別,什麼場景使用;

資料結構與算法

1、堆和棧在記憶體中的差別是什麼(資料結構方面以及實際實作方面);

2、最快的排序算法是哪個?給阿裡2萬多名員工按年齡排序應該選擇哪個算法?堆和樹的差別;寫出快排代碼;連結清單逆序代碼;

3、求1000以内的水仙花數以及40億以内的水仙花數;

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

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

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

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

8、百度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 場景及規避

  • 加載大圖:減小圖檔
  • 記憶體洩漏:規避記憶體洩漏

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 的映射關系

FFmpeg

基于指令方式實作了一個音視訊編輯 App:

https://github.com/yhaolpz/FFmpegCmd

內建編譯了 AAC、MP3、H264 編碼器

播放器原理

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

音視訊同步:

  • 選擇參考時鐘源:音頻時間戳、視訊時間戳和外部時間三者選擇一個作為參考時鐘源(一般選擇音頻,因為人對音頻更敏感,ijk 預設也是音頻)
  • 通過等待或丢幀将視訊流與參考時鐘源對齊,實作同步

IjkPlayer 原理

內建了 MediaPlayer、ExoPlayer 和 IjkPlayer 三種實作,其中 IjkPlayer 基于 FFmpeg 的 ffplay

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

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章 熱門前沿知識相關面試問題

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