避免内存泄露的关键是及时释放不再需要的资源,特别是生命周期较长的资源。在Activity和Fragment的生命周期方法中释放这些资源,如onDestroy()方法中释放线程、集合等引用,避免这些资源的生命周期过长导致内存泄露。
Android内存优化主要有以下几个方面:
- 合理设置应用的minSdkVersion和targetSdkVersion,使应用可以运行在更多设备上,这可以提高内存利用效率。
- 避免在Application和Activity的onCreate方法中做过多工作,这会占用过多内存。可以将不必要的初始化工作放到onStart或延迟加载。
- 避免在UI线程中进行过多工作,可以使用AsyncTask或者Thread执行耗时操作,避免ANR问题发生。
- 重用已有对象,避免重复创建对象,这会产生大量垃圾对象,增加GC负担。可以使用对象池技术重用对象。
- 优化布局,减少视图层级,可以通过merge标签减少不必要的ViewGroup。过多View会增加内存占用。
- 避免使用过多大图,可以加载合适大小的图片,并使用图片缓存技术,只在列表滑动到可视区域时才加载图片,这可以减少不必要的图片内存占用。
- 监测和分析内存使用情况,可以使用ADB的dumpsys meminfo命令查看应用内存使用,并根据报告查找内存占比较大的模块进行优化。也可以使用LeakCanary等内存泄露检测工具监测内存泄露情况。
- 及时释放资源,在Activity和Fragment的onDestroy方法中及时释放资源,避免长期占用内存。对Bitmap等资源调用recycle方法进行回收。
- 将数据存储在SQLite数据库中,而不是将大量对象存储在内存中,这可以大大减少内存占用。但也要注意数据库本身也会占用一定内存。
- 优化自定义View,自定义View也要遵循上述内存优化原则,尽量重用资源,减少创建对象的次数等。
Android开发中容易造成内存泄露的场景主要有:
- 静态变量持有Activity实例。这会使Activity无法被回收,导致内存泄露。应避免静态变量持有Activity实例的引用。
- 非静态内部类持有外部类实例。非静态内部类会隐式持有外部类的引用,这也会导致外部类无法回收。应避免非静态内部类,或显式使内部类的引用为弱引用。
- 线程运行时未释放资源。如果线程运行过程中创建了对象但未及时释放,当线程结束后这些对象也无法被回收,导致内存泄露。应在线程结束前释放所有资源。
- 集合中保留了不再需要的对象引用。如果集合中保留了不再需要的对象引用,这些对象也无法被回收,应及时从集合中移除不需要的对象引用。
- 未调用Bitmap的recycle()方法。Bitmap是占用内存较大的对象,如果未调用recycle()释放,会造成较大的内存泄露。应在Bitmap不再需要时调用recycle()方法进行回收。
- 注册了广播接收器但未 unregister。注册后的广播接收器会持有注册者的引用,如果未调用unregister注销,该引用也无法被回收。应在需要时注册,不需要时注销广播接收器。
- WebView未removeJavascriptInterface或释放。WebView也是较占内存的组件,如果长期保留WebView实例会导致内存泄露,应在WebView不需要时removeJavascriptInterface并销毁WebView。
性能优化对于Android开发的重要性非常大。随着Android设备的不断升级,用户对应用的要求也越来越高,包括应用的运行速度、响应速度、流畅度等方面。如果应用的性能不能满足用户的需求,很可能会导致用户流失、差评以及应用被卸载等情况。
另外,随着移动互联网的普及和应用市场的竞争越来越激烈,开发人员需要尽可能地提高应用的性能,以提高用户的使用体验和满意度。同时,在性能方面的优化还可以减少应用的资源占用和耗电量,也可以为用户节省设备存储空间和流量消耗。
因此一些公司在招聘栏中就有明确的说明:
这里也为大家准备了《Android 性能优化的核心笔记》 如有需要 点击此处免费领取获取,里面记录的有启动优化、、内存优化、网络优化、崩溃优化、UI渲染与卡顿优化、图片加载优化、性能监控……等,算是比较全面的知识点手册了,值得你去收藏参考学习。
部分笔记展示:
内存优化
内存优化是指优化 Android 应用程序的内存使用,以减少可用内存的消耗,提高应用程序的性能和可靠性。Android 内存优化可以通过减少内存使用量,减少对资源的消耗,以及提高内存利用率来实现。
- 内存抖动和内存泄漏
- 内存大户,Bitmap 内存优化
- Profile 内存监测工具
- Mat 大对象与泄漏检测
启动优化
Android启动优化是指通过优化应用程序的启动过程,使其在启动时更快地响应用户的操作。
网端存在的一个定律叫8秒定律:即指用户访问一个网站时,如果等待打开的时间超过8秒,超过70% 的用户将会放弃等待。
同样的,移动端也有一个8秒定律:如果一个App的启动时间超过8秒或有明显的卡顿,80%的用户将会退出应用并对程序员进行口吐芬芳。当然这是我瞎编的,但却不代表是不存在的。最起码肯定会影响App在市场上的评分,进而让更多的用户在对比过程中选择竞品。
- 冷启动和热启动解析
- APP启动黑白屏解决办法
- 启动速度与执行效率优
网络优化
Android应用为什么需要考虑网络优化,主要基于以下几个原因:
- 流量:App的移动网络流量消耗对用户来说是比较敏感的;
- 电量:网络请求对电量的消耗是比较大的,影响手机的待机时间;
- 用户体验:网络请求是耗时操作,如果App请求等待时间长,会给用户网络卡, 应用反应慢的感觉。
网络请求优化的目的是尽可能的减少用户等待的时间、减少用户的流量使用、减少对手机电量的消耗,最终达到提升用户体验。