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开发1――查找所需要出示权限的内容
  3. 第21天 Android(安卓)Touch事件学习 8 事件分发原理
  4. Android(安卓)API 中文 (42) ―― ListView
  5. Android系统权限和root权限
  6. Android开发1――查找所需要出示权限的内容
  7. mk中的 android:sharedUserId和LOCAL_CERTIFICATE作用 应用程序
  8. Android(安卓)屏幕(View)坐标系统
  9. Android开发实例详解之IMF

随机推荐

  1. 【安卓】Android播放器的三种实现方法
  2. Android(安卓)System Server大纲之Vibrat
  3. 实现Android(安卓)ListView 自动加载更多
  4. android各层调用关系,架构流程
  5. WebView Android(安卓)调用js且须要获取
  6. Android端JQueryMobile使用教程(二)
  7. android 测绘流程
  8. gridlayout 子view撑出屏幕
  9. Android系统手机端抓包方法
  10. Android获取IPV4的方法