笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是QQ音乐Android一面凉经。
面试岗位: QQ音乐Android开发工程师
面试时长: 50min(提问40min + 反问10min)
代码考核: 无
面试问题(40min)
-
自我介绍
工作经历, 重点讲能突出自己优势的经历或项目
换工作的原因
-
聊项目A(RN页面打开速度优化)
简单说一下RN的实现,和客户端的交互原理和流程。
RN页面启动耗时久?主要的原因是什么?
网络请求前置,前置的请求参数是怎么获得?
仅网络请求前置的话, 启动速度还是会比native慢。还有其他优化吗?
进入页面前进行预热可能造成不必要的资源消耗, 有没有统计过多少人会进入这个RN页? 有些用户可能不会点。
工程内用RN的页面多不多?
公司内RN的基建是否参与建设
-
聊项目B(业务组件化)
xx业务的组件化讲一下, 具体做了什么?
从主工程里抽出来的子仓库如何保留git记录?
说下组件化模块化的优点。常说的就是“代码清晰,业务隔离”。面试官认为这两点是比较虚幻的。怎么个清晰法,怎么个解耦法其实是不好量化的。实际对业务上的帮助或其他方面的优点说说你的理解。
-
聊项目C
- 展开讲讲
-
聊聊你擅长的领域(内存、页面打开耗时、App安装、so、线程、内存、网络、UI卡顿、ANR、Web等挑一个自己擅长的或有研究的讲讲)
-
内存
内存线程监控怎么做?线上问题排查思路。内存监控工具有哪些?检查内存泄漏的原理, 如何设定内存阈值。
LeakCanary的原理。它是怎么做到检测内存泄漏。如何实现?
LeakCanary过一段会去检测内存中的对象, 这个时机是怎么定的?
内存中常用的几种引用?四大引用。软引用和弱引用的区别说一下
-
线程
在Activity/Fragment页面执行异步任务, 在任务执行前退出页面。那么这个过程中, 线程的执行过程以及内存的情况, 描述一下。比如内存泄漏, 这个线程会不会执行。会有什么样的问题。
这种情况在业务中很容易出现, 你们在工程中是怎么规避的?比如有些任务我们是使用handler, 有些任务要我们做一些后台的处理。这样的情况又该怎么样处理呢?
大多数开发者都会退出页面的时候去移除异步任务。但是每个地方都需要手写的话, 相对来说还是比较繁琐的。要是给你一个需求, 让你实现一个任务框架。要求不用手动地去移除, 但是退出页面的时候也不会去执行。你可以结合感知生命周期的组件去想想怎么实现这个东西。比如说我在用的时候我就知道什么时候该移除, 自动移除。我就只用管它怎么用就好了,我根本就不用考虑使用它会有什么问题。怎么实现?
-
kotlin协程
kotlin协程的原理大概说一下。它怎么做到写起来是同步的, 实际上是异步的。它是怎么做到的?
协程出现问题不好排查, 不像线程链路比较简单, 协程包装的层级比较多。针对协程问题排查, 你们有什么提效手段?
-
你们工程中kotlin的版本升级到多少?kotlin版本升级过程中遇到过什么问题, 怎么解决的?
反问问题(10min)
当前招聘的Android岗位之后会负责什么内容?
缺的业务比较多, 并不明确, 看候选人个人偏好和团队配置情况。目前有以下方向: 游戏化, RN相关、歌单等。
为什么没有问Java/Android基础、操作系统、计算机网络相关的, 也没有代码考核(算法题), 为什么只问项目经历?
1 基础是可以背的, 并不能体现出候选人的优势
2 其实我们面的方式也不一定能体现出一个人真实的能力, 有可能有些人就发挥不出来
3 我们这边还有一些面试官喜欢面算法, 不同的倾向吧
4 我这边更希望能体现出候选人擅长的地方
面试会有几轮? 每一轮面试实际考察的内容应该不一样吧?
至少4-5轮。
我们对社招同学, 看重经验会多一些。有经验就面经验。没有经验就面一些基础能力。能力是可以迁移的。即使你在一个地方深入做了很多东西, 换了一个地方, 它可能是没什么用的。很多业务其实是没法直接复用的。即使说是性能优化, 换了一个项目它有些东西可能就完全用不到了。但是你在做这个东西中的一些思考, 是可以迁移的。 “做这个东西怎么做, 怎么去思考做好”这个是可以迁移的。
招聘的岗位是需要一个什么职级的?
7、8、9都可