Android外置存储备忘

本文是我和大牛同事的聊天记录,只是备忘。各位看官可能会觉得前言不搭后语,如果看不懂请勿喷。本人工作忙,没有时间仔细整理。



A :

为什么android的外置存储这块搞那么复杂

/data/media挂到/mnt/runtime/(default,read,write)/emulated上,然后在进程创建的时候,/mnt/runtime/(default,read,write)又mount到/storage 。还要考虑primary和secondary。把之前的fuse换成sdcardfs。搞这一套只是为了权限控制吗?

B:

权限控制是主要的,sdcardfs纯粹是为了提升效率,fuse毕竟一个进程服务所有app的读写请求,I/O效率太低


A:

他是怎么控制权限的呢? 我看了下,/mnt/runtime/(default,read,write)的权限都是rwxr-xr-x




B:

不同的挂载视图,everybody组的mask不一样,通过mask来屏蔽用户组的读写权限


A:

我也发现了,/data/media向/mnt/runtime/(default,read,write)/emulated挂载的时候,mask是不一样的。我还是内核里看了sdcardfs的源码,没看懂


B:

fs的代码就不管了,主要还是那堆fuse的逻辑挪到kernel里边了


A :

每个进程在访问sdcardfs的时候,都是判断的everybody组吗? 那sdcard_rw/sdcard_r组还有用么。


B:

嗯;

sdcard_rw只对default挂载模式有意义


A:

在zygote fork进程的时候,每个进程根据申请的sd卡权限不同,会创建自己的mount namespace。你说的不同的挂载视图是指的这个吧?

WRITE_MEDIA_STORAGE这个权限主要是控制可插拔的外置sd卡吗? 我之前都不知道还有这个权限。谷歌为什么限制应用访问外置sd卡呢


B:

挂载视图是google的说法,就是default read write这三个挂载点,因其权限不同但实际都指向同一存储位置,所以用视图这个说法比较准确

大家都随地大小便,谁给搽屁股?关键也不知道谁拉的,不能乱搽


A :

那它把外置sd卡和internal sd卡一样对待不就完了么? 还搞出个WRITE_MEDIA_STORAGE,感觉有点多余。再说通过document provider来访问,它就能记录里面的文件是谁创建的?


B :

Write media storage是高级特权,不是谁都能做用的,不能滥用。主要防止第三方在里边乱搞就可以了,请求外置卡存储过程中用户是可以看到的

A:

奥,那明白了,用户在docuemnt ui里面点了文件,调用方才会被赋予permission。我感觉从android 2.x的版本到现在的9.x,变动最大的就是存储这一块,简直是反人类

B:

App默认是可以直接读写externalSD/Android/data/com.package目录的,谷哥一直是建议app把自己的数据放到自己目录下的

安卓的历史,一路都是存储的坑,都丢给厂家了,因为亲儿子从来不支持外置存储


A :

那这两天邮件里的那个问题,我们系统签名的应用申请了WRITE_MEDIA_STORAGE,但是写不了外置存储。到底是什么原因?

这个邮件我看了好几次没看明白


B :

谷哥对这种特权的app不再给其挂载default视图了,且把sdcard_rw组权限也去掉了。外置存储不像内置,本身不可以全局可写,所以所有app都无法通过sdcardfs来写,但这种特权的app可以绕过sdcardfs,直接写/mnt/…这种底层fs路径


A:

那么按谷歌建议的做法,就要通过document provider来写外置存储。为什么document provider能写呢?


B :

上边不是说了,默认可以往android/data/pkg下边写,不用特权就可以,你非得要往其他目录下写吗?


A :

我的意思是,既然app不能随便写外置sd卡,那为什么document provider可以呢? 系统是怎么给他放行的?


B :

手机输入好麻烦,我换电脑。有些App有这个需求

系统就搞了个externalstorageprovider,有write media st特权,有谁有这个需求,就来通过documentui来请求它,它代而为之、


A :

也就是说externalstorageprovider也是通过/mnt/这种底层路径来读写的?


B :




A:

那我就明白了


B :

那你可以跟其他人讲一下


A:

你看这些东西是直接看的源码? 还是看的文档? 我感觉我看代码有点费劲啊,都是些和文件系统相关的底层的概念


B :

只有TNND的source code,RTFSC

A:

我先在我们组里说一下吧。还有,你咋不做技术分享了?可以每个月讲一次,有不少同事挺愿意学习的

我看代码容易钻牛角尖,尤其是看内核代码

上次搞个内核单步调试还没搞好,单步执行老是跳乱


B :

就前几天有人说这个,我也刚看了一通这块


A :

其实android上很多设计理念都很不错,比如sdcardfs,作为一个wrap fs, 把底层的文件系统包装起来,很像代理设计模式。设计的很好,但是当体现到源码上,就有很多细节,比较复杂,如果对文件系统源码不熟,很难分析下来


B:

看个大概,知道大致原理就够了,你又不维护它


A :

所以我看代码有时候钻牛角尖,这个毛病得克服一下。老是想完全搞明白,其实不太实际


B :

android、linuxkernel太多代码了,就是有心思深入,也难免太深入栈溢出了,看到底层都忘了怎么调过来了。。。好读书不求甚解。你现在生活自由无羁绊,是可以随性深入的


A:

生活自由无羁绊,不存在的!!!哈哈哈

更多相关文章

  1. Android平台安全分析
  2. Android(安卓)Permission check的一点认知更新
  3. Android常用高质量框架
  4. Android中的Spinner的用法详解
  5. 如何让android apk 获得系统权限
  6. Flutter之请求权限(适配android)
  7. Android修改system只读权限:remount
  8. Android(安卓)NullPointerException解决方法(空指针异常)
  9. Android安全机制介绍

随机推荐

  1. android 出现gen already exists but is
  2. 设置activity为Dialog类型的设置
  3. Android之 UI主线程ZT
  4. Android(安卓)系统编译
  5. 系出名门Android(8) - 控件(View)之TextS
  6. Android之间互相的录屏直播 --点对点传输
  7. android tabwidget style
  8. Android相对布局RelativeLayout详解
  9. Android快速入门
  10. Android(安卓)Studio系列教程三--快捷键