布局优化
嵌套布局,include、merge和ViewStub
include和merge联手搭配
复杂界面可选择ConstraintLayout,可有效减少层级
绘制优化
onDraw中不要创建新的局部对象
onDraw方法中不要做耗时的任务
内存优化
内存泄露
-
集合类泄漏
-
单例/静态变量造成的内存泄漏 如持有当前activity的引用,静态变量生命周期比activity长
-
匿名内部类/非静态内部类 内部类隐式持有外部类的引用,如handler
-
资源未关闭造成的内存泄漏
- 网络、文件等流忘记关闭
- 手动注册广播时,退出时忘记 unregisterReceiver()
- Service 执行完后忘记 stopSelf()
- EventBus 等观察者模式的框架忘记手动解除注册
-
leakcanary傻瓜式操作,哪里有泄漏自动给你显示出来,很直接很暴力。
-
我们平时也要多使用Memory Monitor进行内存监控,这个分析就有些难度了,可以上网搜一下具体怎么使用。
-
Android Lint
启动速度优化
当打开一个 Activity 的时候,并且这个 Activity 所属的 Application 还没有运行,系统会首先为这个 Activity 创建一个进程,创建进程的时候就会调用 Application 的 onCreate 方法。进程的创建和 onCreate 内部的初始化是需要时间的,这个时候就有了 StartingWindow(PerviewWindow)的出现,StartingWindow 出现在应用程序进程创建并且初始化完成之前,是个临时的窗口,对应的 WindowType是 TYPE_APPLICATION_STARTING。 我们看到的白屏或者黑屏就是 StartingWindow, 解决方法就算给启动页activity设置theme
<style name = "SplashThem" parent = "AppTheme">
<item name = "android:windowBackground">@drawble/splash</item>
<item name = "android:windwoFullscreen">true</item>
</style>
- 利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;
- 避免在启动时做密集沉重的初始化(Heavy app initialization)采用异步 延时
- 比如像友盟,bugly这样的业务非必要的可以的异步加载。
- 比如地图,推送等,非第一时间需要的可以在主线程做延时启动。当程序已经启动起来之后,在进行初始化。
- 对于图片,网络请求框架必须在主线程里初始化了。;
- 避免I/O操作、反序列化、网络操作、布局嵌套等。
包体优化
- 首先我们可以使用lint工具,查找没有使用过的资源
- 开启资源压缩,自动删除无用的资源 shrinkResources true
- 多用XML Drawable
- 压缩PNG和JPEG文件
- 使用WebP文件格式 可用Android Studio转换
- 代码混淆
耗电优化
ListView优化,主要是合理使用ViewHolder
Bitmap优化
BitmapFactory.Options inSampleSize
响应速度优化的核心思想是避免在主线程中做耗时操作,把耗时操作异步处理
线程优化的思想是采用线程池 线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销