Android优化
代码优化
1.避免产生不必要的对象
对象的创建从来都不是免费的. 一个使用线程分配池的通用垃圾回收器可以让临时对象的分配变得廉价一些, 但是分配内存总是比不分配要昂贵得多.随着在APP中分配更多的对象, 你就得实施定期的强制垃圾收集, 会导致用户体验产生小卡顿现象. 并发垃圾处理器在Android 2.3中引入, 但是总是应该避免不必要的工作. 因此应该在不必要的时候避免创建对象实例. 这里有些有帮助的栗子:
一个int类型的数组比一个Integer对象的数组好很多
一般来说, 如果可以的话应避免创建短期临时的对象. 更少的对象创建意味着更少的垃圾回收, 这会对用户体验有直接的提升.
2.用静态代替虚拟
如果方法不需要访问某对像的字段,将该方法设置为静态,调用速度会提升15%~20%
对于常量使用 final static
3.使用增强for循环
增强for循环(有时也叫”for-each”循环)可以用于实现了Iterable接口的集合和数组. 对于集合, 会分配一个iterator来调用hasNext()和next(). 对于ArrayList, 一个手写的计数循环大概会快3倍(不管有没有JIT), 但是对于其他的集合, 增强的for循环将会完全等同于使用iterator.
4.避免使用浮点数
通常的经验是,在Android设备中,浮点数会比整型慢两倍
7.数据库操作方法的优化
尽量利用原生的SQL语句
原生的SQL省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert、query、 update、delete等函数效率高。当数据库越大,差别也越大
当操作条数较多时,利用事务进行批处理
这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高
db.beginTransaction();
for(Collection c:colls){ insert(db, c); } db.setTransactionSuccessful();
布局优化
Layouts是Android应用里直接影响用户体验的一个关键部分。如果Layout设计的不好,可能导致你的应用大量的内存占用从而导致UI响应很慢。Android SDK提供了工具帮助你分析你的Layouts的性能问题。结合工具同时遵循本节讨论的做法,能实现滑动流畅、占用内存最小的用户界面。
使用Hierarchy Viewer
Hierarchy Viewer工具位于 < SDK >\tools\目录下 ,该工具能分析出你的布局不合理和可以优化的地方。具体用法参见之前文章的介绍例子。
大多数情况下,布局渲染时间差别较大的原因是在LinaerLayout里使用了layout_weight。这将会增加测量(Measure)的时间。你应该仔细的考虑是否有必要使用layout weight。
使用Lint
使用Lint — 查看你的view 层级哪些地方可以优化
使用compound drawables - 一个包含了ImageView与TextView的LinearLayout可以被当作一个compound drawable来处理
使用merge根框架 - 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签
无用的分支 - 如果一个layout并没有任何子组件,那么可以被移除,这样可以提高效率
无用的父控件 - 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件
深层次的layout - 尽量减少内嵌的层级,考虑使用更多平级的组件 RelativeLayout or GridLayout来提升布局性能,默认最大的深度是10
内存优化
为了垃圾回收器能回收你系统的内存,你应该避免引起内存泄露(通常由全局成员hold了对象引用),而且要在合适的时间点(如生命周期回调时,这将在后面章节进一步讨论)释放被引用的对象。
慎用Service
Service执行完后台任务后要停止,注意:不要service任务已完成,而不去停止service
使用IntentService
IntentService不同于普通的Service之处是:
提交的task会系统会post到子线程运行
当后台运行的task完成时,系统会stop掉IntentService
onHandleIntent(Intent intent)
当一个service不需要而还在后台运行时,这是最消耗内存的内存管理错误。因此要慎用服务,当服务完成后台任务时要记得关闭。如果不这样做,由于RAM的限制,你的app运行将变得非常卡,用户也将发现app错误的行为,最后卸载你的应用
用户界面转入后台以后释放资源
例如,在该onStop()里做释放资源(例如网络连接、注销广播等)的工作
使用优化后的集合容器
例如:SparseArray、SparseBooleanArray、LongSpareArray …..
尽量避免使用枚举类型
相比于静态常量,枚举会有超过其两倍以上的内存开销,在android中需严格避免使用枚举
使用ProGuard消除没有使用的代码
使用zipalign优化和对齐apk
优化避免使用更多的内存、资源不会再从apk中映射入内存。
注:google play store不接受没有进行zipalign的apk
I/O使用后需要关闭,数据库和Cursor等使用后要关闭
使用MAT分析和优化内存
使用finalize()+MAT 分析内存泄露