2021最新腾讯Android面试真题解析(累计下载102万次,持续更新中)

418 阅读7分钟

 

背景

没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力+幸运,但如果你不够幸运,那就只能拉高努力的占比。

2020年7月,我有幸成为了腾讯的一名Android开发工程师,在我闲暇之余,我整理了一套2017-2021历年腾讯Android面试真题解析,在github上累计下载102万余次,希望能给正在准备跳槽,找工作的朋友一点帮助。

今年Android开发的整体招聘趋势可以概括为几句话:赛道中的公司在蒙眼狂奔,成熟业务借机补强,更多公司在观望。

而面试大厂时更注重你的基本知识,你对待一个问题的思路。是否是以一个工程师的角度去看待问题。也更注重数据结构&&算法(我的痛)这一块的知识的考察。不会是简单的考你排序、查找这种考研层面上的东西。小厂的话,大概是因为需要即插即用,也没有很好的导师类资源,更看重你的自我学习能力和一个自我学习的过程,以及实际开发的能力。好了,话不多说,我们就直接进入面试的总结

整体流程

腾讯的部门很多,岗位类型有别,职级差异较大,因此,每个面试者的面试流程肯定不尽相同,然而,很多流程基本通用,故值得一看。

一图胜千言,要进腾讯并不那么容易。跟游戏升级一样,只有通过前一关,才有机会进入下一关

面试经历

技术一面

1、mmap + native 日志优化?讲了传统日志打印的两个性能问题,一个是反复操作文件描述符表,一个是反复进入内核态,然后讲了 mmap 的原理机制。

2、广播和 EventBus 的区别?说 EventBus 的实现原理是基于反射,里面管理了两张表,且代码之间关联性不大不易于维护,EventBus 不支持跨进程通信,被面试官反问你确定不支持跨进程?我说我的看的源码是不支持,面试官说那好吧。

3、常用设计模式你了解哪些?我开始巴拉巴拉说了一大堆,其中说到了装饰设计模式,被面试官打断了,请你具体说说装饰设计模式。

4、跨进程通信有哪些?管道,信号,信号量,文件,本地套接字,共享内存,binder 驱动

5、简单讲讲 binder 驱动吧?从 Java 层来看就像访问本地接口一样,客户端基于 BinderProxy 服务端基于 IBinder 对象,从 native 层来看来看客户端基于 BpBinder 到 ICPThreadState 到 binder 驱动,服务端由 binder 驱动唤醒 IPCThreadSate 到 BbBinder 。然后又讲了虚拟内存、物理内存和内存映射,跨进程通信的原理是要基于内核的, 当我讲到 binder_open 、binder_mmap 和 binder_ioctl 是被面试官打断了,估计是怕我讲太久了。

6、跨进程传递大内存数据如何做?我说 binder 肯定是不行的,因为映射的最大内存只有 1M-8K,可以采用 binder + 匿名共享内存的形式,像跨进程传递大的 bitmap 需要打开系统底层的 ashmem 机制。

7、说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?是线程安全的,实现原理采用的是分段锁,初始化大小是 16 ,必须是 2 的幂次。

8、启动优化怎么优化?我说了关键优化 Application ,被面试官打断了,说大家都能想到的东西你不要说了,我想听的是你能不能站在系统的角度去做一些优化,我提到了优化包体积大小能优化启动速度,优化 dex 分包能优化启动速度,可以参考最新的华为方舟编译器等等。

9、你写的 rxpay 和 rxlogin 具体怎么实现的?一般我们集成第三方登录和第三方支付 SDK 都需要监听 onActivityResult 方法,我是参考了 RxPermission 的实现方案添加了透明 Activity 。

10、kotlin + fullter 方面的 kotlin 自己学了语法但是开发项目中没用上,fullter 我是了解了它的实现原理但是开发中也没用上。

技术二面

1、单例设计模式都写写,静态内部类是怎么保证线程安全的?

2、synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。

3、主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?

4、自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?

5、四种启动模式,在源码分析中的原理是怎样的?

6、讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?

7、开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?

8、RxJava 在使用过程中碰到了某些不友好的错误一般怎么解决?发现了内存泄露一般怎么解决分析,有没有碰到过系统服务内存泄露的问题?

9、你们用的 okhttp ?那你有没有做过一些网络优化呢?比如弱网环境。

10、给你个数 1 吧,比如 1000011 里面有几个 1 ?

11、快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?

技术三面

1、讲讲 handler 的底层实现原理?这么简单?问到碗里来了,后面渐渐说到延迟消息是 nativePollOnce 来处理的,在 6.0 以上用的是 epoll 方式来监听文件描述符。接着问道了为什么要用这种方案?它跟 poll 和 select 比起来有哪些优势?它是怎么监听的你看过它的内部实现原理没?反正感觉很难受了。

2、说说你做的日志记录优化?把第一轮面试的又讲了一通,你在每个文件的最后写入了当前内容的大小,你有没有想过如果文件被破坏的情况?这种异常情况怎么处理?后面还问到了加密和压缩。

3、你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。

4、在公司做过哪些优化?内存优化,启动优化,网络优化,包体积优化,具体说说包体积优化。我提到了包体积优化不仅仅是优化了包的大小,包体积太大从安装的那一刻开始,我们的应用就可能比较慢了,因为 pms 会去拷贝解压解析我们的 apk 安装文件,会去优化我们的 dex 等等,包体积太大还会影响我们的启动速度。然后就巴拉巴拉说具体怎么做,问到了为啥混淆资源能减少包体积大小?你当时优化的时候效果是怎样的减少了多少?

5、开发过程中遇到的一些最难解决的问题?提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?后面又聊到了插件化,提到了 360 用的是借尸还魂,那如果我们在插件的 Androidmanifest.xml 中注册了其它属性该怎么解决,资源方面怎么处理?

6、还有什么要问我的

资料整理

Java基础部分

  • HashMap 和 HashTable 以及 CurrentHashMap 的区别。
  • synchronized 和 volatile 、ReentrantLock 、CAS 的区别。
  • JVM 类加载机制、垃圾回收算法对比、Java 虚拟机结构等。
  • Java 的四大引用
  • Java 的泛型,<? super T> 和 <? extends T> 的区别。
  • Java 线程有哪些状态,有哪些锁,各种锁的区别
  • final 、finally、finalize 区别。

ANDROID面试题

  • 什么是 ANR 如何避免它?
  • Activity 和 Fragment 生命周期有哪些?
  • 横竖屏切换时候 Activity 的生命周期
  • AsyncTask 的缺陷和问题,说说他的原理。
  • android 中进程的优先级?
  • Bunder 传递对象为什么需要序列化?Serialzable 和 Parcelable 的区别?
  • 为什么属性动画移动后仍可点击?

Android Framework 相关

  • View 的事件分发机制?滑动冲突怎么解决
  • View 的绘制流程
  • Android 中进程和线程的关系?区别
  • 如何开启多进程?应用是否可以开启 N 个进程?
  • 为何需要 IPC?多进程通信可能会出现的问题?
  • Android 中 IPC 方式、各种方式优缺点?
  • Binder 框架中 ServiceManager 的作用?

性能优化专题

  • 你们做了哪些稳定性方面的优化?
  • 性能稳定性是怎么做的?
  • 如果发生了异常情况,怎么快速止损?
  • 启动优化是怎么做的?
  • 启动优化有哪些容易忽略的注意点?
  • 你们内存优化项目的过程是怎么做的?
  • 你做了内存优化最大的感受是什么

算法合集

  • 排序
  • 二叉树
  • 链表
  • 栈/队列
  • 哈希表
  • 堆/优先队列
  • 数组

上述《2021最新腾讯 Android 面试真题解析》可以【私信我】免费获取或者通过【点击这里】加群,私聊管理员免费获得

分享不易!喜欢的朋友别忘了关注+点赞