简单了解Android性能优化方向及相关工具
作者:志不坚者智不达 发布时间:2022-10-15 19:10:54
开发一款性能优良的应用是每一个Android开发者都必须经历的挑战。在移动端资源有限的前提下,提高应用的性能显得尤为重要。常见的提高APP性能的优化方向有三个:布局和渲染优化、内存优化、功耗优化。
一:布局优化
所谓布局优化,就是尽量减少布局的嵌套层级,减少无用的布局。主要的优化方法有:
(1)优先使用RelativeLayout来减少布局嵌套层数,否则尽量使用LinearLayout。这是因为RelativeLayout能够在不嵌套的情况下完成复杂的布局,而当布局比较简单时优先使用LinearLayout提高性能。
(2)使用include标签来重用布局,使用merge标签来合并布局。
(3)使用ViewStub来实现视图的动态加载,仅当使用的时候才去加载它。
(4)精简布局,删除无用的布局等。
布局优化常用的工具有:Hierarchy Viewer等。
二:渲染优化
渲染优化主要就是提高渲染的速度,避免过度绘制,从而减少画面卡顿。主要优化方法有:
(1)通过布局优化减少布局层级,提高布局的绘制速度。
(2)当同一帧的像素点被绘制多次时,就会产生过度绘制问题(OverDraw),导致资源被浪费,因此需要避免过度绘制。
(3)系统每16ms会发送一次同步信号,进行UI渲染,如果每次都能渲染成功,就能使FPS达到60,从而使用户感觉不到画面卡顿。这就要求onDraw()方法中不能做耗时的逻辑。
绘制优化常用的工具有:开发者选项里的GPU呈现模式分析、调试GPU过度绘制等。
三:内存优化
内存优化最主要的就是避免内存泄漏。常见的内存泄漏有:
(1)使用Static将属性或控件定义为静态的
1)在Activity类里有一个Activity的静态成员变量引用了该Activity实例,由于静态成员生命周期长,从而导致Activity实例需要被GC时由于该实例被引用导致无法被回收。解决方法为在Activity的onDestroy()方法里将该成员变量赋为Null。
2)如果View定义为静态的,由于View持有Activity的context,同样会造成内存泄漏。解决方法为回收Activity实例时同时调用View的onDestroy()方法释放该View。
(2)非静态内部类、匿名内部类造成内存泄漏
由于非静态内部类和匿名内部类默认持有外部类的强引用,当内部类的生命周期比外部类长时就会造成内存泄漏。常见的例子比如Handler内部类造成内存泄漏等。解决方法为将内部类定义为静态的,因为静态内部类没有外部类的引用。如果内部类要访问外部类的成员,可以通过弱引用的方式。
常用的检测内存泄漏工具有:Leakcanary、MAT等。
四:功耗优化
功耗优化主要是减少应用的耗电量,减少不必要的网络请求等。
五:其他优化
比如减小安装包体积,在UI线程避免耗时操作等等。
六:其他优化工具
IDE自带的静态代码检测工具、各种AndroidMonitor;jdk自带的traceView等。
来源:https://www.cnblogs.com/linwenbin/p/11994724.html


猜你喜欢
- 如何在WinForm中请求发送HTTP手工发送HTTP请求主要是调用 System.Net的HttpWebResponse方法手工发送HTT
- 单例模式的实现(5种)常用:饿汉式(线程安全,调用效率高,但是不能延时加载)懒汉式(线程安全,调用效率不高,可以延时加载)其他:双重检测锁式
- 本人一直使用的是Eclipse作为开发工具的,不过现在IDEA非常的受推崇,所以决定上手试一试。网上有很多旗舰版的文章,我没有仔细看,我这次
- 这篇文章主要介绍了Java判断用户名和密码过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。Web
- using Word;下面的例子中包括C#对Word文档的创建、插入表格、设置样式等操作:(例子中代码有些涉及数据信息部分被省略,重要是介绍
- 想必大家都知道,国内的Android应用基本都是免费的,那么开发者如何获得收入呢?应用中插入广告是一个比较常用的盈
- 搭建测试的数据库和表数据的SQL/* Navicat Premium Data TransferSource Server &
- 前言这篇文章探索一下springboot的tomcat是如何实现的一、起步依赖1.首先我们了解一下起步依赖SpringBoot结合Maven
- 最近 IDEA 2020最后一个版本发布了 ,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置
- 为什么需要多线程?模型的简化,如某些程序是由多个相对独立任务的运行:图形界面的出现,输入、输出的阻塞多核CPU的更好利用异步行为的需要Jav
- Android:4.4.4一、应用场景在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0:#
- 前言为什么Spring Boot 定时任务是单线程的?想要解释为什么,一定要从源码入手,直接从@EnableScheduling这个注解入手
- 一、分布式锁介绍分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。二、架构介绍&nbs
- 本文实例为大家分享了C语言实现通讯录小项目的具体代码,供大家参考,具体内容如下编写程序实现通讯录的基本功能,可以做到增,删,查,改,打印通讯
- 本文实例为大家分享了安装和配置maven环境的具体步骤,供大家参考,具体内容如下下载maven:1.进入官网下载:http://maven.
- 对于一个应用程序而言,控件是搭建用户界面的积木。它们具备交互式的特征。VS 2012中的控件都放在工具箱中,添加一个控件到窗体,只需在工具箱
- 什么是Java泛型Java 泛型(generics)是 Jdk 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制, 该机制允许程序
- 一、什么是Spring Cloud?SpringCloud 对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的
- 嵌套类型在类或结构内部定义的类型称为嵌套类型。例如:class Container{ class Nested {