Android开发者必知的内存、性能优化细节

1、使用优化过的数据容器 。
在Android framework下,建议使用优化过的数据容器比如:SparseArray,SparseBooleanArray,LongSparseArray 。通用的HashMap实现的内存使用率非常的低,因为他需要为每一个mApping创建一个分离的entry object 。另外,SparseArray类避免了系统对有些key的自动装箱,因而带来了更高的效率 。
2、注意内存的开销 。

Android开发者必知的内存、性能优化细节

文章插图
 
注意你使用的语言和第三方库的成本和开销,要自始至终的将这些因素考虑在你的程序设计中 。通常,有些事情表面上看着没什么问题但实际上的开销让人惊叹 。比如: ·枚举相对于静态常量来说,需要两倍甚至更多的内存 。你应该完全避免在Android中使用枚举 。·每一个在JAVA中的类(包括匿名内部类)使用大约500 bytes的代码量 。·每一个类的实例拥有12-16 bytes的RAM消耗 。·放置一个单独的实体到HashMap中,一个额外加的实体对象分配需要花费32 bytes 。
3、关于代码的抽象抽象是一个好的编程的基础,因为抽象可以提高代码的灵活性和可维护性 。然而抽象也带来了一定的花销,一般情况下,他们有更多的代码需要执行,需要更多的时间和更多RAM来将这些代码映射到内存中 。因此,如果你的抽象不能带来巨大的好处,你就应该割掉你的赘肉 。
4、避免依赖注入框架虽然注入框架给我们带来了很多方便,但是在使用这些框架的时候,框架需要花费很多时间来扫描我们自己写的代码,甚至会将哪些你根本不需要的东西也加载到内存中 。
5、小心的使用扩展库很多扩展库的代码不是针对手机环境开发的,可能在用到移动客户端的时候会导致很低的效率 。因此在使用之前,需要评估一下其占用内存的大小 。
即使库针对手机开发,也会有潜在的危险,因为每一个Library做的事情不尽相同 。比如,一个Library使用nano protobufs而另一个使用micro protobufs 。现在,在你的app中就有两个protobuf 。类似情况经常发生 。
6、使用混淆器移除不必要的代码ProGuard工具通过移除无用代码,使用语意模糊来保留类,字段和方法来压缩,优化和混淆代码 。可以使你的代码更加完整,更少的RAM 映射页 。
7、使用多个进程(注意是process 不是 thread ok?)如果这适合你的app,可能帮助你管理你的app的内存就是将你的app多个部分分配到多个进程中 。该技术必须小心使用并且大多数应用不应该运行在多个进程下 。这个技术的主要应用是后台工作跟天台工作一样重要的情况下 。典型应用就是:当音乐播放器从服务器下载并长时间播放音乐,一般将其分为两个进程:一个是UI,另一个位置后台服务的运行 。
like this:
<service android:name=".PlaybackService"android:process=":background" />process后面需要记住要有个":",这表示该进程属于你的app 。一般情况下,一块基本的空进程需要的内存大小在1.4m左右 。
adb shell dumpsys meminfo com.example.android.apis:empty8、基本性能优化方法的基本原则:1)不要做你不必要的工作;
2)不要申请不必要的内存;
例如,你明明知道一个方法返回一个String之后,你需要对这个String重新进行修改,那么就不要返回一个String,返回一个StringBuffer会是你更好的选择 。
再比如,使用int比使用Integer占用更少的空间 。这个大家肯定都是晓得的 。
【Android开发者必知的内存、性能优化细节】数组比一个Map拥有更好的性能 。
如果你的方法不需要访问类字段,那么让你的方法是static的吧,这将会带来15%-20%速度的提升 。
对于常量,请尽量使用static and final定义 。如果使用final定义常量之后,会减少编译器在类生成时初始化<clinit>方法调用时对常量的存储,对于int型常量,将会直接使用其数值来进行替换,而对于String对象将会使用相对廉价的“string constant”指令来替换字段查找表 。虽然这个方法并不完全对所有类型都有效,但是,将常量声明为static final绝对是一个好的做法 。
避免Getters/Setters 。虽然在一般的面向对象的设计模式中使用Getter和Setter是稀松平常的事情,但是在Android中使用getters/Setters是一个非常糟糕的主意,方法的调用相对于直接查找字段来说十分的昂贵 。在没有JIT的情况下,直接对字段进行访问要比通过Getter访问快了近3倍 。在有JIT的情况下,前者比后者快近7倍 。
使用最新的循环方式 。比如增强for 。


推荐阅读