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

news2024/10/5 13:05:45

本文首发于公众号“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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1842224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Oracle APEX开发小技巧2】在不通过类型转换的前提下使用Oracle APEX自带的格式掩码实现数值的精确展现

在日常APEX开发中,你也许会遇到过这种情况,输入两个数值,通过相除得到比率,但是如果比率小于1,小数点前的0往往会被省略,例如“0.32”会展示为“.32”,不符合正常的表达。 原来的效果&#xff1…

海量数据处理利器 Roaring BitMap 原理介绍

作者:来自 vivo 互联网服务器团队- Zheng Rui 本文结合个人理解梳理了BitMap及Roaring BitMap的原理及使用,分别主要介绍了Roaring BitMap的存储方式及三种container类型及Java中Roaring BitMap相关API使用。 一、引言 在进行大数据开发时,…

【数据结构】【版本1.3】【线性时代】——栈

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、栈的概念二、栈的模拟实现2.1 定义2.2 初始化2.3 销毁2.4 压栈2.5 判空2.6 出栈2.7 获取栈顶元素2.8…

一分钟生成论文全文,这款AI论文神器你不会还不知道吧?

毕业季写论文就选范文喵AI论文助手。范文喵V2.0主要包括了论文范文、选题分析、开题报告、任务书的写作、以及论文答辩PPT、论文解读等功能。此外,我们也会在近期进一步优化范文喵论文助手,写作效果更好的V3.0版本预计将于今年7月份和大家见面&#xff0…

Ps:动作面板

Ps菜单:窗口/动作 Window/Action 快捷键:Alt F9 动作面板 Action Panel提供了一种自动化的方法,可以记录、播放、编辑和管理一系列的 Photoshop 操作。使用动作可以大大提高工作效率,特别是在处理重复性任务时。 ◆ ◆ ◆ 常用…

WPF 深入理解二、布局

布局与控件 常用得布局属性 HorizontalAlignment:用于设置元素的水平位置VerticalAlignment: 用于设置元素的垂直位置Margin: 指定元素与容器的边距Height: 指定元素的高度Width: 指定元素的宽度WinHeight/winWidth:指定元素的最小高度和宽度MaxHeight/MaxWidth: 指定元素的最…

AD域离线破解新思路:Trustroasting和TimeRoasting

简介 近期Tom Tervoort发表了白皮书《TIMEROASTING, TRUSTROASTING AND COMPUTER SPRAYING》并在Github发布了名为Timeroast的工具包,其中介绍了几种新的攻击思路TimeRoasting、Trustroasting和计算机账户密码喷洒,本篇文章主要对TimeRoasting和Trustro…

主流电商平台API接口【京东商品详情按关键字搜索商品按图搜索京东商品(拍立淘)获得店铺的所有商品】

主流电商平台商品接口在电商企业中的应用可以帮助企业实现信息同步、库存管理、订单处理、数据分析和营销推广等多重功能,提升运营效率、优化用户体验,进而推动业务增长。 jd API 接入说明 API地址:申请调用KEY地址 调用示例: 参数说明 通用…

『大模型笔记』斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来

MAC 文章目录 一. 斯坦福大学教授李飞飞在2024年数据与人工智能峰会上的人工智能历史与未来引言过去与现在现代 AI 的进步未来的发展空间智能近期进展与未来展望文字输入制作视频机器人学习AI 与人类互动医疗健康应用结语二. 参考文献一. 斯坦福大学教授李飞飞在2024年数据与人…

保姆级网络信任证书配置教程

前言 TitanIDE在第一次安装完成以后,会显示的网络协议是https不安全的,我们需要在本地配置信任证书,有信任证书才能正常使用所有的功能,以下操作均以服务器名称ide,ip为192.168.101.144的服务器为例,在实际…

若依 Excel导入 字段值转换 字典自动匹配转换等

Excel表格数据截图: 数据库结构:需要将数据转换为数值或char类型存储 转换结果: 未使用Excel注解参数的效果: 断点数据 使用Excel注解参数的效果: 断点数据 最终入库: 参考: http://doc.ru…

一种改进最大相关峭度解卷积的滚动轴承故障诊断方法(MATLAB)

近年来,最大相关峭度解卷积受到了研究人员越来越多的关注,陆续有多篇研究论文将该方法应用于滚动轴轴承故障诊断。MCKD是由McDonald提出的一种解卷积方法,其算法中设计了一个新的目标函数——相关峭度,并以此为优化目标设计一系列…

软件测试——稳定性测试:adb Monkey

Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…

测量8个回路的三相多功能电表

随着工业的发展,在生产过程中,往往需要同时间测量多台设备的电流、电压和电量数据的采集,但是很多情况下,安装独立电表或者多用户计量箱,受限于安装空间大小无法实现。 下面我们举例说明,如图所示需要计量八个塑壳开关回路下设备的…

vue的安装配置并创建项目

npm 工具的安装 安装node.js之后,npm工具会自动安装到系统环境中 网址:https://nodejs.org/en vue的安装 安装vue并创建项目 npm create vuelatest 进入项目之后,然后启动npm run dev 解决方法: npm install -g create-vite 再次启动 通…

怎么为自己的VPS选择合适的CPU和RAM?

为网站选择VPS(虚拟专用服务器)与为家庭或办公室选择台式机或笔记本电脑没有什么不同。基本上,您要做的就是查看硬件配置并比较功能和价格。 然而,虽然您可能对个人计算机所需的资源类型有一个粗略的估计,但为服务器获…

企业PC端官网在线客服源码系统 完全开源可二开 附带源代码包+搭建部署教程

系统概述 企业 PC 端官网在线客服源码系统是一款专为企业打造的先进客服解决方案。它基于先进的技术架构,旨在为企业提供稳定、高效、功能丰富的在线客服服务。 该系统采用了模块化设计理念,将各个功能模块有机地整合在一起,形成了一个完整…

【Mybatis-plus】查询及更新为null或空字符串

前言 查询为 null 或者 空字符串时&#xff0c;可以使用 or() 关键字。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 查询 使用 LambdaQueryWrapper 查询 parentCode 为 null 或者 空字符串 的数据。 LambdaQueryWrapper<CompanyEntity> qu…

redhat-devtoolset备忘

参考&#xff1a; User Guide Red Hat Developer Toolset 12 | Red Hat Customer Portal https://access.redhat.com/documentation/en-us/red_hat_developer_toolset/12/html-single/user_guide/index Red Hat Devtoolset 是 Red Hat 提供的一组开发工具集合&#xff0c;主要用…

MySQL服务无法启动,服务没有报告任何错误(cmd里面)

安装压缩包版MySQL时&#xff0c;有时会此问题 解决方法 方法一、MySQL默认3306端口被占用&#xff0c;此时结束占用该端口的任务进程即可&#xff1b; 1.进入cmd,查找占用的端口 netstat -aon|findstr 3306 发现进程编号&#xff08;也就是PID)为2084的进程占用了此端口&am…