Android 性能优化

Android 中的性能优化在我看来分为以下几个方面:内存优化、布局优化、网络优化、安装包优化;

内存优化: 下一个问题就是;

布局优化: 布局优化的本质就是减少 View 的层级。常见的布局优化方案如下

o 在 LinearLayout 和 RelativeLayout 都可以完成布局的情况下优先选择 RelativeLayout,可以减少 View 的层级

o 将常用的布局组件抽取出来使用 < include > 标签

o 通过 < ViewStub > 标签来加载不常用的布局

o 使用 \< Merge \> 标签来减少布局的嵌套层次

网络优化: 常见的网络优化方案如下

o 尽量减少网络请求,能够合并的就尽量合并

o 避免 DNS 解析,根据域名查询可能会耗费上百毫秒的时间,也可能存在DNS劫持的风险。可以根据业务需求采用增加动态更新 IP 的方式,或者在 IP 方式访问失败时切换到域名访问方式。

o 大量数据的加载采用分页的方式

o 网络数据传输采用 GZIP 压缩

o 加入网络数据的缓存,避免频繁请求网络

o 上传图片时,在必要的时候压缩图片

安装包优化: 安装包优化的核心就是减少 apk 的体积,常见的方案如下

o 使用混淆,可以在一定程度上减少 apk 体积,但实际效果微乎其微

o 减少应用中不必要的资源文件,比如图片,在不影响 APP 效果的情况下尽量压缩图片,有一定的效果

o 在使用了 SO 库的时候优先保留 v7 版本的 SO 库,删掉其他版本的SO库。原因是在 2018 年,v7 版本的 SO 库可以满足市面上绝大多数的要求,可能八九年前的手机满足不了,但我们也没必要去适配老掉牙的手机。实际开发中减少 apk 体积的效果是十分显著的,如果你使用了很多 SO 库,比方说一个版本的SO库一共 10M,那么只保留 v7 版本,删掉 armeabi 和 v8 版本的 SO 库,一共可以减少 20M 的体积。

3、Android 内存优化

Android的内存优化在我看来分为两点:避免内存泄漏、扩大内存,其实就是开源节流;

其实内存泄漏的本质就是较长生命周期的对象引用了较短生命周期的对象;

常见的内存泄漏

· 单例模式导致的内存泄漏。 最常见的例子就是创建这个单例对象需要传入一个 Context,这时候传入了一个 Activity 类型的 Context,由于单例对象的静态属性,导致它的生命周期是从单例类加载到应用程序结束为止,所以即使已经 finish 掉了传入的 Activity,由于我们的单例对象依然持有 Activity 的引用,所以导致了内存泄漏。解决办法也很简单,不要使用 Activity 类型的 Context,使用 Application 类型的 Context 可以避免内存泄漏;

· 静态变量导致的内存泄漏。 静态变量是放在方法区中的,它的生命周期是从类加载到程序结束,可以看到静态变量生命周期是非常久的。最常见的因静态变量导致内存泄漏的例子是我们在 Activity 中创建了一个静态变量,而这个静态变量的创建需要传入 Activity 的引用 this。在这种情况下即使 Activity 调用了 finish 也会导致内存泄漏。原因就是因为这个静态变量的生命周期几乎和整个应用程序的生命周期一致,它一直持有 Activity 的引用,从而导致了内存泄漏;

· **非静态内部类导致的内存泄漏。**非静态内部类导致内存泄漏的原因是非静态内部类持有外部类的引用,最常见的例子就是在 Activity 中使用 Handler 和 Thread 了。使用非静态内部类创建的 Handler 和 Thread 在执行延时操作的时候会一直持有当前Activity的引用,如果在执行延时操作的时候就结束 Activity,这样就会导致内存泄漏。解决办法有两种:第一种是使用静态内部类,在静态内部类中使用弱引用调用Activity。第二种方法是在 Activity 的 onDestroy 中调用 handler.removeCallbacksAndMessages 来取消延时事件;

· 使用资源未及时关闭导致的内存泄漏。常见的例子有:操作各种数据流未及时关闭,操作 Bitmap 未及时 recycle 等等;

· 使用第三方库未能及时解绑。有的三方库提供了注册和解绑的功能,最常见的就 EventBus 了,我们都知道使用 EventBus 要在 onCreate 中注册,在 onDestroy 中解绑。如果没有解绑的话,EventBus 其实是一个单例模式,他会一直持有 Activity 的引用,导致内存泄漏。同样常见的还有 RxJava,在使用 Timer 操作符做了一些延时操作后也要注意在 onDestroy 方法中调用 disposable.dispose()来取消操作;

· 属性动画导致的内存泄漏。常见的例子就是在属性动画执行的过程中退出了 Activity,这时 View 对象依然持有 Activity 的引用从而导致了内存泄漏。解决办法就是在 onDestroy 中调用动画的 cancel 方法取消属性动画;

· WebView 导致的内存泄漏。WebView 比较特殊,即使是调用了它的 destroy 方法,依然会导致内存泄漏。其实避免WebView导致内存泄漏的最好方法就是让WebView所在的Activity处于另一个进程中,当这个 Activity 结束时杀死当前 WebView 所处的进程即可,我记得阿里钉钉的 WebView 就是另外开启的一个进程,应该也是采用这种方法避免内存泄漏;

扩大内存

为什么要扩大我们的内存呢?有时候我们实际开发中不可避免的要使用很多第三方商业的 SDK,这些 SDK 其实有好有坏,大厂的 SDK 可能内存泄漏会少一些,但一些小厂的 SDK 质量也就不太靠谱一些。那应对这种我们无法改变的情况,最好的办法就是扩大内存。

扩大内存通常有两种方法:一个是在清单文件中的 Application 下添加largeHeap="true"这个属性,另一个就是同一个应用开启多个进程来扩大一个应用的总内存空间。第二种方法其实就很常见了,比方说我使用过个推的 S DK,个推的 Service 其实就是处在另外一个单独的进程中。

Android 中的内存优化总的来说就是开源和节流,开源就是扩大内存,节流就是避免内存泄漏;

Android开发之Android性能优化记录相关推荐

  1. Android开发之Android Material Design Toolbar自定义随笔

    一.自定义Toolbar的menu: 在menu下新建menu.xml文件,自定义menu的样式: 1 <menu xmlns:android="http://schemas.andr ...

  2. Android开发之android与JS互调 | Android与H5互调(附源码)

    我们先看下JS代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  3. Android开发之 Android 的基本组件的概述

    Android是一个为组件化而搭建的平台,它的应用是由一些零散的有联系的组件组成,并通过AndroidManifest.xml文件 把它们绑定起来. Android常用的组件有: Activity(活 ...

  4. Android开发之android studio快捷键大全

    AndroidStudio 快捷键大全 编辑相关快捷键 Ctrl+Space 补全代码 ctrl+shift+space 智能代码补全 Ctrl + Shift + Insert 可以选择剪贴板内容并 ...

  5. Android开发之Android Studio 3.6新特性之获取控件id的高级方式ViewBinding

    一般获取id有如下几种方式: 访问布局控件ID方式 优点 缺点 findViewById 系统提供有保障 特别繁琐代码量大 第三方注解 快捷简单 引用三方可能有不确定因素 kotlinx.androi ...

  6. Android开发之Android WIFI ADB(ADB WIFI)无线调试的技巧

    老套路线上效果图 以前又adb wifi可以使用,不过那是17年我用的AS2.3版本,并且除了adb wifi这个插件外还得手机安装一个app才可以,特别麻烦. 显示有心插件了->Android ...

  7. Android开发之Android Studio第三方库的六种依赖讲解说明

    在Android Studio中有六种依赖 Compile,Provided,APK,Test compile,Debug compile,Release compile 1.Compile 是对所有 ...

  8. android开发之android:padding和android:margin的区别

    android:layout_margin:指该控件距离父控件的边距, android:padding: 指该控件内部内容,如文本距离该控件的边距.

  9. Android开发之android录制视频功能

    录制视频主要使用到MediaRecorder这个类.代码也不多很简单我就直接粘贴下 if (btRecord.text.toString() == "录制") {camera = ...

最新文章

  1. win8无线网服务器,Win8连接wifi受限
  2. leetcode 刷题 119. 杨辉三角II
  3. shutdown,halt,reboot,init
  4. 一条命令解决系统N多故障
  5. linux的IP配置
  6. UVALive 6508 Permutation Graphs
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的贷款审批系统
  8. (转)从开发小白到音视频专家
  9. bat 调用class文件_[Golang实现JVM第五篇]静态方法调用的实现
  10. [matlab]元胞数组(使用cellplot显示元胞数组)
  11. 2. 使用keras-神经网络来做线性回归问题
  12. 国内首个SENT 信号解析软件 适配NXP KMA321, melexis MLX90372等SENT信号输出芯片 完美替代PicoScope 解析SENT
  13. 企业信息化规划的重要性
  14. sourceinsight界面中的英文解释
  15. 跨月作废发票,红字冲红注意事项 如何整理上交发票
  16. 【AUTOSAR】【CAN通信】CanTrcv
  17. linux浏览器网页唤起electron应用
  18. 为什么你比同龄人更显老?答案可能和“久坐”有关
  19. 【ZJOI2022】 众数(根号分治)
  20. ​在职场,我们如果高效地沟通

热门文章

  1. java解析sql查询字段_sql解析json格式字段 如何获取json中某个字段的值?
  2. linux怎么64位,在linux下如何查看CPU是否支持64位
  3. 老是说我编译版本不够_海思3518E编译环境搭建
  4. 陌上花开 HYSBZ - 3262 (CDQ分治)
  5. 在虚拟机上安装redis集群,redis使用版本为4.0.5,本机通过命令客户端可以连接访问,外部主机一直访问不了...
  6. Confluence 6 为空白空间编辑默认主页
  7. day5-xml模块
  8. web.xml上下文配置
  9. Bzoj 2724: [Violet 6]蒲公英(分块)
  10. clear在CSS中的妙用