前言
我們都知道面試大廠主要就是考察程序員技術方向的專業技能,JAVA開發主要考察的就是Java方面的專業技能,而Android崗位的專業技能就是Android程序員面試的重要考察方向。
大廠的招聘條件是明牌的,但技術這一塊卻難倒了大部分的人。
面試是測試一個人能力最直接的方式,從8月份開始兩個月陸陸續續面了10余家公司,下面就放上我遇到的所有面試題以及我的建議,并且提供一些簡歷的寫作和面試技巧給各位即將面試的同志們。
簡歷
基本信息
- 簡歷不要太花哨, 你是應聘的技術, 不是設計師
- 簡歷把一些基本信息要說清楚(無關的不要寫, 比如頭像之類的)
- 有個人博客, 跟 GitHub 的寫上, 若沒有內容那就別寫
- 應屆畢業生需寫上相關證書之類, 有經驗的可不寫
- 簡歷控制在兩頁以內
項目經驗
- 一般寫 2, 3個代表性的項目就好,優先寫本職工作相關的
- 時間順序建議為倒序
- 明確說明你在項目當中的職責以及發揮的作用
- 項目模塊需要了解大概邏輯與思路,以及一些關鍵的技術點,以防面試官問到
- 沒有項目經驗的也要模仿一兩個小 Demo
面試技巧
**須知**
- 自己親自做的東西一定要明白, 如果不是自己親自做的, 請慎重騙面試官
- 問的時候會問一些知識點相關的話題,比如你的數據是需要 api 交互的,那可能會問 http 相關, json 數據解析相關,緩存相關,圖片加載相關等
- 對用到的知識點雖用不著一定要看源碼的地步,但是最好要懂原理,比如圖片加載一定要知道二級緩存,一些常見的緩存算法
工資
不同的城市肯定工資水平不一樣的,這里僅以一線城市為例,而且不同的公司、個人能力的高低都會造成工資差異化,這里只是一個大概。
注意事項
- 去面試前一定要花點時間了解下你面試的這家公司(本身有自己產品的下載體驗一下,以防面試過程中問到,或者可以給產品提點意見)
- 面試的時候態度要謙虛點
- 學習能力很重要(一定要讓面試官感受到你是一個好學的人)
- 個人興趣(不要提什么打游戲, 唱歌之類的, 可以說一下業余時間提下自己經常上一些技術社區,看一些技術博客之類的)
- 除了基本的知識點, 面試官通常都會問一些比較深的領域(可能你沒有接觸過,但不要氣餒, 面試官在考察下你的技術的深度, 這些領域一般包括設計模式, 虛擬機, 插件化, React Native之類的)
面試題目
1.一般什么情況下會導致內存泄漏問題?如何解決
參考答案:
- 資源對象沒關閉造成的內存泄漏(如: Cursor、File等)
- Bitmap 對象不在使用時調用recycle()釋放內存
- 集合中對象沒清理造成的內存泄漏(特別是 static 修飾的集合)
- 接收器、監聽器注冊沒取消造成的內存泄漏
- Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
- Handler 造成的內存泄漏問題(一般由于 Handler 生命周期比其外部類的生命周期長引起的)
2.自定義 Handler 時如何有效地避免內存泄漏問題?
參考答案:
1.自定義的靜態handler 2.可以加一個弱引用 3.還有一個主意的就是當你activity被銷毀的時候如果還有消息沒有發出去 就remove掉吧
4.removecallbacksandmessages去清除Message和Runnable 加null 寫在生命周的ondestroy()就行
3.哪些情況下會導致OOM問題?如何解決?
參考答案:
1,過多的內存泄漏會導致內存溢出 2,加載大的圖片 3,創建過多的線程
內存優化的解決方法: 1.申請更大的內存,比如多進程、設置manifest中的largeHeap=true等。 2.減少內存使用 ①使用優化后的集合對象,分場景使用SpaseArray和HashMap; ②使用微信的mmkv替代sharedpreference; ③使用StringBuilder替代String拼接 ④統一帶有緩存的基礎庫,特別是圖片庫,如果用了兩套不一樣的圖片加載庫就會出現2個圖片各自維護一套圖片緩存 ⑤給ImageView設置合適尺寸的圖片,列表頁顯示縮略圖,查看大圖顯示原圖 ⑥優化業務架構設計,比如省市區數據分批加載,需要加載省就加載省,需要加載市就加載失去,避免一下子加載所有數據 3.避免內存泄漏
4.ANR 出現的場景以及解決方案?
參考答案:
場景: 1、觸摸無響應5s 2、BroadCastReciver 前臺處理超過10s 后臺超過60s 3、Server 前臺處理超過20s 后臺超過200s
ANR出現的類型有兩種 1、主線程耗時導致 2、CPU、內存、IO 占用過高資源耗盡(其他進程也可以導致)
如何避免: 1、不要在主線程中做耗時的操作 2、避免CPU占用過高,簡化方法,減少執行時間 3、避免內存占用過高,防止內存泄漏
5.談談 Android 中內存優化的方式?
參考答案:
關于內存泄漏,一般像單例模式的使用不當啊、集合的操作不當啊、資源的缺乏有效的回收機制啊、Handler、線程的使用不當等等都有可能引發內存泄漏。
- 單例模式引發的內存泄漏: 原因:單例模式里的靜態實例持有對象的引用,導致對象無法被回收,常見為持有Activity的引用 優化:改為持有Application的引用,或者不持有使用的時候傳遞。
- 集合操作不當引發的內存泄漏: 原因:集合只增不減 優化:有對應的刪除或卸載操作
- 線程的操作不當引發的內存泄漏: 原因:線程持有對象的引用在后臺執行,與對象的生命周期不一致 優化:靜態實例+弱引用(WeakReference)方式,使其生命周期一致
- 匿名內部類/非靜態內部類操作不當引發的內存泄漏: 原因:內部類持有對象引用,導致無法釋放,比如各種回調 優化:保持生命周期一致,改為靜態實例+對象的弱引用方式(WeakReference)
- 常用的資源未關閉回收引發的內存泄漏: 原因:BroadcastReceiver,File,Cursor,IO流,Bitmap等資源使用未關閉 優化:使用后有對應的關閉和卸載機制
- Handler使用不當造成的內存泄漏: 原因:Handler持有Activity的引用,其發送的Message中持有Handler的引用,當隊列處理Message的時間過長會導致Handler無法被回收 優化:靜態實例+弱引用(WeakReference)方式 內存溢出: 原因: 1.內存泄漏長時間的積累 2.業務操作使用超大內存 優化: 1.調整圖像大小后再放入內存、及時回收 2.不要過多的創建靜態變量

6.為什么巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術是什么呢?
參考答案:
- 1)空間冗余:圖像相鄰像素之間有較強的相關性
- 2)時間冗余:視頻序列的相鄰圖像之間內容相似
- 3)編碼冗余:不同像素值出現的概率不同
- 4)視覺冗余:人的視覺系統對某些細節不敏感
- 5)知識冗余:規律性的結構可由先驗知識和背景知識得到
7.怎么做到直播秒開優化?
參考答案:
- DNS 解析慢 為了有效降低 DNS 解析對首開的影響,我們可以提前完成播放域名->IP 地址的解析, 并緩存起來,播放的時候,直接傳入帶 IP 地址的播放地址,從而省去了 DNS 解析的耗時。 如果要支持用 IP 地址播放,是需要修改底層 ffmpeg 源碼的。
- 播放策略 很多側重點播的播放器,為了減少卡頓,會有一些緩沖策略,當緩沖足夠多的數據之后 ,再送入解碼播放。
而為了加快首開效果,需要對播放的緩沖策略做一些調整,如果第一幀還沒有渲染出來的情況下, 不要做任何緩沖,直接送入解碼器解碼播放,這樣就可以保證沒有任何因為「主動」緩沖帶來的首開延時。
- 播放參數設置 所有基于 ffmpeg 的播放器,都會遇到avformat_find_stream_info這個函數耗時比較久, 從而增大了首開時間,該函數主要作用是通過讀取一定字節的碼流數據, 來分析碼流的基本信息,如編碼信息、時長、碼率、幀率等等,它由兩個參數來控制其讀取的數據量大小和時長, 一個是 probesize,一個是 analyzeduration。
減少 probesize 和 analyzeduration 可以有效地減少avformat_find_stream_info的函數耗時, 從而加快首開,但是需要注意的是,設置地太小可能會導致讀取的數據量不足,從而無法解析出碼流信息,導致播放失敗, 或者出現只有音頻沒有視頻,只有視頻沒有音頻的問題。
- 服務端優化
- 服務器關鍵幀緩沖
- CDN最近策略
8.直方圖在圖像處理里面最重要的作用是什么?
參考答案:
- 灰度直方圖的定義:灰度級的函數,描述圖像中該灰度級的像素個數或該灰度級像素出現的頻率。反映了圖像灰度分布的情況。
- 灰度直方圖只能反映圖像的灰度分布情況,不能反映圖像像素的位置,即所有的空間信息全部丟失。
- 直方圖的應用:
- a.數字化參數:判斷一幅圖像是否合理的利用了全部被允許的灰度級范圍。一般一幅圖應該利用全部或幾乎全部可能的灰度級,否則等于增加了量化間隔,丟失的信息將不能恢復。
- b.邊界閾值選取(確定圖像二值化的閾值):假定某圖像的灰度直方圖具有二峰性,則表明這個圖像的較亮區域和較暗區域可以很好地分離,以這一點為閾值點,可以得到很好地2值處理效果(區分物體與背景)。
- c.當物體部分的灰度值比其他部分的灰度值大時,可利用直方圖統計圖像中物體的面積。
- d.計算圖像的信息量H。
9.說一說ffmpeg的數據結構?
參考答案:
ffmpeg的數據結構可以分為以下幾類:

- (1)解協議(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協議的類型以及狀態。 URLProtocol存儲輸入音視頻使用的封裝格式。每種協議都對應一個URLProtocol結構。(注意:FFMPEG中文件也被當做一種協議“file”)
- (2)解封裝(flv,avi,rmvb,mp4) AVFormatContext主要存儲視音頻封裝格式中包含的信息 ffmpeg支持各種各樣的音視頻輸入和輸出文件格式(例如FLV, MKV, MP4, AVI),而 AVInputFormat和AVOutputFormat 結構體則保存了這些格式的信息和一些常規設置。
- (3)解碼(h264,mpeg2,aac,mp3) AVStream是存儲每一個視頻/音頻流信息的結構體。 AVCodecContext: 編解碼器上下文結構體,存儲該視頻/音頻流使用解碼方式的相關數據。 AVCodec: 每種視頻(音頻)編解碼器(例如H.264解碼器)對應一 個該結構體。
三者的關系如下圖:

- (4)存數據 對于視頻,每個結構一般是存一幀;音頻可能有好幾幀
- 解碼前數據:AVPacket
- 解碼后數據:AVFrame
10.數字圖像濾波有哪些方法?
參考答案:
均值濾波(鄰域平均法)、中值濾波(消除獨立的噪聲點)、高斯濾波(線性平滑濾波,消除高斯噪聲,對整幅圖像進行加權平均,每一個像素點的值都由其本身和鄰域內的其他像素值經過加權平均后得到)、KNN濾波、高通濾波、低通濾波等。