Android⽂件系统基本认识
本⼈是⼆流不知名地⽅本科毕业既失业,然后经过很社会培训班洗礼后,再各种碰壁三个⽉后开始Android⼯作,最近⼀年由于⼯作需要⼀直都写Java了,刚好Android⼜需要更新⼀下,那就站在Android应⽤程序CV开发者的⾓度简单总结Android中⽂件基本知识。如有错误纰漏还望不吝赐教。
⼀、Android系统中⽂件
本⼈是通过⽹上技术博客和AndroidStudio⾃带的DeviceFileExplorer⼯具基础上理解整个Android系统⽂件基本框架。
1.1 Android应⽤中常⽤的⽂件⽬录
Android⽂件系统同样是基于Linux的虚拟⽂件系统(VFS),通过系统软件层将不同的底层硬件的差异进⾏差分处理,然后封装统⼀的接⼝提供给应⽤层开发调⽤的。VFC设计的好处是让可以不同类型的技术⼈员专注于解决特定的领域的问题,硬件驱动、操作系统、应⽤层开发等,分⼯明确可以专注于⼀个特定领域更有利于提供⼯作效率,保证整体的稳定性。个⼈都感觉这种宏观设计就是典型的模块化、⾯向对象设计思想。
在中看到简易的Android⽂件树状的图和基本介绍,感觉不错就copy来了,希望原作者不要介意。
1. /data/data/package-name的安装⽬录。 如:百度地图的安装路径是/data/data/com.baidu/ 注意:该⽬录需要获取root权
限才能查看
2. /system/ 存放系统应⽤的apk⽂件,即⼿机⼚商预安装应⽤的apk⽂件,launcher就是在这个⽬录下的 (⼿机⼚商只需把需要预安
装的apk放在该节点的相应路径下,android系统就会⾃⼰解压并安装该apk)
3. /storage/ 该节点是内置存储卡和外置SD卡的挂载点,/storage/emulated/0/是内置存储卡挂载点, /storage/sdcard1是外置
SD卡挂载点(不同的设备挂载节点不⼀样,有些设备可能会挂载到/mnt/节点)
1.2 Android⽂件系统补充知识点
在⽹上看到很多⼈将DeviceFileExplorer截图也贴在博⽂便于理解,但是个⼈感觉这个没有必要因为只要打开是AS连接上真机就可以看到了。
还有看到做系统开发站在Android编译的⾓度总结⽂件系统的⽂章,感觉很不错但是不是很明⽩,还好看到中对Android系统⽂件进⾏层次分明标注,于是就也copy了⼀下记录下来,作为备⽤参考知识。
|-3rdmodemnvm
|-3rdmodemnvmbkp
|-acct                      //系统回收站
|-uid
|-uid_0
|-bin
|-cache                    //缓存
|-config                    //配置
|-cust
|-etc
|-global
|-hw
|-xml
|-data                      //【内部存储】 --> DataDirectory()
|-app                  //存放⽤户安装的软件
|-data                  //存放⽤户安装的所有程序,包含/system/app 和 /data/app 和 /mnt/asec中装的软件
|-android
|-st.demo    //应⽤程序的内部存储⽬录,卸载时⾃动清除
|-app_textures  // --> Dir(String name, int mode)
|-app_webview  // --> Dir(String name, int mode)
|-cache        //缓存,不需要额外的权限;当该⽂件夹超额时,系统将⾃动删除该⽬录中的⽂件  --> CacheDir()
|-code_cache
|-databases    //数据库
|-databases    //数据库
|-files        //不需要额外的权限      --> FilesDir()
|-file1    //  --> FileStreamPath("file1")
|-shared_prefs  //sharedPrefrences配置⽂件
|-.xml 配置⽂件
|-system        //安装app时的注册表配置
|-local
|-tmp
|-user
|-0
|-st.demo    //⽂件系统⽬录的绝对路径,所有属于该应⽤程序的私有⽂件都存储在⽂件系统中 (minsdk 21) --> DataDir()                |-cache        //
|-code_cache    //保存应⽤程序代码缓存⽂件的⽬录路径 (minsdk 21) --> CodeCacheDir()
|-databases    //
|-files        //
|-no_backup    //不会⾃动备份到远程存储的应⽤程序⽂件的路径 (minsdk 21) --> NoBackupFilesDir()
|-dev                      //设备⽂件,Linux系统常规⽂件夹,⾥⾯的⽂件很多都是设备模拟的⽂件系统
安卓系统软件开发培训|-blkio
|-background
|-foreground
|-block
|-input
|-dload
|-eng
|-etc              //系统配置⽂件
|-bluetooth
|-init
|-logo
|-log
|-mnt              //挂载点
|-proc              //运⾏时⽂件
|-product
|-app
|-etc
|-lib
|-media
|-res
|-root
|-sdcard
|-amap
|-Android
|-data      //应⽤程序包同上⾯的/data/st.demo
|-media
|-dcim
|-camera    //照⽚以及视频
|-download      //下载的⽂件,存放.apk包
|-logo
|-movies
|-musics
|-pictures      //屏幕截屏
|-sandbox
|-storage          //【外部存储】
|-sdcard0      //⽂件管理器看到的⽂件下⾯的⽬录跟 /sdcard/⽬录下的⽂件⽬录⼀样  --> ExternalStorageDirectory()
|-Android  //
|-data  //同上⾯的/data/data/
|- st.demo
|-cache        //系统不会时刻监测这⾥的数据,有可能不会⾃动清除  --> ExternalCacheDir()
|-files        // --> ExternalFilesDir
|-file1    // --> ExternalFilesDir("file1")
|-obb  //      --> ObbDir()
|-DCIM      //      --> ExternalStoragePublicDirectory("DCIM")
|-backups
|-baidu
|-Download
|-self
|-sys              //Linux 内核⽂件
|-system            // 包含系统的framework、组件、字体播放器等系统⾃带的资源配置;常⽤开发⼯具tcpdump/sqlite3
|-app          //系统⾃带的应⽤程序, .apk包
|-bin          //存放⽤户常⽤的⼯具程序
|-build.prop    //记录了系统的设置和改变,类似于/etc中的⽂件
|-etc          //存放了系统中⼏乎所有的配置⽂件,根⽬录下的/etc链结于此,⽐如APN接⼊点设置等核⼼配置,
|-modules      //存放内核模块(主要是fs和net)和模块配置⽂件
|-fonts        //字体库
|-framework    //.jar包,系统核⼼⽂件
|-      //⼀个初始化脚本,⽤于将/system/modules和/system/xbin挂载为cramfs,避免系统被⽆意破坏
|-lib          //.so包,系统底层类库,框架层的实现⽂件
|-usr          //⽤户⽂件夹,包含共享、键盘布局、时间区域⽂件等
|-media        //.ogg⾳频⽂件
|-audio    //系统默认铃声
|-alarms            //闹钟
|-animationsounds  //开关机动画
|-notificatinos    //短信或提⽰⾳
|-rignstones        //来电铃声
|-ui                //界⾯⾳效,⽐如键盘敲击声
|-video      //
|-xbin          //系统管理⼯具
|-theme
|-vendor
|-version
⼆、Android应⽤⽂件存储区域
Android系统在应⽤层按照逻辑上划分为两个⽂件存储区域:内部存储空间和外部存储空间。但是开发者根据Android系统提供⽂件接⼝进⾏数据读写操作,最终实现还是要在通过物理介质存储的,所以接下来先从易于理解的存储硬件开始逐步到最后基本开发应⽤认识做基本记录。
2.1 物理存储与逻辑划分
Android物理存储基本认识
本质上讲⼀部Android智能⼿机也是冯·诺依曼结构计算机,既Android智能机中同样是有CPU、内存、磁盘、输⼊输出等基本组件。Android智能⼿机⼚家都有内置的存储磁盘(Google⽂档叫内置的⾮易失性内存),否则它就运⾏不起来的。
⽬前国内Android智能⼿机⼚家也基本上保留MicroSD卡卡槽⽀持扩展,Android中扩展MicroSD卡和内置存储磁盘同样在冯诺依曼计算机结构中都是的磁盘的⾓⾊,只是在物理空间上存储位置不⼀样⽽已,可以类⽐PC机磁盘和移动硬盘。
从"⼤哥⼤"到"功能机"到"⼭寨机"再到现在智能机整个过程中⼀直就伴随有“内存卡/Micro SD卡"。那就从SD卡开始数⼀下常见错误认识:
1. 有⼈错误以为Android的外部存储的物理存储空间就是指SD卡;
2. 当然普通⼈基本上都没有完全搞明⽩内存和磁盘关系,有把内存卡当成内存的。
Android应⽤程序的开发者并不需要完全掌握并理解Android智能机的物理磁盘与底层系统处理逻辑,因为正如上⽂中所讲的基于Linux的虚拟⽂件系统(VFS)的Android在应⽤层屏蔽了内置存储卡和外置SD卡的关系,既同样Api在存储位置选择与实现由系统代码决定。开发者只需要调⽤Android提供⽂件接⼝实现业务需要即可,但是⽤户需要清楚哪些那个Api存储⽂件是可能会随SD卡缺失⽽丢失,哪些是只和APP有关系。
2.2 Android⽂件逻辑划分
所有 Android 设备都有两个⽂件存储区域:内部存储空间和外部存储空间。现在,很多设备将永久性
存储空间划分为单独的“内
部”和“外部”分区。因此,即使没有可移动存储媒介,这两种存储空间也始终存在,并且⽆论外部存储空间是否可移动,这两种存储空间的 API ⾏为都是相同的。由于外部存储空间可能是可移动的,因此这两种选项之间存在⼀些差异。
内部存储空间外部存储空间
1.始终提供 ;
2.只有应⽤本⾝才可以访问保存到此处的⽂件。
3.如果⽤户卸载您的应⽤,系统会从内部存储空间中移除1.并⾮始终提供,因为⽤户可以将外部存储空间装载为 USB 存储设备,也可以在某些情况下将其从设备中移除 ;
2. 全局可读,因此保存到此处的⽂件可能在您的控制范围之外被读取。
3.如果⽤户卸载您的应⽤,系统会从此处移除您应⽤的⽂件(仅当您通过 getExternalFilesDir()
您应⽤的所有⽂件将这些⽂件保存到⽬录中)。
内部存储空间外部存储空间
/data/data/package_name/……/storage/……
Google⽂档的建议
1. 如果开发者希望确保⽤户和其他应⽤都⽆法访问您的⽂件,最好使⽤内部存储空间。
2. 对于不需要访问限制的⽂件以及您希望与其他应⽤共享或允许⽤户通过计算机访问的⽂件,外部存储空间是最佳位置。
3. 注意:尽管应⽤默认安装到内部存储空间中,但您可以通过在清单中指定 android:installLocation 属性将应⽤安装到外部存储空间中。如果要安
装的 APK ⾮常⼤且外部存储空间⽐内部存储空间⼤得多,则⽤户会倾向于使⽤此选项。
2.3 Android开发⽂件基本API
内部存储 internal Storage
内部存储 位于应⽤包名相同的⽬录下,既属于内部存储的⽂件,与应⽤相关联,当应⽤卸载之后,内
部存储中的这些⽂件也被删除。
内部存储空间⼗分有限,因⽽显得可贵,⽽且,它也是系统本⾝和系统应⽤程序主要的数据存储所在地,⼀旦内部存储空间耗尽,⼿机也就⽆法使⽤了。所以对于内部存储空间,需要合理使⽤。
内部存储的⼏个基本知识点
1. App应⽤中不需要任何系统权限即可读取和写⼊这些⽅法返回的内部⽬录;
2. 内部存储函数⼀般都是需要Context来获取和操作;
3. App中Shared Preferences、SQLite数据库、WebView 缓存信息以及App内部缓存file均属于内部存储,且⽬录为
data/data/package_name/;
4. getFreeSpace() 和getTotalSpace() 分别提供存储卷中的当前可⽤空间和总空间,不引发 IOException
获取合适的File对象:当存储在内部存储时,可⽤通过下⾯⽅法:
Context getFilesDir(): 返回应⽤程序的内部files⽬录的File对象。
Context getCacheDir():返回⼀个应⽤程序内部临时⽂件⽬录的File对象,这个临时⽂件在不需要时会被删除,在系统可⽤存储很低时也会被系统删除。
//打开指定⽂件 流
//输出流
String filename = "fileName";
byte[] fileContent = "Hello world!";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.Bytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
获取存储⽂件夹
其他详细可以直接查看Google⽂档
三、Android应⽤开发⽂件存储区域

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。