Bilibili Android一二面凉经(2024)

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.mzph.cn/news/870918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《昇思25天学习打卡营第1天|QuickStart》

说在前面 曾经接触过华为的910B服务级显卡,当时基于910B做了一些开发的工作,但是总感觉做的事情太低层,想要能自顶向下的了解下,因此开始了MindSpore的学习。另外也想给予提供的显卡,简单尝试下llm模型的训练&#xf…

GCN、GIN

# 使用TuDataset 中的PROTEINS数据集。 # 里边有1113个蛋白质图,区分是否为酶,即二分类问题。# 导包 from torch_geometric.datasets import TUDataset from torch_geometric.data import DataLoader import torch import torch.nn as nn import torch.…

Linux rpm和ssh损坏修复

背景介绍 我遇到的问题可能和你的不一样。但是如果遇到错误一样也可以按此方案尝试修复。 我是想在Linux上安装Oracle,因为必须在离线环境下安装。就在网上搜一篇文章linux离线安装oracle,然后安装教程走,进行到安装oracle依赖包的时候执行了…

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

SpringBootWeb 篇-入门了解 Swagger 的具体使用

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Swagger 介绍 1.1 Swagger 和 Yapi 的使用场景 2.0 Swagger 的使用方式 2.1 导入 knife4j 的 maven 坐标 2.2 在配置类中加入 knife4j 相关配置 2.3 设置静态资源…

oracle控制文件详解以及新增控制文件

文章目录 oracle控制文件1、 控制文件包含的主要信息如下:2、查看目前系统的控制文件信息,主要是查看相关的字典视图 oracle新增控制文件 oracle控制文件 控制文件是一个很小的二进制文件(10MB左右),含有数据库结构信息,包括数据…

Open3D 点云Kmeans聚类算法

目录 一、概述 1.1算法介绍 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2聚类后点云 前期试读,后续会将博客加入该专栏,欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 1.1算法介绍 聚类是一种将数据集分组的方…

人工智能时代的转型与挑战:从就业替代到技术创新的新纪元

人工智能时代的转型与挑战:从就业替代到技术创新的新纪元 摘要 随着人工智能(AI)技术的飞速发展,我们正步入一个前所未有的变革时代。本文旨在探讨当前人工智能领域的三大关键趋势——AI对工作岗位的潜在取代、ChatBot技术的厌倦…

redis的发布与订阅

与消息队列的差别 不做持久化 不是异步 不能保证可靠性 使用实例 发布者示例:连接到 Redis 服务器,使用 publish 方法发布消息到指定的频道。 订阅者示例:连接到 Redis 服务器,使用 subscribe 方法订阅指定的频道,并…

Next.js的静态生成和服务端渲染,你搞懂了吗?

Next.js的静态生成和服务端渲染,你搞懂了吗? 嘿,各位前端小伙伴们!今天咱们来聊聊Next.js中那令人又爱又恨的静态生成(Static Generation)和服务端渲染(Server-side Rendering)。这…

软设之中介者模式

设计模式中,中介者模式的意图是:用一个中介对象来封装一系列的对象间的交互。它使各个对象不需要显式互相调用,从而达到低耦合,还可以独立改变对象间的交互。 比方,飞机与塔台之间,如果没有塔台,飞机就得需…

双语|如何给教授/教职员发送电子邮件

斯坦福大学提出建议,指导学生如何给教授或者教职员发送电子邮件,这些建议对于访问学者、博士后及联合培养博士也很适用,故知识人网小编用双语对照的形式进行节选转发。 Whether youre writing a professor to ask for an extension or to loo…

笔记:在Entity Framework Core中使用乐观并发控制来处理数据更新的冲突

一、目的: 在Entity Framework Core (EF Core) 中配置乐观并发控制主要涉及到使用并发令牌。并发令牌是在模型中定义的属性,用于在数据库操作期间检测并发冲突。当两个或更多用户尝试同时更新同一条记录时,EF Core 会使用这些令牌来确定是否有…

C++图像转换过程中的内存异常报错

问题描述 在OpenCV中&#xff0c;将输入的图像转到Lab颜色空间中&#xff0c;使用cv::split 函数分离L&#xff0c;A&#xff0c;B三个通道的时候发生内存异常&#xff0c;报错。 cv::split(LabImg, std::vector<cv::Mat>{L, A, B});报错信息&#xff1a; 0x00007FFAA1…

多平台支持,制作的电子画册随时随地都可以查看

​在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地…

高精度定位与AI技术的深度融合——未来智慧世界的钥匙

引言在当今迅速发展的科技时代&#xff0c;精确定位和人工智能&#xff08;AI&#xff09;技术正在快速推动各领域的创新与变革。高精度定位结合AI技术所产生的融合效应&#xff0c;正在加速智慧城市、智能驾驶、智能物流以及许多其他领域的实现。这篇文章将详细探讨高精度定位…

基于Java技术的校园台球厅人员与设备管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;Eclipse、Navicat、Maven 系统展示 首页 用户注册界面 球桌信息…

物流EDI:如何与马士基Maersk建立EDI连接?

马士基Maersk是在全球范围内经营航运和物流的公司&#xff0c;提供包括仓储、配送、供应链管理等一系列的物流解决方案。 与马士基Maersk建立EDI连接&#xff0c;首先需要创建一个 Developer Portal帐户。接下来需要在马士基Maersk提供的列表中选择适合自己的EDI解决方案。 马…

C++基础编程100题-023 OpenJudge-1.4-03 奇偶数判断

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0104/03/ 描述 给定一个整数&#xff0c;判断该数是奇数还是偶数。 输入 输入仅一行&#xff0c;一个大于零的正整数n。 输出 输出仅一行&#xff0c;如果n是奇数&#xff0c;输出odd&#xff1b;如果n是偶…

Twelve Labs:专注视频理解,像人类一样理解视频内容

在当今数字化世界中&#xff0c;视频已成为人们获取信息和娱乐的主要方式之一。 AI视频生成领域的竞争也很激烈&#xff0c;Pika、Sora、Luma AI以及国内的可灵等&#xff0c;多模态、视频生成甚至也被视为大模型发展的某种必经之路。然而&#xff0c;与文本生成相比&#xff…