RAM(random access memory)随机存取存储器。 相当于电脑内存
ROM(Read-Only Memory)只读存储器,相当于电脑硬盘。
一般Java在内存分配时会涉及到以下区域:
寄存器(Registers):速度最快的存储场所,因为寄存器位于处理器内部,我们在程序中无法控制
栈(Stack):存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆(Heap):堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。
静态域(static field): 静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量
常量池(constant pool):虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。
非RAM存储:硬盘等永久存储空间
一).界面 布局优化
1.使用 include,界面重复利用
2.使用 merge,减少层级,但是merge内外父布局要一致。
3.使用ViewStub,动态延时加载,调用inflate。注意不能调用多次,否则引起异常。
4.布局要减少嵌套,用HierarchyViewer检查层级。
5.UI隐藏时View。Gone是隐藏不进行绘制,提高性能。
二)内存优化
1.service用完要及时关闭。因为一般service开启线程,最好用intentService
2.重写onTrimMemory()回调。(4.0) 当发现TRIM_MEMORY_RUNNING_LOW时app运行且没有被杀死,这是应该释放无用资源来提高系统性能。
3.onLowMemory(4.0以前)
4.getMemoryClass()获取app可用heap大小,
5.在manifest的application中添加largeHeap=true,声明一个更大的heap控件,通过getLargeMemoryClass()来获取更大的heapSize()。但是更大ram容易让GC花费更多的时间回收资源
6.避免bitmaps浪费。在3.0以后bitmap pixel data在dalvik heap中可调式。并保存当前屏幕分辨率适当的适配。
7.google protobufs代替xml、json的优化。
8.避免框架过度依赖。Guice 和RoboGuice依赖注入框架是有效的,但会导致代码需要大量RAM来map代码,但是,mapped pages会长时间被保留在RAM中。
9.ProGuard来提出不需要的代码。重命名类,域与方法或代码压缩。使代码更加紧凑
10.编译apk生成后,zipalign 对APK进行重新校准,根本目的是帮助操作系统更高效率的根据请求索引资源,可以减少RAM。googleplay不接受没有aipalign的apk。
11.多进程代替代替多服务。app组件切分成多个组件。
12.如果线程创建频繁,线程池代替临时创建线程。
三)UI控件的优化
1.listview优化:
1)getview中 converview是否为空,空就new,非空就复用
2)自定义viewholder,使用settag和gettag存取
四)java 和android数据容器优化
1.sparseArray HashMap 。避免key和value的自动装箱和装箱后的解箱
2.SparseBooleanArray
3.LongSparseArray
4.ArrayMap 和hashmap
五)内存优化工具
1.内存检测工具Memory Monitor
DDMMS 下的heap工具。可以将当前的内存 Dump成一个 hprof格式的文件。用MAT查看
2.内存泄漏检查工具LeakCanary。
3.Hierarchy Viewer检查节点性能分析,一般是绿,黄,红代表渲染速度
4.TraceView数据收集,分析。其中Timeline Pannel时间线()和Profile Pannel函数面板(主要暂时各个线程中各个函数调用,包括CPU使用时间和调用次数,函数真是执行时间信息。
5.Android 4.4 KitKat 提出了一个新系统服务,叫做procstats(Process Stats:)。它将帮助你更好的理解你app在后台(background)时的内存使用情况。
6.Android还提供了一个工具叫做meminfo。它是根据PSS标准 (Proportional Set Size——实际物理内存)计算每个进程的内存使用并且按照重要程度排序。
7. GT 腾讯开源检查性能工具
https://github.com/TencentOpen/GT
8.Google的开源Battery Historian:检测与电池有关的信息和事件的工具。运行在Android5.0Lollipop(APIlevel21)
https://github.com/google/battery-historian
六)编码优化
1.使用lurcache 处理图片等资源。
2.合理利用强软弱虚四种引用。
3.避免使用枚举,尽量用静态fianal来代替
4.一个方法或类声明为final不会带来性能的提升,但是会帮助编译器优化代码。举例说,如果编译器知道一个getter方法不会被重载,那么编译器会对其采用内联调用。
5.静态方法代替虚拟方法:如果不需要访问某对象的字段,将方法设置为静态,调用会加速15%到20%
6.减少不必要的全局变量。尽量避免static成员变量引用资源耗费过多的实例,比如Context。尽量使用Application这种Context类型Context.getApplicationContext()
7.避免创建不必要的对象。频繁操作一个字符串时,使用StringBuffer代替String
8.成员变量可以设置public。减少Getters/Setters方法。
9.避免使用浮点数,android 浮点数会比整型慢两倍。
10.嵌入式中声明实体类比接口更好
Map map1 = new HashMap();
HashMap map2 = new HashMap();
11.for循环,中第二个范围条件不要调用方法。
12.for循环不要遍历容器,容器遍历要用iterator。或者foreach
13System.arraycopy((Object src,int srcPos, Object dest, int destPos, int length)速度虽然快,但是是浅拷贝。
14.Parcelable序列化对象是内存级别
Serializable IO,文件上的序列化。会产生中间对象。
七)图片优化
1.Bitmap.recycle()注意回收资源
2.BitmapFactory.Options设置inSampleSize这样做可以减少对系统资源的要求。
属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
3.Android中图片有四种属性,分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存 (默认)
RGB_565:每个像素占用2byte内存 (565没有透明度属性)
九)稳定性优化
1.代码静态扫描工具。常见工具有Android Lint、Findbugs、Checkstyle、PMD
2.Crash监控和上传机制。Bugly,友盟,Testin云测
十)耗电优化
1.5.0 之后专门引入了一个获取设备上电量消耗信息的 API:Battery Historian
2.WakeLock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态。主要指屏幕的打开关闭,cpu的保持运行。简单的理解WakeLock是让系统保持"清醒"的一种手段.
关注:https://www.cnblogs.com/leipDao/p/8241468.html
https://www.jianshu.com/p/67ccdac38271
3.计算避免使用浮点运算
4.使用 Job Scheduler( Android 5.0)。你须要在稍后的某个时间点或者当满足某个特定的条件时运行一个任务,比如当设备接通电源适配器或者连接到WIFI。 https://www.cnblogs.com/zhujiabin/p/5949490.html
十一) 安装包大小优化
1.代码混淆。使用proGuard 代码混淆器工具
2。资源优化。比如使用 Android Lint 删除冗余资源
3.图片优化。比如利用 AAPT 工具对 PNG 格式的图片做压缩处理,降低图片色彩位数等。
4.插件化。比如功能模块放在服务器上,按需下载,可以减少安装包大小。
5.避免重复功能的库,使用 WebP图片格式等。
十二)集成第三方插件
1.避免使用相同功能使用多个名称的插件。