Android 开发一比一年难做!面试题都这么难了,android 插件化
面试官问的面试题:
详细说说 Binder 通信原理与机制
Linux 自带多种进程通信方式,为什么 Android 都没采用二偏偏使用 Binder 通信
进程保活如何做到,你们保活率有多高
谈一谈 Binder 的原理和实现一次拷贝的流 程
ButterKnife 为什么执行效率为什么比其他注入框架高?它的原理是什么
组件化如何实现,组件化与插件化的差别在哪里,该怎么选型
说下组件之间的跳转和组件通信原理机制
有没有使用过组件化,组件化通信如何做到 的,ARouter 有用过吗
插件化你是如何理解的
热修复连环炮(热修复是什么 有接触过 tinker 吗,tinker 原理是什么)
增量升级为什么减少升级代价,增量升级原理
PackageManagerService 运行流程详解
AMS 在 Android 起到什么作用,简单的分析 下 Android 的源码
你知道什么是 AOP 吗?AOP 与 OOP 有什么 区别,谈谈 AOP 的原理是什么
手机 QQ 的换肤是怎么做到的,你对换肤有 了解吗?看过换肤的原理没?
Android(虚拟机)内存模型
数据库版本如何单独升级,并且将原有数据迁移过去。
谈谈 volatile 关键字与 synchronized 关键字在内存的区别
synchronize 关键字在虚拟机执行原理是什 么,能谈一谈什么是内存可见性,锁升级吗
类比于微信,如何对 Apk 进行极限压缩,谈下 Android 压缩 8 大步
如何彻底防止反编译,dex 加密怎么做
序列化与反序列化的原理 , Android 的 Parcelable 与 Serializable 区别是什么
有设计过 App 的数据库框架吗?或者只是停 留在使用 ormlite greenDao 这类框架
Android P 禁止了 http 对你们有影响吗? https 原理你知道吗?
什么是对称加密,什么是非对称加密,公钥 与私钥属于对称加密吗
之前有做过直播吗?你们是通过什么方式实 现直播的? 直播互动是如何做的
直播中网速比较差的条件下,如何使画面保证流畅的效果
硬编码与软编码区别,录屏时如 何选取硬编与软编
对于 Tersorflow 你怎么理解的,有做过人工智能的应用吗
给你一个 Demo 你如何快速定位 ANR
Handler 中有 Loop 死循环,为什么没有阻塞主线程,原理是什么
说说你对 Dalvik 虚拟机的认识 与 Java 虚拟 机有什么不一样的地方
为什么会用到 EventBus,EventBus 的源码详解与架构分析,使用 EventBus 会造成什么弊端。
谈谈你对 Android 线程池原理的理解
谈下音视频同步原理,音频和视频能绝对同步吗?
有做过直播特效吗? 说说直播特效的实现原理与难点。
以上 36 道都是我从以往面试中抽取的经典面试题,从 Binder 通信原理与机制、组件化、插件化、热修复、Handler 、数据库框架到音视频技术直播等技术问题。如果让你回答你能答出几题?
由于文章篇幅长度的原因,我就随机抽选几个简短进行解析,如想参考全部的面试题解析,请移步至我 GitHub:https://github.com/733gh/Android-T3 上查看。
1.详细说说 Binder 通信原理与机制
先上一张 Binder 的工作流程图。(如果不清晰,可以复制图片链接到浏览器 或 保存到本地 查看,我经常都是这样看图的哈)
一开始上手,陌生的东西比较多,But,其实并不复杂。喔,流程图是用 ProcessOn 画的。很棒的在线画图工具。
出发前预备子弹 我们知道进程之间,虚拟地址不同,是不能直接通信的,这是 一种保护机制。打开任务管理器,查看一下 N 多的进程,试想一下如果这些进 程直接通信会带来什么后果?
而用户空间可以通过 System calls(系统回调)与内核空间通信的,如果在内核 空间中有一个模块,能够完成数据的转发,那么是不是两个进程就可以通信了呢?如下图:
上面提到一些用户空间、内核空间的概念,用户空间也能大概猜到是什么东西, 而内核空间,就知道它是很底层的东西好了。而模块呢,可以简单的理解为实现
一个功能的程序或一个硬件电路等,比如玩单片机的时候,会有红外线模块,蓝 牙模块,wifi 模块等。这些概念的东西搜索一下百科知道就好。
Binder 驱动
Binder 驱动运行在内核空间,它就是那个内核模块了。Binder 驱动很重要,承 担了进程间通信的数据转发等。一提到驱动,也是比较熟悉,你插个 U 盘,需 要驱动吧。而 Binder 驱动也差不多,虽然名字取得很好,功能还很强大。但也 不是什么神奇的东西。
Binder 跨进程通信模型
Binder 的通信模型有 4 个角色:Binder Client、Binder Server、Binder Driver (Binder 驱动)、ServiceManager。
想象一个情景:我到北京旅行,要给高中同学寄一张明信片,明信片肯定要写上 地址吧,不然怎么寄给对方呢?那么我怎么拿到这个地址呢,很简单,翻一下毕 业相册就好了。而这个记录着同学们通信地址的毕业相册,就相当与一个通讯录。 在 Binder 的通信模型中扮演的是 ServiceManager 的角色。好,现在已经有了通 信地址了,那么就找到邮局寄出去就好了。过几天同学就高高兴兴的收到了明信 片。那么这个邮局在 Binder 通信模型中扮演的是 Binder 驱动的角色,而作为寄 信人的我就是 Binder Client,收信人同学就是 Binder Server。
先上一张图来描述上面的那个情景:
可以看到,ServiceManager、Binder Client、Binder Server 处于不同的进程,他 们三个都在用户空间,而 Binder 驱动在内核空间。(我是特意把 Binder 驱动画 的比较大的,因为 Binder 驱动的作用最大)
那先来简述一下这个通信模型:
首先是有一个 ServiceManager,刚开始这个通讯录是空白的,然后 Server 进程 向 ServiceManager 注册一个映射关系表,比如徐同学把自己的地址广东省广州 市 xx 区写进通讯录,那么就形成了一张表:
评论