首页 > 其他分享 >Android面试题 之App性能优化的卡顿监控和卡顿优化

Android面试题 之App性能优化的卡顿监控和卡顿优化

时间:2024-06-20 11:00:00浏览次数:9  
标签:面试题 布局 监控 view 优化 卡顿 加载

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

卡顿优化

这里主要介绍卡顿优化方面的布局优化

布局优化

1、 在主线程中,加载SP,或者是缓存加载,JSON解析,可以放到Idelhander

2、 viewpager的懒加载,用viewpager2替换viewpager,方便懒加载

 ViewPager.offscreenPageLimit = 2

3、 布局嵌套层级优化时,自定义继承自ViewGroup的View中,如果本身继承自LinearLayout等布局,则可以考虑根布局使用merge标签,如果根布局使用merge标签,在LayoutInfater中必须指定attachToParent为true,否则会崩溃,同时this.addView就不需要了

4、 如果view不一定会显示,此时可以使用 ViewStub 来包裹此View 以避免不需要显示view但是又需要加载view消耗资源。viewstub是一个轻量级的view,它不可见,不用占用资源,只有设置viewstub为visible或者调用其inflflater()方法时,其对应的布局文件才会被初始化。

5、 检测工具: Layout Inspector

过渡渲染

开发者选项—>打开GPU过度绘制开关

  • 检查是否重复设置background
布局加载优化
  • LayoutInflflater加载xml布局的过程会在主线程使用IO读取XML布局文件进行XML解析,再根据解析结果利用反射创建布局中的View/ViewGroup对象。
  • 可以用Asynclayoutinflater来异步加载
dependencies { implementation "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0" }

    new AsyncLayoutInflater(this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
    @Override public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {

            setContentView(view); 
            //...... 
        } 

    });

异步加载注意点:

1、使用异步 inflflate,那么需要这个 layout 的 parent 的 generateLayoutParams 函数是线程安全的;

2、所有构建的 View 中必须不能创建 Handler 或者是调用 Looper.myLooper;(因为是在异步线程中加载的,异步线程默认没有调用 Looper.prepare );

3、AsyncLayoutInflflater 不支持设置 LayoutInflflater.Factory 或者 LayoutInflflater.Factory2;

4、不支持加载包含 Fragment 的 layout

5、如果 AsyncLayoutInflflater 失败,那么会自动回退到UI线程来加载布局

卡顿监控的2种方式:

1、 Looper比较适合在发布前进行测试或者小范围灰度测试然后定位问题

2、 ChoreographerHelper适合监控线上环境的 app 的掉帧情况来计算 app 在某些场景的流畅度然后有针对性的做性能优化

public class ChoreographerHelper {
    public static void start() {
    if (Build.VERSION.SDK\_INT >= Build.VERSION\_CODES.JELLY\_BEAN) {
    	Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
    			long lastFrameTimeNanos = 0;
                @Override
                public void doFrame(long frameTimeNanos) { //上次回调时间
                    if (lastFrameTimeNanos == 0) {
                        lastFrameTimeNanos = frameTimeNanos;
                        Choreographer.getInstance().postFrameCallback(this);
                        return;
                    }
                    long diff = (frameTimeNanos - lastFrameTimeNanos) / 1_000_000;
                    if (diff > 16.6f) {
                        //掉帧数
                        int droppedCount = (int) (diff / 16.6);
                    }
                    lastFrameTimeNanos = frameTimeNanos;
                    Choreographer.getInstance().postFrameCallback(this);
                }
            });
        }
    }

}

App 开发者可以通过以下这些方法监控自身 App 的性能,其中常用的方法如下:

  • 利用 FrameCallback 的 doFrame 回调

  • 利用 FrameInfo 进行监控

使用 :adb shell dumpsys gfxinfo framestats
示例 :adb shell dumpsys gfxinfo com.meizu.flyme.launcher framestats
  • 利用 SurfaceFlinger 进行监控
使用 :adb shell dumpsys SurfaceFlinger --latency
示例 :adb shell dumpsys SurfaceFlinger --latency com.meizu.flyme.launcher/com.meizu.flyme.launcher.Launcher#0
  • 利用 SurfaceFlinger PageFlip 机制进行监控
使用 : adb service call SurfaceFlinger 1013
备注:需要系统权限
其他卡顿监控的工具

1、 systrace 一般用来检测滑动的情况,有没有卡顿掉帧

2、 BlockCanary卡顿监控原理:跟Looper中message有关,在取出message后,会先调用一个printer打印一个日志,然后执行dispatchMessage方法,再又打印下日志,我们可以通过设置自己的实现printer接口的类,来监听日志打印,根据前后打印的间隔时间,超过阈值就输出日志

总结2种卡顿监控原理

Choreographer 原理:自身的掉帧计算逻辑
BlockCanary原理: 基于 Looper 的性能监控


欢迎关注我的公众号AntDream查看更多精彩文章!

AntDream

标签:面试题,布局,监控,view,优化,卡顿,加载
From: https://blog.csdn.net/myth13141314/article/details/139817625

相关文章

  • 赶紧收藏!2024 年最常见 20道设计模式面试题(七)
    上一篇地址:赶紧收藏!2024年最常见20道设计模式面试题(六)-CSDN博客十三、享元模式如何优化资源使用?享元模式(FlyweightPattern)是一种结构型设计模式,用于减少创建对象的数量,以减少内存占用和提高性能。这种模式通过共享多于一个对象共同使用的相同状态,来优化资源使用。享元模......
  • css面试题
    文章目录CSS部分1.IE盒模型和标准盒模型2.px、em、rem区别3.实现左、中、右三列布局CSS部分1.IE盒模型和标准盒模型可使用CSS属性来切换IE盒模型和标准盒模型:box-sizing:border-box||content-box||inherit当使用content-box时:页面将采用标准模式来解析......
  • 基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘
    1.程序功能描述变异混合蛙跳算法的车间调度最优化,可以任意调整工件数和机器数,输出甘特图。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行                     3.核心程序%初始种群Pop_n=round(sqrt(Npop));......
  • matlab最优化工具箱
    一、实验目的(一)通过一个农业生产计划优化安排的实例求解,培养学生解决实际线性规划问题的初步能力;熟悉线性规划的建模过程;掌握Matlab优化工具箱中线性规划函数的调用。二、实验内容(一)某村计划在100公顷的土地上种植a、b、c三种农作物。可以提供的劳力、粪肥和化肥等资源的数量,种......
  • 持续总结中!2024年面试必问 20 道设计模式面试题(六)
    上一篇地址:持续总结中!2024年面试必问20道设计模式面试题(五)-CSDN博客十一、迭代器模式(IteratorPattern)解决了什么问题?迭代器模式(IteratorPattern)解决了如何顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示的问题。这种模式定义了一种方法来遍历集合,同时保持了对象......
  • 整理好了!2024年最常见 20 道设计模式面试题(五)
    上一篇地址:整理好了!2024年最常见20道设计模式面试题(四)-CSDN博客九、什么是命令模式?它如何帮助实现解耦?命令模式(CommandPattern)是一种行为设计模式,它将一个请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象与执行请求的对象解耦,从而让不同的请求、队列或者......
  • 【优化设计】基于泊松方程求解形状优化设计问题附Matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • Nginx优化与防盗链
    一.Nginx服务优化        在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验。Nginx默认的安装参数只能提供最基本的服务,需要调整如网页缓存时间、连接超时、网页压缩等相应参数,才能发挥出服务器的最大作用。......
  • 游戏被DDOS攻击卡顿、掉线如何解决?
    随着游戏行业的蓬勃发展,越来越多的玩家投入到了虚拟世界的怀抱。然而,在这个充满竞争与乐趣的世界里,游戏服务器却时常面临着一项严峻的挑战——DDoS攻击。当游戏遭受DDoS攻击时,玩家会遭遇卡顿、掉线等问题,这不仅影响了玩家的游戏体验,也给游戏管理员(GM)带来了极大的困扰。那么,面对......
  • Go中的一些优化笔记,简单而不简单
    转自https://mp.weixin.qq.com/s/X8c6ZIJdBFptYA9CRj6wnA今天小土给大家带来一篇关于Golang项目中最简单的优化的文章。原文见Golang:simpleoptimizationnotes[1]我们这里简单聊一下优化本身,然后我们直接从实际的示例开始。为什么要优化呢?当你资源占有较高的话会需要很......