Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第1张图片
我们为什么需要学习掌握Framework?

解决问题:开发遇到Bug,报读不到,而你不懂框架里面的黑盒机制?
学习设计:项目代码想到哪写到哪,每次迭代就是一场轮回?你不想知道Android这么庞大的源码体系是怎么设计的吗?
知识实践:学完就忘,不会使用,面试解析+源码结合,通过Framework学习知识点的使用。
面试需要:Framework不熟练,又是回家等通知?

在Android面试中,关于 Framework 的问题是必备的,但是这些关于字节跳动 Framework 的高频面试题你都掌握了吗?

接下来分享一份字节跳动的Android Framework 高频面试题总结:

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第2张图片
字节跳动Android Framework 高频面试题详细总结

一、AMS 、PMS

  • AMS 概述

AMS 是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管 理都需要 AMS 的支持。从这里可以看出 AMS 的功能会十分的繁多,当然它并不 是一个类承担这个重责,它有一些关联类,这在文章后面会讲到。

  • AMS 的启动流程
  • AMS 与进程启动
  • AMS 家族
  • PMS 之 SyetemServer 处理部分
  • PMS 构造方法

开始阶段、扫描系统阶段、扫描 Data 分区阶段、扫描结束阶段、准备阶段、

二、Activity 启动流程,App 启动流程

Activity 的启动模式

1.standard:默认标准模式,每启动一个都会创建一个实例,
2.singleTop:栈顶复用,如果在栈顶就调用 onNewIntent 复用,从 onResume()开始
3.singleTask:栈内复用,本栈内只要用该类型 Activity 就会将其顶部的 activity 出栈
4.singleInstance:单例模式,除了 3 中特性,系统会单独给该 Activity 创建一个栈

1.什么是 Zygote 进程

Zygote 进程是所有的 android 进程的父进程,包括 SystemServer 和各种应用进程都 是通过 Zygote 进程 fork 出来的。Zygote(孵化)进程相当于是 android 系统的根进程, 后面所有的进程都是通过这个进程 fork 出来的。

虽然 Zygote 进程相当于 Android 系统的根进程,但是事实上它也是由 Linux 系统的 init 进程启动的。

2.Zygote 进程的启动流程

  • 源码位置
  • ZygoteInit 类的 main 方法
  • registerZygoteSocket(socketName)分析
  • preLoad()方法分析
  • startSystemServer()启动进程

3.SystemServer 进程启动流程

SystemServer 进 程 主 要 的 作 用 是 在 这 个 进 程 中 启 动 各 种 系 统 服 务 , 比 如 ActivityManagerService,PackageManagerService,WindowManagerService 服务,以 及各种系统性的服务其实都是在 SystemServer 进程中启动的,而当我们的应用需要使 用各种系统服务的时候其实也是通过与 SystemServer 进程通讯获取各种服务对象的句 柄的。

  • SystemServer 的 main 方法
  • 查看 run 方法
  • run 方法中 createSystemContext()解析
  • mSystemServiceManager 的创建

4.启动服务

  • 启动哪些服务:在开始执行启动服务之前总是会先尝试通过 socket 方式连接 Zygote 进程,在成功 连接之后才会开始启动其他服务。

  • 启动服务流程源码分析

  • 启动部分服务

三、Binder 机制(IPC、AIDL 的使用)

1、什么是 AIDL 以及如何使用(★★★★)

①aidl 是 Android interface definition Language 的英文缩写,意思 Android 接口定义语言。
②使用 aidl 可以帮助我们发布以及调用远程服务,实现跨进程通信。
③将服务的 aidl 放到对应的 src 目录,工程的 gen 目录会生成相应的接口类
......

2、AIDL 的全称是什么?如何工作?能处理哪些类型的数 据?(★★★)

AIDL 全称 Android Interface Definition Language(AndRoid 接口描述语 言) 是一种接口描述语言; 编译器可以通过 aidl 文件生成一段代码,通过预先 定义的接口达到两个进程内部通信进程跨界对象访问的目的。需要完成2件事情: 1. 引入 AIDL 的相关类.; 2. 调用 aidl 产生的 class.理论上, 参数可以传递基本数 据类型和 String, 还有就是 Bundle 的派生类, 不过在 Eclipse 中,目前的 ADT 不 支持 Bundle 做为参数。

3.android 的 IPC 通信方式,线程(进程间)通信机制有哪些?

1)ipc 通信方式:binder、contentprovider、socket
2)操作系统进程通讯方式:共享内存、socket、管道

4.为什么使用 Parcelable,好处是什 么?

简单来说,Parcelable 是一个 interface,有一个方法 writeToParcel(Parcel dest, int flags),该方法接收两个参数,其中第一个参数类型是 Parcel。看起来 Parcelable 好像是 对 Parcelable 的一种包装,从实际开发中,会在方法 writeToParcel 中调用 Parcel 的某 些方法,完成将对象写入 Parcelable 的过程。

........

5. Android 图像显示相关流程,Vsync 信号等

1)没有使用 Vsync 的情况

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第3张图片

2)有 Vsync 的情况

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第4张图片

3)双重缓冲

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第5张图片

4)三重缓冲

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第6张图片

BATJ 大牛笔记Android Framework 内核解析

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

目录

章节部分内容展示:

那位BATJ 的大佬是这个方面的专家,他整理出来的这份资料一共有452页,都是他根据自己的工作实战经验,把Android Framework 内核解析精编出来的劳动成果,那份资料火爆全网,但是现在开放下载了!

文章内容比较长,一篇文章写不完,为了不影响大家的阅读体验,下面只以截图的方式进行部分内容的展示。

大家可以看一下有没有自己需要或者感兴趣的点,方便对自己的知识体系进行查漏补缺。

第一节 Binder 系列—开篇

一、概述
二、 Binder
三、 提纲
四. 源码目录

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第7张图片

第二节 Binder Driver 初探

一、Binder 驱动概述
二、 Binder 核心方法
三、附录

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第8张图片

第三节 Binder Driver 再探

一、Binder 通信简述
二、Binder 通信协议
三. 场景总结
四、Binder 内存机制

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第9张图片

第四节 Binder 启动 ServiceManager

一. 概述
二. 启动过程
三. 核心工作
四. 总结

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第10张图片

第五节获取 ServiceManager

一. 概述
二. 获取 ProcessState 对象
三. 获取 BpBinder 对象
四. 获取 BpServiceManager
五. 总结

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第11张图片

Android Framework 精编内核解析预览图

第六节注册服务(addService)
第七节获取服务(getService)
第八节 framework 层分析
第九节如何使用 Binder
第十节如何使用 AIDL
第十一节 Binder 总结
第十二节 Binder 面试题全解析

Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结_第12张图片

最后,面试前还该准备哪些资源复习?

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一下我面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《Android开发七大模块核心知识笔记》

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,以上资源均免费分享,以上内容均放在了开源项目:github 中已收录,大家可以自行获取(或者关注主页扫描加微信获取)。

你可能感兴趣的:(Android庞大的源码体系是怎么设计的?2020字节跳动Framework 高频面试题详细总结)