寫在前面
那天剛好是下午 oppo hr 面完,大約 3 點(diǎn)左右騰訊來(lái)電沥曹,我在電梯里沒太注意沒接到電話份名,下午就一直盼呀盼,大約九點(diǎn)剛下班到公司樓下來(lái)電了妓美,問(wèn)方不方便我當(dāng)然說(shuō)方便同窘,就在馬路邊上面了大約 50 來(lái)分鐘,我感覺應(yīng)該是掛了的部脚,因?yàn)檫^(guò)程中電話老是斷加上環(huán)境又比較吵想邦,第二天問(wèn)獵頭說(shuō),下班前查了一下同一批面試的都釋放了委刘,你應(yīng)該是過(guò)了只說(shuō)是應(yīng)該過(guò)了丧没。過(guò)了整整一周到了隔周五上午,接到了第二面的面試通知锡移,約的是隔周三上午 10:30 呕童。第二面面試官時(shí)不時(shí)的面帶笑容,給人很輕松的感覺淆珊。二面完后要我稍等一下接著面三面夺饲,三面面完面試官問(wèn)我下午還有事沒?我們***(應(yīng)該是領(lǐng)導(dǎo))有點(diǎn)事施符,下午四點(diǎn)左右可以面第四面往声,具體我也沒聽清楚是誰(shuí)我也不敢問(wèn)。我說(shuō)下午要上班就先回去了戳吝,下午接到 hr 電話約的是隔周二的上午浩销。總共五輪面試含 hr 面听哭,持續(xù)周期一個(gè)月左右慢洋。
技術(shù)一面
mmap + native 日志優(yōu)化?
講了傳統(tǒng)日志打印的兩個(gè)性能問(wèn)題陆盘,一個(gè)是反復(fù)操作文件描述符表普筹,一個(gè)是反復(fù)進(jìn)入內(nèi)核態(tài),然后講了 mmap 的原理機(jī)制隘马。廣播和 EventBus 的區(qū)別太防?
說(shuō) EventBus 的實(shí)現(xiàn)原理是基于反射,里面管理了兩張表祟霍,且代碼之間關(guān)聯(lián)性不大不易于維護(hù)杏头,EventBus 不支持跨進(jìn)程通信盈包,被面試官反問(wèn)你確定不支持跨進(jìn)程?我說(shuō)我的看的源碼是不支持醇王,面試官說(shuō)那好吧呢燥。常用設(shè)計(jì)模式你了解哪些?
我開始巴拉巴拉說(shuō)了一大堆寓娩,其中說(shuō)到了裝飾設(shè)計(jì)模式叛氨,被面試官打斷了,請(qǐng)你具體說(shuō)說(shuō)裝飾設(shè)計(jì)模式棘伴。跨進(jìn)程通信有哪些寞埠?
管道,信號(hào)焊夸,信號(hào)量仁连,文件,本地套接字阱穗,共享內(nèi)存饭冬,binder 驅(qū)動(dòng)簡(jiǎn)單講講 binder 驅(qū)動(dòng)吧?
從 Java 層來(lái)看就像訪問(wèn)本地接口一樣揪阶,客戶端基于 BinderProxy 服務(wù)端基于 IBinder 對(duì)象昌抠,從 native 層來(lái)看來(lái)看客戶端基于 BpBinder 到 ICPThreadState 到 binder 驅(qū)動(dòng),服務(wù)端由 binder 驅(qū)動(dòng)喚醒 IPCThreadSate 到 BbBinder 鲁僚。然后又講了虛擬內(nèi)存炊苫、物理內(nèi)存和內(nèi)存映射,跨進(jìn)程通信的原理是要基于內(nèi)核的冰沙, 當(dāng)我講到 binder_open 侨艾、binder_mmap 和 binder_ioctl 是被面試官打斷了,估計(jì)是怕我講太久了倦淀。跨進(jìn)程傳遞大內(nèi)存數(shù)據(jù)如何做蒋畜?
我說(shuō) binder 肯定是不行的,因?yàn)橛成涞淖畲髢?nèi)存只有 1M-8K撞叽,可以采用 binder + 匿名共享內(nèi)存的形式,像跨進(jìn)程傳遞大的 bitmap 需要打開系統(tǒng)底層的 ashmem 機(jī)制插龄。說(shuō)說(shuō) ConcurrentHashMap 的實(shí)現(xiàn)原理說(shuō)下愿棋,初始化大小是多少?
是線程安全的均牢,實(shí)現(xiàn)原理采用的是分段鎖糠雨,初始化大小是 16 ,必須是 2 的冪次徘跪。啟動(dòng)優(yōu)化怎么優(yōu)化甘邀?
我說(shuō)了關(guān)鍵優(yōu)化 Application 琅攘,被面試官打斷了,說(shuō)大家都能想到的東西你不要說(shuō)了松邪,我想聽的是你能不能站在系統(tǒng)的角度去做一些優(yōu)化坞琴,我提到了優(yōu)化包體積大小能優(yōu)化啟動(dòng)速度,優(yōu)化 dex 分包能優(yōu)化啟動(dòng)速度逗抑,可以參考最新的華為方舟編譯器等等剧辐。你寫的 rxpay 和 rxlogin 具體怎么實(shí)現(xiàn)的?
一般我們集成第三方登錄和第三方支付 SDK 都需要監(jiān)聽 onActivityResult 方法邮府,我是參考了 RxPermission 的實(shí)現(xiàn)方案添加了透明 Activity 荧关。kotlin + fullter 方面的
kotlin 自己學(xué)了語(yǔ)法但是開發(fā)項(xiàng)目中沒用上,fullter 我是了解了它的實(shí)現(xiàn)原理但是開發(fā)中也沒用上褂傀。
技術(shù)二面
單例設(shè)計(jì)模式都寫寫忍啤,靜態(tài)內(nèi)部類是怎么保證線程安全的?
synchronized 底層實(shí)現(xiàn)原理仙辟,ReentrantLock 公平鎖與非公平鎖檀轨。
主線程等待所有線程執(zhí)行完畢,再執(zhí)行某個(gè)特定任務(wù)怎么實(shí)現(xiàn)欺嗤?原理和源碼看過(guò)沒参萄?
自定義 view 的一般流程,要注意些什么如何優(yōu)化煎饼,點(diǎn)擊事件和長(zhǎng)按時(shí)間分別是怎么實(shí)現(xiàn)的讹挎?
四種啟動(dòng)模式,在源碼分析中的原理是怎樣的吆玖?
講講 bindService 的過(guò)程筒溃,你當(dāng)初是怎么優(yōu)化后臺(tái)服務(wù)進(jìn)程的?
開發(fā)中你都用到了哪些設(shè)計(jì)模式沾乘?說(shuō)說(shuō)當(dāng)時(shí)具體的場(chǎng)景怜奖。為什么你要用方法工廠,另外兩種呢翅阵?
RxJava 在使用過(guò)程中碰到了某些不友好的錯(cuò)誤一般怎么解決歪玲?發(fā)現(xiàn)了內(nèi)存泄露一般怎么解決分析,有沒有碰到過(guò)系統(tǒng)服務(wù)內(nèi)存泄露的問(wèn)題掷匠?
你們用的 okhttp 滥崩?那你有沒有做過(guò)一些網(wǎng)絡(luò)優(yōu)化呢?比如弱網(wǎng)環(huán)境讹语。
給你個(gè)數(shù) 1 吧钙皮,比如 1000011 里面有幾個(gè) 1 ?
快排了解不?最壞的情況是怎樣短条?如果有大量重復(fù)數(shù)據(jù)怎么優(yōu)化导匣?
技術(shù)三面
講講 handler 的底層實(shí)現(xiàn)原理?
這么簡(jiǎn)單茸时?問(wèn)到碗里來(lái)了贡定,后面漸漸說(shuō)到延遲消息是 nativePollOnce 來(lái)處理的,在 6.0 以上用的是 epoll 方式來(lái)監(jiān)聽文件描述符屹蚊。接著問(wèn)道了為什么要用這種方案厕氨?它跟 poll 和 select 比起來(lái)有哪些優(yōu)勢(shì)?它是怎么監(jiān)聽的你看過(guò)它的內(nèi)部實(shí)現(xiàn)原理沒汹粤?反正感覺很難受了命斧。說(shuō)說(shuō)你做的日志記錄優(yōu)化?
把第一輪面試的又講了一通嘱兼,你在每個(gè)文件的最后寫入了當(dāng)前內(nèi)容的大小国葬,你有沒有想過(guò)如果文件被破壞的情況?這種異常情況怎么處理芹壕?后面還問(wèn)到了加密和壓縮汇四。你看過(guò) binder 驅(qū)動(dòng)的源碼,說(shuō)說(shuō)他的內(nèi)存映射過(guò)程踢涌,說(shuō)說(shuō)客戶端等待服務(wù)端處理返回的流程通孽,如果要跨進(jìn)程傳遞大內(nèi)存數(shù)據(jù)你具體會(huì)怎么做?簡(jiǎn)單寫一寫吧睁壁。
在公司做過(guò)哪些優(yōu)化背苦?
內(nèi)存優(yōu)化,啟動(dòng)優(yōu)化潘明,網(wǎng)絡(luò)優(yōu)化行剂,包體積優(yōu)化,具體說(shuō)說(shuō)包體積優(yōu)化钳降。我提到了包體積優(yōu)化不僅僅是優(yōu)化了包的大小厚宰,包體積太大從安裝的那一刻開始,我們的應(yīng)用就可能比較慢了遂填,因?yàn)?pms 會(huì)去拷貝解壓解析我們的 apk 安裝文件铲觉,會(huì)去優(yōu)化我們的 dex 等等,包體積太大還會(huì)影響我們的啟動(dòng)速度城菊。然后就巴拉巴拉說(shuō)具體怎么做备燃,問(wèn)到了為啥混淆資源能減少包體積大小凌唬?你當(dāng)時(shí)優(yōu)化的時(shí)候效果是怎樣的減少了多少?開發(fā)過(guò)程中遇到的一些最難解決的問(wèn)題?
提到了動(dòng)態(tài)修復(fù)替換加載 so 客税,那你知道怎么修復(fù) class 嗎况褪?怎么修復(fù)資源呢?后面又聊到了插件化更耻,提到了 360 用的是借尸還魂测垛,那如果我們?cè)诓寮?Androidmanifest.xml 中注冊(cè)了其它屬性該怎么解決,資源方面怎么處理秧均?
- 還有什么要問(wèn)我的食侮?
個(gè)人體會(huì)
要是換幾年前我也跟大家一樣,感覺這些面試題估計(jì)一個(gè)也答不好目胡,但是今天回過(guò)頭再來(lái)看其實(shí)感覺也就一般般吧锯七。當(dāng)我們讀小學(xué)時(shí)感覺初中知識(shí)比較難,但當(dāng)我們讀到高中時(shí)再回過(guò)頭來(lái)看就很簡(jiǎn)單了誉己。因此我們不必在乎現(xiàn)在的自己能力是否足夠強(qiáng)眉尸,一口也是吃不成胖子的,只要今天比昨天有進(jìn)步這就足夠了巨双。但道理我們都懂噪猾,可是能堅(jiān)持下來(lái)的同學(xué)卻比較少了,人生貴在堅(jiān)持筑累!
隨著年齡的增長(zhǎng)意味著我們的時(shí)間也越來(lái)越少了袱蜡,所以我們自己心里要明白想要什么?是想成為某個(gè)領(lǐng)域的專家慢宗,還是想多方面發(fā)展以后做領(lǐng)導(dǎo)型人才坪蚁。一個(gè)時(shí)間段往往只能做好一件事情,有舍必會(huì)有得婆廊。當(dāng)我們開著拖拉機(jī)在鄉(xiāng)村道路時(shí)迅细,不要看著別人開著跑車就羨慕,以為拖拉機(jī)也能上高速淘邻,但內(nèi)心要有換噴氣式飛機(jī)的勇氣和決心茵典。
大廠的正常面試流程周期一般是一到兩個(gè)月,就算薪資談完到 offer 最終審批下來(lái)可能都需要一到兩周宾舅,這段時(shí)間心理是比較難熬的统阿,因此建議大家盡量不要裸辭。面試完畢一般都會(huì)透露多久給答復(fù)筹我,如果是獵頭推的多跟獵頭聯(lián)系扶平,大家要盡量想辦法打聽到最新的動(dòng)態(tài)。
二本大學(xué)也會(huì)有一流的專業(yè)蔬蕊,所以并不一定說(shuō)一線互聯(lián)網(wǎng)企業(yè)就是最好的结澄,因此在面試的時(shí)候一定要問(wèn)一下部門和項(xiàng)目,自己根據(jù)自身的情況來(lái)選擇企業(yè)和項(xiàng)目組。一般情況下通過(guò)面試的難易程度就能判斷出部門的技術(shù)沉淀麻献,那種幾乎不問(wèn)技術(shù)很容易過(guò)的情況们妥,并不見得就一定是好現(xiàn)象,還是得根據(jù)自身的情況和以后的打算來(lái)判斷勉吻,有時(shí)選擇可能會(huì)大于努力监婶。