Android 开发如今的行情想必大家应该都有了解,如果有不了解的小伙伴可以去看我的这篇文章《都2021年了,你怎么看待Android 开发前景?》,前几年,Android开发火爆一时,风头一般无二,很多Java,c+都转过来分一杯羹。市场暴涨的红利消失趋于稳定后,转Android的热潮渐渐退隐,现在,Android程序员都想成为架构师,但这期间,需要付出的辛苦和努力远超过我们的想象。
据Android 行业调研数据发现:97% 的Android开发 技术人都会面临以下这些困境:
- 身处外包公司/小型团队,技术闭塞
如果你长期在小型软件公司或外包公司工作,那么你的技术是很难有机会经历完整且大型项目的开发,整个技术视野会比较窄,导致薪资长期处于停滞不前。
- 重复同样的编码工作,一年经验重复多年
长期重复同样的编码工作,项目对你的技术要求就是那些,不会让你按照自己的期望去发展,导致很长时间自己的能力都无法突破,企业更是难以接受新技术。
- 自控力差,没时间学习
白天工作,晚上加班,只能依靠碎片化的时间学习,如果自控力比较差,基本就三天打鱼两天晒网,无法系统性学习,无法沉淀自己的技术实力;
- 目前的简历,难进大厂
现有的技术能力、项目经验,无法通过大厂简历初筛,更别说拿到大厂的高薪 Offer。
这些问题,当时你还不会觉得有什么,等到你想跳槽,想要升职的时候,他们就会成为你职业发展的绊脚石。不想办法解决这些,他们就会以焦虑的形式,像一块巨石,压在你身上。很多求职者的能力体系和企业用人需求有很大出入。
公司现在招人不像以前一样,你只要能写几个简单的页面,懂一点Android 开发基础就可以通过了。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 区写进通讯录,那么就形成了一张表:
之后 Client 进程想要和 Server 进程通信,首先向 ServiceManager 查询地址, ServiceManager 收到查询的请求之后,返回查询结果给 Client。
注意到这里不管是 Server 进程注册,还是 Client 查询,都是经过 Binder 驱动的, 这也真是 Binder 驱动的作用所在,先不急,下面的原理会分析到。 这时候我就拿着地址就开始寄明信片咯。当我把明信片放扔进邮筒,之后的工作 就是由邮局去完成了,也就是 Binder 驱动去完成通信的转发。
Binder 通信原理
从寄明信片的例子中,邮递员从邮筒取出明信片,然后跨越千山万水将明信片送 达。从这点我们也能想到,其实 Binder 驱动完成的工作是很重要的。