Android面试题——高级开发面试题一
一 面试题概述
- 请简单的分析一下Android系统启动流程的原理?
- App启动状态有哪几种,各自的启动流程是怎么样的?
- 当项目中遇到黑白屏问题,你有什么好的解决方案?
- 如何查看方法内的耗时时间与方法分析?
- 介绍一下AMS加载Applicaton流程?
- 启动过程中有那几个问题需要处理?
- 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"
这个属性,查看属性下的内容,就能知道是黑屏还是白屏,这个属性就是设置预览窗口的背景。
如何解决黑白屏
- theme下面的
android:windowIsTranslucent
属性 - 启动activity的theme设置启动图片
2.4 如何查看方法内的耗时时间与方法分析?
借助于Android自带的分析工具:
- Traceview
- 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(一)-窗口管理
Android面试题——高级开发面试题一相关推荐
- 耗时118天爆肝【1296页】的“Android高级开发面试题”,终于成功上岸字节
前言 本人16年毕业于一家普通二本,考研裂开了且没有实习经验,只做过两个项目,每天就是不断地投简历.刷面经,感觉自己都要抑郁了,最后勉强进入了一家学校合作的互联网公司,后面陆陆续续也换了几家公司,毕业 ...
- Android-Notes|BottomNavigationView-爱上-Lottie,android高级开发面试题
} 复制代码 封装个 BasicData,存放 App 内置的一些基本数据,这里主要针对 Lottie 文件: val mNavigationAnimationList = arrayListOf( ...
- 用友java面试题_用友网络科技Java高级开发面试题(2019)
面试岗位:Java高级开发 面试形式:电话面试 这些天在boss上逛了下,看见北京Java开发工资比较诱人,便萌生了去北京的想法,做一名北漂的程序猿.约了几家面试,由于是异地,当然优先电话面了.本篇记 ...
- python高级开发面试题_python面试的100题(16)
Python高级 元类 42.Python中类方法.类实例方法.静态方法有何区别? 类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对 ...
- 高级开发面试题,朋友给的,怕忘了
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...
- java高级开发面试题
1,java堆,分新生代老年代,新生代有Eden,from surviver,to surviver三个空间,堆被所有线程共.eden内存不足时,发生一次minor GC,会把from survivo ...
- Java高级开发面试题整理
一.并发编程 1.什么是进程和线程? 进程是指程序的一次执行过程,是系统运行程序的基本单位,系统运行一个程序就是一个进程创建.运行.到销毁的过程:一个进程可以有多个线程.比如我跑一个java的main ...
- 某公司.Net高级开发面试题(1)
1.将字符串转换成时间类型,有几种方式?有什么注意事项? Convert.ToDateTime(string) Convert.ToDateTime(string, IFormatProvider) ...
- 2022高级JAVA开发面试题精选
面试过程是一个由浅入深的过程,面试官先给求职者抛出一个相对简单的问题,然后通过一环套一环的追问深入考察求职者对知识点的理解掌握程度. 如下是一个实际的关于redis知识点的面试场景: 面试官:你用过r ...
最新文章
- libtorch 调用pytorch模型
- 自己挖的坑自己填--docker创建实例出现Waiting for SSH to be available…
- Flutter实战之(Clubhouse App)
- replaceAll
- Mysql ERROR 1067: Invalid default value for ‘auth_time‘
- mongodb服务部署
- 673. 最长递增子序列的个数
- Asterisk标准通道变量
- 算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历
- JVM虚拟机-Class文件之字段表集合
- gfdmp和mysql,《高性能MySQL》读书笔记--锁、事务、隔离级别
- CF 246E. Blood Cousins Return [dsu on tree STL]
- php 快速路由,基于FastRoute的快速路由(支持RESTful)
- 他面前有一个人,有一把刀
- P3649 [APIO2014]回文串
- java爱心效果代码来了
- Python模拟登陆古诗文网手动输入验证码显示验证码错误
- 计算机顶级会议Rankings 英文投稿的一点经验
- 全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项
- MFC-CListCtrl重绘,添加按钮到单元格
热门文章
- Photoshop CS2 视频教程-PS涂抹工具(转)
- 北醒TF-mini激光雷达实现定位
- Arduino ESP32 flash数据存储结构
- 38. DDR2内存初始化代码分析-1
- 计算机网络原理总结(英文版 第五版) Chapter1
- springboot中使用@ConfigurationProperties(prefix = “xxx“) 取值为空问题
- EmEditor如何取消开机自启
- 从零搭建仿抖音短视频APP-后端开发短视频业务模块(1)
- 如何构建基于Python的星座脚本
- 模型预测控制在路径规划中的应用