Android 性能优化
1.Hugo工具
做项目的时候有时候需要打印方法的传参和返回值,甚至方法的执行时间,有没有一种简单方便通用的方式去做这个呢,Hugo就可以。
2.启动优化
1).避免在启动时做密集沉重的初始化。Application 的oncreate()方法中异步处理耗时操作。
3.布局优化
1).减少嵌套层次及控件个数,保持view的树形结构尽量扁平(使用Hierarchy Viewer可以方便的查看),同时移除所有不需要渲染的view;
2).使用GPU配置渲染工具,定位出问题发生在具体哪个步骤,使用TraceView精准定位代码;
Android 代码审查
4.内存优化
a:内存泄漏:对于Java来说,就是new出来的Object 放在Heap上无法被GC回收(内存中存在无法被回收的对象);内存泄漏发生时的主要表现为内存抖动,可用内存慢慢变少。
1).LeakCanary检测内存泄漏
LeakCanary是square出品的一个检测内存泄漏的库,集成到App之后便无需关心,在发生内存泄漏之后会Toast、通知栏弹出等方式提示,可以指出泄漏的引用路径,而且可以抓取当前的堆栈信息供详细分析。
2.)内存泄漏优化
在Android中很多的内存泄露都是由于在Activity中使用了非静态内部类导致的,就像本文提到的一样,所以当我们使用时要非静态内部类时要格外注意,如果其实例的持有对象的生命周期大于其外部
类对象,那么就有可能导致内存泄露。
b:内存溢出:Android系统的每个进程都有一个最大内存限制,如果申请的内存资源超过这个限制,系统就会抛出OOM错误。
5.避免应用卡顿
1).将耗时操作移到异步中
类如I/O读写、数据库访问等都应该采用异步的方式,不能有“只是一个很小的文件”之类的想法,防微杜渐;
2).合理优化布局,避免OverDraw。
同样的实现功能界面,不同的布局方式产生的View个数以及渲染耗时差异是数倍的,恐怖的差异.
3).合理优化内存
节省内存的分配空间,尽可能的降低GC的频率,缩短GC的平均时间;CPU不被占用,卡顿的几率就会更低;
4).正确使用异步
耗时操作不能都直接随意交给异步,不正确的异步使用方式反而会加剧卡顿;
6.异步处理任务
1).最重要的两个线程优先级是default和background。线程的优先级应该根据线程的工作量谨慎选择,简单来说,
线程优先级应该和该线程期望完成的工作量相反。线程做的工作越多,它的优先级应该越小,以便它不会造成系统资源紧张。
所以,UI线程(Activity的主线程)通常是default优先级,然而后台线程(AsyncTask的线程)通常是background优先级。
2).Thread、AsyncTask适合处理单个任务的场景;
HandlerThread适合串行处理多任务的场景;
IntentService适合处理与UI无关的多任务场景;
当需要并行的处理多任务之时,ThreadPoolExecutor是更好的选择,当然也可以使用AsyncTask传入自定义的线程池;
注意线程优先级的设置;
特别注意对不同场景下异步方式的选择。
3)线程池的使用
线程池的优点有:
(1)复用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。
(2)能够有效的控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。
(3)能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。
1.插件代码自动审查
Alibaba Java Coding Guidelines
网友评论