Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-05-21:谈谈你对Android性能优化方面的了解?

Moosphan opened this issue · comments

2019-05-21:谈谈你对Android性能优化方面的了解?

我先,emmm,楼下的好好答题

不知道怎么性能优化

那我写几个作为开头把,从打开应用开始,启动页加快,电池耗电,流量,内存,启动页冷启动跟热启动,流量部门页面也可作缓存,耗电量自行查阅怕说的不标准,内存通过工具看看自己app就知道了,最后再说一个吧,资源释放,线程管理,布局的异步加载。

  • 启动优化: application中不要做大量耗时操作,如果必须的话,建议异步做耗时操作
  • 布局优化:使用合理的控件选择,少嵌套。(合理使用include,merge,viewStub等使用)
  • apk优化(资源文件优化,代码优化,lint检查,.9.png,合理使用shape替代图片,webp等)
  • 性能优化,网络优化,电量优化
    • 避免轮询,尽量使用推送。
    • 应用处于后台时,禁用某些数据传输
    • 限制访问频率,失败后不要无限重连
    • 选用合适的定位服务(GPS定位,网络定位,被动定位)
    • 使用缓存
    • startActivityForResult替代发送广播
  • 内存优化
    • 循环尽量不使用局部变量
    • 避免在onDraw中创建对象,onDraw会被频繁调用,容易造成内存抖动。循环中创建大的对象,也是如此。
    • 不用的对象及时释放
    • 数据库的cursor及时关闭
    • adapter使用缓存
    • 注册广播后,在生命周期结束时反注册
    • 及时关闭流操作
    • 图片尽量使用软引用,较大的图片可以通过bitmapFactory缩放后再使用,并及时recycler。另外加载巨图时不要 使用setImageBitmap或setImageResourse或BitmapFactory.decodeResource,这些方法拿到的都是bitmap的对象,占用内存较大。可以用BitmapFactory.decodeStream方法配合BitmapFactory.Options进行缩放
    • 避免static成员变量引用资源耗费过多实例
    • 避免静态内部类的引用


能想到的先这些吧。有时间整理下。

  1. 布局优化:
  • 尽量减少布局的嵌套
  • 合理使用include,merge以及viewStub
  1. apk优化:
  • 压缩资源
  • lint检查
  • 图片尽量使用wepng压缩
  1. 内存优化
  • 尽量不要在onDraw里面创建对象,onDraw会被频繁调用,容易造成内存抖动
  • 不用的随想及时释放
  • 数据库cursor及时关闭
  • 注册的东西,在生命周期结束时要反注册
  • 及时关闭io流
  • 避免静态内部类的引用

性能优化:

  1. 渲染:
    现在有不少App为了达到很华丽的视觉效果,会需要在界面上层叠很多的视图组件,但是这会很 容易引起性能问题。如何平衡Design与Performance就很需要智慧了 ,其中典型的就是overDraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。

  2. 代码运算:
    Android中的Java代码会需要经过编译优化再执行的过程。代码的不同写法会影响到Java编译器的优化效率。例如for循环的不同写法就会对编译器优化这段代码产生不同的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就需要知道代码在硬件层的执行差异,这个时候你的算法基础就发挥公功能了,像之前提到的排序算法

  3. 内存:
    Android系统里面有一个Generational Heap Memory的模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。典型问题就是内存泄漏,发生内存泄漏会导致Memory Generation中的剩余可用Heap Size越来越小,这样会导致频繁触发GC,更进一步引起性能问题。

  4. 电量:
    http://developer.android.com/training/efficient-downloads/index.html

  5. 网络优化:
    避免频繁的网络请求,后台数据的分页加载,图片优先使用缩略图,图片加载框架,网络缓存使用,优先使用Wi-Fi等。

其他优化方式:使用LRU Cache,Bitmap的缩放,缓存,重用,PNG压缩,自定义View的性能,提升设置alpha之后View的渲染性能,以及Lint,StictMode等等

楼上说的很齐全,差不多就是内存优化,布局优化,电量优化,网络优化,算法优化而且可以利用as字带工具去检测代码。

commented

1.布局优化:减少布局嵌套层级,如使用ConstraintLayout;多使用布局标签,如merge,ViewStub;做好文字大小适配;
2.网络优化:避免不必要的网络请求,做好数据缓存;
3.内存优化:内存抖动,内存泄露与内存溢出问题;
4.apk瘦身:删除无用资源,图片视情况使用webp格式或svg,使用图片前用tinypng或squoosh进行压缩处理;
5.根据安卓应用版本以及主流手机做好适配工作。

楼上都说的差不多了,这里加个奇技淫巧:
有些时候你的应用内存可能保持在gc临界点上,这个时候可能发生很多的无意义gc,可以通过反射VMRuntimesetTargetHeapUtilization 方法调整
还有就是有些时候系统可能会频繁裁剪你的应用的堆内存,让你的应用申请内存时引发大量的gc等操作,可以反射 java.lang.Daemons 强制停止堆内存裁剪线程,完事以后再行启动
刚刚看了下9.0的源码,发现堆裁剪已经和其他堆处理操作统一放在HeapTaskDaemon 里执行了,强行停止会影响到其他......

打个卡

性能优化不存在的 跑起来就完事了

就是干

打个卡

性能优化不存在的 跑起来就完事了

是啊,现在的手机要啥性能优化,要啥自行车

1布局优化
尽量减少布局嵌套 合理使用布局 多层嵌套使用constraintLayout 合理使用include,merge以及viewStub
2内存优化
内存及时回收
数据库及时关闭
IO流读取完成及时关闭
动态注册事件 不使用及时销毁
减少start的使用
3,图片优化
合理的使用图片缓存
4,网络优化
不要频率的请求网络数据 多数据列表尽量使用分页请求 避免请求使用过长
5,apk优化
没有使用的资源文件要删除掉 避免APK文件过大