性能优化总结

性能优化方向

  • 流畅(启动速度、卡顿)
  • 稳定(内存泄漏、崩溃)
  • 功耗(耗电、网络)
  • 安装包(包体积)

一、 流畅
卡顿优化
1、 布局优化

  • 简单布局使用Java代码代替布局文件
    Android加载Xml布局文件,并将其转换成View,需要经历XML解析,使用Java代码直接创建View可以省去这一过程

  • 使用标签
    :复用布局标签
    : 配合使用,如果include复用的布局和其上层布局是同一种布局,则可以使用merge标签减少嵌套层级
    : 在需要的时候加载。可以使用ViewStub标签来代替android:visibility=“gone”
    属性。在需要的时候调用viewStub.inflate() 加载显示

1.3 减少布局嵌套层级,相同层级使用性能更好的布局
1.4 减少使用wrap_content 属性,避免View多次触发measure、layout

2、 绘制优化
避免过度绘制:

  • 不要给View设置不必要的背景(其他无用属性也应该避免)
  • 避免过多的层级嵌套
    OnDraw()优化:
  • 避免创建新对象
  • 避免执行大量耗时操作

3、 避免频繁刷新View,导致View 频繁绘制
4、 避免频繁GC,导致短暂阻塞渲染
5、 UI线程中不做耗时操作(数据库、IO、或大量轻微耗时操作)
6、 生命周期优化:
在onCreate、onResume、onStart等生命周期方法中,不做太多初始化操作
7、 列表和Adapter优化:
a) Adapter中复用ItemView、避免频繁调用Adapter刷新方法
b) 列表滑动时不进行数据加载和UI刷新
c) Adapter中避免耗时操作
8、 避免同一动画多次执行,导致CPU或GPU负载过重
9、 避免ANR发生
10、使用合理的数据结构和算法

 启动速度优化
冷启动:冷启动是指应用从头开始启动,系统进程在冷启动后才创建应用进程。
冷启动可以分为两个阶段:
第一阶段:
在冷启动开始时,系统有三个任务,它们是:

  1. 加载并启动应用。
  2. 在启动后立即显示应用的空白启动窗口。
  3. 创建应用进程。
    第二阶段:
    系统一创建应用进程,应用进程就负责后续阶段:
  4. 创建应用对象。
  5. 启动主线程。
  6. 创建主 Activity。
  7. 扩充视图。
  8. 布局屏幕。
  9. 执行初始绘制。
    一旦应用进程完成第一次绘制,系统进程就会换掉当前显示的后台窗口,替换为主 Activity。此时,用户可以开始使用应用。
    在这里插入图片描述
    在创建应用和创建 Activity 的过程中可能会出现性能问题。所以冷启动优化主要针对对第二阶段优化。

优化:
1、 Application 优化
OnCreate()方法中,将耗时操作放到子线程中进行
2、 Activity 优化
a) 避免在Activity生命周期中进行耗时操作
b) 布局优化
c) 绘制优化

热启动:应用已经被启动,后台存在该应用进程,再次打开该App的过程称为热启动。
热启动后台已经存在该应用进程,所以不会走Application创建这一过程,而是直接进入Activity中

二、 稳定
 内存优化
1、内存泄漏
1.1单例模式引起的内存泄露(使用全局Context)
1.2 Handler引起的内存泄漏
a)使用静态内部类继承Handler
b)使用弱引用持有当前Activity,在handleMessage()方法中判断弱引用Activity是否为空
c)页面销毁时,移除消息
1.3 非静态内部类引起内存泄漏(eg:线程的Runnable方法)
非静态内部类会持有外部类的引用,如果当前Activity销毁,类还在执行,会导致Activity被持有
1.4 图片引起的内存泄漏
大图压缩、Bitmap及时释放、使用Glide等优秀的图片缓存框架
1.5 WebView引起的内存泄漏
a)开启独立进程处理web View逻辑
b)页面销毁的时候,清空WebView内容
1.6 资源未关闭(IO、Cursor)、注册的资源未及时解除注册
1.7 动画引发的内存泄漏
及时取消动画
1.8 集合未及时清理导致的内存泄漏
将一个对象放到集合中后,集合就会持有该对象的引用,导致对象无法被回收造成对象内存泄漏

2、内存溢出
2.1 大量内存泄漏导致的内存溢出
2.2 图片过大、图片资源过多导致的内存溢出
a)大图需要压缩、缓存
b)加载图片使用优秀的开源框架(eg:Glide)
2.3 ListView的Adapter中未复用ConcertView
2.4 for循环中无线创建对象

3、 内存抖动
3.1 短时间内大量字符串拼接
3.2 for循环或者频繁刷新的地方创建对象

三、 功耗
 网络优化:
目标:提高网络请求速度、节约流量
a)加载WebP格式的图片,可以大幅节约流量,提高加载速度
b)图片加载使用缓存,避免重复网络加载。优秀的图片加载框架自带缓存功能(Glide)
c) 在WiFi环境进行数据传输和下载,大文件下载使用断点续传
d)网络数据缓存,网络不好时可以使用缓存数据
e)初始界面接口划分合理,减少网络请求时间
f)设置合理的超时时间
 电量优化
a)使用WiFi进行数据传输,WIFI传输数据比移动网络传输数据不仅省流量还省电
b)电量低时,不要执行非紧急任务。非紧急任务可以选择合适的时间执行
c)避免频繁的间隔进行网络操作,最好批量进行网络请求
e)网络请求时,先判断网络状态,并设置合理的超时时间,避免一直在后台等待数据
f)通过获得手机电量,决定是否执行一些耗电操作
g)避免后台频繁唤醒CPU

四、 安装包
APK结构如下:
在这里插入图片描述
在这里插入图片描述
优化方案有:
a)屏幕只适配一套代码xxh
b)使用WebP格式图片、.9图片
c)小图标使用shape或者矢量图
c)开启混淆minifyEnabled true
shrinkResources true 删除无用资源
zipAlignEnabled true 压缩优化
d)移除无用代码、资源、删除无用功能

Android性能优化网址大全:
https://androidperformance.com/2018/05/07/Android-performance-optimization-skills-and-tools/

热门文章

暂无图片
编程学习 ·

SSM整合小案例

SSM整合 数据库部分(Oracle)创建表 CREATE TABLE product( id varchar2(32) default SYS_GUID() PRIMARY KEY, productNum VARCHAR2(50) NOT NULL, productName VARCHAR2(50), cityName VARCHAR2(50), DepartureTime timestamp, productPrice Number, productDesc VARCHAR2(500…
暂无图片
编程学习 ·

shell(1)

diff -b 忽略空格 -B 忽略空行 -i 忽略大小写 -c 显示文件所有内容并标不同 -r 对比输出 -u 合并输出 patch patch 源文件 布丁文件 -b 备份原文件 cut 检测apache服务器被谁访问的次数最多,显示访问者ip并显示访问次数 cat /etc/httpd/logs/access_log | cut…
暂无图片
编程学习 ·

电商新手做亚马逊要怎样开始?

"说到互联网创业,很多人的第一个想到的是淘宝,但是很多人并不清楚,经过十几年的发展淘宝已经很难再进入了,利润也是下降到了最低,很多的卖家都在寻找机会做转型,而你一个毫无经验的小白现在进入,基本可以说很难生存,近年来,我国的跨境电子商务进入迅猛的发展阶段,…
暂无图片
中恒嘉业 ·

关于主从复制的超详细解析(全)

目录前言1. 主从复制1.1 方式2. Mysql的主从复制2.1 一主一从2.1.1 window和linux通讯2.1.2 linux和linux的通讯2.2 双主双从3. Redis的主从复制3.1 哨兵模式3.2 java代码结合前言 主要介绍mysql的主从复制以及redis的主从复制 能由浅入深的明白原理以及如何操作 再者&#xf…
暂无图片
郑州普通话 ·

android移动应用开发实践教程,flutter真机调试插件

ANR面试题 1、什么是ANR Application Not Responding,页面无响应的对话框 2、发生ANR的条件 应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框Activity超过5秒无响应 BroadcastReceiver超过10秒无响应 Service超…
暂无图片
郑州普通话 ·

android直播框架,Android事件分发机制及设计思路

大厂面试的时候,都会问哪些技术? 最常问的就是四大组件、Binder、网络编程等基本知识点,也会问热修复、换肤、自定义动画等项目实战操作,因此你得要做好方方面面的准备才行。而且BATJ的面试官特别喜欢抓着一个知识点一直问,问到你不会为止。所以精通一个或多个知识点,比博…
暂无图片
代理记账 ·

在web应用中发送和接收Jakarta消息

Running the websimplemessage Example To Package and Deploy websimplemessage Using Maven _1、Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server). _2、In a terminal window, go to: tut-install/examples/jms/websimp…
暂无图片
cgfy ·

C++学习日记2——函数、封装、对象特性

一、函数 1.1 函数默认参数 1.1.1 简介 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 1.1.2 语法 返回值类型 函数名 (参数 默认值) {} 1.1.3 代码 #include <iostream> using namespace std;// 函数的默认参数 int func(int a, int b 20, int c 30…
暂无图片
coreui ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
coreui ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
未来博客 ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
未来博客 ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
建站日记 ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
建站日记 ·

NLP聊天机器人原理(seq2seq模型)

一、seq2seq模型 1.概念 seq2seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder将这个固定长度的向量变成可变长度的目标的信号序列。这个结构最…
暂无图片
mfbz ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
mfbz ·

全渠道会员通-天猫会员通3: 会员运营内容准备

在天猫会员通技术对接开发过程中&#xff0c;为了通知存量会员的通知工作&#xff0c;发挥会员通的优势&#xff0c;品牌需要做好以下事宜&#xff1a; 会员体系暂停公告&#xff1a;因会员通技术升级期间&#xff0c;会员服务将被暂停&#xff0c;店铺tab中会员入口将被下线&…
暂无图片
珊珊日记 ·

C# 执行Javascript脚本

c#教程https://www.xin3721.com/eschool/CSharpxin3721/ 前一阵子使用C#编写SCXML状态机&#xff0c;需要解析EMCScript表达式&#xff0c;使用了Jint库&#xff08;https://github.com/sebastienros/jint/)&#xff0c;当时感觉与C#之间的数据转换不是很方便。这两天有时间又关…
暂无图片
珊珊日记 ·

第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

A.大学期末现状 题目描述 作为一名大学生的你&#xff0c;现在又到了期末查成绩的时候&#xff0c;当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。 输入描述: 一行&#xff0c;一个整数x代表你的成绩&#xff08;0<x<100&a…