Android性能优化方案详情

目录
  • 1、指标
  • 2、包大小优化
  • 3、响应时间优化
  • 4、内存优化
  • 5、CPU优化
  • 6、耗电量优化

前言:

上一个季度在百度工作挺忙碌,在最后期限完成了OKR目标,因此有一段时间没有写文章。今天趁有机会想分享下在大型Android项目工程内的一些性能优化方式。

1、指标

量化性能的指标有很多,但最重要的就是以下5种:

  • 包大小
  • 响应时间
  • 内存
  • CPU
  • 耗电量

优化性能就是可以从以上5点入手。

2、包大小优化

顾名思义就是减少apk包体积大小,apk大小主要取决于res下的资源文件、.class文件,

具体优化措施有:

压缩图片大小,再在项目中使用。
AndroidStudio内,可以将png等格式的图片压缩为.webp格式,这可以进一步减少图片大小。
尽可能地减少本地资源的使用,可从技术方案上考虑从服务端拉取图片、lottie、so库等资源。
利用lottie替换帧动画的使用,减少帧动画图片资源的使用。
利用混淆删除无用代码,减少dex文件大小。

3、响应时间优化

对用户来说,响应时间自然越短越好。响应时间越短,操作也就越顺畅。

响应速度包括启动速度——点击APP按钮到APP首页完全打开的过程尽可能快、页面响应速度——用户执行点击、滑动等操作后,页面能快速响应。APP不能产生卡顿、更不能出现ANR。

具体优化措施有:

  • 耗时操作应放入子线程进行处理,不能阻塞主线程。
  • SDK等资源应采用懒加载方式,需要时才进行加载,不需要时可不必加载。
  • 线上环境避免打印大量的日志。
  • 使用BitmapFactory.OptioninBitmap变量,来复用旧的Bitmap,避免为新Bitmap多次分配内存以及销毁旧Bitmap(如果该Bitmap使用频率高的话)

优化view视图渲染时间:

①若view视图比较复杂,可考虑使用ConstraintLayout约束布局,减少视图渲染的层级。

②若view视图比较简单,优化考虑使用LinearLayout水平布局(因为LinearLayout的渲染时间比ConstraintLayout、RelativeLayout都要短)。

③避免过度渲染,如果有多个view的背景重叠在一起,可以考虑去掉底层被覆盖的view;主题theme可以设置为NoBackground模式。

④若view视图在需要时才被创建,使用ViewStub控件。

recyclerview列表控件优化:

item view视图优化,同第4点。

②增加recyclerviewitem缓存数量,将网络请求的数据缓存,避免二次请求网络。

③在onBindViewHolder避免执行耗时操作,因为onBindViewHolder是在主线程执行,onBindViewHolder加耗时操作会影响滑动流畅度。

④如果不需要recyclerview的默认动画,删除。(如刷新时闪烁的动画效果)

recyclerview刷新时尽量使用局部刷新,避免全局刷新。

查看view是否过度渲染可在手机开发者模式开启以下设置:

4、内存优化

减少内存的使用,主要是避免创建过多对象占用过多内存、避免内存抖动以及避免内存泄漏。

内存抖动即频繁地创建和销毁内存,在这个过程中,垃圾回收器也会频繁工作,对内存性能造成影响。

内存泄漏即应该被GC回收的内存,由于还在被其他对象引用,导致无法被回收。内存泄漏是比较严重的问题,过多的内存泄漏会导致内存溢出,产生OOM的系统错误。

造成内存泄漏的原因主要有:

  • 单例类引用Context造成内存泄漏。
  • 非静态内部类引用外部类造成内存泄漏。
  • handler引用activity造成内存泄漏。
  • 属性动画没有取消,导致view一直被引用造成内存泄漏。
  • 监听器没有取消、回调没有反注册。

内存优化的措施有:

  • 使用线程池复用线程,因为线程本身会占用相对比较大的内存,复用就可以省下部分内存。
  • onDraw方法内避免创建对象。因为onDraw会被频繁调用,导致其内部的对象也会被频繁创建,占用过多内存。
  • 尽量使用StringBuilderStringBuffer拼接字符串,减少String的使用。(因为拼接字符串时,String会创建新的对象,而StringBuilderStringBuffer是在原字符串基础上拼接)
  • 视图资源不可见时进行清除,避免占用内存。如Bitmap执行.recycle方法进行清除、对图片和lottie资源进行销毁。

针对内存泄漏的问题进行优化:

①单例类应引用ApplicationContext,因为Application的Context的生命周期是和APP一致的,不会造成单例类引用某个activity的context以致该activity无法被回收的问题。

②将非静态内部类改为静态内部类,这样就不会引用外部类。

handler:a.handler使用结束时调用removeCallbacksAndMessages(null)清除队列;b.静态内部类+弱引用方式可避免内存泄漏。

static class SafeHandler extends Handler {
     WeakReference<MainActivity> activity;
     public SafeHandler(MainActivity mainActivity) {
             activity = new WeakReference<MainActivity>(mainActivity);
    }
    @Override public void handleMessage(Message msg) { }
}

④属性动画、监听器使用结束应及时取消,广播或其他一些外部库的回调应该及时反注册。

5、CPU优化

CPU的作用是计算处理信息、运行程序,因此优化的方向就是减少CPU计算的工作,提升CPU的计算效率。

具体的优化措施有:

  • 避免主线程执行耗时任务,耗时任务在子线程异步执行。
  • 避免在onDraw方法里执行大量耗时操作。
  • 暂时不需要用到的信息进行懒加载、延迟初始化。

6、耗电量优化

优化的措施有:

  • 避免频繁进行网络请求。
  • 避免任务被频繁执行,可以等任务形成一定数量时,再一起执行。
  • 避免应用频繁唤醒屏幕。(频繁唤醒屏幕会导致系统无法进入休眠,耗电量大)

保证性能指标不下降一直是开发过程中的重中之重,如果由于开发新功能导致出现卡顿、机身发热耗电量猛增、内存增大等性能问题,那样反而会流失用户,得不偿失。因此关注性能也是RD们的一项隐形工作。希望这篇文章能对大家有所帮助。

到此这篇关于Android性能优化方案详情的文章就介绍到这了,更多相关Android性能优化方案内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 性能优化系列之bitmap图片优化

    背景 Android开发中,加载图片过多.过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出.因为Android对单个应用施加内存限制,默认分配的内存只有几M(具体视不同系统而定).而载入的图片如果是JPG之类的压缩格式(JPG支持最高级别的压缩,不过该压缩是有损的),在内存中展开会占用大量的内存空间,也就容易形成内存溢出.那么高效的加载Bitmap是很重要的事情.Bitmap在Android中指的是一张图片,图片的格式有.jpg .jpg .webp 等常见的格式. 如何

  • 浅谈Android性能优化之内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应一个被调用的方法.栈帧包括局部标量表, 操作数栈. 本地方法栈:本地方法栈主要是为执行本地方法服务的.而Java栈是为执行Java方法服务的. 方法区:该区域被线程共享.主要存储每个类的信息(类名,方法信息,字段信息等).静态变量,常量,以及编译器编译后的代码等. 堆:Java中的堆是被线程共享的,

  • Android图片性能优化详解

    1. 图片的格式 目前移动端Android平台原生支持的图片格式主要有:JPEG.PNG.GIF.BMP.和WebP(自从Android 4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG.PNG.WebP,图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定. public static enum CompressFormat { JPEG. PNG. WebP; private CompressFormat() { } } 如果要在

  • Android 分析实现性能优化之启动速度优化

    目录 启动方式 冷启动(启动优化目标) 热启动 温启动 启动流程中可优化的环节 检测工具 启动时间检测 Logcat Displayed adb 命令统计 CPU profile API level >= 26 API level < 26 StrictMode 严苛模式 优化点 黑白屏问题 本文主要探讨以下几个问题: 启动方式 启动流程中可优化的环节 检测工具 优化点 黑白屏问题 启动方式 应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动.温启动与热启动 冷启动(启动优化

  • Android 进阶实现性能优化之OOM与Leakcanary详解原理

    目录 Android内存泄漏常见场景以及解决方案 资源性对象未关闭 注册对象未注销 类的静态变量持有大数据 单例造成的内存泄漏 非静态内部类的静态实例 Handler临时性内存泄漏 容器中的对象没清理造成的内存泄漏 WebView 使用ListView时造成的内存泄漏 Leakcanary leakcanary 导入 leakcanary 是如何安装的 leakcanary 如何监听Activity.Fragment销毁 RefWatcher 核心原理 流程图 本文主要探讨以下几个问题: And

  • 详解Android性能优化之启动优化

    1.为什么要进行启动优化 网上流行一种说法,就是8秒定律,意思是说,如果用户在打开一个页面,在8秒的时间内还没有打开,那么用户大概的会放弃掉,意味着一个用户的流失.从这里就可以看出,启动优化的重要性了. 2.启动的分类 2.1 冷启动 先来看看冷启动的流程图 从图中可以看出,APP启动的过程是:ActivityManagerProxy 通过IPC来调用AMS(ActivityManagerService),AMS通过IPC启动一个APP进程,ApplicationThread通过反射来创建App

  • 简单了解Android性能优化方向及相关工具

    开发一款性能优良的应用是每一个Android开发者都必须经历的挑战.在移动端资源有限的前提下,提高应用的性能显得尤为重要.常见的提高APP性能的优化方向有三个:布局和渲染优化.内存优化.功耗优化. 一:布局优化 所谓布局优化,就是尽量减少布局的嵌套层级,减少无用的布局.主要的优化方法有: (1)优先使用RelativeLayout来减少布局嵌套层数,否则尽量使用LinearLayout.这是因为RelativeLayout能够在不嵌套的情况下完成复杂的布局,而当布局比较简单时优先使用Linear

  • Android性能之冷启动优化详析

    1.前言 APP冷启动比较慢,点击桌面图片需要用户等待很久,体验较差. 2.APP启动方式 冷启动(Cold start) 场景:冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动. 可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化.在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的.因此本文重点谈论的是对冷启动相关的优化. 生命周期:Process.start->Application创建->attachBas

  • Android性能优化方案详情

    目录 1.指标 2.包大小优化 3.响应时间优化 4.内存优化 5.CPU优化 6.耗电量优化 前言: 上一个季度在百度工作挺忙碌,在最后期限完成了OKR目标,因此有一段时间没有写文章.今天趁有机会想分享下在大型Android项目工程内的一些性能优化方式. 1.指标 量化性能的指标有很多,但最重要的就是以下5种: 包大小 响应时间 内存 CPU 耗电量 优化性能就是可以从以上5点入手. 2.包大小优化 顾名思义就是减少apk包体积大小,apk大小主要取决于res下的资源文件..class文件,

  • Android性能优化全局异常处理详情

    目录 前言 1 UncaughtExceptionHandler 1.1 替代Android异常机制 1.2 可选择的异常处理 2 日志上传 2.1 日志收集 2.2 日志存储 3 策略设计模式实现上传功能 前言 异常崩溃,是Android项目中一项比较棘手的问题,即便做了很多的try - catch处理,也不能保证上线不会崩,而且一旦出现崩溃,就会出现下图的弹窗,xx应用停止运行了,这种体验对用户来说是非常差的,因此已经很明显地提示,我们做的app崩溃了. 像现在企业应用,有的在发生崩溃的时候

  • Android 性能优化实现全量编译提速的黑科技

    目录 一.背景描述 二.效果展示 2.1.测试项目介绍 三.思路问题分析与模块搭建: 3.1.思路问题分析 3.2.模块搭建 四.问题解决与实 编译流程启动,需要找到哪一个 module做了修改 module 依赖关系获取 module 依赖关系 project 替换成 aar 技术方案 hook 编译流程 五.一天一个小惊喜( bug 较多) 5.1 output 没有打包出 aar 5.2 发现运行起来后存在多个 jar 包重复问题 5.3 发现 aar/jar 存在多种依赖方式 5.4 发

  • Android性能优化之ANR问题定位分析

    目录 前言 1 ANR原因总结 1.1 KeyDispatchTimeout 1.2 BroadCastTimeout 1.3 ServiceTimeout 1.4 ContentProviderTimeout 2 ANR问题解决 2.1 线下问题解决 2.2 线上问题解决 2.2.1 Bugly 2.2.2 FileObserver 2.2.3 WatchDog 前言 ANR(Application Not Response)应用程序未响应,当主线程被阻塞时,就会弹出如下弹窗 要么关闭当前ap

  • Android性能优化之ViewPagers + Fragment缓存优化

    目录 前言 1 ViewPager懒加载优化 1.1 ViewPager的缓存机制 1.2 ViewPager懒加载方案 2 ViewPager2与ViewPager的区别 前言 大家看标题,可能会有点儿懵,什么是ViewPagers,因为在很久之前,我们使用的都是ViewPager,但是现在更多的是在用ViewPager2,因此用ViewPagers(ViewPager.ViewPager2)来代替两者,主要介绍两者的区别. ViewPagers嵌套Fragment架构,在我们常用的App中随

  • Android性能优化之弱网优化详解

    目录 弱网优化 1.Serializable原理 1.1 分析过程 1.2 Serializable接口 1.3 ObjectOutputStream 1.4 序列化后二进制文件的一点解读 1.5 常见的集合类的序列化问题 1.5.1 HashMap 1.5.2 ArrayList 2.Parcelable 2.1 Parcel的简介 2.2 Parcelable的三大过程介绍(序列化.反序列化.描述) 2.2.1 描述 2.2.2 序列化 2.2.3 反序列化 2.3 Parcelable的实

  • Android性能优化系列篇UI优化

    目录 前言 一.UI优化 1.1 系统做的优化 1.1.1 硬件加速 1.2 优化方案 1.2.1 java代码布局 1.2.2 View重用 1.2.3 异步创建view 1.2.4 xml布局优化 1.2.5 异步布局框架Litho 1.2.6 屏幕适配 1.2.7 Flutter 1.2.8 Jetpack Compose 1.3 工具篇 1.3.1 Choreographer 1.3.2 LayoutInspector/Android Device Monitor 1.3.3 Systr

  • Android性能优化之JVMTI与内存分配

    目录 前言 JVMTI JVMTI 简介: native层开启jvmti 前置准备 复写Agent 开启jvmtiCapabilities 设置jvmtiEventCallbacks 开启监听 java层开启agent 验证分配数据 总结 前言 内存治理一直是每个开发者最关心的问题,我们在日常开发中会遇到各种各样的内存问题,比如OOM,内存泄露,内存抖动等等,这些问题都有以下共性: 难发现,内存问题一般很难发现,业务开发中关系系数更少 治理困难,内存问题治理困难,比如oom,往往堆栈只是压死骆驼

  • Android性能优化死锁监控知识点详解

    目录 前言 死锁检测 线程Block状态 获取当前线程所请求的锁 通过锁获取当前持有的线程 线程启动 nativePeer 与 native Thread tid 与java Thread tid dlsym与调用 系统限制 死锁检测所有代码 总结 前言 “死锁”,这个从接触程序开发的时候就会经常听到的词,它其实也可以被称为一种“艺术”,即互斥资源访问循环的艺术,在Android中,如果主线程产生死锁,那么通常会以ANR结束app的生命周期,如果是两个子线程的死锁,那么就会白白浪费cpu的调度资

随机推荐