Bilibili Android一二面涼經(jīng)(2024)

筆者作為一名雙非二本畢業(yè)7年老Android, 最近面試了不少公司, 目前已告一段落, 整理一下各家的面試問題, 打算陸續(xù)發(fā)布出來, 供有緣人參考。今天給大家?guī)淼氖恰禸ilibili Android一二面涼經(jīng)(2024)》。

面試職位: 高級(jí)Android開發(fā)工程師(播放業(yè)務(wù))

技術(shù)一面

  • 面試時(shí)長(zhǎng): 50min(提問40min + 反問10min)
  • 代碼考核: 無

面試問題(40min)

  • 自我介紹
  • Flow用過嗎
  • Jetpack ComposeView
  • 起播優(yōu)化
  • 業(yè)務(wù)組件化
  • 內(nèi)存泄漏排查的經(jīng)驗(yàn)
    • 在哪里會(huì)有常見的內(nèi)存泄漏
  • 有哪幾類鎖?這些鎖有哪些區(qū)別?
  • kotlin獨(dú)有的類有哪些, 分別是什么功能? (sealed class、value class、data class)
  • 視頻播放器有研究過嗎
  • RN頁面打開速度優(yōu)化
    • 為什么選用RN, 沒用kotlin的跨平臺(tái), 或者flutter?

面試反問(10min)

招聘崗位未來負(fù)責(zé)的內(nèi)容

  • 1 ijk內(nèi)核負(fù)責(zé)解碼和渲染。給ijk封裝了一層。還接了其他的播放器。為這些播放器接了統(tǒng)一的API, 提供給別的業(yè)務(wù)方使用, 或者自己業(yè)務(wù)用。
  • 2 詳情頁和短視頻頁(B站內(nèi)部稱之為story頁); 長(zhǎng)視頻的播放流已經(jīng)經(jīng)過一年的改造, 現(xiàn)在再用協(xié)程、flow、hilt。短視頻還未完成改造。
  • 3 不想做播放可以做業(yè)務(wù);想做播放的話, 可以去跟ijk對(duì)接。兩者跨度比較大。

播放真正的底層都是C/C++層, 這個(gè)崗位更多的還是上層的吧?

是的, c++層是在ijk內(nèi)核做的。ijk負(fù)責(zé)解碼。但是播放有什么問題, 或者介入新的播放能力都要經(jīng)過我們。

播放組有多少人?為什么現(xiàn)在比較少?

現(xiàn)在單端5個(gè)。去年優(yōu)化了一波。

整個(gè)Android團(tuán)隊(duì)人數(shù)。

20+

分組是業(yè)務(wù)劃分還是技術(shù)棧分?

不同的端分組。

有代碼考核或算法題嗎

我不面

面試有幾輪

三輪(兩輪技術(shù)+一輪hr)。

問了團(tuán)隊(duì)氛圍

二次元氛圍濃郁。有個(gè)別小朋友(應(yīng)該是指年輕的同事)二次元屬性比較厲害。

每層樓都有貓咪常駐。每次過節(jié)都有cosplay, 比如圣誕節(jié)什么的。之前有好多女裝大佬。

社團(tuán): 漢服社、蘿莉社。

個(gè)人獨(dú)特愛好包容性比較強(qiáng)。

技術(shù)二面

  • 面試時(shí)長(zhǎng): 60min(提問40min + 反問20min)
  • 代碼考核: 無

面試問題(40min)

  • 自我介紹
  • 業(yè)務(wù)組件化
  • 播放優(yōu)化的優(yōu)化措施、優(yōu)化的效果(具體的數(shù)值)
    • 是否有線上統(tǒng)計(jì)數(shù)據(jù)?
    • 拉流地址過期時(shí)間, 過期了怎么做? 用戶播放暫停了, 退到后臺(tái), 超過過期時(shí)間, 緩存會(huì)全部失效。針對(duì)這塊問題有什么優(yōu)化手段?
    • 播放底層有做什么優(yōu)化嗎? 比如解碼
    • 用戶網(wǎng)絡(luò)不好, 帶寬緊張, 預(yù)加載會(huì)導(dǎo)致他當(dāng)前的音視頻不能流暢播放?這種問題怎么解決?
    • 有些音頻碼率也很高(無損音樂), 動(dòng)不動(dòng)一首歌就一兩百兆。然后用戶的網(wǎng)絡(luò)狀況并不是很優(yōu)秀, 比如他在地鐵上聽, 怎么保障流暢度?
    • 怎么計(jì)算起播耗時(shí)?起始點(diǎn)和結(jié)束點(diǎn)分別是?
    • 播放器跨進(jìn)程通信的時(shí)間對(duì)你統(tǒng)計(jì)有影響嘛?它回調(diào)給你的時(shí)候, 已經(jīng)送響給Audio Window了。因此你的打點(diǎn)時(shí)機(jī), 相對(duì)來說是滯后的。這塊gap后來有解決嗎?如果沒有, 現(xiàn)在想想該怎么解決?
    • 你在做視頻和音頻上有沒有做什么差異化的優(yōu)化?
  • kotlin相關(guān)
    • compose、MVI、coroutines在項(xiàng)目中有用嗎?
    • 根據(jù)你對(duì)kotlin coroutines的理解是, 你覺得它是個(gè)什么?
    • 我們?cè)趉otlin協(xié)程寫的時(shí)候, 會(huì)涉及到一個(gè)概念叫CoroutineContext, 如果他只是一個(gè)線程池的話, 他設(shè)計(jì)出來一個(gè)context干嘛?
    • 一個(gè)協(xié)程scope下有多個(gè)子協(xié)程。當(dāng)一個(gè)某一個(gè)子協(xié)程異常的時(shí)候, 會(huì)影響到其他協(xié)程嗎?
  • 對(duì)于你負(fù)責(zé)的這幾個(gè)項(xiàng)目, 都是你獨(dú)自負(fù)責(zé)項(xiàng)目嗎?還是跟其他人合作開發(fā)?
  • 這些項(xiàng)目在Android端的代碼編寫上就是你自己獨(dú)立負(fù)責(zé)的?
  • RN相關(guān)
    • RN的渲染機(jī)制。它的頁面繪制是通過什么樣的方式完成的?這個(gè)頁面最終是怎么畫出來的?你寫的東西在Android上面其實(shí)都是沒有的, 寫的所謂的DSL。
    • RN自己提供的UI組件是不能滿足需求的, 然后面對(duì)這種問題, 一般怎么解決?
  • 有其他性能優(yōu)化的經(jīng)驗(yàn)嗎?還是做業(yè)務(wù)開發(fā)為主?
  • 你的業(yè)務(wù)里面有什么東西是可以去優(yōu)化?
    • 布局xml轉(zhuǎn)code是手寫嗎?有自動(dòng)化嗎?
    • 布局可以異步創(chuàng)建嗎?
    • Android異步操作UI會(huì)拋一個(gè)異常?為什么litho不會(huì)?

面試反問(20min)

距離一面過了很久了(2周+), 為什么招聘流程會(huì)這么慢?

我們?cè)跈M向比較候選人, 匹配度最高的那個(gè)候選人也在橫向?qū)Ρ人膐ffer。整體時(shí)間久拖得比較久。

HC多嗎?

不多。所以才會(huì)橫向?qū)Ρ? 優(yōu)中選優(yōu)。HC多的話就直接發(fā)了嘛。我們也擔(dān)心白折騰。

現(xiàn)在B站技術(shù)選型, 跨端方案, Native占比?

Native占絕對(duì)的主導(dǎo)地位。
跨端: 一部分是c/c++(播放器、彈幕), JSRuntime來做。業(yè)務(wù)層跨端用KMP。

KMP不是不支持UI的跨端嗎?

對(duì)。我們考量下來, UI在各端上面去做跨端的話, 可能后續(xù)還是去用compose做UI的跨端。
目前來講, 復(fù)雜邏輯的跨端和基礎(chǔ)組件的跨端可能對(duì)我們來說更有意義。因?yàn)閁I變化太頻繁了, 很多跨端方案的UI實(shí)現(xiàn)方式不能一比一復(fù)刻平臺(tái)的效果。

為什么沒有選擇其他跨端方案?

1 復(fù)雜邏輯的跨端和基礎(chǔ)組件的跨端可能對(duì)我們來說更有意義。
2 UI變化太頻繁了, 很多跨端方案的UI實(shí)現(xiàn)方式不能一比一復(fù)刻平臺(tái)的效果。

Flutter: 平臺(tái)差異詬病多。
RN: 轉(zhuǎn)成原生性能差。
KMP+compose: 轉(zhuǎn)換成平臺(tái)可執(zhí)行的代碼, 性能好。缺點(diǎn)是: 邏輯和UI的跨端不是一并兼容, 需要分開做。

聽上去B站之前也是嘗試過這些跨端方案, 但綜合考慮下來最終沒有選擇?

Flutter和RN都做過。
漫畫業(yè)務(wù)在用Flutter, 團(tuán)隊(duì)人少, 交付更重要(Ps: 我理解面試官這里表達(dá)的是省人力, 快速交付的意思)。
主站對(duì)性能要求高, 大部分場(chǎng)景還是原生。

B站的跨端方案主推KMP和compose的話, 做跨端的都是Android開發(fā)嗎?還是iOS同學(xué)也會(huì)參與?

它確實(shí)天然對(duì)Android友好, 因?yàn)槭褂胟otlin嘛。不過iOS也在學(xué)。

對(duì)崗位的候選人的要求?

要求: 主要看技術(shù)基礎(chǔ) + 對(duì)播放器有一定的了解(不是完全小白的, 比如說播放器怎么播起來都不知道的那種)
招聘崗位主要是面向于業(yè)務(wù)開發(fā) + 技術(shù)優(yōu)化為主。
播放業(yè)務(wù)復(fù)雜度特別高。比如播放頁的框架是用依賴注入(Dagger)+協(xié)程scope抽象出來的一套框架。它需要對(duì)依賴注入和各種協(xié)程理解比較到位才可以。
沒有使用依賴注入的經(jīng)驗(yàn)也不用太擔(dān)心, 因?yàn)槲覀兺M的同學(xué)剛開始也不會(huì)寫, 會(huì)了以后就輕松了。

B站有專門的組去做一些工程的基建, 流程監(jiān)控, 啟動(dòng), 內(nèi)存, 電量等?

有基礎(chǔ)架構(gòu)團(tuán)隊(duì)。有負(fù)責(zé)CI/CD, 以及移動(dòng)端基礎(chǔ)建設(shè)。比如說網(wǎng)絡(luò)庫, 埋點(diǎn)上報(bào), APM, APM后臺(tái)。編譯、流程都有。

播放相關(guān)的指標(biāo)的APM, 是播放組這邊單獨(dú)做嗎?

播放: 我們會(huì)建立自己的業(yè)務(wù)指標(biāo)和技術(shù)指標(biāo)。合作比較密切的播放內(nèi)核組。他們會(huì)和我們的指標(biāo)雙向驗(yàn)證。

播放會(huì)監(jiān)控什么指標(biāo)?

首幀、頁面打開速度、卡頓率、錯(cuò)誤率、帶寬(CDN)。

如果面試流程順利的話, 后面還有一輪技術(shù)面還是直接HR面?

HR面

你們還在橫向比較一些候選人嗎?

就只有二面的幾個(gè)。

你們?cè)谧鲽櫭蓡??怎么做?我聽說有些公司在用C/C++做Android/iOS/鴻蒙三者的跨端。

在做。我們一開始也想用C, 但我們沒有那么多會(huì)C的同事。沒有HC, 因此沒法招更多會(huì)C的同事。

總結(jié)

公司氛圍比較多元化, 不僅僅有二次元, 公司內(nèi)部也有許多社團(tuán), 對(duì)有獨(dú)特愛好的人群也有非常強(qiáng)的包容性。

B站Android(播放業(yè)務(wù))面試以音視頻播放+性能優(yōu)化為主, 也會(huì)考察候選人對(duì)目前B站工程中在使用的技術(shù)(Flow、Compose、KMP、Dagger等)的熟練度。

B站整體的HC比較少, 面試周期比較長(zhǎng)。如果真的應(yīng)聘這個(gè)崗位, 那就要非常高的匹配度。我總結(jié)了以下幾項(xiàng)技術(shù)/經(jīng)驗(yàn)來提升崗位匹配度(但有可能已經(jīng)招到人了):

  • 視頻播放器性能優(yōu)化
    • 起播
    • 預(yù)加載 & 緩存
    • 網(wǎng)絡(luò)
    • ijkplayer
  • 跨端: KMP + Jetpack Compose
  • 播放器框架: Dagger + Hilt
  • 工程中使用較多: Kotlin Coroutines & Flow
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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