前言

春招已经接近尾声了,不知道各位小伙伴有没有找到自己心仪的工作呢。

我前几天内推刚刚收获了腾讯高级开发岗的 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

一份【Android FrameWork】综合面试题,给你醍醐灌顶_Android

Choreorgapher

一份【Android FrameWork】综合面试题,给你醍醐灌顶_android_02

原理

一份【Android FrameWork】综合面试题,给你醍醐灌顶_android_03

每一个线程都有一张表,其实就是一个数组,key 和 value 都存储在数组中

key 存储在 weakReference 中,value 对应对象如 Looper、Choreorgapher 等

一个应用里可以定义多个 ThreadLocal,ThreadLocal 都有自己的哈希值,哈希值根据 hashCounter 计算

算出 hash 值之后,对表的 size 取余数,就能算出 key:value 在表中的 index 值

如果发生了 hash 冲突,就会从当前 index 开始向下遍历数组,放在空闲的位置上

代码如下:

一份【Android FrameWork】综合面试题,给你醍醐灌顶_面试_04

总结

同一个 ThreadLocal 对象,在不同线程 get 返回不同 value

Thread 对象里有张表,保存 ThreadLocal 到 value 的映射关系

这张表是怎么实现的?(见上面的原理分析)

是如何解决 hash 冲突的?(见上面的原理分析)

3.说说 Looper 的副业(待完善)
Looper 里可以监听其它描述符

创建管道,跨进程传数据,用 looper 监听描述符事件

4.怎么检查线程有耗时任务
两种情况

正常的,轻微阻塞

不正常的,严重阻塞

检测机制

WatchDog:

Framework 自带,检查 system_server 中系统服务是否正常

用于检查死锁或者线程异常

BlockCanary

开源框架,用于检查线程是否有耗时任务