【Android FrameWork】综合面试问题

本文探讨了Android开发中的关键概念,如Binder缓存对大数据量事务的影响、跨进程图片传递、ThreadLocal的使用和实现、Looper和Choreographer的工作原理、以及性能优化策略,如ANR检测、消息同步和UI性能提升。此外,还强调了系统化学习和团队合作对于技术成长的重要性。
摘要由CSDN通过智能技术生成
  • 发出去的或者返回的数据量太大

  • Binder缓存用于该进程所有正在进行中的Binder事务

  • 进程弃用binder机制会映射一块内存,大小是1M

  • 跨进程通信申请的缓冲区大小是不能超过1M的

  • 所有binder事务共享这1M内存空间,应该尽量避免同时跑多个事务,尤其是数据量很大的事务

  • 大数据量打碎分批发,或按需发(官方建议)

总结 跨进程传递大图片的方式

  • 图片写到文件,路径传到另一个进程,再读出来

  • intent传图,但是容易抛异常,原因是什么

  • binder调用传图,底层ashmem机制

2. ThreadLocal原理

关于更多面试题资料,可以前往 GitHub 自行查阅。

考察点

  • 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

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

WatchDog WatchDog的作用上面说过:一是检查是否发生了死锁,二是检查线程是否被任务blocked

  • WatchDog是一个线程

  • 看下WatchDog的关键变量:

  • mHandlerCheckers是核心列表,添加了多个HandlerChecker

  • 每一个Checker都对应了一个线程,比如主线程、前台线程、IO线程等,这几个线程都是system_server中非常重要的工作线程

  • 每一个HandlerChecker下都有一个Monitor列表

  • addMonitor实质上是向mMonitorChecker加了一个BinderThreadMonitor,用于检测binder线程是否正常

看下下图

  • 第一个MonitorChecker用户检查系统服务是否发生了死锁,在单独的线程中检查,

  • 原理就是在另外的线程中去尝试拿到锁,拿到了就正常返回

  • 如果一直拿不到,就可能是产生了死锁问题

  • 如图AMS中代码细节

  • 同时服务还会把自己的工作线程new一个HandlerChecker,也注册到watchDog,每一个handlerChecker都会对应一个线程,在线程中派发handlerChecker

BlockCanary 原理就是通过messageLogging在消息分发前后的时间戳打印,利用时间戳的差算出消息执行耗时

5. 怎么同步处理消息

「同步处理消息」:我们发了一个消息到另外一个线程去处理,并没有直接返回,而是挂在那里等待消息处理完毕,有些时候还需要拿到消息处理结果,这就是同步处理消息

适用场景如图124

应用要访问另一个进程的服务,请求会调到服务进程的binder线程池中,binder线程切换到工作线程处理请求,工作线程工作的时候binder线程会一直等待,应用端也会一直等着,等到处理完成后返回结果给给应用

6. 你去了解framework是为了解决一个什么样的问题,怎么解决的?

考察点

  • 你有没有解决复杂问题的经验

  • 你有没有深入研究底层原理的习惯

  • 你的知识体系是否有一定深度

7. 应用组件相关题目

  • 为什么Activity在onResume之后才会显示出来

  • ActivityThread handleResumeActivity时WindowManager才会addView并makeVisible

  • bindService的时候Rebind总是调不到,研究原理

  • TODO

  • 广播onReceive的context可否启动Activity, 显示Dialog?

  • TODO

  • 发现provider的onCreate比Application还早,研究一下

  • Application 构造方法 –> Application.attachBaseContext –> ContentProvider.onCreate –> Application.onCreate –> Activity.onCreate

  • 看下 ActivityThread.java 的 handleBindApplication方法:

  • 图130

8. 消息通信相关题目

  • intent带的数据量大了会异常,研究原因

  • binder机制 1m限制

  • 需要跨进程传大图,研究Bitmap传输原理,Ashmem机制

  • 想知道Handler消息延时的精度怎么样,去了解原理

  • 延迟处理不是延迟发送,精度不太准确

  • 为什么有时候IdleHandler调不到,去了解原理

  • 主线程繁忙,一直在处理消息

  • 比如:

  • 在View的onDraw方法里面无限制的直接或者间接调用View的invalidate方法。

  • 做一个无限轮询的View动画。

9.性能优化相关题目

  • ANR了,看主线程是否有耗时任务

  • 卡顿掉帧,了解屏幕刷新机制,研究Choregrapher

  • 启动速度优化,了解应用启动原理

  • 内存优化,清理不必要的资源

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值