开头

先说一下我大概的情况吧。渣本毕业,工作已经有快两年了,从高中就开始玩小破站。无论是学习还是日常放松都是在b站。大学主学的软件技术专业,所以,进大学校门那一刻起,去上海bilibili工作就在心里埋下了种子。在学校,专业学的挺好的,自己写过一些小项目,也参与过一些协会开发的项目。
两年前刚毕业时候,b站也有校招,我当然满怀期待的参加了,但是并没有被录用。当时,挺失落的吧,当时也有想过放弃:我一个渣渣二本毕业,凭什么去上海,进b站啊。所以就找了个普普通通的公司开始了我的程序员生涯。
到今年年初的时候,疫情爆发了,各行业都收到的很大的影响,也包括我任职的小公司。在家隔离了一个多月,在家玩手机的看到了b站的社招,人闲下来的时候还真就会有各种想法会冒出来,我突然就想到,要不再试一次吧,反正工作也没了,在家闲着也是闲着,就着手准备bilibili的面试。刷面试题,看别人的面经,总结了一下校招时的失败经验…准备了挺久的,得有20多天吧,把学习所学的和工作两年的所学以及网友的经验,系统的梳理、巩固。世间所有的付出终是有回报的,努力的耕耘,肯定是有收获的。我成功的入职了bilibili,也是要感谢网友们提供的宝贵经验,所以整理了一下,把我的面经分享出来给大家。

在开始回答前,先简单概括性地说说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开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

Android学习PDF+学习视频+面试文档+知识点笔记

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

mg-jAvbU1it-1615803323510)]

【Android高级架构视频学习资源】

android必备软件!移动APP开发框架盘点,已拿到offer相关推荐

  1. 成为一名合格Android架构师,移动APP开发框架盘点,面试资料分享

    缘起 经过近十年的发展,Android技术优化日新月异,如今Android 10.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS.到了各大厂商手里,改源码.自定义系统, ...

  2. 安卓前端开发!移动APP开发框架盘点,附带学习经验

    关于Android的近况 大家都知道,今年移动开发不那么火热了,完全没有了前两年Android开发那种火热的势头,如此同时,AI热火朝天,很多言论都说Android不行了.其实不光是Android,i ...

  3. suunto android 跑步软件,SUUNTO APP | 自定义运动模式教程

    原标题:SUUNTO APP | 自定义运动模式教程 SUUNTO腕表本身搭载了大量预设的运动模式, 使您的腕表在运动时,实时显示最相关的数据. 现在除了腕表本身预设的运动模式之外, 您可利用 SUU ...

  4. android必备软件清单[]

    用来开发 用来拆包打包dex 用来分析dex 用来开发 Android Studio. genymotion Sublime(插件hex-viewer,) 用来拆包打包dex dex2jar jd-j ...

  5. android必备软件!零基础如何成为高级Android开发,薪资翻倍

    背景 本人双非渣本 今年由于疫情,上半年一直在家里.2月份本来无忧无虑,呆在家里不给国家添乱的时候,发现身边的同学找到了大厂的offer.心里开始有点慌张.本来想在3月份如果能回到学校,就开始考研之路 ...

  6. android钢琴软件和弦,‎App Store 上的“判断和弦以钢琴演奏 Piano Chord Judge”

    帮助您弹奏,创作歌曲和学习和弦! 我知道声音是什么,但是我不知道该叫什么和弦名称! 我试图做一首歌,但是和弦是什么? 这是在这种情况下可以使用的应用程序. Nyanyan 按钢琴上的键判断和弦.还有一 ...

  7. android平板自带软件,新人看过来 安卓平板装机必备软件推荐

    1平板与PC的桥梁:豌豆荚.91 [PConline 应用]前几天我们为大家简单对比介绍了一下不同第三方安卓电子市场之间的差异.如今,安卓平板已经到手,也知道哪些电子市场好了,开始疯狂装软件呗.停!急 ...

  8. android平板 跑分软件,新人看过来 安卓平板装机必备软件推荐

    1平板与PC的桥梁:豌豆荚.91 [PConline 应用]前几天我们为大家简单对比介绍了一下不同第三方安卓电子市场之间的差异.如今,安卓平板已经到手,也知道哪些电子市场好了,开始疯狂装软件呗.停!急 ...

  9. android开发2021,2021年高校邦Android手机软件快速开发App Inventor【2021秋】满分答案...

    2021年高校邦Android手机软件快速开发App Inventor[2021秋]满分答案 更多相关问题 <模仿:西方文学中的现实的再现>作者是:A.霍布斯B.阿多诺C.奥尔巴赫D.米勒 ...

最新文章

  1. 更快更强,谷歌提出SWideRNet:全景分割新标杆来啦!
  2. ubuntu18.04 更改apt源
  3. 在unity调用WebService的接口方法
  4. metadata usage in the runtime
  5. Debian on VirtualBox下共享win7文件夹设置
  6. mongodb 如何删除 字段值为 json对象中的某个字段值
  7. 怎样恢复计算机管理员身份,电脑高手必备:2招教你找回Windows管理员权限?
  8. Leetcode算法题(C语言)1
  9. Python -- 大小写转换
  10. html修改访问量txt,哪位大佬帮我改一下JS谢谢,txt改html网页直接显示的,感激不尽,现在的源码只能看......
  11. 用友t3服务器系统管理软件,T3用友通系统管理常见问题及解决方案
  12. thinkphp 3.1.3 php版本,ThinkPHP
  13. 社交媒体视频字幕AE模板 Podcast Badges for After Effects
  14. excel隐藏的选项卡和命令栏怎么找回?
  15. 温故知新(九一)什么是抽象语法树,有哪些用途
  16. [转贴]李雅轩杨式太极拳精论
  17. 垃圾邮件分类(trec06c数据集)特征分词、特征向量化、模型训练
  18. 锐取录播服务器咋样进系统界面,锐取录播系统
  19. 笨方法学Python 练习16
  20. 用navicat对比两个数据库表结构

热门文章

  1. h3c linux驱动 wn612_H3C iNode智能客户端安装指导(Linux)-7.3-5PW102
  2. Spring的Factories机制介绍
  3. 笔记19 | 利用MediaRecorder实现录像
  4. 替换输入的密码为星号【C语言】
  5. 什么是目视化管理?目视化管理都用在哪些行业?
  6. C编译问题: declaration is incompatible with previous FuncName (declared at line XXX)
  7. js跳转到指定url
  8. CSS与JS结合制作钟表
  9. 阿里大于 DEMO(java)
  10. 什么?财务也要软件测试?