《Android性能优化》笔记
《Android性能优化》下载地址:计算机书籍控
如果下载链接失效或者不完整,可百度搜索下载
目录
这里写图片描述
这里写图片描述
这里写图片描述
作者说:优化像是一门艺术
1. JAVA代码优化
代码优化不是应用开发的首要任务,提供良好的用户体验并专注于代码的可维护性,这才是首要任务。代码优化应该最后才做,甚至完全可能不用做。不过,良好的优化可以使程序性能直接打到一个可接受的水平,因而也就无需再重新审视代码中的缺陷并耗费更多的精力去解决它们。
1.1 Android如何执行代码
Android开发者使用JAVA,不过Andriod平台不用JAVA虚拟机(JVM)来执行代码,而是把应用编译成Dalvik字节码,使用Dalvik虚拟机来执行。JAVA代码仍然编译成JAVA字节码,但随后JAVA字节码会被dex编译器(dx,SDK工具)编译成Dalvik字节码。最终,应用只包含Dalvik字节码,而不是JAVA字节码。Dalvik的编译器可以将字节码编译为本地代码,由设备处理器直接执行。
1.2 算法的优化
这里写图片描述
这里写图片描述
简单递归--->减少递归次数--->迭代--->减少迭代次数--->BigInteger解决溢出--->混合BigInteger和基本类型--->缓存
缓存思想:
这里写图片描述
LruCache 先丢弃最近最少使用的项目
1.3 API等级
这里写图片描述
1.4 数据结构
好的算法和数据结构是实现代码高效的关键。比如:当HashMap(键为对象)键为Integer时,可以用SparseArray(键为整数)代替,减少对象创建,优化内存。
这里写图片描述
1.5 SQLite优化
1.5.1 SQLite语句
1)compileStatement、populateWithCompileStatement、populateWithCompileStatementOneTransaction减少SQLite语句的编译次数
如下,在循环外只编译一次:
这里写图片描述
2)使用API(InsertHelper插入多行、ContentValues,它们类似populateWithCompileStatement)减少SQLite语句的编译次数
这里写图片描述
1.5.2 事物
如果不显式创建任何事务,那么SQLite会为每个增删改查操作创建一个事务,并在每次操作后立即提交。显式创建事务有2个基本特性:
1)原子提交
原子提交意味着数据库的所有修改都完成或都不做,事务不会提交部分修改。
2)性能更好
这里写图片描述
1.5.3 查询
限制数据库访问的方式(减少访问时间)来加快查询速度,如减少列的查询
这里写图片描述
1.6 代码检测
检测应用中执行缓慢的代码或潜在缓慢的代码
这里写图片描述
这里写图片描述
2. NDK
字节码需要由虚拟机解释,而本地代码可以由设备处理器直接执行,没有任何中间步骤,执行速度更快,有时快很多。Dalvik的编译器可以将字节码编译为本地代码,减少应用字节码的解释次数(理想情况下仅有一次)。使用NDK时,是在开发环境中将代码编译为本地代码,而不是在Android设备上,直接使用自己生成的本地代码,可以让应用运行得更快。
.
在静态初始化块内调用System.loadLibrary加载本地库,是加载库的最简单的方法。这种块中的代码是在虚拟机加载类时执行的,静态初始化块可能会显著增加开销。
这里写图片描述
.
Dalvik的编译器可以显著提高性能,本地实现并不总是比启用Dalvik的编译器的JAVA实现快
.
JNI提供了多种方式来处理字符串,它们都用相同的方式完成大量工作:
JAVA字符串必须被转换成C/C++字符串;
C/C++字符串必须释放
这里写图片描述
应该在代码中尽可能使用GetStringRegion、GetString-UTFRegion,好处如下:
避免可能的内存分配;
复制String要用的一部分到预先分配的缓冲区(可能在栈上);
不需要释放字符串,避免了忘记释放字符串的风险。
.
出于性能方面的考量,不想每次访问域或调用方法时都去获取一次域或方法的ID。
虚拟机加载类时域和方法的ID就被设置,只要类被加载,改ID就有效。如果类由虚拟机卸载并再次加载,新的ID可能与旧的不同。也就是说,高效的方式是在类被加载时获取ID,即在静态初始化块中获取。
这里写图片描述
关注专题Android开发常用开源库
微信公众号
这里写图片描述
QQ群
这里写图片描述