目录
启动优化
应用进程创建流程:每个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
对象来启用响应缓存:
合理设置超时时间
根据网络状况和应用需求,合理设置连接超时时间和读取超时时间。避免过长的超时时间导致用户等待过久,也避免过短的超时时间导致频繁的超时错误。
耗电优化
待更新.....