Android 面試經(jīng)驗(yàn) - 大廠 騰訊 面

寫在前面

那天剛好是下午 oppo hr 面完,大約 3 點(diǎn)左右騰訊來電,我在電梯里沒太注意沒接到電話,下午就一直盼呀盼,大約九點(diǎn)剛下班到公司樓下來電了,問方不方便我當(dāng)然說方便,就在馬路邊上面了大約 50 來分鐘,我感覺應(yīng)該是掛了的,因?yàn)檫^程中電話老是斷加上環(huán)境又比較吵,第二天問獵頭說,下班前查了一下同一批面試的都釋放了,你應(yīng)該是過了只說是應(yīng)該過了。過了整整一周到了隔周五上午,接到了第二面的面試通知,約的是隔周三上午 10:30 。第二面面試官時不時的面帶笑容,給人很輕松的感覺。二面完后要我稍等一下接著面三面,三面面完面試官問我下午還有事沒?我們***(應(yīng)該是領(lǐng)導(dǎo))有點(diǎn)事,下午四點(diǎn)左右可以面第四面,具體我也沒聽清楚是誰我也不敢問。我說下午要上班就先回去了,下午接到 hr 電話約的是隔周二的上午??偣参遢喢嬖嚭?hr 面,持續(xù)周期一個月左右。

技術(shù)一面

  1. mmap + native 日志優(yōu)化?
    講了傳統(tǒng)日志打印的兩個性能問題,一個是反復(fù)操作文件描述符表,一個是反復(fù)進(jìn)入內(nèi)核態(tài),然后講了 mmap 的原理機(jī)制。

  2. 廣播和 EventBus 的區(qū)別?
    說 EventBus 的實(shí)現(xiàn)原理是基于反射,里面管理了兩張表,且代碼之間關(guān)聯(lián)性不大不易于維護(hù),EventBus 不支持跨進(jìn)程通信,被面試官反問你確定不支持跨進(jìn)程?我說我的看的源碼是不支持,面試官說那好吧。

  3. 常用設(shè)計(jì)模式你了解哪些?
    我開始巴拉巴拉說了一大堆,其中說到了裝飾設(shè)計(jì)模式,被面試官打斷了,請你具體說說裝飾設(shè)計(jì)模式。

  4. 跨進(jìn)程通信有哪些?
    管道,信號,信號量,文件,本地套接字,共享內(nèi)存,binder 驅(qū)動

  5. 簡單講講 binder 驅(qū)動吧?
    從 Java 層來看就像訪問本地接口一樣,客戶端基于 BinderProxy 服務(wù)端基于 IBinder 對象,從 native 層來看來看客戶端基于 BpBinder 到 ICPThreadState 到 binder 驅(qū)動,服務(wù)端由 binder 驅(qū)動喚醒 IPCThreadSate 到 BbBinder 。然后又講了虛擬內(nèi)存、物理內(nèi)存和內(nèi)存映射,跨進(jìn)程通信的原理是要基于內(nèi)核的, 當(dāng)我講到 binder_open 、binder_mmap 和 binder_ioctl 是被面試官打斷了,估計(jì)是怕我講太久了。

  6. 跨進(jìn)程傳遞大內(nèi)存數(shù)據(jù)如何做?
    我說 binder 肯定是不行的,因?yàn)橛成涞淖畲髢?nèi)存只有 1M-8K,可以采用 binder + 匿名共享內(nèi)存的形式,像跨進(jìn)程傳遞大的 bitmap 需要打開系統(tǒng)底層的 ashmem 機(jī)制。

  7. 說說 ConcurrentHashMap 的實(shí)現(xiàn)原理說下,初始化大小是多少?
    是線程安全的,實(shí)現(xiàn)原理采用的是分段鎖,初始化大小是 16 ,必須是 2 的冪次。

  8. 啟動優(yōu)化怎么優(yōu)化?
    我說了關(guān)鍵優(yōu)化 Application ,被面試官打斷了,說大家都能想到的東西你不要說了,我想聽的是你能不能站在系統(tǒng)的角度去做一些優(yōu)化,我提到了優(yōu)化包體積大小能優(yōu)化啟動速度,優(yōu)化 dex 分包能優(yōu)化啟動速度,可以參考最新的華為方舟編譯器等等。

  9. 你寫的 rxpay 和 rxlogin 具體怎么實(shí)現(xiàn)的?
    一般我們集成第三方登錄和第三方支付 SDK 都需要監(jiān)聽 onActivityResult 方法,我是參考了 RxPermission 的實(shí)現(xiàn)方案添加了透明 Activity 。

  10. kotlin + fullter 方面的
    kotlin 自己學(xué)了語法但是開發(fā)項(xiàng)目中沒用上,fullter 我是了解了它的實(shí)現(xiàn)原理但是開發(fā)中也沒用上。

技術(shù)二面

  1. 單例設(shè)計(jì)模式都寫寫,靜態(tài)內(nèi)部類是怎么保證線程安全的?

  2. synchronized 底層實(shí)現(xiàn)原理,ReentrantLock 公平鎖與非公平鎖。

  3. 主線程等待所有線程執(zhí)行完畢,再執(zhí)行某個特定任務(wù)怎么實(shí)現(xiàn)?原理和源碼看過沒?

  4. 自定義 view 的一般流程,要注意些什么如何優(yōu)化,點(diǎn)擊事件和長按時間分別是怎么實(shí)現(xiàn)的?

  5. 四種啟動模式,在源碼分析中的原理是怎樣的?

  6. 講講 bindService 的過程,你當(dāng)初是怎么優(yōu)化后臺服務(wù)進(jìn)程的?

  7. 開發(fā)中你都用到了哪些設(shè)計(jì)模式?說說當(dāng)時具體的場景。為什么你要用方法工廠,另外兩種呢?

  8. RxJava 在使用過程中碰到了某些不友好的錯誤一般怎么解決?發(fā)現(xiàn)了內(nèi)存泄露一般怎么解決分析,有沒有碰到過系統(tǒng)服務(wù)內(nèi)存泄露的問題?

  9. 你們用的 okhttp ?那你有沒有做過一些網(wǎng)絡(luò)優(yōu)化呢?比如弱網(wǎng)環(huán)境。

  10. 給你個數(shù) 1 吧,比如 1000011 里面有幾個 1 ?

  11. 快排了解不?最壞的情況是怎樣?如果有大量重復(fù)數(shù)據(jù)怎么優(yōu)化?

技術(shù)三面

  1. 講講 handler 的底層實(shí)現(xiàn)原理?
    這么簡單?問到碗里來了,后面漸漸說到延遲消息是 nativePollOnce 來處理的,在 6.0 以上用的是 epoll 方式來監(jiān)聽文件描述符。接著問道了為什么要用這種方案?它跟 poll 和 select 比起來有哪些優(yōu)勢?它是怎么監(jiān)聽的你看過它的內(nèi)部實(shí)現(xiàn)原理沒?反正感覺很難受了。

  2. 說說你做的日志記錄優(yōu)化?
    把第一輪面試的又講了一通,你在每個文件的最后寫入了當(dāng)前內(nèi)容的大小,你有沒有想過如果文件被破壞的情況?這種異常情況怎么處理?后面還問到了加密和壓縮。

  3. 你看過 binder 驅(qū)動的源碼,說說他的內(nèi)存映射過程,說說客戶端等待服務(wù)端處理返回的流程,如果要跨進(jìn)程傳遞大內(nèi)存數(shù)據(jù)你具體會怎么做?簡單寫一寫吧。

  4. 在公司做過哪些優(yōu)化?
    內(nèi)存優(yōu)化,啟動優(yōu)化,網(wǎng)絡(luò)優(yōu)化,包體積優(yōu)化,具體說說包體積優(yōu)化。我提到了包體積優(yōu)化不僅僅是優(yōu)化了包的大小,包體積太大從安裝的那一刻開始,我們的應(yīng)用就可能比較慢了,因?yàn)?pms 會去拷貝解壓解析我們的 apk 安裝文件,會去優(yōu)化我們的 dex 等等,包體積太大還會影響我們的啟動速度。然后就巴拉巴拉說具體怎么做,問到了為啥混淆資源能減少包體積大?。磕惝?dāng)時優(yōu)化的時候效果是怎樣的減少了多少?

  5. 開發(fā)過程中遇到的一些最難解決的問題?
    提到了動態(tài)修復(fù)替換加載 so ,那你知道怎么修復(fù) class 嗎?怎么修復(fù)資源呢?后面又聊到了插件化,提到了 360 用的是借尸還魂,那如果我們在插件的 Androidmanifest.xml 中注冊了其它屬性該怎么解決,資源方面怎么處理?

  1. 還有什么要問我的?

個人體會

要是換幾年前我也跟大家一樣,感覺這些面試題估計(jì)一個也答不好,但是今天回過頭再來看其實(shí)感覺也就一般般吧。當(dāng)我們讀小學(xué)時感覺初中知識比較難,但當(dāng)我們讀到高中時再回過頭來看就很簡單了。因此我們不必在乎現(xiàn)在的自己能力是否足夠強(qiáng),一口也是吃不成胖子的,只要今天比昨天有進(jìn)步這就足夠了。但道理我們都懂,可是能堅(jiān)持下來的同學(xué)卻比較少了,人生貴在堅(jiān)持!

隨著年齡的增長意味著我們的時間也越來越少了,所以我們自己心里要明白想要什么?是想成為某個領(lǐng)域的專家,還是想多方面發(fā)展以后做領(lǐng)導(dǎo)型人才。一個時間段往往只能做好一件事情,有舍必會有得。當(dāng)我們開著拖拉機(jī)在鄉(xiāng)村道路時,不要看著別人開著跑車就羨慕,以為拖拉機(jī)也能上高速,但內(nèi)心要有換噴氣式飛機(jī)的勇氣和決心。

大廠的正常面試流程周期一般是一到兩個月,就算薪資談完到 offer 最終審批下來可能都需要一到兩周,這段時間心理是比較難熬的,因此建議大家盡量不要裸辭。面試完畢一般都會透露多久給答復(fù),如果是獵頭推的多跟獵頭聯(lián)系,大家要盡量想辦法打聽到最新的動態(tài)。

二本大學(xué)也會有一流的專業(yè),所以并不一定說一線互聯(lián)網(wǎng)企業(yè)就是最好的,因此在面試的時候一定要問一下部門和項(xiàng)目,自己根據(jù)自身的情況來選擇企業(yè)和項(xiàng)目組。一般情況下通過面試的難易程度就能判斷出部門的技術(shù)沉淀,那種幾乎不問技術(shù)很容易過的情況,并不見得就一定是好現(xiàn)象,還是得根據(jù)自身的情況和以后的打算來判斷,有時選擇可能會大于努力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容