不断学习,做更好的自己!💪
Android 进阶中重点考察 Android Framework
、性能优化和第三方框架。
1. Binder
Binder的介绍?与其他IPC方式的优缺点?
Binder是Android中特有的IPC方式,引用《Android开发艺术探索》中的话(略有改动):
从IPC角度来说,Binder是Android中的一种跨进程通信方式;Binder还可以理解为虚拟的物理设备,它的设备驱动是/dev/binder;从Android Framework来讲,Binder是Service Manager连接各种Manager和对应的ManagerService的桥梁。从面向对象和CS模型来讲,Client通过Binder和远程的Server进行通讯。
基于Binder,Android还实现了其他的IPC方式,比如AIDL、Messenger和ContentProvider。
与其他IPC比较:
效率高:除了内存共享外,其他IPC都需要进行两次数据拷贝,而因为Binder使用内存映射的关系,仅需要一次数据拷贝。
安全性好:接收方可以从数据包中获取发送发的进程Id和用户Id,方便验证发送方的身份,其他IPC想要实验只能够主动存入,但是这有可能在发送的过程中被修改。
Binder 的通信过程?Binder 的原理?
原理:
Binder的结构:
Client:服务的请求方。
Server:服务的提供方。
Service Manager:为Server提供Binder的注册服务,为Client提供Binder的查询服务,Server、Client和Service Manager的通讯都是通过Binder。
Binder驱动:负责Binder通信机制的建立,提供一系列底层支持。
从上图中,Binder通信的过程是这样的:
- Server在Service Manager中注册:Server进程在创建的时候,也会创建对应的Binder实体,如果要提供服务给Client,就必须为Binder实体注册一个名字。
- Client通过Service Manager获取服务:Client知道服务中Binder实体的名字后,通过名字从Service Manager获取Binder实体的引用。
- Client使用服务与Server进行通信:Client通过调用Binder实体与Server进行通信。
更详细一点?
Binder通信的实质是利用内存映射,将用户进程的内存地址和内核的内存地址映射为同一块物理地址,也就是说他们使用的同一块物理空间,每次创建Binder的时候大概分配128的空间。数据进行传输的时候,从这个内存空间分配一点,用完了再释放即可。
2. 序列化
Android 有哪些序列化方式?
为了解决 Android 中内存序列化速度过慢的问题,Android 使用了 Parcelable。
3. Framework
Zygote 孕育进程过程?
Activity 的启动过程?
建议阅读:
《3分钟看懂Activity启动流程》
App 的启动过程?
介绍一下App进程和System Server进程如何联系:
-
ActivityThread
:依赖于Ui
线程,实际处理与AMS
中交互的工作。 -
ActivityManagerService
:负责Activity
、Service
等的生命周期工作。 -
ApplicationThread
:System Server
进程中ApplicatonThreadProxy
的服务端,帮助System Server
进程- 跟App
进程交流。 -
System Server
:Android
核心的进程,掌管着Android
系统中各种重要的服务。
具体过程: - 用户点击
App
图标,Lanuacher
进程通过Binder
联系到System Server
进程发起startActivity
。 -
System Server
通过Socket
联系到Zygote
,fork
出一个新的App
进程。 - 创建出一个新的
App
进程以后,Zygote
启动App
进程的ActivityThread#main()
方法。 - 在
ActivtiyThread
中,调用AMS
进行ApplicationThread
的绑定。 -
AMS
发送创建Application
的消息给ApplicationThread
,进而转交给ActivityThread
中的H
,它是一个Handler
,接着进行Application
的创建工作。 -
AMS
以同样的方式创建Activity
,接着就是大家熟悉的创建Activity
的工作了。
Apk 的安装过程?
建议阅读:
Activity 启动过程跟 Window 的关系?
建议阅读:
《简析Window、Activity、DecorView以及ViewRoot之间的错综关系》
Activity、Window、ViewRoot和DecorView之间的关系?
建议阅读:
4. Context
关于 Context 的理解?
建议阅读:
《Android Context 上下文 你必须知道的一切》
5. 断点续传
多线程断点续传?
基础知识:
-
Http
基础:在Http
请求中,可以加入请求头Range
,下载指定区间的文件数。 -
RandomAccessFile
:支持随机访问,可以从指定位置进行数据的读写。
有了这个基础以后,思路就清晰了:
- 通过
HttpUrlConnection
获取文件长度。 - 自己分配好线程进行制定区间的文件数据的下载。
- 获取到数据流以后,使用
RandomAccessFile
进行指定位置的读写。
6. 性能优化
平时做了哪些性能优化?
建议阅读:
7. 第三方库
一定要在熟练使用后再去查看原理。
Glide
Glide考察的频率挺高的,常见的问题有:
- Glide和其他图片加载框架的比较?
- 如何设计一个图片加载框架?
- Glide缓存实现机制?
- Glide如何处理生命周期?
…
建议阅读:
《Glide最全解析》《面试官:简历上最好不要写Glide,不是问源码那么简单》
OkHttp
OkHttp常见知识点:
- 责任链模式
- interceptors和networkInterceptors的区别?
建议看一遍源码,过程并不复杂。
Retrofit
Retrofit常见问题:
- 设计模式和封层解耦的理念
- 动态代理
建议看一遍源码,过程并不复杂。