From b4fcefcc5eb8bc105b985eae470f4f16910775f3 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Mon, 14 Jan 2019 20:22:19 +0800 Subject: [PATCH] add storage opt --- blogs/Android/存储优化.md | 116 ++++++++++++++++++ .../Android/ContentProvider 实现原理.png | Bin 0 -> 38007 bytes 2 files changed, 116 insertions(+) create mode 100644 blogs/Android/存储优化.md create mode 100644 images/Android/ContentProvider 实现原理.png diff --git a/blogs/Android/存储优化.md b/blogs/Android/存储优化.md new file mode 100644 index 0000000..d56eb27 --- /dev/null +++ b/blogs/Android/存储优化.md @@ -0,0 +1,116 @@ +--- +存储优化 +--- + +#### 目录 + +1. 思维导图 +2. Android 的存储基础 + - Android 分区 + - Android 存储安全 +3. 常见的数据存储方法 + 1. 关键要素 + 2. 存储选项 + - SharedPreferences + - ContentProvider + - 文件 + - 数据库 +4. 参考 + +#### 思维导图 + +#### Android 的存储基础 + +##### Android 分区 + +Android 系统可以通过 df 命令来查看分区情况,常见的分区如下: + +| 分区名 | 解释 | +| ------- | ------------------------------------ | +| /system | 操作系统预留,用来存储系统文件和框架 | +| /data | 存储用户数据 | +| /cache | 系统升级过程使用的分区或 recovery | +| /vendor | 用来存储厂商对 Android 系统的修改 | +| /storge | 外置或内置 sdcard | + +不同的分区可以使用不同的文件系统。 + +##### Android 存储安全 + +除了对数据的分区隔离,存储安全也是 Android 系统非常重要的一部分,它分为两部分: + +1. 权限控制 +2. 数据加密 + +#### 常见的数据存储方法 + +存储就是把特定的数据结构转化为可以被记录和还原的格式,这个数据格式可以是二进制的,也可以是 XML、Json、Protocol Buffer 这些格式。 + +在选择某种数据存储方法之前,一般需要考虑哪些关键要素呢? + +##### 关键要素 + +| 要素 | 解释 | +| -------- | ------------------------------------------------------------ | +| 正确性 | 判断它是否靠谱。存储是否完备,有没有支持多线程或者跨进程;内部是否健壮,有没有考虑异常情况下数据的校验和恢复,比如采用双写和备份文件策略; | +| 时间开销 | 时间开销包括 CPU 时间和 I/O 时间,I/O 存储是非常慢的,但是如果存储方法中比如编解码或者加解密等设计的很复杂,整个数据存储过程也会拖慢 CPU 时间 | +| 空间开销 | 即使是相同的数据如果采用不同的编码方式,占用的空间也有所不同。相同的数据所占的空间大小是 XML > Json > Protocol Buffer | +| 安全 | 对于一些敏感的数据,可能需要加密存储等 | +| 开发成本 | 尽可能低成本 | +| 兼容性 | | + +##### 存储选项 + +- SharedPreferences + + SP 使用简单,但是问题也很多。常见的问题有: + + 1. 非进程安全 + + 就算使用 MODE_MULTI_PROCESS ,SP 在跨进程读写也会导致数据丢失,大约会有万分之一的损坏率。 + + 2. 加载缓慢 + + SP 文件的加载使用了异步线程,但是并没有设置线程优先级,如果这个时候 getXxx/putXxx 就会阻塞线程。这就导致出现主线程等待低线程优先级锁的问题。 + + 3. 全量写入 + + 无论是调用 commit 还是 apply,即使只改动了其中一个条目,都会把整个内容全部写到文件。即使多次写入同一个文件,SP 也没有将多次修改合并为一次,这也是性能差的重要原因之一。 + + 4. 卡顿 + + 由于提供了异步落盘的 apply 机制,在崩溃或者其他一些异常情况可能会导致数据丢失。所以当应用收到系统广播,或者被调用 onPause 等一些时机,系统会强制把所有的 SP 对象数据落地到磁盘,如果没有落地完成,这时候主线程会被一直阻塞,这样非常容易造成卡顿、甚至是 ANR。 + + 所以,SP 只能适用于存储少量数据,每个 SP 文件不能过大,最好能把频繁写的数据隔离开。 + + 当然,我们也可以通过复写 Application 的 getSharedPreferences 方法替换掉系统默认实现,比如优化卡顿、合并多次 apply 操作、支持跨进程等等。 + + 即使这样,也不能彻底解决文件,最好使用微信开源的 MMKV。 + + [https://github.com/Tencent/MMKV](https://github.com/Tencent/MMKV) + + MMKV 利用文件锁保证跨进程的安全、使用 mmap 保证数据不会丢失、选用性能和存储空间更好的 Protocol Buffer 替换 XML、支持增量更新等。 + +- ContentProvider + + ContentProvider 支持跨进程通信,但是也有几点需要注意: + + 1. 启动性能 + + ContentProvider 的生命周期默认在 Application onCreate() 之前,而且都是在主线程创建的。自定义的 ContentProvider 不要再类构造方法、静态代码块、onCreate 方法中做耗时操作。 + + 2. 稳定性 + + ContentProvider 在进行跨进程数据传递时,利用了 Android 的 Binder 和匿名共享内存机制。简单来说,就是通过 Binder 传递 CursorWindow 对象内部的匿名共享内存的文件描述符。这样在跨进程传输中,结果数据并不需要跨进程传输,而是在不同进程中通过传输的匿名共享内存文件描述符来操作同一块内存,这是来实现不同进程访问相同数据的目的。 + + ![](https://i.loli.net/2019/01/14/5c3c7116737ab.jpg) + + 基于 mmap 的匿名共享内存机制也是有代价的,当传输的数据量非常小的时候,可能不一定划算,所以 ContentProvider 提供了一种 call 函数,它会直接通过 Bindler 来传递数据。 + + Android 的 Bindler 传输是有大小限制的,一般来说限制是 1~2 MB。ContentProvider 的接口调用参数和 call 函数调用并没有使用匿名共享机制,比如要批量插入很多数据,那么就会出现一个插入数据的数组,如果这个数组太大了,那么这个操作就可能会出现数据超大异常。 + + 3. 安全性 + + 虽然 ContentProvider 为应用程序之间的数据共享提供了很好的安全机制,但是如果 ContentProvider 是 exported,当支持执行 SQL 语句时就需要注意 SQL 注入的问题。另外如果我们传入的参数是一个文件路径,然后返回文件的内容,这个时候也要校验合法性,不然整个应用的私有数据就可能被别人拿到,在 intent 传递参数的时候可能也会有这个问题。 + + 总的来说,ContentProvider 这套方案实现相对比较笨重,适合传输大的数据。 \ No newline at end of file diff --git a/images/Android/ContentProvider 实现原理.png b/images/Android/ContentProvider 实现原理.png new file mode 100644 index 0000000000000000000000000000000000000000..9468d2cb7f85fa191245725a4f0a62fec9dea054 GIT binary patch literal 38007 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