Android面试题——高级开发面试题一

一 面试题概述

  1. 请简单的分析一下Android系统启动流程的原理?
  2. App启动状态有哪几种,各自的启动流程是怎么样的?
  3. 当项目中遇到黑白屏问题,你有什么好的解决方案?
  4. 如何查看方法内的耗时时间与方法分析?
  5. 介绍一下AMS加载Applicaton流程?
  6. 启动过程中有那几个问题需要处理?
  7. WMS管理UI的流程对启动优化的意义什么?

二 面试题解答

2.1 请简单的分析一下Android系统启动流程的原理?

过程简化分析:

  • BootLoader:接通电源后,Boot ROM加载BootLoader到RAM
  • Linux kernel:Linux内核负责初始化各种软硬件环境,加载驱动程序,挂载根文件系统等
  • init进程:在init进程中,挂载虚拟文件系统、启动property服务、当然更重要的是包括了启动的各种系统服务:serviceManager、adbd、mediasever、zygote、bootanmation等。
  • zygote进程:zygote进程是Android系统最重要的进程之一。后续Android中的应用进程都是由zygote进程fork出来的。因此,zygote是Android系统所有应用进程的父进程
  • systemServer进程:SystemServer进程,被称为系统服务进程,属于Android framework层的源码实现,通过android studio打开SystemServer.java,能够看到其中声明了大量的android的系统服务
  • launcher的启动:就是laucher程序的启动的入口函数
  • BootAnimation退出:Launcher启动完成之后,开机动画会进行出,这样给用户的体验就是开机后,就直接进入到桌面了

启动架构图:

2.2 App启动状态有哪几种,各自的启动流程是怎么样的?

APP启动状态

  • 冷启动:App进程创建
  • 热启动:Activity已创建,从后台到前台
  • 温启动:App进程存在,但Activity结束

各自启动流程

冷启动

系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP,此时,APP的启动将经历两个阶段:

第一阶段:

  • 加载并启动app;
  • app启动后,第一时间为app显示一个空白的window;
  • 创建app进程

第二阶段:

  • 系统一旦创建了app进程,app进程就要负责做以下的任务:

创建app对象

  • 启动主进程ActivityThread;
  • 创建MainActivity;
  • 渲染视图;
  • 执行onLayout;
  • 执行onDraw
  • 完成第一次绘制后,把mainActivity替换已经展示的BackgroundWindow,即空白window。

热启动

  • 当我们按了Home键或其它情况app被切换到后台,再次启动app的过程。
  • 热启动时,系统将activity带回前台。如果应用程序的所有activity存在内存中,则应用程序可以避免重复对象初始化、渲染、绘制操作
  • 如果由于内存不足导致对象被回收,则需要在热启动时重建对象,此时与冷启动时将界面显示到手机屏幕上一样。

温启动

温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。

温启动有很多场景,例如:

  • 用户按连续按返回退出了app,然后重新启动app;
  • 由于系统收回了app的内存,然后重新启动app。

2.3 当项目中遇到黑白屏问题,你有什么好的解决方案?

为什么会有黑白屏

在桌面点击应用图标后,在app进程没有创建的情况下,需要时间创建app进程,初始化资源,以及启动首页Activity的(这里讨论的首页是指AndroidManifest里面标志的启动页),这就意味点击图标不能马上看到启动页。为了不让用户有卡顿的感觉,谷歌有了Preview Window,在启动页没有绘制完成时,会先初始化一个Window,我们通常看到的黑屏或白屏,就是这个预览窗口。

怎么知道是黑屏还是白屏?

查看这个AppTheme,找到name="android:windowBackground"这个属性,查看属性下的内容,就能知道是黑屏还是白屏,这个属性就是设置预览窗口的背景。

如何解决黑白屏

  1. theme下面的android:windowIsTranslucent属性
  2. 启动activity的theme设置启动图片

2.4 如何查看方法内的耗时时间与方法分析?

借助于Android自带的分析工具:

Traceview

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Android Traceview是Android开发中的性能分析工具,
它可以用来分析Android应用程序的性能,特别是在CPU和内存方面。
Traceview提供了一个可视化的界面,可以查看应用程序在运行过程中各个方法的调用情况、执行时间、CPU占用率等信息。

使用Traceview进行性能分析通常包括以下步骤:

1-收集跟踪数据:通过在应用程序中插入跟踪代码或者使用命令行工具,收集应用程序的运行数据。
2-导出跟踪数据:将收集到的跟踪数据导出到Traceview格式文件。
3-打开Traceview:使用Android Studio或者其他兼容的工具打开Traceview文件。
4-分析跟踪数据:在Traceview中,你可以查看方法调用树、方法执行时间、CPU占用率等信息,来了解应用程序的性能瓶颈。
5-优化性能:根据分析结果,进行相应的性能优化,比如减少方法调用次数、优化算法、减少内存占用等。

Traceview是Android开发中非常有用的工具,可以帮助开发者找出应用程序的性能问题,
并进行相应的优化,提高应用程序的性能和用户体验

systrace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Systrace是Android开发中用于系统级性能分析的工具,
它能够提供更全面的性能数据,包括CPU、内存、GPU、电源等方面的信息。
Systrace通过在设备上运行并收集数据,然后将数据可视化呈现,帮助开发者分析应用程序和系统之间的交互和性能问题。

使用Systrace进行性能分析通常包括以下步骤:

1-准备环境:确保你的开发环境已经设置好,包括连接到要分析的Android设备或模拟器,并且已经安装了必要的开发工具。
2-收集跟踪数据:运行Systrace工具,收集设备上的性能数据。
你可以通过命令行工具或者Android Studio中的"Android Profiler"工具来启动Systrace。
3-导出跟踪数据:将收集到的性能数据导出到Systrace格式文件。
4-打开Systrace:使用Chrome浏览器打开Systrace文件。
5-分析跟踪数据:在Systrace中,你可以查看各个系统组件和进程之间的交互情况、
CPU、内存、GPU等资源的使用情况,以及应用程序的执行时间线等信息。
6-优化性能:根据分析结果,进行相应的性能优化,比如减少CPU和内存的占用、优化GPU渲染、降低功耗等。

Systrace是一种强大的性能分析工具,可以帮助开发者发现应用程序和系统的性能问题,
并进行相应的优化,提高应用程序的性能和用户体验

2.5 介绍一下AMS加载Applicaton流程?

AMS: ActivityManagerService

AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。

ActivityManagerService启动

  • 创建AMS对象
  • 调用ams.setSystemProcess
  • 调用ams.installSystemProviders
  • 调用ams.systemReady

2.6 启动过程中有那几个问题需要处理?

2.7 WMS管理UI的流程对启动优化的意义什么?

WMS窗口管理

三 参考

  • CSDN—Android系统启动流程分析
  • CSDN—App三种启动场景:冷启动、热启动、温启动
  • 简书—启动速度与执行效率优化项目实战(二):启动黑白屏解决
  • 微信公众号—让你的Android应用快速定位耗时方法
  • 简书—详解AMS启动流程
  • 简书—Android之AMS介绍
  • 知乎—Framework之简单上手AMS启动流程
  • 简书—Android App启动优化
  • Android 的窗口管理系统 (View, Canvas, WindowManager)
  • 简书—Android WMS窗口管理
  • 简书—Android WMS窗口管理(二)
  • 简书—Android WMS(一)-窗口管理