前言
春招已经接近尾声了,不知道各位小伙伴有没有找到自己心仪的工作呢。
我前几天内推刚刚收获了腾讯高级开发岗的 offer,得益于内推朋友面试时的面试经验,照着他给的方向复习刷题,顺利的通过了面试。在这里也无偿分享给广大网友们,喜欢也能帮助到你们。如果觉得文章不错,烦请点个关注转发,谢谢!
从做Android的第一天起,你一定听过无数次关于Framework的讨论,也曾在这个版块被面试官吊锤N次。掉帧监控,函数插桩,慢函数检测,ANR 监控,启动监控,都需要对 Framework 有比较深入的了解,才能知道怎么去监控,利用什么机制监控,函数插桩插到哪里,反射调用该反射哪个类哪个方法哪个属性……
关于FrameWork的面试问题是面试官喜欢问到的。
这里就整理了一些这方面的面试题:
IPC 方式传图
Binder:性能好,使用方便,但是大小有限制
Socket、管道:两次拷贝,也有大小限制
共享内存:性能不错
主要注意点
1.性能,减少拷贝次数
2.内存泄漏,资源及时关闭
TransactionTooLargeException
发出去的或者返回的数据量太大
Binder 缓存用于该进程所有正在进行中的 Binder 事务
进程弃用 binder 机制会映射一块内存,大小是 1M
跨进程通信申请的缓冲区大小是不能超过 1M 的
所有 binder 事务共享这 1M 内存空间,应该尽量避免同时跑多个事务,尤其是数据量很大的事务
大数据量打碎分批发,或按需发(官方建议)
总结?跨进程传递大图片的方式
图片写到文件,路径传到另一个进程,再读出来
intent 传图,但是容易抛异常,原因是什么
binder 调用传图,底层 ashmem 机制
2.ThreadLocal 原理
考察点
ThreadLocal 的适用于什么场景?
ThreadLocal 的使用方式是怎样的?
ThreadLocal 的实现原理是怎样的?
ThreadLocal 在 FrameWork 中的使用
Looper
Choreorgapher
原理
每一个线程都有一张表,其实就是一个数组,key 和 value 都存储在数组中
key 存储在 weakReference 中,value 对应对象如 Looper、Choreorgapher 等
一个应用里可以定义多个 ThreadLocal,ThreadLocal 都有自己的哈希值,哈希值根据 hashCounter 计算
算出 hash 值之后,对表的 size 取余数,就能算出 key:value 在表中的 index 值
如果发生了 hash 冲突,就会从当前 index 开始向下遍历数组,放在空闲的位置上
代码如下:
总结
同一个 ThreadLocal 对象,在不同线程 get 返回不同 value
Thread 对象里有张表,保存 ThreadLocal 到 value 的映射关系
这张表是怎么实现的?(见上面的原理分析)
是如何解决 hash 冲突的?(见上面的原理分析)
3.说说 Looper 的副业(待完善)
Looper 里可以监听其它描述符
创建管道,跨进程传数据,用 looper 监听描述符事件
4.怎么检查线程有耗时任务
两种情况
正常的,轻微阻塞
不正常的,严重阻塞
检测机制
WatchDog:
Framework 自带,检查 system_server 中系统服务是否正常
用于检查死锁或者线程异常
BlockCanary
开源框架,用于检查线程是否有耗时任务