搞懂Android应用启动过程,再也不怕面试官了( 三 )


//ProcessState.cpp//一次Binder通信最大可以传输的大小是 1MB-4KB*2#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)//binder驱动的文件描述符fd被限制了最大线程数15#define DEFAULT_MAX_BINDER_THREADS 15我们看下binder线程PoolThread长啥样:
class PoolThread : public Thread {public:explicit PoolThread(bool isMain): mIsMain(isMain){}protected:virtual bool threadLoop(){//把binder线程注册进binder驱动程序的线程池中IPCThreadState::self()->joinThreadPool(mIsMain);return false;}const bool mIsMain;}; 来到IPCThreadState.cpp:
//IPCThreadState.cppvoid IPCThreadState::joinThreadPool(bool isMain){//向binder驱动写数据:进入死循环mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);status_t result;do {//进入死循环,等待指令的到来result = getAndExecuteCommand();} while (result != -ECONNREFUSED && result != -EBADF);//向binder驱动写数据:退出死循环mOut.writeInt32(BC_EXIT_LOOPER);}status_t IPCThreadState::getAndExecuteCommand(){//从binder驱动读数据,得到指令cmd = mIn.readInt32();//执行指令result = executeCommand(cmd);return result;} 梳理一下binder的启动过程:

  1. 打开binder驱动
  2. 映射内存,分配缓冲区
  3. 运行binder线程,进入死循环,等待指令
总结综上,Android应用进程的启动可以总结成以下步骤:
  1. 点击Launcher桌面的App图标
  2. AMS发起socket请求
  3. Zygote进程接收请求并处理参数
  4. Zygote进程fork出应用进程,应用进程继承得到虚拟机实例
  5. 应用进程启动binder线程池、运行ActivityThread类的main函数、启动Looper循环
完整流程图:
搞懂Android应用启动过程,再也不怕面试官了

文章插图
 
面试前的知识梳理,储备提升自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的 。
关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
  • 微信小程序:小程序介绍+UI开发+API操作+微信对接
  • Hybrid 开发与Flutter:html5项目实战+Flutter进阶

搞懂Android应用启动过程,再也不怕面试官了

文章插图
 
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结 。
搞懂Android应用启动过程,再也不怕面试官了

文章插图
《507页Android开发相关源码解析》

搞懂Android应用启动过程,再也不怕面试官了

文章插图
《379页Android开发面试宝典》
3.项目复盘
实际上,面试的一二轮所问到的技术问题,很多都是围绕着你的项目展开,因此在面试前最后要做好的一件事情就是项目复盘 。关于项目复盘,我个人的思路如下,可供参考:
  • 你在这个项目中承担了什么样的角色?
  • 这个项目的背景是什么,如果是技术项目,为什么要做?
  • 有哪些技术难点,是怎么解决的,是否还有更好的方案?
  • 你认为项目中是否有可以改进的点?
  • 这个项目解决了什么问题,最好用数据说话,这个数据又是怎么得出来的?
提前把思路捋一捋,上面这些问题好好思考或准备一下,做到心中有谱以后,自然能够面试官聊得融洽,保持一个好的心态,通过的几率就会更大一些 。
以上文章中的资料,均可以免费分享给大家来学习,
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图;




推荐阅读