前言
感概一下最近的Android面试情况,因为快临近金九银十,能约到的面试也是越来越多,但是有不少小伙伴也提到了一个问题:“目前Android的面试基本上都会被问到Framework,让不少人苦不堪言"。
这个情况也是日积月累形成的,现在进军程序员的人太多了,公司有的挑,我们没得选,那么公司肯定需要更好更强的员工,而Framework不但是一个很好的检测手段,也能提前为公司招一批底层系统开发程序员。
提到正事,先挂出最近小伙伴给我发的问题
ActivityManagerService是什么?什么时候初始化的?有什么作用
ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。ActivityManagerService进行初始化的时机很明确就是在 SystemServer进程开启的时候,就会初始化ActivityManagerService。
(系统启动流程)
如果打开一个App的话,需要AMS去通知zygote进程
所有的Activity的生命周期AMS来控制
ActivityThread是什么?ApplicationThread是什么?他们的区别
ActivityThread
在Android中它就代表了Android的主线程它是创建完新进程之后,main函数被加载,然后执行一个loop的循 环
使当前线程进入消息循环,并且作为主线程
ApplicationThread
ApplicationThread是 ActivityThread的内部类是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端的请求然后进行处理,最大的client就是AMS.
Instrumentation是什么?和ActivityThread是什么关系?
AMS与ActivityThread之间诸如Activity的创建、暂停等的交互工作实际上是由Instrumentation具体操作的。
每个Activity都持有一个Instrumentation对象的一个引用,整个进程中是只有一个Instrumentation。
mInstrumentation的 初始化在 ActivityThread:: handleBindApplication函数可以用来独立地控制某个组件的生命周期。
“startActivity会调用’mInstrumentation .execStartActivity0 ; mInstrumentation 掉Activity的startActivity 方法用AMS,AMS 通过 socket 通信告知 Zygote 进程 fork 子进程
ActivityManagerService和zygote进程通信是如何实现的
应 用启动时,Launcher进程请求AMS。
AMS发送创建应用进程请求 ,Zygote进程接受请求并fork应
用进程 客户端发送请求
调 用 Process.start() 方法新建进程
连 接 调 用 的 是
ZygoteState.connect()
方 法
, ZygoteState 是
ZygoteProcess 的 内 部 类 。
ZygoteState里 用 的 LocalSocket
public static ZygoteState connect( LocalSocketAddress address)
throws IOException {
DataInputStream zygoteInputStream = null ;
BufferedWriter zygoteWriter =
null;
final LocalSocket zygoteSocket = new LocalSocket( ) ;
try {
zygoteSocket .connect(address);
zygoteInputStream = new DataInputStream(zygoteSocket .getInputStream()) ;
zygoteWriter =
new BufferedWriter( new OutputStreamWriter(
zygoteSocket .getOutputStream()) , 256) ;
} catch (IOException ex) {
try {
zygoteSocket .close() ;
} catch (IOException ignore) {
}throw ex ;
}
return new ZygoteState(zygoteSocket , zygoteInputStream , zygoteWriter ,
Arrays .asList(abiListString .split(","))) ;
}
Zygote 处理客户端请求
Zygote 服 务 端 接 收 到 参 数 之 后 调 用
ZygoteConnection.processOneCommand()
处 理 参 数
,并fork 进 程 最 后 通 过 fifindStaticMain() 找 到
ActivityThread 类 的main() 方 法并 执 行, 子进 程就 启动 了
这里这是选出了几个问题 回答。更多更全面的Framework 面试题解析可以扫描下方二维码
## 《Andrio Framework面试题解析合集》●系统启动流程面试题解析
●Binder面试题解析
●Handler面试题解析
●AMS面试题解析