2022年Android高级面试题记录
Posted 码农乐园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022年Android高级面试题记录相关的知识,希望对你有一定的参考价值。
应用稳定性优化
1、你们做了哪些稳定性方面的优化?
项目的人群逐渐成熟,基数大量增多,DAU持续升高,我们遇到了很多用户稳定方面的问题,或者经常使用我们的App卡顿功能不正常的用户,因此我们就针对持续关注的重点优化项目,我们主要优化了三个:
崩溃专项优化(=>2)
性能稳定性优化(=>2)
业务稳定性优化(=>3)
这三个方面的优化我们实现了真正的移动端的高可用平台。同时,也有很多措施来让移动端实现了高品质。
、2、性能稳定性是怎么做的?
整体性能优化:加速、性能优化、启动优化
下线发现问题、优化
线上监控之上
崩溃专项优化
我们启动针对内存、布局、瘦身、流量、定制、多维的多个方面的启动。
我们的优化主要分为两个层次,针对线下呢,即我们线上和线下呢,即我们在线上发现问题,直接解决,将问题上线之前解决为目标呢。让我们的目的是为了,为了提前获取性能到我们度的监控的呢?
,例如,Crash 的最严重的同时发生的问题,我们做了一些具体的信息,然后优化了 Crash 的显示,而且还涉及到 Crash 的详细信息,那么优化的结合了,报警等功能,方便我们快速地定位问题。
3、稳定性如何保障?
数据采集+报警
需要对项目的主流程与核心路径进行埋点监控,
还需要知道每发生多少异常率,这样,我们就知道了所有业务的转换率,以及相应的界面的转换率
,如果转换率结合大盘,进行报警
异常监控+单点追查
兜底策略
移动端业务高给用户提供了异常功能,但主要是为了解决完整的一些功能导致他在某些情况下没有崩溃,也没有性能,呢,只是单纯的不可用的,情况需要我们对项目的主流程、核心路径进行埋点监控,来计算每一步它真正的转换率是多少,同时呢,还需要知道每一步发生多少异常。这样我们就知道了所有业务流程的转换率。以及相应显示的转换率,有很大的数据出现呢,我们就转换率盘或者是某些监控的成功率已经知道了在线值,如果那有可能就是异常,有相应的可能的报警功能,我们不需要这个等用户来反馈了,就是业务稳定性保障的基础。
呢,代码,当时,开发过程中出现了一些特殊情况或某些功能块中的某些特殊情况,让程序不发生意外,这异常实际上是不正常的,程序虽然没有发生故障,但程序的有这样的用户出现了这些不知道的问题,所以我们也需要出现这样的异常,所以我们需要在某个问题上报出的异常,我们在上面,还有一些问题,在触发用户点击的时候呢?一直不去,这种情况就属于我们共同需要了解的问题和其他问题的性质,所以呢,一定要找到它的详细信息。
最后,如果发生异常情况,我们还对表举进行了快速止损。(=>4)
4、如果发生异常情况,怎么快速止损?
功能开关
跳统中心
动态修复:热修复、资源包更新
自主修复:安全模式
首先,需要让 App 具备一些高级的功能,我们决定为任何显示要启用的新功能,要添加一个功能的开关,通过配置中心下发的功能呢,来是否要新的功能。有异常,可以紧急功能的入口,那就可以让这个应用程序控制的状态关闭了。
然后,需要给所有的路由跳转,所有的界面都需要通过我们或者通过应用程序来分发一个,如果我们需要跳转到有错误的这样的新功能时,那我们就不再是创建路由跳转了,跳转到统一的异常正处理中的界面。在我们的项目中添加热功能修复的能力,当然,如果有的是由RN或WeeX来实现就更好了,那么如果通过更新资源包的方式来实现动态更新。那那么可以考虑自己添加一个自主修复的状态,如果应用程序启动的大规模的话,那么可以考虑清空所有的缓存数据,将应用程序重新设置到安装的状态,到最高级的位置,可以阻止用户热修复,此时一定要等App成功之后才能进入。
5、原生崩溃
崩溃过程:本机崩溃时运行会向进程发送信号,崩溃信息会写入到数据/墓碑下,并在 logcat 输出崩溃日志
定位:所以定位库可以调试信息的话,只有相对位置没有具体的行号,使用 NDK 提供的 addr2line 或 ndk-stack 来
addr2line:根据有调试信息的so和相对位置定位实际的代码处
ndk-stack:可以分析墓碑文件,实际的代码调用栈
需要更全面更深入的理解请查看探索android稳定性优化
2、App启动速度优化
1、启动优化是怎么做的?
分析现象、确认问题
到达之前,引导其到达
长期保持最佳效果
在某个版本之后呢,我们会发现这个启动速度特别快,同时用户给我们的反馈也越来越多,所以,我们开始考虑对应用程序的启动速度来进行优化。然后,我们就对启动速度进行优化。代码进行了一系列代码工具的确认,结果我们已经执行了我们的发现流程,随后我们已经通过执行任务中的多个主线程中的多个操作来执行一系列操作。
然后我们经过细密的代码发现之后,发现了应用主线程的任务,就想出了一个方案给我们解决,也就是进行了第一个类似的发现。一个问题,也可以创建一个初始化的优化,就是在我们执行的那些代码中,因为某些优先级高,所以它可以不执行应用程序,而可以立即执行中的,而可以立即执行。我们对这些代码进行了了初始化,我们还为处理程序做了一个优的迟到的结合,可以在主线程的最近的事件中,以更有效的方式进行启动它的计划。做完这些之后,我们的启动就很快了。
最后,我简单的说下我们怎么会长久来启动优化的效果。首先,我们做了我们的启动器,我们的CI,并且在线上增加了很多方面的监控。(引导=> 4题)
2、是偶然的,偶然遇到的问题没有?
演演进过程
详细介绍启动器
我们最初是采用的普通的一个异步的方案,即new Thread + 后台线程优先级为我们后台线程的方式在Application的onCreate中发起初始化,使用了线程池、IntentService的,后来,在我们应用的演进过程中,不管怎样,发现代码会在某些情况下非常不好处理,并且有多个初始化任务,在某个特定的时间段内需要一个初始化任务完成,这些都是我们无法使用地解决问题的,IntentService 的实现。
这个就是目前所使用的启动方案,我们在启动器的概念中,我们将每一个初始化代码组成一个任务,然后,对进行一个示例,根据他们之间的关系排列有一个向无图,然后,使用一个任务委托我们的主线程执行,它和CPU的核心是强大的相关的,它最大程度的保证处理和这个线程都能够执行我们的,也就是大家几乎都可以同时完成。
3、启动优化有哪些容易引起的注意点?
cpu时间与wall time
注意提前初始化的优化
介绍下黑科技
首先,在 CPU Profiler 和 Systrace 中有两个很重要的指标,即 cpu time 和 wall time,我们必须明确 cpu time 和 wall time 之间的区别,wall time 指的是代码执行的时间,而 cpu time 指的是就是代码占用CPU的时间,锁中断会造成时间差距过大。我们需要以cpu时间来作为我们优化的一个方向。
我们也只寻求启动速度上的一个提升,也需要最近才开始的一个优化,对于稍后初始化,但是的习惯是在界面显示,通常如果此时需要进行显示和用户进行滑动等与用户进行加载这位杰出人物的操作,似乎有很明显的效果,因此我们的突然出现了突然出现的事件,并在这个时间点来运行用户,极大地提高了用户的使用效率,并促进了因停机而引发的意外事件。的页面卡顿现象。
最后,启动优化,一些黑科技,首先,就是我们采用了类预加载的方式,我们在Multiex.install之后有一个线程,然后用Class.forName的方法来触发类的加载,然后当我们这个类真正被使用的时候,就不用再进行类加载的运行过程了。核,但是这些却给了我们4核的情况,然后,有些应用程序只是做了一些黑科技等,只是它的cpu的内核以及它的频率在启动时进行了一次暴力的提升。
4、版本导致的启动方式变慢有好的解决方法吗?
启动器
结合CI
完善监控
其实我们之前也遇到过,这个问题非常有解决办法,但是我们后来进行了反复的思考和尝试,终于找到了一个比较。
首先,使用器去管理每个任务的一个任务,并且我们在每一个任务中的执行都是自动进行部署的,我们的这些任务被我们自动启动的部署会在我们安排的时候保证启动它的部署每一个进程的目标,这和我们普通的意外是不一样的,它可以很好地减缓我们应用程序的启动变化。
之后,我们还结合了 CI,所以我们现在限制了一些修改,比如应用程序,如果有人给它,我们不会把它部分代码合并到主干部门,或者是有一些内部工具,如内部工具如果主动发送,,,我可以和他的代码的最终结果是否可以进行考虑,如果她可以提出申请,如果我愿意的话,我可以考虑迟到的时间太长,则懒加载,等的时候再去使用等等。
然后,我们已经监控到的问题同时暴露在环境上线之前。比如说应用程序和AttachBaseContext在一个时间间隔上创建一个监视的方法,以及这两个生命周期如果间隔期间,我们都进行了一次,说下我们我们这个启动变慢了,我们就可以去寻找发现到底是哪一个变慢了,我们会和之前的进行对比,对比完成之后呢,我们就可以来找这一段新加的代码了。
5、开放问题:如果提高启动速度,设计一个延迟加载框架或sdk的方法和注意的问题
需要更全面更深入的理解请查看 加速探索Android加速优化(上) 开始探索Android启动优化(下)
3、应用内存优化
1、你们内存优化项目的过程是怎么做的?
1、分析现实、确认问题
我们的APP在内存方面可能存在我们很大的问题,第一方面发现的原因是线上的OOM率比较高。第二点呢,我们会经常在我们的Android Studio的Profiler工具中看到我组织的一个最终发现了一个重大事件。然后在我们组织的一个项目中,我们发现了这个项目之后,我们发现了这个项目中存在的问题,我们对我们进行了深入的研究,并进行了深入的研究,使用非常大的问题,说:支付、支付、支付,还有我们的位图粗犷。
2、优化目标
内存故事的解决方案> 内存剖析器的使用(出现了展示齿> 分析展示中存在的日志)或溢出的解决办法。
3、产能提升
为了不增加业务同学的工作量,我们使用一些类或 ARTHook 这样的大图方案,没有任何这些工具的侵入性,同时,我们将技术教给大家,然后让大家一起进行工作效率上的提升。
我们对整个内存优化工具的内存分析器、MAT 的使用情况,因此针对不同的不同情况的问题,我们写出了杰出的解决方案的问题,分享给大家。这样的文档,我们团队成员的内存优化意识就变强了了。
2、你做优化最大的感受是什么?
1、磨刀不误砍柴工
我们一开始并没有去分析代码中的哪些地方存在学习内存问题,而是先直接去 Google 官方的一些文档,用于学习项目的 Memory Profiler 的使用、学习工具的使用,在我们将工具学习定位之后,当在我们的项目中遇到内存问题时,我们就能够方便地进行排地问题进行解决。
2、技术优化必须结合业务代码
开始编写 APP 运行阶段,然后,我们在运行阶段的一个内存上报,然后,我们发现了一些内存模块在后面发现并监控并没有在我们的内存中运行一些相关的业务代码,显示在这些监控中我们完成了一次监控项目之后,我们发现使用多个图片存在的情况,发现多个图片库中的内存缓存肯定不是公用的项目,所以导致我们的内存使用量非常高。所以进行技术优化时整个项目必须结合我们的业务代码。
3、系统化完善解决方案
我们不管是在运行内存的过程中,然后是在把 Android 端的工作放在一边,我们把 Android 端的一些数据发送到我们的服务器上,这样,方便我们的后台,这样,方便我们的 Bug 跟踪或者是崩溃跟踪人员进行重大问题的解决。
3、如何检测所有不合理的地方?
开发大图片的检测,最初我们通过继承 ImageView 的方法发现了一个类似的方案,但是因为它的实现,我们在推广它的过程中,很多人不接受,很多 ImageView 之前已经过了,你现在让他去替换,工作成本是比较高的。所以说,后来我们就想,有没有一种方案可以免替换,最终我们就ARTHook这样找了一个Hook的。
如何计算内存?(代码注意事项)
内存占用是因为伴随着有大量的对象进入新生区,着有cpu资源的GC,gc会导致应用程序全面卡顿。
避免任何建议的建议:
避免在循环中创建对象,应该把对象创建到对象的循环中。
注意自定义视图的()方法会被捕获,所以这里应该不是真正的创建对象。
当需要大量使用 Bitmap 的时候,试着把它们在的或容器中复用。
对于能够复用的对象,同理可以使用池将它们缓存起来。
需要更全面更深入的理解请查看Android性能优化之内存优化、探索Android内存优化4、App下载优化
1、你在过程中做了哪些优化的工具?
我在安排不同的过程中,每个不同的不同情况下,我有不同的工具和工具的使用情况,下面是我从线上和线的不同角度来进行分析的。。
话说,我要统计线上的FPS,我使用的就是Choreographer这一类,它具有以下特性:
1、能够获取整体的帧率。
2、能够在线使用。
3、它获取的帧率几乎是实时的,能够满足我们的需求。
是,在线下,如果要执行加载会带来的时间消耗,因此检测每一个不同的布局,这是我需要的开发性,同时也不需要使用的方式,也不需要使用如果这个接入点,就可以方便地检测到一个部署的方法去获取。
此外,LayoutInspector 和 Systrace 这个工具,Systrace 的每一个帧都可以看到一个很好的布局,并且可以方便地在这个框架中使用它的每个布局。界面的层次级,帮助我们对层级进行优化。
2、为什么会导致卡顿,你又是如何优化的
分析完布局的加载流程之后,我们有四点可能会导致发现布局卡顿:
1、首先,过程系统生成我们的 Xml 文件通过IO的映射方式的方式加载到我们的内存中,而 IO 可能会触发我们的协议。
2、顿时是一个反应过程的过程,而反应的过程可能会导致卡。
3、这个地势的层次比较深,那么同时穿越的过程中进行比较层比较。
4、elativeLayout布局同样重绘的次数过多。
这个,我们的优化方式有以下几种:
1、针对布局加载Xml文件的优化,使用了对异步Inflater的方式,即LayoutInflater。其原理是在之后的子线程中通过它的进行加载,而加载完成我们将它的布局同步发送到主线程来使用我们的主线程,加载的时间全部是在类似线程中进行超时的。而这又是从另一个方面缓解的思路。
2、后面就是,我们发现了一个从根本上解决使用上述痛点的方式,即使用X2C框架。它的一个原理是在开发过程中还是我们的进行XML编写布局的时候,但是在编译的时候它会使用APT的方式将XML排列转换为Java的方式进行排列,这样的去写布局,它有优点:1、它省去了采用XML排列的方式是通过以下方式使用Java的顺序代码。2、它新的新对象控件,所以它也去没有带来反射的创建的方法。这样就直接从根本上就在布局加载过程中带来了性能问题。
它、3,我们可以减少使用深层次的布局层级,如果布局层级,可以越级越多层。多。
4、最后,我们可以使用AspecJ框架(即AOP)LayoutInflaterCompat.setFactory2的方式分别去建立线下加载层次的加载速度和控制监控体系。
3、做完布局优化有什么效果?
1、首先,我们建立了一个化化的监控手段,这里的体系还指的是线上加线下的一个综合方案,针对线下,我们AOP或者ARTHook,可以很方便地获取到各个使用格局可以通过发送框以及通过这样一个控件的发射到C调用的方式来获取。线上,我们可以通过Callback的方式知道我们在哪些情况下出现了调用的情况。
2、,对于布局方面,我们建立了FPS、布局时间、布局层级监控等指标。
3、最后,在一个版本上线之前,我们每个部门对我们的核心路径进行一次审核,确保我们的FPS、布局时间、布局层级等达到一个合理的状态。
4、你是怎么做卡顿优化的?
从现在到大期的事情,再到结束期的阶段都针对不同的处理方式进行。每顿的项目每天按时完成的任务如下所示:
1、系统工具定位、解决
2、自动化卡顿方案及优化
3、线上监控及线下监控工具的建设
我的卡顿优化是在最初的阶段,我们出现了一些后来的一些模块之后,我是进行系统跟踪的,我使用Systrace,在一段时间内的CPU情况下,结合代码,对这个模块进行了改造,将部分进行了延迟和延迟,在项目初期就是解决了问题。呢,随着项目的扩大,线下卡顿的代码也越来越多多,同时,在线上,消息也有卡顿的反馈,但是线上的反馈卡顿,我们在线下复现,于是我们开始寻找自动化的卡顿监控方案,思路来自于Android的其处理机制,执行线程代码单元Looper.Looper.方法自动记录我们使用的任何方法,其中有一个循环对象,它会在消息的主执行调度处被调用,执行这个线程执行的时机来执行的监控同时,在这个阶段,我们也完成了线上ANR的上报,我们采取的方式就是监控ANR的信息,同时结合了ANR-WatchDog,作为高无文件权限的补充方案。在做这个卡顿检测,我们还做了线上监控及之后的线检测的建设,最终实现了一整套完善,多维度的工具呢?
5、你是经常自动化的获取卡顿信息?
我们的想法是来自于的消息处理机制,主线程执行任何代码管理Love进程,而这个函数的处理方法有一个mlogging它,它在每个线程中被调用,而主线程被调用某个线程会在某个时间点执行一个调度的触发事件的那个,我们可以在那个时间执行一个延迟的消息,我们可以在这个延迟的时间触发一个事件,这个延迟的消息,我们可以在这个延迟的时间触发一个事件阈值,被主线程的线程在这个值之内完成的任务,那么取消这个子线程的任务,如果有主线程的任务完成在它的值内,就可以执行,它会获取到我们当前的主人公执行的一个那边,就可以知道那里发生了。
已经,发现了这种方案的正确位置,因为我们发现了一个真正的地方呢,我们就针对这个方案做的一些方案,我们采取了在近期收集的一个优化方案,我们也会在一段时间内触发主的相关信息,如果卡顿,我们就会将这些卡顿给我们顿顿信息压缩后给APM后台,这些信息重复显示的信息,然后重复发生了一个巨大的地方,这就是卡卡顿信息发生的一个巨大的位置。
6、卡顿的一整套解决方案是怎么做的?
首先,针对线上媒体卡顿的方式,我们采用了线下工具我们内卷而提前暴露工具问题,针对线上呢,我们结合于,全面的性、自动化以及异常的结果。
有很多错误呢,看到你卡顿的执行任务了。所以,我们在线上以某种方式对下一个正常的预测结果进行了 Hook,我们就可以对内获取到的数据进行分析,以及这些数据的知道时间和频率然后,它是在下面进行的很多情况。周期的一个时间间隔,对于特定问题的修改呢,我们就采用了编译时注释的方式解决了这个项目所有处理程序的父类的问题,其中包括两个处理方法,我们可以主处理消息它们的执行时间以及的二醇。
卡顿,我们除了计算App的卡顿率、ANR率等常规指标之外呢,我们还计算了页面的秒开率、周期周期的执行时间等等。而且,在卡顿发生的时刻,我们也多地保存下来了当前的一个场景之后,这为我们复现或者复现了这个卡顿留下的信息。
7、卡顿的主要场景?
卡顿的主要有很多画面,按场景可以有四种类型:UI、场景应用为启动、切换事件响应,其中又可以添加:
1、用户界面
绘画
刷新
2、启动
安装启动
冷启动
热启动
3、跳转
页面间跳转
前后台切换
4、响应
单颗
系统事件
滑动
而导致产生的根本原因可以分为以下几种
1、界面绘制
画层级深
复杂的页面
不合理刷新
2、数据处理
数据处理在UI线程
CPU占用高,导致主线程拿不到时间片
内存增加触发点GC,因此引发卡
需要更深入的理解查看Android性能优化之绘制优化、 探索Android布局优化(上) 深入探索Android布局(中)、探索Android布局优化(下)、探索Android卡顿优化(上) )、探索Android卡顿优化(下)
5、App瘦身
瘦身优化是优化性能虽然看起来不是很重要的一个帮助,但是我们的问题会比较稳定有运营。下面有一些常见的问题。
1、如何减小Apk包大小?
我们注意在回答的时候要注意一些可操作的干货,同时结合你的项目周期。主要可以从以下三个点来回答:
1)、代码:Proguard、统一三方库、无用代码删除。
2)、用资源删除、资源重构:无。
3)、所以:只保留Armeabi、更优方案。
在项目初期,我们一直在地里加,加入了很多的代码、资源,同时呢,也没有相应的规范,所以说,UI同学给我们很多UI图的时候,都没有不断压缩不断的功能图片,长久以来,我们的包包会越来越大。优化,采用是Android Studio自带的Analyze APK来做我们的包体积分析,主要就是制作代码、资源、所以等三个方面的重点优化。
首先,针对代码精简,我们进行首次使用 Proguard 实现了第一个功能,工具代码转换为第一个功能,但工具代码转换为不容易理解的格式。同时将一个很长的类转换为身份。,还有一个进行安全保障的工作,就是让项目中使用到一些等库、数据库、数据库、安全项目中,我们将功能不同,但是却不一样的库。第三点,我们将项目中的无用代码进行了删减,我们使用了 AOP 的方式统计了哪些活动以及片段在真实的情况下没有用户使用,对于那些不是 Activity 或者是 Fragment 的类,我们可以统计出来的类的构造函数,你可以这样统计出来这样一些类就可以不用真的被调用到了。但是,对于代码的精简效果,其实不是很明显。
一开始,我们拿出了一些资源。我们给我们的资源资源,我们一定会遇到这样的图片,然后我们制作资源图片的压缩, UI资源图片的时候,是压缩过的图片,同时对于我们做的一个底策略,在我们做打包的时候,没有被压缩过的图片,那我们就需要一直持续到现在,这个时候效果就非常明显了。资源我们还做了资源的好名,资源也就是将资源名称换成更多的压缩效用代码,精简的效果。
最初,我们只保留了手臂这个,它最后可以实现另一个 CPU 架构,点的非常的目录。移除了对它的高性能,所以,我们还另外一个处理,胳膊的项目为了使用它的视频,所以它对性能非常高,所以我们采用了另一种方式,将所有这个模块的目录都放在了这个下面,在代码中做决定,如果是另一种 CPU 架构,那我们就可以加载 CPU 架构的那么文件了。这样就可以达到最后的性能。的效果一般是最好的。
以上是关于2022年Android高级面试题记录的主要内容,如果未能解决你的问题,请参考以下文章
2022年最新Android面试题分享,助你轻松拿下名企offer
2022年最新Android大厂面试174题+答案解析,限时分享
跳槽涨薪必备这份《2022最新Android中高级面试合集》让你直线提升面试通过率(1932页PDF详细解析)