供应信息和文章都能优化的采集软件( Android面试-性能优化最常问的面试题、面试点的文章 )

优采云 发布时间: 2022-04-08 02:18

  供应信息和文章都能优化的采集软件(

Android面试-性能优化最常问的面试题、面试点的文章

)

  

  前言

  如题,这是一篇文章关于Android面试中最常见的面试问题和面试要点——性能优化。这也是“Android-Interviewer”系列的第二篇文章。对Java模块比较薄弱的可以看看我上一篇文章文章:

  Android-Interviewer:这些Java知识点我一定要问

  好了,废话不多说,赶紧冲冲冲!

  前排温馨提示:阅读本文前,请自备豆浆!

  

  如果你有 2-3 年以上的 Android 开发经验,不知道如何优化自己的项目,那就有点不知所措了。无论是日常工作还是跳槽面试,性能优化都是我们打怪、成长为优秀高级开发工程师的必备技能。下面是我总结的一套通用级别的Android性能优化知识点和大小厂高频性能优化面试题。

  一、APP启动优化1、你有研究过APP启动吗?有做过相关的启动优化吗?

  之前做热修复的时候,研究过Application的启动原理。项目中也做了一些启动优化。

  面试官:

  哦,你以前学过过热修复?(这个时候你可能会深入询问热修复的原理,这里不讨论热修复的原理)那么你在启动时做了哪些优化呢?

  程序员:

  ps:这样会让面试官觉得你是一个注重用户体验的人

  ps:这会让面试官觉得你对app应用的启动过程有深入的研究,实际上已经阅读了底层源码而不是背诵答案。

  1、项目不需要的代码及时异步加载。

  2、对于一些使用率低的初始化会做延迟加载。

  3、 将通过打开一个 IntentService 来处理一些耗时的任务。

  4、同样通过redex重新排列class文件,将启动阶段需要的文件排列在APK文件中,尽可能使用Linux文件系统的pagecache机制,使用最少的磁盘IO来读取在启动阶段需要尽可能多的文件,以减少 IO 开销并提高启动性能。

  抖音发布的5、文章知道在低版本5.0中可以进行MultiDex优化。首次启动时,直接加载原版DEX,不进行OPT优化,先让APP正常启动。然后在后台启动一个单独的进程,慢慢完成DEX的OPT工作,尽量避免影响前台APP的正常使用。

  ps:1.面试官会认为你对启动优化有很好的理解,对启动优化有一定的经验。

  2.第五点,面试官会认为你比较关注圈子的动态,找到好的解决方案,用在自己的项目中。这是一个加号!

  因此,除了在这一步简化 XML 布局外,自定义 View 的测量、布局、绘制等功能不应该太耗时而导致 GC 操作。最后,还可以使用TreaceView工具来检测这三个申报周期的耗时,从而进一步优化,达到极限。

  这一步给面试官的印象是你对整个Activity的启动、View的绘制、刷新机制都有深入的研究,所以此时你一定给面试官留下了很好的印象,说明您通常比较这些源代码级别。广泛而彻底。

  最后,基于上述优化,我将启动时间减少了 50%。

  面试官:

  嗯,研究的挺深的,源代码平时也读了很多。

  二、应用稳定性优化1、做了哪些稳定性优化?

  随着项目的逐渐成熟,用户基数逐渐增加,DAU持续上升。我们遇到了很多稳定性问题,也给我们的技术生遇到了很多挑战。用户经常使用我们的App卡住或功能不可用。,所以我们针对稳定性开放了专门的优化,我们主要优化了三项:

  通过这三个方面的优化,我们构建了移动端的高可用平台。同时也采取了很多措施,让应用真正做到高可用。

  2、性能稳定性如何做到的?

  我们对启动速度、内存、布局加载、冻结、瘦身、流量、功耗等方面进行了多维度的优化。

  我们的优化主要分为线上和线下两个层次。对于线下,我们注重发现问题,直接解决问题,尽可能在上线前解决问题。说到在线,我们的主要目的是监控。对于各种性能纬度的监控,我们可以尽早得到异常情况的告警。

  同时,针对线上最严重的性能问题:Crash,我们做了专门的优化,不仅优化了Crash的具体指标,还尽可能的获取了Crash发生的详细信息,结合后端聚合、告警等功能,方便我们快速定位问题。

  3、如何保证业务稳定?

  移动服务的高可用侧重于用户功能的完全可用,主要是解决一些导致用户不死机、不存在性能问题的在线异常情况。对项目的主要流程和核心路径进行埋点监测,计算每一步的真实转化率。同时,还需要知道每一步发生了多少异常。这样,我们就知道了所有业务流程的转化率和对应接口的转化率。有了行情的数据,我们就会知道,如果转化率或者一些监控的成功率低于某个值,很可能是线上出现了异常。结合相应的报警功能,我们无需等待用户反馈。

  同时,对于一些特殊情况,比如在开发过程中或者代码中出现一些catch代码块,异常被捕获,程序没有crash,这其实是不合理的。虽然程序没有崩溃,但当时程序的功能是不合理的。已经变成不可用了,所以我们也需要把这些捕捉到的异常上报,这样才能知道是用户的问题导致的异常。另外,网上还有一些单点问题。比如用户点击登录后进不去,这是一个单点问题。事实上,我们无法找出它们与其他问题的共性。因此,我们将有必要找到相应的细节。

  最后,我们还实施了一系列措施,以在出现异常情况时迅速止损。(=>4)

  4、如果出现异常情况,如何快速止损?

  首先,应用程序需要具备一些高级功能。对于要启动的任何新功能,我们都需要添加一个功能开关。通过配置中心下达的开关,我们决定是否显示新功能的入口。如果出现异常情况,可以紧急关闭新功能的入口,可以让app处于可控状态。

  然后,我们需要为 App 设置路由跳转。所有的接口跳转都需要通过路由进行分发。如果我们匹配了一个新的函数需要跳转到某个bug,那么我们就不会跳转,或者跳转到正在处理统一异常的界面。如果这两种方法都不行,那么可以考虑通过热修复进行动态修复。目前热修复方案比较成熟,我们可以低成本的给我们的项目增加热修复的能力。当然,如果一些功能由RN或WeeX实现会更好,然后可以通过更新资源包来实现动态更新。如果这些都不可能,那么你可以考虑自己为应用添加自我修复能力。如果应用程序启动多次,您可以考虑清除所有缓存数据并将应用程序重置为已安装状态。,在最严重的情况下,主线程可能会被阻塞。此时,用户必须等待应用修复成功后,才能允许用户进入。

  三、你做过相关的内存优化吗?

  程序员:

  我之前也做过,现在的项目中内存优化还是蛮多的。我先说优化内存的好处怎么样?我们不能盲目优化!

  有时你必须主动在你熟悉的领域领导面试。

  面试官:

  能。

  ps:这里大部分面试官都会同意你的要求,除非你遇到冒充B的人。

  程序员:

  益处:

  减少OOM,可以提高程序的稳定性。减少延迟并提高应用程序的流畅性。减少内存使用并提高应用后台生存能力。减少程序异常,降低应用崩溃率,提高稳定性。

  所以基于这四点,我的程序做了如下优化:

  刷新原理:

  View的requestLayout和ViewRootImpl##setView最终会调用ViewRootImpl的requestLayout方法,然后通过scheduleTraversals方法向Choreographer提交一个绘图任务,再通过DisplayEventReceiver向底层请求vsync垂直同步信号。当vsync信号到来时,会通过JNI Back回调,通过Handler向消息队列发布一个异步任务,最后通过ViewRootImpl执行绘制任务,最后调用performTraversals方法完成绘制。

  详细流程可参考以下流程图:

  

  卡顿的根本原因:

  从刷新原理来看,卡顿的基本原理是有两个地方会导致掉帧:

  一是主线程有其他耗时操作,使得在发出vsync信号后16毫秒内doFrame没有机会被调用;

  还有一个是当前doFrame方法绘制时间过长,下一个vsync信号到来时还没有画完帧,导致掉帧。

  现在我们知道了卡顿的根本原因,我们可以监控卡顿,从而将卡顿优化到极致。我们可以从以下四个方面监控应用冻结:

  根据Looper的Printer分发消息的时间差,判断是否卡住。

<p>//1. 开启*敏*感*词*

Looper.myLooper().setMessageLogging(new

LogPrinter(Log.DEBUG, "ActivityThread"));

//2. 只要分发消息那么就会在之前和之后分别打印消息

public static void loop() {

final Looper me = myLooper();

if (me == null) {

throw new RuntimeException("No Looper; Looper.prepare() wasn&#39;t called on this thread."); } final MessageQueue queue = me.mQueue; ...

for (;;) {

Message msg = queue.next(); // might block

...

//分发之前打印

final Printer logging = me.mLogging; if (logging != null) { logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what); }

...

try {

//分发消息

msg.target.dispatchMessage(msg);

...

//分发之后打印

if (logging != null) {

logging.println("

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线