缘起
对于大多数 Android 开发工程师来说,掌握Android Framework 一定是一个不光要熟练而且还要精通的技能。
在刚刚过去的金九银十,我受邀帮一家独角兽公司面试,他们希望我帮忙给目前正在招聘的高级 Android 工程师岗位做一些技术面试。我一般会准备下面几个面试题进行提问:
- 1.Android中多进程通信的方式有哪些?
- 2.进程通信你用过哪些?原理是什么?(字节跳动、小米)
- 3.描述下Binder机制原理?(东方头条)
- 4.Binder线程池的工作过程是什么样?(东方头条)
- 5.Handler怎么进行线程通信,原理是什么?(东方头条)
- 6.Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)
- 7.handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)
- 8.handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么?(字节跳动、小米)
- 9.Handler的sendMessage和postDelay的区别?(字节跳动)
- 10.IdleHandler是什么?怎么使用,能解决什么问题?
- 11.为什么Looper.loop不阻塞主线程?(腾讯)
- 12.Looper无限循环为啥没有ANR(B站)
- 13.Looper如何在子线程中创建?(字节跳动、小米)
- 14.Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)
- 15.如何更新UI,为什么子线程不能更新UI?(美团)
- 16.ThreadLocal的原理,以及在Looper是如何应用的?(字节跳动、小米)
- 17.Android 有哪些存储数据的方式?
- 18.SharedPreference原理,commit与apply的区别是什么?使用时需要有哪些注意?(腾讯)
- 19.如何判断一个 APP 在前台还是后台?
- 20.如何做应用保活?
- 21.一张图片100x100在内存中的大小?(字节跳动)
- 22.Intent的原理,作用,可以传递哪些类型的参数?
然后我再扩展到和这些知识点相关的更深层次的知识点细节,直到问的你答不上来为止,以此来探寻你的技术边际,这样就能更深入地了解你的技术能力。
好吧,这些问题相信很多面试者都遇到过,但我面试的结果却表明Android Framework框架层原理的掌握并没有到人尽皆知的境地。不过也好,这些问题就可以很容易区分出面试者是否对Android开发真的还有热情。
经常有网友给我留言,询问我Android Framework如何学习的问题。
如果非要总结Framework学习中的问题,大家遇到的困惑无非是这些方面:
- 1.开发遇到Bug,百度不到,而你不懂框架里面的黑盒机制
- 2.项目代码想到哪写到哪,每次迭代就是一场轮回?你不想知道Android这么庞大的源码体系是怎么设计的?
- 3.学完就忘,不会使用,原理结合实战通过Framework学习知识点的使用。
Android Framework重要性
Android Framework 开发虽然比较偏底层,圈子窄,但是能掌握一些原理的东西,可以触类旁通,往应用层发展也可以,接下来我们看看Framework知识有多重要。举几个栗子,你或许就能清楚了。
像掉帧监控,函数插装,慢函数检测,ANR 监控,启动监控,都需要对 Framework 有比较深入的了解,才能知道怎么去做监控,利用什么机制去监控,函数插桩插到哪里,反射调用该反射哪个类哪个方法哪个属性……
目前大公司的app开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在Android Framework系统框架底层原理实现之上。
分享读者
笔者2011年校招加入三星从事Android开发,三星走下坡路后,跳槽去过小米,OPPO等大厂,19年5月份进了腾讯一直到现在。 被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
**这里给大家分享一份由腾讯技术团队出品的《Android Framework 开发揭秘》总共有19万字,包含109个知识点,通过经典Binder、Handler、AMS等面试题解析加深你对Android Framework框架层的理解。
完整《Android Framework 开发揭秘》学习笔记pdf免费分享,需要的朋友可以【点击这里直达免费获取方式】
如何学习Android Framework
- 1.系统启动流程分析 众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,下图所示为 Android 平台的主要组件。
Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。
此外还需要学习和掌握int进程。 init进程是Android系统中及其重要的第一个进程,init进程通常会做到以下几点。
- 创建和挂载启动所需要的文件目录
- 初始化和启动属***
- 解析init.rc配置文件并启动Zygote进程
init.rc是一个非常重要的配置文件,它是由Android初始化语言(Android Init Language)编写的脚本,这里也是需要重点掌握和学习的。 最后不得不提zgyote了,作为Android中的第一个art虚拟机,他通过socket的方式与其他进程进行通信。这里的“其他进程”其实主要是系统进程——SystemServer。因此重要性不言而喻。
- 2.Binder解析
Binder机制作为进程间通信的一种手段,基本上贯穿了andorid框架层的全部。所以首先必须要搞懂的Android Binder的基本通信机制。
首先我们要宏观认识Binder,从binder框架、binder涉及到的类、binder驱动整体层面去重新认识它。
接下来再从binder的jni方法注册、binder驱动、数据结构、启动service_manager、获取service_manager、addService流程等逐级进行学习。
- 3.深入解析Handler
Message 源码分析,再到MessageQueue 的源码分析,Looper 的源码分析,handler 的源码分析,Handler 机制实现原理,既是面试常考,又是工作必备技能。
- 4.深入解析AMS
Android系统非常庞大、错综复杂,其底层是采用Linux作为基底,上层采用包含虚拟机的Java层以及Native层, 通过系统调用(Syscall)连通系统的内核空间与用户空间。用户空间主要采用C++和Java代码,通过JNI技术打通用户空 间的Java层和Native层(C++/C),从而融为一体。 Google官方提供了一张经典的四层架构图,从下往上依次分为Linux内核、系统库和Android运行时环境、框架 层以及应用层这4层架构,其中每一层都包含大量的子模块或子系统。
- 5.深入解析 WindowManagerService 简称Wms,WindowManagerService管理窗口的创建、更新和删除,显示顺序等,是WindowManager这个管理接品的真正的实现类。它运行在System_server进程,作为服务端,客户端(应用程序)通过IPC调用和它进行交互。
- 6.PackagerManagerService PKMS 是什么东西?
PackageManagerService(简称 PKMS),是 Android 系统中核心服务之一,负责应用程序的安装**,卸载,**信息查询,等工作。
大佬云集、资料丰富
当初我在腾讯认识一个非常非常资深的前辈,他在腾讯十来年了,但因为各种原因级别不是很高。我当时问他,既然你对现状如此不满,为什么不想着离开寻找更好的机会呢?
他沉思了片刻跟我说,他说我现在在这里虽然待着不顺心,但是我接触到的人都是非常优秀的。我遇到问题,还可以和你们讨论讨论。我如果出去了,我要是再遇到问题,可能连一个讨论的人都没有。
我当时听听只是觉得有道理,现在再回想起来,感受非常深刻。三观、格局、能力,能够进入大公司的,这三个方面一般都不会太差。别的不说,就拿个人能力而言,我曾出国出差过几个月,有幸见识了许多各种海外名校的同事,和他们学习交流Android系统框架,这真的让我Android系统框架有了更深层次的认识。
除了优秀的同事之外,大公司里往往还有丰富的内部文档和资料。我当时在腾讯内部看到了很多优秀的文章,也有很多优秀的技术沙龙和分享。现在想起来两年下来,也没有去过几次,文章和资料看得也不算多,现在想想颇为遗憾。别的不说,就拿推荐领域而言,近些年质量不错的论文往往都来源于大公司尤其是国内的大公司,以腾讯、华为和头条为主。除了公开的论文,公司内部还有很多技术相关的资料和文档,这些真的可以说是有价无市,非常珍贵。
例如:《Android Framework 开发揭秘》
完整《Android Framework 开发揭秘》学习笔记pdf免费分享,需要的朋友可以【点击这里直达免费获取方式】
完整《Android Framework 开发揭秘》学习笔记pdf免费分享,需要的朋友可以【点击这里直达免费获取方式】