安卓性能优化

目录

启动优化

应用启动流程分析?

启动速度分析工具

TraceView

启动优化常见优化措施

UI渲染优化

如何解决自定义View的OverDraw?

内存优化

内存抖动和内存泄漏

大图片优化?

网络优化

根据网络情况获取不同分辨率的图片

合理使用网络缓存。

合理设置超时时间

耗电优化


启动优化

应用进程创建流程:每个App在启动前必须先创建一个进程,该进程是由zygote进程fork出来,进程具有 独立的资源空间,用于承载App上运行的Activity/Service等组件。

安卓进程创建流程:

  • 当点击App图标应用时,或者启动带有process标签的Activity时,会触发创建新进 程的请求,请求会先过Binder发送给system_server进程,即AMS进行处理。

  • system_server进程调用process.start() 方法,收集uid,gid产数,通过Socket()方式发送给Zygote进程,请求创建新进程。

  • Zygote进程收到创建新进程的请求后,fork出新的应用进程。

system_server 进程:是用于管理整个 Java framework 层,包含 ActivityManager,PowerManager 等各种系统服务;

Zygote 进程:是 Android 系统的首个 Java 进程,Zygote 是所有 Java 进程的父进程,包括 system_server 进程以及所有的 App 进程都是 Zygote 的子进程。

应用启动流程分析?

进程创建后,会调用ActivityThread#main()方法,进入应用创建启动流程。

应用的启动流程主要分为三步:启动主线程(ActivityThread),创建Application, 创建MainActivity。

  • ActivityThread 是应用程序的入口。 在main方法里对ActivityThread , 主线程Handler进行初始化,然后Looper开启消息轮询

  • 执行到bindApplication()方法,开始创建Application并初始化,这里会使用反射创建,调用Application相关的生命周期

  • 通过主线程Handler回到主线程中执行Activity的创建和启动,然后执行Activity的的相关生命周期函数。 在 Activity LifeCycle 结束之后,就会执行到 ViewRootImpl,这时才会进行真正的页面的绘制

启动速度分析工具
TraceView
class SumApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 自定义路径和文件大小
        // Debug.startMethodTracing(getExternalFilesDir(null) + "SumTea.trace", 12 * 1024) 
        // 开始记录
        Debug.startMethodTracing()
        initSumHelper()
        initMmkv()
        initAppManager()
        initRefreshLayout()
        initArouter()
        // 结束记录
        Debug.stopMethodTracing()
     }
} 
​
启动优化常见优化措施
  • 优化Activity自身的View的层次结构,尽量减小布局的层次,复杂布局可以优先考虑使用ConstraintLayout

  • 一些静态代码,使用懒加载模式。 比如地图或者语音的第三方SDK, 可以等到用户需要时再加载。

  • 耗时任务放在子线程中执行,比如本地数据库初始化

UI渲染优化

避免过度绘制,即一个像素在同一帧的时间内被绘制了多次。比如重叠布局下可能会发生这样的情况。

如何定位?

手机开发者选项,将调试GPU过度 绘制的开关打开即可。

如何解决自定义View的OverDraw?

使用canvas.clipRect()裁切 来帮助系统识别可见区域。

invalidate(new Rect(0, 0, 100, 100)); 仅更新变化的区域,减少不必要的重绘制。

内存优化

内存抖动和内存泄漏

内存抖动:短时间产生大量对象又在短时间内马上释放。短时间产生大量对象超出阈值,内存不够,同样会触发GC操作。

场景以及解决方案: 比如说自定义View中 onDraw方法中包含了创建对象的代码,如果频繁重绘,那么就会导致内存抖动。可以选择将创建对象放到外面。其他常见的手段是:对象池,像是 Handler的Message 单链表池,Glide的bitmap池等。

内存泄漏:一个长生命周期的对象持有一个短生命周期对象的强引用。

场景:静态属性,内部类持有外部类的引用,未关闭的资源,未释放的资源(取消网络请求,解除订阅...)。例子ImageView持有Bitmap,Bitmap 不会自动释放

大图片优化?

加载太大图导致内存泄漏。图片太大如果不做压缩处理,会爆的。使用Glide图片缓存框架,自动处理内存管理,缓存,生命周期监听,自动释放BitMap,避免内存泄漏。

网络优化

根据网络情况获取不同分辨率的图片

淘宝网站就做了这种优化

合理使用网络缓存。

对于一些经常访问且不经常变化的数据, 可以考虑使用缓存来避免重复的网络请求。比如使用HTTP缓存头Control和Expires来指示服务器和客户端如何缓存响应数据。在 OkHttp 中,可以通过设置 Cache 对象来启用响应缓存:

合理设置超时时间

根据网络状况和应用需求,合理设置连接超时时间和读取超时时间。避免过长的超时时间导致用户等待过久,也避免过短的超时时间导致频繁的超时错误。

耗电优化

待更新.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值