Android面试题最全攻略!

Posted 程序员入门进阶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试题最全攻略!相关的知识,希望对你有一定的参考价值。

这是安卓系列的第四个课题,面试相关。在这个册子里面,完成了一些经典问题的回答,以及一些建议,学习技巧。

Android 深入系统完全讲解(三)操作系统完全攻略 PDF

Android 深入系统完全讲解(二)音视频理解攻略 PDF

Android/安卓系统进阶5k字最全攻略~~

同时之前出了一个职场相关的电子册,现在在知乎不断有人在问,这个册子也是沉淀了多年,自身经历写出来的职场玩法,当前免费分享给大家。

这份册子送给大家,直接下载:

链接:https://pan.baidu.com/s/1wZM1AEDDQmz6vt2eC5MNMA

提取码:1234

今天我们来看下面试相关的话题,其他的后续我们再说,面试这个册子里面,我主要分享的内容是:

总计文字28888,给需要的朋友。

内容经过2周时间的筛选,校验,同时里面加入了大量的图表,方便大家理解,很多是以手绘的方式出现,目标只是这样子更好表达,也更高效一些。

以下是完整的内容,大家可以来看了。

1 面试到底面什么?

我辅导过几百个朋友的面试,也看每个人的简历,看完真的很头疼,头疼的点很简单,简历写的一塌糊涂,而面试也不知道侧重点,复习了一大堆。

导致的结果就是自信心降低,面试越面越没劲,一度崩溃。实际而言,简历很简单,只是大家忽略了一个角度,导致简历杂乱无章。

那么,面试到底在面什么?

我想先说一个故事,你追一个女孩,是不是投其所好?她喜欢什么,你买什么,是不是就更容易俘获芳心。把追女孩的心思,用在简历上,也是可以事半功倍的。

面试说白了就是,对方要什么,你有什么,两者的匹配度,匹配度越高,对方越兴奋,越容易录用你。就如同你追妹子,有文化,有涵养,有车,有房,女生越看越满意,不就顺势推倒了。

那么,面试看什么呢?我们来认真说下,主要就三点:

1 你的基础能力

2 专业能力

3 超预期的惊喜

基础能力指的是你的学校,专业成绩,以及有价值的获奖经历。专业能力指的是你跟公司匹配的本事,技术,专业知识是否扎实。超预期的惊喜,指的是当我们看到专业能力匹配的人才的时候,就剩一个要不要的时候,有专业之外的价值能力,那么就会让公司瞬间录用。

举例来讲就是你去买衣服,打折促销,降价品牌,平时看到都是899,今天去了一看双12促销,399,你在想要不要买,过去一看还赠199的化妆品,这个199的化妆品,就是促成成交的关键。

399还在犹豫的时候,199就直接乱了阵脚,管它这月在哪吃饭,吃一月泡面都值。这个199就是超预期的惊喜,找工作一样,要学会秀这些。

而关于简历如何调整,简历的一些常见问题,准备,训练营的朋友直接领取,其他朋友可以19元联系我,购买。辅导简历优化99元,语音指导,399元,感兴趣找明哥。

这一个册子的重心,放在安卓的面试题上面,我会选择经典的一些问题,帮助大家高效的复习,搞定面试这块。

2 Android系统框架是什么

android 是一种基于 Linux 的开放源代码软件栈,为各类设备和机型而创建。下图所示为

Android 平台的主要组件。

Linux 内核

Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。

使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。

硬件抽象层 (HAL)

硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。

Android Runtime

对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。

ART 的部分主要功能包括:

预先 (AOT) 和即时 (JIT) 编译

优化的垃圾回收 (GC)

在 Android 9(API 级别 28)及更高版本的系统中,支持将应用软件包中的 Dalvik Executable 格式 (DEX) 文件转换为更紧凑的机器代码。

更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置观察点以监控特定字段

在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。

Android 还包含一套核心运行时库,可提供 Java API 框架所使用的 Java 编程语言中的大部分功能,包括一些 Java 8 语言功能。

原生 C/C++ 库

许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。

如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。

Java API 框架

您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:

丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器

资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件

通知管理器,可让所有应用在状态栏中显示自定义提醒

Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈

内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据

开发者可以完全访问 Android 系统应用使用的框架 API。

系统应用

Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。

系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。

我们常见的开发工具是Android Studio ,使用的Java SDK ,用Activity 这些组件去开发。这里了解框架的优势是,能够从整体去看待,我们开发属于哪个层,上层的SDK 归于Framework 编译出来的jar包。

而这里的framework 提供的很多服务,都是需要底层支撑,也就是C/C++ 本地开发,于是就有了 JNI/NDK 开发。而c/c++ 完成了所谓的虚拟机的实现,同时Linux 操作系统也是c语言开发。

驱动也是属于底层c语言开发。在我们的程序员生涯里面,能够有框架思维,会让自己的知识形成归类,体系,也会让你的知识更加稳固,有了所谓的分类,你在后续的知识,都会放入对应的类别,不断地抽象总结归纳,会让你后续的成长飞速,这个也是高手必须掌握的能力。

3 ANR怎么发生的,如何避免?

在Android系统上,如果你的应用程序在我们点击,按键响应里面,长时间没有完成,系统会认为应用卡死,为了让系统更加流畅,这时候会提示一个对话框,这个对话框是无响应对话框(ANR:Application NotResponding),会提示用户哪个应用当前没响应了,是否结束它。

ANR是对用户很友好的,但是却不是用户期望的,所以需要解决的就是,如果避免ANR。ANR在不同的组件里面,它的时间是不一样的。主要就以下一些:

1:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

2:BroadcastTimeout(10 seconds)

BroadcastReceiver 在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) 

Service 在特定的时间内无法处理完成

除此之外,还有 ContentProvider,只是一般很少见。

广播和服务,在后台启动的时候,时间会是 60s,于是我们在分析问题时候,尽量将 anr 的 log 分析,将查看的 log 从发生 anr 的时刻向前找 1 分钟。

我们常见的分析技巧就是看log,看trace.txt ,看当前应用的堆栈信息,通过这几个内容,来判断出是哪块出现的问题,进行优化,详细的分析大家参考这篇文章:

https://mp.weixin.qq.com/s/S_k92xsVWBJWYQqYh44JfA

常见的ANR原因:

1 主线程阻塞或者死锁

2 CPU满负荷,I/O阻塞,这里会出现的是一些下载器,并发后台太多缓存,比如图片浏览器,壁纸这类软件,会存在大量的缓存动作,存储图片,这块就需要进行优化,不要并发太多。

3 内存不足,会触发GC

4 代码里面耗时,操作数据库,循环体

面试宝典想把重点放在内容分析,以及我的一些旁注,关于知识点,尽量不做太多粘贴,看起来内容多,但是会阻碍整体的流畅度。

关于ANR,很多时候面试官会问,它的原理,那么我们来说下

4 ANR的设计原理

ANR的出现是解决一类问题,用户点击操作之后,发现屏幕没有变化,以为机子死机了。安卓系统为了避免这个问题,在一些关键的事件处理里面,做了一个检测,去判断是否超时,用来降低用户的这个卡顿体验。

设计流程很简单,当有事件上来之后,InputManager 接收到消息,此时开始计时,同时把消息派送给对应的窗口,比如我们的一个Button的onclick 响应里面,等待返回。

如果5s内返回,那么计时器撤掉,代表这个消息处理的没有超时,系统可以接收。如果说计时5s已到,但是处理还没返回,这时候系统就认为卡死了,就会触发ANR。

而安卓设计的时候,ANR监测的是主线程,也就是UI线程,这个线程关注的是我们的显示,响应,用户感知的地方,所以ANR是监测的主线程。

参考文档:https://segmentfault.com/a/1190000022967452

那么在面试的时候,会常问的一个问题是,ANR既然是5s内没响应就会出现,为什么我们的主线程Looper 一直在阻塞,却没有发生ANR?

原因很简单,因为ANR的检测,是在有消息处理前后,Looper 默认阻塞,是在等消息,这时候ANR的检测没有启动,所以不会ANR的。

顺带讲到这里,我们来讲个问题,

5 子线程如何使用handler,跟主线程使用有什么区别?

子线程使用Handler的时候,需要先使用 Looper.prepare();后才可以,为什么主线程不需要呢?

 class LooperThread extends Thread

     public Handler mHandler;

     public void run()

         Looper.prepare();

         mHandler = new Handler()

             public void handleMessage(Message msg)

                 // process incoming messages here

             

         ;

         Looper.loop();

     

 

因为主线程的,系统默认帮我们创建了。具体代码位置在ActivityThread.java :

//创建Looper和MessageQueue

Looper.prepareMainLooper();

//轮询器开始轮询

Looper.loop();

所以我们在主线程不需要Looper.prepare();

说到这里,我们就来继续看一个问题,

6 Handler Looper Message 之间的关系是怎样的?

我来给大家画一张图,大家看下

我们这里关注点是,Looper是一个处理器,处理消息队列的内容,解析然后调用对应的Handler的处理Message方法。

符合简单的生产,处理,消耗的框架,理解这个就能够看明白三者的关系。其实没有想象的那么复杂。

大家可以再学习一下Looper的源码分析,学习过程可以使用androidxref.com网站,可以直接检索源码学习

https://blog.csdn.net/a34140974/article/details/50638089?locationNum=13

以上是关于Android面试题最全攻略!的主要内容,如果未能解决你的问题,请参考以下文章

2022年最新Android面试题整理,全网都在看,史上最全面试攻略

2020年最全Android面试攻略好文推荐

Android面试题总结(最全)

史上最全Android 面试题

2022史上最全Android面试题归纳汇总(附答案解析)

2017年最全的30个Android面试题,你将如何回答?