Android开发:个人大厂面经,轻松斩获腾讯Offer

写在前面

那天恰好是下午 oppo hr 面完,大约 3 点左右腾讯来电,我在电梯里没太注意没接到电话,下午就一直盼呀盼,大约九点刚下班到公司楼下来电了,问方不方便我固然说方便,就在马路边上面了大约 50 来分钟,我感受应该是挂了的,由于过程当中电话总是断加上环境又比较吵,次日问猎头说,下班前查了一下同一批面试的都释放了,你应该是过了只说是应该过了。过了整整一周到了隔周五上午,接到了第二面的面试通知,约的是隔周三上午 10:30 。第二面面试官时不时的面带笑容,给人很轻松的感受。二面完后要我稍等一下接着面三面,三面面完面试官问我下午还有事没?咱们***(应该是领导)有点事,下午四点左右能够面第四面,具体我也没听清楚是谁我也不敢问。我说下午要上班就先回去了,下午接到 hr 电话约的是隔周二的上午。总共五轮面试含 hr 面,持续周期一个月左右。面试

技术一面

  1. mmap + native 日志优化?
  2. 讲了传统日志打印的两个性能问题,一个是反复操做文件描述符表,一个是反复进入内核态,而后讲了 mmap 的原理机制。
  3. 广播和 EventBus 的区别?
  4. 说 EventBus 的实现原理是基于反射,里面管理了两张表,且代码之间关联性不大不易于维护,EventBus 不支持跨进程通讯,被面试官反问你肯定不支持跨进程?我说个人看的源码是不支持,面试官说那好吧。
  5. 经常使用设计模式你了解哪些?
  6. 我开始巴拉巴拉说了一大堆,其中说到了装饰设计模式,被面试官打断了,请你具体说说装饰设计模式。
  7. 跨进程通讯有哪些?
  8. 管道,信号,信号量,文件,本地套接字,共享内存,binder 驱动
  9. 简单讲讲 binder 驱动吧?
  10. 从 Java 层来看就像访问本地接口同样,客户端基于 BinderProxy 服务端基于 IBinder 对象,从 native 层来看来看客户端基于 BpBinder 到 ICPThreadState 到 binder 驱动,服务端由 binder 驱动唤醒 IPCThreadSate 到 BbBinder 。而后又讲了虚拟内存、物理内存和内存映射,跨进程通讯的原理是要基于内核的, 当我讲到 binder_open 、binder_mmap 和 binder_ioctl 是被面试官打断了,估计是怕我讲过久了。
  11. 跨进程传递大内存数据如何作?
  12. 我说 binder 确定是不行的,由于映射的最大内存只有 1M-8K,能够采用 binder + 匿名共享内存的形式,像跨进程传递大的 bitmap 须要打开系统底层的 ashmem 机制。
  13. 说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
  14. 是线程安全的,实现原理采用的是分段锁,初始化大小是 16 ,必须是 2 的幂次。
  15. 启动优化怎么优化?
  16. 我说了关键优化 Application ,被面试官打断了,说你们都能想到的东西你不要说了,我想听的是你能不能站在系统的角度去作一些优化,我提到了优化包体积大小能优化启动速度,优化 dex 分包能优化启动速度,能够参考最新的华为方舟编译器等等。
  17. 你写的 rxpay 和 rxlogin 具体怎么实现的?
  18. 通常咱们集成第三方登陆和第三方支付 SDK 都须要监听 onActivityResult 方法,我是参考了 RxPermission 的实现方案添加了透明 Activity 。
  19. kotlin + fullter 方面的
  20. kotlin 本身学了语法可是开发项目中没用上,fullter 我是了解了它的实现原理可是开发中也没用上。

技术二面

  1. 单例设计模式都写写,静态内部类是怎么保证线程安全的?
  2. synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
  3. 主线程等待全部线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
  4. 自定义 view 的通常流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?
  5. 四种启动模式,在源码分析中的原理是怎样的?
  6. 讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
  7. 开发中你都用到了哪些设计模式?说说当时具体的场景。为何你要用方法工厂,另外两种呢?
  8. RxJava 在使用过程当中碰到了某些不友好的错误通常怎么解决?发现了内存泄露通常怎么解决分析,有没有碰到过系统服务内存泄露的问题?
  9. 大家用的 okhttp ?那你有没有作过一些网络优化呢?好比弱网环境。
  10. 给你个数 1 吧,好比 1000011 里面有几个 1 ?
  11. 快排了解不?最坏的状况是怎样?若是有大量重复数据怎么优化?

技术三面

  1. 讲讲 handler 的底层实现原理?
  2. 这么简单?问到碗里来了,后面渐渐说到延迟消息是 nativePollOnce 来处理的,在 6.0 以上用的是 epoll 方式来监听文件描述符。接着问道了为何要用这种方案?它跟 poll 和 select 比起来有哪些优点?它是怎么监听的你看过它的内部实现原理没?反正感受很难受了。
  3. 说说你作的日志记录优化?
  4. 把第一轮面试的又讲了一通,你在每一个文件的最后写入了当前内容的大小,你有没有想过若是文件被破坏的状况?这种异常状况怎么处理?后面还问到了加密和压缩。
  5. 你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,若是要跨进程传递大内存数据你具体会怎么作?简单写一写吧。
  6. 在公司作过哪些优化?
  7. 内存优化,启动优化,网络优化,包体积优化,具体说说包体积优化。我提到了包体积优化不只仅是优化了包的大小,包体积太大从安装的那一刻开始,咱们的应用就可能比较慢了,由于 pms 会去拷贝解压解析咱们的 apk 安装文件,会去优化咱们的 dex 等等,包体积太大还会影响咱们的启动速度。而后就巴拉巴拉说具体怎么作,问到了为啥混淆资源能减小包体积大小?你当时优化的时候效果是怎样的减小了多少?
  8. 开发过程当中遇到的一些最难解决的问题?
  9. 提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?后面又聊到了插件化,提到了 360 用的是借尸还魂,那若是咱们在插件的 Androidmanifest.xml 中注册了其它属性该怎么解决,资源方面怎么处理?
  10. 还有什么要问个人?

我的体会

要是换几年前我也跟你们同样,感受这些面试题估计一个也答很差,可是今天回过头再来看其实感受也就通常般吧。当咱们读小学时感受初中知识比较难,但当咱们读到高中时再回过头来看就很简单了。所以咱们没必要在意如今的本身能力是否足够强,一口也是吃不成胖子的,只要今天比昨天有进步这就足够了。但道理咱们都懂,但是能坚持下来的同窗却比较少了,人生贵在坚持!设计模式

随着年龄的增加意味着咱们的时间也愈来愈少了,因此咱们本身内心要明白想要什么?是想成为某个领域的专家,仍是想多方面发展之后作领导型人才。一个时间段每每只能作好一件事情,有舍必会有得。当咱们开着拖拉机在乡村道路时,不要看着别人开着跑车就羡慕,觉得拖拉机也能上高速,但心里要有换喷气式飞机的勇气和决心。安全

大厂的正常面试流程周期通常是一到两个月,就算薪资谈完到 offer 最终审批下来可能都须要一到两周,这段时间心理是比较难熬的,所以建议你们尽可能不要裸辞。面试完毕通常都会透露多久给答复,若是是猎头推的多跟猎头联系,你们要尽可能想办法打听到最新的动态。网络

二本大学也会有一流的专业,因此并不必定说一线互联网企业就是最好的,所以在面试的时候必定要问一下部门和项目,本身根据自身的状况来选择企业和项目组。通常状况下经过面试的难易程度就能判断出部门的技术沉淀,那种几乎不问技术很容易过的状况,并不见得就必定是好现象,仍是得根据自身的状况和之后的打算来判断,有时选择可能会大于努力。架构

Android学习PDF+架构视频+面试文档+源码笔记源码分析

最后

感谢你们能耐着性子,看完我啰哩啰嗦的文章。性能

愿与各位坚守在Android开发岗位的同胞们互相交流学习,共同进步!学习

在这里我也分享一份本身收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料帮助你们学习提高进阶,也节省你们在网上搜索资料的时间来学习,也能够分享给身边好友一块儿学习优化