存储优化

2019-09-30  本文已影响0人  修塔寻千里

Android存储基础

1、Android 分区

分区简单来说就是将设备中的存储划分为一些互不重叠的部分,每个部分都可以单独格式化,用作不同的目的。这样系统可以灵活的针对单独的分区进行不同的操作,而不影响其他分区的数据。


2、Android存储安全

常见数据存储方法

1、关键因素

选择存储方法时一般会考虑一下因素:


2、存储选项

1)SharePreferences的使用

2)ContentProvider的使用

对象序列化

对象序列化就是把一个Object对象所有的信息表示成一个字节序列,包括class信息、继承关系信息、访问权限、变量类型以及数值信息等。

1、Serializable

Serializable是Java原生的序列化机制,广泛地在Android 中使用,可以通过Bundle传递Serializable的序列化数据。
Serializable的原理是通过ObjectInputStream和ObjectOutputStream来实现的。整个序列化过程大量地使用了反射和临时变量,整个计算非常复杂,序列化性能比较差。

2、Parcelable

Parcelable是专门针对Android设计的轻量且高效地对象序列化和反序列化实现方案。Parcelable的实现核心都在Parcel.cpp,它只会在内存中进行序列化操作,并不会将数据存储到磁盘里。也可以通过Parcel.cpp的marshall接口获取byte数组,然后存在文件中从而实现永久保存。
Parcelable注意事项:
Parcelable在使用的时候需要手动添加自定义代码,使用起来比Serializable要麻烦一些,正是因为如此Parcelable才不需要使用反射的方法去实现,提高了性能。

3、Serial

Teitter开源的高性能序列化方案Serial。从实现原理来看Serial就像是把Parcelable和Serializable的有点集合在一起的方案。

数据的序列化

1、JSON

JSON是一种轻量级的数据交换格式,它被广泛的使用在网络传输中,很多应用与服务端的通讯业采用JSON进行通讯。
JSON的优势:

2、Protocol Buffers

Protocol Buffers是Google开源的跨语言编码协议,适用于数据量非常大,对性能要求高的方案。

存储监控

1、性能监控

2、ROM监控

除了某个存储模块的监控,我们也需要对应用整体的ROM空间做详细监控。ROM监控的两个核心指标是文件总大小与总文件数。

SQLite优化

1、基础知识

1)ORM

ORM(Object Relational Mapping)即关系对象映射,用面向对象的概念把数据库中表和对象关联起来,让我们可以不用关心数据库底层实现。Android中常见ORM框架有greenDAO和Google官方的Room,ORM框架使用简单,但是以牺牲部分执行效率为代价的。

2)进程与线程并发

并发问题会导致SQLiteDatabaseLockedException,SQLite并发有两个维度,一个多进程并发,另一个是多线程并发。

多进程并发

SQLite默认支持多进程并发,它通过文件锁来控制多进程的并发。SQLite锁的粒度并没有非常细,它针对的是整个DB文件,内部有5个状态。多进程可以同时获取SHARED锁来读取数据,但是只有一个进程可以获取EXCLUSIVE锁来写数据库,在EXCLUSIVE模式下,数据库连接在断开之前都不会释放SQLite文件的锁,从而避免不必要的冲突,提高数据库访问速度。

多线程并发

SQLite默认支持多洗那成并发模式,更多进程的锁机制一样,为了实现简单,SQLite锁的粒度都是文件级别,并没有实现表级甚至行级的锁。同一个句柄同一时间只有一个线程在操作,这个时候我们需要打开连接池Connection Pool。多线程可以同时读取数据库数据,但是写数据库依然是互斥的。SQLite提供了Busy Retry的方案,即发生阻塞时会触发Busy Retry,此时可以让线程休眠一段时间后,重新尝试操作。如果出现多个写并发的情况,依然有可能出现SQLiteDatabaseLockedException,这个时候应用可以捕获这个异常,然后等待一段时间后再尝试。

3)查询优化

索引优化

正确使用索引大部分情况下可以大大降低查询速度,索引的建立总体来说有一定的原则:

页大小与缓存大小

对于SQLite的DB文件来说,页(page)是最小的存储单位,每个表对应的数据在整个DB文件都是通过一个一个页存储,属于同一个表不同的页以B树(B-tree)的方式组织索引,每一个表都是一个B树。



跟文件系统的页缓存一样,SQLite会将读过的页缓存起来,用来加快下一次读取速度。页大小默认1024Byte,缓存大小默认1000页。每个页永远只会存放一个表或一组索引的数据,即不可能同一个页存放多个表或索引数据。增大页的大小不能不断提升性能,在拐点之后会起反作用,建议选择4KB作为默认的page size以获得更好的性能。

其他优化

2、SQLite其他特性

1)损害与修复

2)加密与安全

数据库的安全主要有两个方面,一个是防注入,一个是加密。防注入可以通过静态安全扫描的方式,而加密一般会使用SQLClipher支持。
SQLite的加解密都是以页为单位,默认使用AES算法加密,加解密的耗时跟选用的密钥长度有关。

3)全文搜索

3、SQLite的监控

1)本地测试

2)耗时监控

3)智能监控

上一篇 下一篇

猜你喜欢

热点阅读