面试官提了一个问题,我们来看看 😎、😨 和 🤔️ 三位同学的表现如何吧
😎 自认为无所不知,水平已达应用开发天花板,目前月薪 10k
面试官️:看你简历上写熟悉 AIDL,说一说 oneway 吧
😎:oneway 是什么?跟 AIDL 没关系吧,我熟悉 AIDL 指的是使用 AIDL 接口进行跨进程通信。
面试官:AIDL 接口的方法可以用 oneway 修饰符来修饰,了解过这个修饰符的作用吗?
😎:可以提高性能吗?我觉得没必要使用,我从没用过,程序也跑的好好的,没出过什么问题。
面试官:好的,回去等通知吧
😨 业余时间经常打游戏、追剧、熬夜,目前月薪 15k
面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧
😨:用 oneway 修饰的 AIDL 接口方法,是单向调用,不需要等待另一个进程的返回结果,所以方法的返回类型也只允许是 void.
面试官:怎么理解 "单向调用" ,有了解过它的实现原理吗?
😨:由应用进程到服务进程是通过 binder 驱动进行 IPC 通信的,单向的意思应该是应用进程只向 binder 驱动发送一次数据就结束返回,不再等待回复数据;而不用 oneway 修饰的方法需要等待 binder 驱动与服务端通信完后,再回复数据给应用端。
面试官:只向 binder 驱动发送数据吗?binder 驱动有没有回复应用?
😨:嗯... 我理解的是既然不需要返回值,所以没有回复吧
面试官:好的,回去等通知吧
🤔️ 坚持每天学习、不断的提升自己,目前月薪 30k
面试官:看你简历上写熟悉 AIDL,说一说 oneway 吧
🤔️:oneway 主要有两个特性:异步调用和串行化处理。异步调用是指应用向 binder 驱动发送数据后不需要挂起线程等待 binder 驱动的回复,而是直接结束。像一些系统服务调用应用进程的时候就会使用 oneway,比如 AMS 调用应用进程启动 Activity,这样就算应用进程中做了耗时的任务,也不会阻塞系统服务的运行。
串行化处理是指对于一个服务端的 AIDL 接口而言,所有的 oneway 方法不会同时执行,binder 驱动会将他们串行化处理,排队一个一个调用。
面试官:有了解过相关的 binder 协议吗?
🤔️:了解过,图会更直观一些,我来画一下图吧,首先是非 oneway 的情况:
如果是 oneway 的话,客户端就不需要挂起线程等待:
涉及到的 binder 命令也有规律,由外部发送给 binder 驱动的都是 BC_ 开头,由 binder 驱动发往外部的都是 BR_开头。
面试官:怎么理解客户端线程挂起等待呢?有没有实际占用 CPU 的调度?
🤔️:这里的挂起相当于 Thread 的 sleep,是真正的"休眠",底层调用的是 waiteventinterruptible() Linux 系统函数。
面试官:你是从哪里了解到 waiteventinterruptible() 函数的呢?
🤔️:在学习 Handle 机制的时候,Handle 中最关键的地方就是 Looper 的阻塞与唤醒,阻塞是调用了 nativePollOnce() 方法,当时对它的底层实现感兴趣,就去了解了一下,也学习到 Linux 用来实现阻塞/唤醒的 select、poll 和 epoll 机制
面试官:可以,我们再来聊聊别的。
文末
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android进阶学习视频】、【全套Android面试秘籍】关注我【主页简介】或者【简信我】查看免费领取方式!
最后看完了这三位同学的面试表现,你有什么感想呢?
网友评论