Bilibili Android一二面凉经(2024)

news/2024/9/18 12:45:08/ 标签: android

BiliBili Android一二面凉经(2024)

笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《BiliBili Android一二面凉经(2024)》。

面试职位: 高级Android开发工程师(播放业务)

技术一面

  • 面试时长: 50min(提问40min + 反问10min)
  • 代码考核: 无

面试问题(40min)

  • 自我介绍
  • Flow用过吗
  • Jetpack ComposeView
  • 起播优化
  • 业务组件化
  • 内存泄漏排查的经验
    • 在哪里会有常见的内存泄漏
  • 有哪几类锁?这些锁有哪些区别?
  • kotlin独有的类有哪些, 分别是什么功能? (sealed class、value class、data class)
  • 视频播放器有研究过吗
  • RN页面打开速度优化
    • 为什么选用RN, 没用kotlin的跨平台, 或者flutter?

面试反问(10min)

招聘岗位未来负责的内容

  • 1 ijk内核负责解码和渲染。给ijk封装了一层。还接了其他的播放器。为这些播放器接了统一的API, 提供给别的业务方使用, 或者自己业务用。
  • 2 详情页和短视频页(B站内部称之为story页); 长视频的播放流已经经过一年的改造, 现在再用协程、flow、hilt。短视频还未完成改造。
  • 3 不想做播放可以做业务;想做播放的话, 可以去跟ijk对接。两者跨度比较大。

播放真正的底层都是C/C++层, 这个岗位更多的还是上层的吧?

是的, c++层是在ijk内核做的。ijk负责解码。但是播放有什么问题, 或者介入新的播放能力都要经过我们。

播放组有多少人?为什么现在比较少?

现在单端5个。去年优化了一波。

整个Android团队人数。

20+

分组是业务划分还是技术栈分?

不同的端分组。

有代码考核或算法题吗

我不面

面试有几轮

三轮(两轮技术+一轮hr)。

问了团队氛围

二次元氛围浓郁。有个别小朋友(应该是指年轻的同事)二次元属性比较厉害。

每层楼都有猫咪常驻。每次过节都有cosplay, 比如圣诞节什么的。之前有好多女装大佬。

社团: 汉服社、萝莉社。

个人独特爱好包容性比较强。

技术二面

  • 面试时长: 60min(提问40min + 反问20min)
  • 代码考核: 无

面试问题(40min)

  • 自我介绍
  • 业务组件化
  • 播放优化的优化措施、优化的效果(具体的数值)
    • 是否有线上统计数据?
    • 拉流地址过期时间, 过期了怎么做? 用户播放暂停了, 退到后台, 超过过期时间, 缓存会全部失效。针对这块问题有什么优化手段?
    • 播放底层有做什么优化吗? 比如解码
    • 用户网络不好, 带宽紧张, 预加载会导致他当前的音视频不能流畅播放?这种问题怎么解决?
    • 有些音频码率也很高(无损音乐), 动不动一首歌就一两百兆。然后用户的网络状况并不是很优秀, 比如他在地铁上听, 怎么保障流畅度?
    • 怎么计算起播耗时?起始点和结束点分别是?
    • 播放器跨进程通信的时间对你统计有影响嘛?它回调给你的时候, 已经送响给Audio Window了。因此你的打点时机, 相对来说是滞后的。这块gap后来有解决吗?如果没有, 现在想想该怎么解决?
    • 你在做视频和音频上有没有做什么差异化的优化?
  • kotlin相关
    • compose、MVI、coroutines在项目中有用吗?
    • 根据你对kotlin coroutines的理解是, 你觉得它是个什么?
    • 我们在kotlin协程写的时候, 会涉及到一个概念叫CoroutineContext, 如果他只是一个线程池的话, 他设计出来一个context干嘛?
    • 一个协程scope下有多个子协程。当一个某一个子协程异常的时候, 会影响到其他协程吗?
  • 对于你负责的这几个项目, 都是你独自负责项目吗?还是跟其他人合作开发?
  • 这些项目在Android端的代码编写上就是你自己独立负责的?
  • RN相关
    • RN的渲染机制。它的页面绘制是通过什么样的方式完成的?这个页面最终是怎么画出来的?你写的东西在Android上面其实都是没有的, 写的所谓的DSL。
    • RN自己提供的UI组件是不能满足需求的, 然后面对这种问题, 一般怎么解决?
  • 有其他性能优化的经验吗?还是做业务开发为主?
  • 你的业务里面有什么东西是可以去优化?
    • 布局xml转code是手写吗?有自动化吗?
    • 布局可以异步创建吗?
    • Android异步操作UI会抛一个异常?为什么litho不会?

面试反问(20min)

距离一面过了很久了(2周+), 为什么招聘流程会这么慢?

我们在横向比较候选人, 匹配度最高的那个候选人也在横向对比他的offer。整体时间久拖得比较久。

HC多吗?

不多。所以才会横向对比, 优中选优。HC多的话就直接发了嘛。我们也担心白折腾。

现在B站技术选型, 跨端方案, Native占比?

Native占绝对的主导地位。
跨端: 一部分是c/c++(播放器、弹幕), JSRuntime来做。业务层跨端用KMP。

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

对。我们考量下来, UI在各端上面去做跨端的话, 可能后续还是去用compose做UI的跨端。
目前来讲, 复杂逻辑的跨端和基础组件的跨端可能对我们来说更有意义。因为UI变化太频繁了, 很多跨端方案的UI实现方式不能一比一复刻平台的效果。

为什么没有选择其他跨端方案?

1 复杂逻辑的跨端和基础组件的跨端可能对我们来说更有意义。
2 UI变化太频繁了, 很多跨端方案的UI实现方式不能一比一复刻平台的效果。

Flutter: 平台差异诟病多。
RN: 转成原生性能差。
KMP+compose: 转换成平台可执行的代码, 性能好。缺点是: 逻辑和UI的跨端不是一并兼容, 需要分开做。

听上去B站之前也是尝试过这些跨端方案, 但综合考虑下来最终没有选择?

Flutter和RN都做过。
漫画业务在用Flutter, 团队人少, 交付更重要(Ps: 我理解面试官这里表达的是省人力, 快速交付的意思)。
主站对性能要求高, 大部分场景还是原生。

B站的跨端方案主推KMP和compose的话, 做跨端的都是Android开发吗?还是iOS同学也会参与?

它确实天然对Android友好, 因为使用kotlin嘛。不过iOS也在学。

对岗位的候选人的要求?

要求: 主要看技术基础 + 对播放器有一定的了解(不是完全小白的, 比如说播放器怎么播起来都不知道的那种)
招聘岗位主要是面向于业务开发 + 技术优化为主。
播放业务复杂度特别高。比如播放页的框架是用依赖注入(Dagger)+协程scope抽象出来的一套框架。它需要对依赖注入和各种协程理解比较到位才可以。
没有使用依赖注入的经验也不用太担心, 因为我们同组的同学刚开始也不会写, 会了以后就轻松了。

B站有专门的组去做一些工程的基建, 流程监控, 启动, 内存, 电量等?

有基础架构团队。有负责CI/CD, 以及移动端基础建设。比如说网络库, 埋点上报, APM, APM后台。编译、流程都有。

播放相关的指标的APM, 是播放组这边单独做吗?

播放: 我们会建立自己的业务指标和技术指标。合作比较密切的播放内核组。他们会和我们的指标双向验证。

播放会监控什么指标?

首帧、页面打开速度、卡顿率、错误率、带宽(CDN)。

如果面试流程顺利的话, 后面还有一轮技术面还是直接HR面?

HR面

你们还在横向比较一些候选人吗?

就只有二面的几个。

你们在做鸿蒙吗?怎么做?我听说有些公司在用C/C++做Android/iOS/鸿蒙三者的跨端。

在做。我们一开始也想用C, 但我们没有那么多会C的同事。没有HC, 因此没法招更多会C的同事。

总结

公司氛围比较多元化, 不仅仅有二次元, 公司内部也有许多社团, 对有独特爱好的人群也有非常强的包容性。

B站Android(播放业务)面试以音视频播放+性能优化为主, 也会考察候选人对目前B站工程中在使用的技术(Flow、Compose、KMP、Dagger等)的熟练度。

B站整体的HC比较少, 面试周期比较长。如果真的应聘这个岗位, 那就要非常高的匹配度。我总结了以下几项技术/经验来提升岗位匹配度(但有可能已经招到人了):

  • 视频播放器性能优化
    • 起播
    • 预加载 & 缓存
    • 网络
    • ijkplayer
  • 跨端: KMP + Jetpack Compose
  • 播放器框架: Dagger + Hilt
  • 工程中使用较多: Kotlin Coroutines & Flow

http://www.ppmy.cn/news/1474654.html

相关文章

Openresty+lua 定时函数 ngx.timer.every

ngx.timer.every 是 OpenResty 中的一个函数,用于创建定时器,以便定期执行某个函数或代码块。它的用法如下: local delay 5 -- 定时器间隔时间,单位为秒ngx.timer.every(delay, function(premature)-- 这里是定时执行的代码块i…

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片(Form_Vision部分代码)

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片(Form_Vision部分代码) 1 目标效果视频 CamManager 2 增加一个class IMG_BUFFER 用来管理采集的图片 // <summary> /// IMG_BUFFER 用来管理内存图片的抓取队列 /// </summary> public class IMG_BUFF…

【代码随想录算法训练营第六十二天|卡码网53.寻宝(prim算法和kruskal算法)】

文章目录 53.寻宝prim算法kruskal算法 53.寻宝 prim算法 prim算法三部曲&#xff1a; 1.选择当前最短入树结点&#xff1b;2.更新入树结点&#xff1b;3.更新结点距离最小生成树的距离。 可以把所有已经使用过的结点看作一个整体&#xff0c;然后把他们相接的结点的结点顶点边…

百日筑基第十八天-一头扎进消息队列1

百日筑基第十八天-一头扎进消息队列1 先对业界消息队列有个宏观的认识 消息队列的现状 当前开源社区用的较多的消息队列主要有 RabbitMQ、RocketMQ、Kafka 和Pulsar 四款。 国内大厂也一直在自研消息队列&#xff0c;比如阿里的 RocketMQ、腾讯的 CMQ 和 TubeMQ、京东的 JM…

玄机——第五章 linux实战-CMS01 wp

文章目录 一、前言二、概览简介 三、参考文章四、步骤&#xff08;解析&#xff09;准备步骤#1.0步骤#1.1通过本地 PC SSH到服务器并且分析黑客的 IP 为多少,将黑客 IP 作为 FLAG 提交; 步骤#1.2通过本地 PC SSH到服务器并且分析黑客修改的管理员密码(明文)为多少,将黑客修改的…

Perl 语言开发(八):子程序和模块

目录 1. 引言 2. 子程序的基本概念与用法 2.1 子程序的定义和调用 2.2 传递参数 2.3 返回值 2.4 上下文和返回值 3. 模块的基本概念与用法 3.1 模块的定义 3.2 使用模块 3.3 导出符号 3.4 模块的文件结构和命名 4. 实际应用中的子程序与模块 4.1 子程序参数验证与…

省市县下拉框的逻辑以及多表联查的实例

2024.7.12 一. 省市县的逻辑开发。1、准备&#xff1a;1.1. 要求&#xff1a;1.2 数据库表&#xff1a; 2. 逻辑&#xff1a;3. 方法3.1 创建实体类3.2 数据访问层3.3 实现递归方法3.4 控制器实现3.5 前端处理 二、多表联查&#xff08;给我干红温了&#xff09;1. 出现了问题2…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

服务网格新篇章:Eureka与分布式服务网格的协同共舞

服务网格新篇章&#xff1a;Eureka与分布式服务网格的协同共舞 引言 在微服务架构的浪潮中&#xff0c;服务网格&#xff08;Service Mesh&#xff09;技术以其微服务间通信的精细化控制而备受瞩目。Eureka作为Netflix开源的服务发现框架&#xff0c;虽然本身不直接提供服务网…

前端面试题47(在动态控制路由时,如何防止未授权用户访问受保护的页面?)

在Vue中&#xff0c;防止未授权用户访问受保护页面通常涉及到使用路由守卫&#xff08;Route Guards&#xff09;。路由守卫允许你在路由发生改变前或后执行一些逻辑&#xff0c;比如检查用户是否已登录或者有访问某个页面的权限。下面是一些常见的路由守卫类型及其使用方式&am…

C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)

1.继承规则 继承的本质是复用&#xff0c;是结构上的继承而不是内容上的继承&#xff0c;近似于在子类中声明了父类的成员变量。 &#xff08;1&#xff09;写法&#xff1a;class student : public person 派生类&#xff08;子类&#xff09;&#xff0c;继承方式&…

数据库doris中的tablet底层解析

在Doris中,tablet(数据片)是数据存储和管理的最小单元。理解tablet的底层原理有助于更好地理解Doris的高可用性、负载均衡和查询优化等特性。 Tablet 的概念 Tablet:Tablet是Doris中用于存储数据的最小物理单元。每个tablet通常对应于一个数据分区和一个分桶组合的子集。…

网工内推 | 网络运维、云计算工程师,NP以上认证,平均薪资10K

01 网络运维 &#x1f537;岗位职责 1、至少3年以上的网络运维相关工作经验; 2、熟悉VLAN、STP、OSPF、RIP、BGP等网络技术; 3、熟悉IPsec、SSL等VPN技术; 4、熟悉主流网络安全厂商的各种产品; 5、精通TCP/IP协议&#xff0c;熟悉主流网络产品设备的调试、配置方法: 6、有…

人工智能笔记分享

文章目录 人工智能图灵测试分类分类与聚类的区别&#xff08;重点&#xff09;分类 (Classification)聚类 (Clustering) 特征提取 分类器&#xff08;重点&#xff09;特征提取为什么要进行特征提取&#xff1f;&#xff08;重点&#xff09;分类器 训练集、测试集大小&#x…

Spring Boot与Jenkins的集成

Spring Boot与Jenkins的集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 Jenkins作为一个开源的持续集成&#xff08;CI&#xff09;和持续交付…

妙笔生词智能写歌词软件:科技赋能艺术还是冲淡原味?

在当今数字化的时代&#xff0c;科技的触角延伸至艺术创作的各个领域&#xff0c;妙笔生词智能写歌词软件便是其中一个引人瞩目的产物。然而&#xff0c;它的出现引发了一场关于科技与艺术关系的深刻思考&#xff1a;究竟是为艺术创作赋予了新的能量&#xff0c;还是在不经意间…

【NLP】利用 RAG 模分块技术提升文档处理效能

将大型文档划分为较小的部分是一项至关重要但又复杂的任务&#xff0c;它对检索增强生成 (RAG) 系统的性能有重大影响。这些系统旨在通过结合基于检索和基于生成的方法&#xff0c;提高输出的质量和相关性。有效的分块&#xff0c;即将文档拆分为可管理的片段的过程&#xff0c…

【区块链+跨境服务】基于区块链的离岸贸易综合服务平台 | FISCO BCOS应用案例

离岸贸易是一种新型的国际贸易模式&#xff0c;指在一个国家或地区的境内&#xff0c;通过一定的方式&#xff0c;将两个或多个国家或地区 之间的贸易活动&#xff0c;从货物流、资金流和信息流三个方面分离开来&#xff0c;实现货物不经过境内&#xff0c;直接从一个国家或地区…

qt 的表格控件有什么

在Qt中&#xff0c;表格控件主要用于显示和编辑表格数据。以下是Qt中常用的表格控件及其相关信息的详细归纳&#xff1a; QTableWidget 介绍&#xff1a;QTableWidget是Qt框架下的一个表格控件&#xff0c;它是基于QTableView的封装&#xff0c;并提供了更方便的方式来操作和呈…

uboot学习:(二)uboot命令

目录 uboot命令 常见命令 内存操作命令 网络操作命令 EMMC/SD卡操作命令: FAT格式文件系统操作命令: EXT格式文件系统操作命令 NAND操作命令 BOOT操作命令 其他命令 uboot命令 在烧录uboot到板子中后&#xff0c;开机三秒后才会进入系统&#xff0c;在这三秒按enter…