讨论/求职面试/字节跳动|Android|真实面经|2021.3|/
字节跳动|Android|真实面经|2021.3|

刚过完年之后,入职了新公司字节跳动,Android岗位。故事开始于去年年底的时候,在上一家公司呆了三年多,作为一名互联网从业者三年多的时间确实挺长的,也学到了很多东西,但是感觉自己再待下去没有意义了,因为已经学不到什么技术了,也到了一个瓶颈期,就感觉是时候走了,决定出去看看,就选择了去上海字节试试机会,整个面试过程还是挺快的,两个星期就面完了,谈的也比较顺利。这不已经上了两个星期班了。这边的工作环境,硬件条件,生活福利都非常好,最重要的是入职第一天我发现公司内部的技术文档好多,Android相关的技术分享,抖音头条性能优化技术讲解,基础组件源码在这里都能看到,不论你是哪一个部门的,都是无障碍阅读,只要你想学,这里都有,感觉自己没有来错地方,而且同学们都很优秀,工作起来确实跟以前不一样。

哈哈哈,说了一堆废话,下面就闲聊下Android面试的东西吧。

Android面试其实技术面挺广的,大概分为以下5个方面吧

  1. Java技术知识

这方面的内容的内容其实挺多的。比如

JVM内存模型,垃圾回收机制,类加载机制,泛型,常用的集合类,IO,线程等等,这里面就有好多问题可以问了,比如弱引用与软引用,HashMap的各个版本差异,什么是线程安全,如何实现线程安全,常用的线程池种类,为什么要这么设计,单例常见的实现方式,DCL为什么要加两层判断。更深一点的话就有ReentrantLock如何实现公平锁的,线程池里面非核心线程什么时候会被回收,Type接口与泛型联系等等。

  1. Android技术知识

前面的Java知识都是为了给Android开发的铺垫,对于初级的开发者来说就是API了,中高级就是对源码的了解程度,涉及到Android四大组件,Fragment,事件分发,自定义View,动画原理,常用的开源框架Retrofit,OKHttp,Glide等等,如果是中高级岗位的话光了解API使用还不够,还要了解源码、原理。比如说handler机制,AsyncTask原理,Activity窗口层级,binder机制,Activity的启动流程,mmap,Intent传输数据的限制,ANR原理,SP的性能问题,RxJava 线程池的使用注意问题,OKHTTP拦截器,Activity的启动流程,打包等等,这都是实际开发会遇到的问题。

  1. 网络知识

这部分应该属于基础了,开发应该都要知道,TCP与UDP,HTTP与HTTPS,Http1.1存在的问题,HTTP2解决了什么还存在的问题,HTTP与Websocket,Https如何实现安全传输的,TCP如何保证可靠的,HTTPS握手过程等等,建议大家多看看开源库OKhttp,Retrofit的源码,有没有什么网络优化的点,比如DNS之类的。

  1. Android性能优化

这部分的内容实在太多了,根本讲不完,建议大家还是根据实际项目来谈,平时多想想自己的项目有没有什么优化的地方,布局优化,内存优化,网络优化,apk瘦身等,这部分应该是最考验开发者技术能力的点了,如果有相关的实践经验,那么同学你很nice!大家可以关注我们字节跳动技术团队的公众号,上面有好多技术文章。这一篇大家可以看看哦,https://mp.weixin.qq.com/s/IFgXvPdiEYDs5cDriApkxQ,如果是你,你要怎么来解决呢,有没有什么替代方案呢。

  1. 其他

kotlin,常用设计模式,MVC,MVVM等等。


面试之外

有人说知道这些有啥用,平时又用不到,就面试的时候**。这~,我也没法反驳啊。因为这些都属于知识,学到了就是你的知识,下一次你在实际开发中用了,这就是技术。如果没有前面的知识积累,没有这个知识面,是想不出来的解决方案的,所以要多学习,也不是为了面试,而是为了将来的技术应用。举些例子吧。

比如项目中要读取本地一张大图片要注意什么?读取大图片IO时间长,CPU占用少,如果经常性的去读取会浪费时间,并且多次读取会占用更多的内存,所以要做什么,做缓存,缓存解决了多次IO时间长的问题,并且内存只有一份图片文件,但是一张大图片的缓存对于一些低配的机器来说本来内存就吃紧,一直存着,也不是办法,那么内存不够用的时候应该释放掉的,那么这个时候缓存要用强引用,弱引用还是软引用呢?那就留给大家去思考了。

再举个栗子,现在要去做一个日志组件,要用到那些技术呢?比如设计模式中的生产消费者模式,线程安全,线程池,这个线程池如何设计呢,如果用缓存线程池会带来什么问题?Asynctask也有线程池,为了偷懒我们能不能直接用呢?要解决这些问题,其实都是基于你对这些基础知识的理解,才能更好的处理这些技术问题。又再举个栗子,对volatile 关键字的理解,我们都知道可以保证可见性,可以用来修饰一些状态变量,比如boolean这类的,只有两种状态,并且状态切换跟前面状态没有关系,那么DCL为什么要加这个关键字?它可不是为了状态切换。这其实是平时开发挺常见的,还是需要大家平时多思考。

kotlin中的data class在定义参数的时候最好给一个默认值,是因为给了默认值,data class会默认生成无参构造函数,如果你的项目里面用的是Gson来反序列化的话,可以减少这些类反序列化时调用反射的次数,这是因为Gson在实现反序列化的时候,其实是采用了一种尝试机制,通过不断的反射尝试来生成一个实例,如果有无参构造函数的话,在第一步就能生成一个实例,减少后续反射的次数,这部分源码感兴趣的话可以自己去看看,这里就不贴了,其实了解下Gson的反序列化过程,会加深对泛型的理解。

最后一个例子吧, Activity 窗口层级了解吗,就是Phonewindow,decorview,contentview,那了解这个有什么用呢?以前做过一个需求,就是在各个模块的页面设计一个阅读时间奖励,到了时间弹出一个奖励的view,到了时间就消失。因为当时已经组件化了,不能各个模块都加一份同样的代码,所以这个只能放到公共库里面。其实也很简单,就是设计一个工具类,然后传一个父布局给这个工具类显示一下不就行了,是的,但是这里又遇到问题了,各个页面的父布局都不一样,怎么能实现加在同样的位置,一个个去判断父布局类型吗?这也不是不行,碰到是Linearlayout咋办呢,而且看到一堆判断也挺头疼的,还不够好,如果你看过Activity的窗口层级结构,就不难想到用Activity的contentview的加载这个布局了,而且对于这个工具类的方法,只需要传一个Activity就可以了。

面试和工作经验分享就到这了,上面写的说不定会在面试中碰到哦~~
有问题也可以随时交流哦


最后打个广告

我们部门有大量的研发岗位空缺,真诚招人,如果大家有兴趣的话,可以找我内推,希望有机会做同学,一起工作学习。

需要的岗位,地点和要求?

需求的岗位为:所有研发岗位!(包括前端,后端,客户端,测试,测开)!

岗位的地点为:北京/上海两地!

岗位的要求:

对于应届生:只要计算机基础扎实,就可以投递,不要求科班!没有项目经验和语言要求!这些都是可以来了后团队内培养的!(计算机基础指的是:操作系统,数据结构与算法,计算机网络等,并非熟练微软办公软件😅)

对于往届生:毕业一年左右要求同应届生。一年以上,则要求有相关岗位的从业经验!

投递方式?

投递邮箱:yangyinghao@bytedance.com

邮件标题格式: 姓名+学校+岗位+base   附件:个人简历

答疑解惑,个人微信:inwhites

为方便确认投递是否成功,投递完成后请务必在帖子下方回复:已投递+岗位!收到简历后,我会回复每封邮件,并回复楼层

38
共 20 个回复

无语了,面了四五个大厂都过了,唯独字节面了足足六次一次不过,想不懂。。。

2

方便的话,简历发我,我帮你回捞一下 liyu.08@bytedance.com

面的确实深,,,,

招的招的,欢迎投递

收不收实习生

老哥,算法题考的多么,难度怎么样。

顶一下

校招基础好就行啊,社招要相关经验哈

只要计算机基础好就行了??实战经验呢