0%

存储优化<上>-常见的存储方式

Android存储安全

在4.3以前,应用都在自己的沙盒里,沙盒使用标准Linux保护机制,为每个应用创建唯一 Linux UID 来定义。简单来说,就是保证微信不能访问淘宝的数据

4.3以后引入SELinux,进一步定义应用沙盒边界。即使我们进程有root权限也不能为所欲为(想干事情必须先在安全策略配置文件中赋予权限)。

数据加密:Android 两种加密,全盘加密和文件加密。全盘加密在4.4引入,在 5.0 后默认打开

常见数据存储方法

综合来看,Android提供了 SharedPreferences /ContentProvider/文件/数据库

SharedPreferences

非常简便,但是问题比较多:

  • 跨进程不安全
  • 加载缓慢(使用异步加载,且没设置线程优先级,就有可能出现主线程等待低优先级线程所问题)
  • 全量写入(无论commit还是apply,即使只改动一个条目,也会把全部内容写入,并且多次写入一个同一文件,也不会合并为一次)
  • 卡顿(收到系统广播或onPause等时机,系统会强制把sp文件写到磁盘,此过程或阻塞)
  • 还有,存储json等复杂文件时,会有转义等操作,会额外耗时

如果我们想的话,可以使用 MMKV 替代sp,它利用文件锁保证跨进程安全,并且性能也比较好

ContentProvider

ContentProvider 的生命周期默认在 Application 的onCreate 之前,而且是在主线程的,ContentProvider 跨进程传递数据是利用 Android 的 Binder 和匿名共享内存机制。简单来说,就是通过 Binder 传递 (CusorWindow 对象内部的)匿名共享内存的文件描述符,这样数据无需跨进程。

ContentProvider 主要存在以下几个问题:

  • 自定义的 ContentProvider 的构造函数、静态代码块、onCreate 函数尽量不要做耗时操作
  • 性能。传输数据比较小的时候,使用 ContentProvider 不一定划算
  • 安全:ContentProvider本身提供了很好的安全,但是如果是exported,当支持执行 sql 语句时,就要注意 sql 注入问题。

简而言之,ContentProvider 适合相对比较笨重,适合传输量大的数据

谢谢你的鼓励