android 面试!Android 事件体系全面总结 + 实践分析,大牛最佳总结
其实不是 Android 不行了,而是你跟不上了
我的很多读者都在反馈说,现在一个岗位可以收到的简历数,是前几年的几倍。我们必须承认,僧多粥少就是 Android 行业的现状,别说初中级工程师,就是高级工程师也是一抓一大把。企业招人的眼光也越来越高,如果你没点“真东西”,是真的挺难的。
前几天和一位 Android 前辈聊天,他说面试中很多工程师,对特别基础的问题都停留在“使用过”或者“听说过”。没有深入到技术细节里,在竞争激烈的市场中就只能被淘汰。下面这些,是他提到的几个问题,你能快速回答上么?
SoftReference(软引用)在内存不足时会被虚拟机回收,那它会不会导致 OOM?
Android 的 Touch 事件中 CANCEL 事件是如何产生的?哪些场景下会发生 CANCEL 事件?
Handler 中的 Looper 无限循环,为什么没有阻塞 UI 主线程?
你在简历中写“精通多线程”,那么:线程中自己的“工作内存”指的是什么? 为什么阿里开发规范中不允许使用 Executors 创建线程池?
你一定想说“面试造火箭,工作拧螺丝”。实际上,你的答案反映了你对技术理解的深度,以及解决问题的能力。 听起来很套路,但企业需要的是能对自己提交代码负责、对使用每一个工具负责的「高级/资深 Android 开发」。
在开始回答前,先简单概括性地说说 Linux 现有的所有进程间 IPC 方式:
1. 管道:在创建时分配一个 page 大小的内存,缓存区大小比较有限;2. 消息队列:信息复制两次,额外的 CPU 消耗;不合适频繁或信息量大的通信;3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;4. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;5. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。6. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;
Android 的内核也是基于 Linux 内核,为何不直接采用 Linux 现有的进程 IPC 方案呢,难道 Linux 社区那么多优秀人员都没有考虑到有 Binder 这样一个更优秀的方案,是 google 太过于牛 B 吗?事实是真相并非如此,请细细往下看,您就明白了。
接下来正面回答这个问题,从 5 个角度来展开对 Binder 的分析:
(1)从性能的角度 数据拷贝次数:Binder 数据拷贝只需要一次,而管道、消息队列、Socket 都需要 2 次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder 性能仅次于共享内存。
(2)从稳定性的角度 Binder 是基于 C/S 架构的,简单解释下 C/S 架构,是指客户端(Client)和服务端(Server)组成的架构,Client 端有什么需求,直接发送给 Server 端去完成,架构清晰明朗,Server 端与 Client 端相对独立,稳定性较好;而共享内存实现方式复杂,没有客户与服务端之别, 需要充分考虑到访问临界资源的并发同步问题,否则可能会出现死锁等问题;从这稳定性角度看,Binder 架构优越于共享内存。
仅仅从以上两点,各有优劣,还不足以支撑 google 去采用 binder 的 IPC 机制,那么更重要的原因是:
(3)从安全的角度传统 Linux IPC 的接收方无法获得对方进程可靠的 UID/PID,从而无法鉴别对方身份;而 Android 作为一个开放的开源体系,拥有非常多的开发平台,App 来源甚广,因此手机的安全显得额外重要;对于普通用户,绝不希望从 App 商店下载偷窥隐射数据、后台造成手机耗电等等问题,传统 Linux IPC 无任何保护措施,完全由上层协议来确保。
Android 为每个安装好的应用程序分配了自己的 UID,故进程的 UID 是鉴别进程身份的重要标志,前面提到 C/S 架构,Android 系统中对外只暴露 Client 端,Client 端将任务发送给 Server 端,Server 端会根据权限控制策略,判断 UID/PID 是否满足访问权限,目前权限控制很多时候是通过弹出权限询问对话框,让用户选择是否运行。Android 6.0,也称为 Android M,在 6.0 之前的系统是在 App 第一次安装时,会将整个 App 所涉及的所有权限一次询问,只要留意看会发现很多 App 根本用不上通信录和短信,但在这一次性权限权限时会包含进去,让用户拒绝不得,因为拒绝后 App 无法正常使用,而一旦授权后,应用便可以胡作非为。
针对这个问题,google 在 Android M 做了调整,不再是安装时一并询问所有权限,而是在 App 运行过程中,需要哪个权限再弹框询问用户是否给相应的权限,对权限做了更细地控制,让用户有了更多的可控性,但同时也带来了另一个用户诟病的地方,那也就是权限询问的弹框的次数大幅度增多。对于 Android M 平台上,有些 App 开发者可能会写出让手机异常频繁弹框的 App,企图直到用户授权为止,这对用户来说是不能忍的,用户最后吐槽的可不光是 App,还有 Android 系统以及手机厂商,有些用户可能就跳果粉了,这还需要广大 Android 开发者以及手机厂商共同努力,共同打造安全与体验俱佳的 Android 手机。
最后
Android 学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。
我把自己这段时间整理的 Android 最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。
资源持续更新中,欢迎大家一起学习和探讨。
评论