发现美好生活

Discovering a Better Life

安卓应用程序文件结构是什么(安卓手机桌面文件路径基本)

前言

前两天因为一个更新的能,我将从的apk文件放在了内部存储目录(手机为小米,路径为:data/user/0/packagename/fi)下面,然后安装的时候一直安装不了,提示解析包出错。后来查询发现,安装apk是调用了PackageInstaller,没有相关权限,这个无法获取内部路径,所以会安装不了。借机也复了一遍Andid下面存储相关的知识点,总结一番。

存储分类

对于Andid存储目录,我总结成一张思维导。上面这张很清楚的展示了Andid存储的目录,接下来我们详细每一个目录。

    内部存储

内部存储位于中很特殊的一个位置,对于设备中每一个安装的 App,都会在 data/data/packagename/ 自动创建与之对应的文件夹。如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。对于这个内部目录,用户是无法访问的,除非获取ot权限。

Stng fileDir = .getAbsolutePath; Stng cacheDir = .getAbsolutePath;

一般情况下,我们获取到的路径为data/data/packagename/,小米手机下面打印出来的结果如下:

对于内部存储路径,我们一般通过以下两种方式获取,内部存储空间的获取都需要使用Context:

对应内部存储的路径为: data/data/packagename/fi,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0/packagename/fi

对应内部存储的路径为: data/data/packagename/cache,但是对于有的手机如:华为,小米等获取到的路径为:data/user/0/packagename/cache应用程序的缓存目录,该目录内的文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有保障的,可能会丢掉。

    外部存储

针对于外部存储比较容易混淆,因为在Andid4.4以前,手机机身存储就叫内部存储,入的SD卡就是外部存储,但是在Andid4.4以后的话,就目前而言,现在的手机自带的存储就很大,现在Andid10.0的话,有的手机能达到256G的存储,针对于这种情况,手机机身自带的存储也是外部存储,如果再入SD卡的话也叫外部存储,因此对于外部存储分为两部分:SD卡和扩展卡内存

我们通过一段代码来获取手机的外部存储目录,我们用的手机是三星G4,带有入SD卡的:

if (>= ) {
File fi = getExternalFiDirs;
for (File file : fi) {
("file_dir", );
}
}

对于以上代码,打印的结果如下:

打印出两行目录,第一行目录是机身自带的外部存储目录,目录结构为:/storage/emulated/0/Andid/data/packagename/fi 第二行是存储卡的目录结构,路径为:/storage/extSdCard/Andid/data/packagename/fi

扩展外部存储

此目录路径需要通过context来获取,同时在卸载之后,这些文件也会被删除。类似于内部存储。

getExternalCacheDir

对应外部存储路径:/storage/emulated/0/Andid/data/packagename/cache

getExternalFiDir(Stng type)

对应外部存储路径:/storage/emulated/0/Andid/data/packagename/fi

SD卡存储

SD卡里面的文件是可以被访问,即文件的数据对应用或者用户来说都是可以访问的,当应用被卸载之后,其卸载前创建的文件仍然保留。

对于SD卡上面的文件路径需要通过Envinment获取,同时在获取前需要判断SD的状态:

MEDIA_UNKNOWN SD卡未知MEDIA_REMOVED SD卡移除MEDIA_UNMOUNTED SD卡未安装MEDIA_CHECKING SD卡中,刚装上SD卡时MEDIA_NOFS SD卡为空白或正在使用不受支持的文件MEDIA_MOUNTED SD卡安装MEDIA_MOUNTED_READ_ON SD卡安装但是只读MEDIA_SHARED SD卡MEDIA_BAD_REMOVAL SD卡移除错误MEDIA_UNMOUN 存在SD卡但是不能挂载,例如发生在介质损坏

Stng externalStorageState = ;
if {
//sd卡已经安装,可以进行相关文件操作
}

getExternalStorageDirectory

对应外部存储路径:/storage/emulated/0

getExternalStoragePublicDirectory(Stng type)

获取外部存储的文件夹路径如:

DIRECTORY_MUSIC 音乐目录DIRECTORY_PICTES 目录DIRECTORY_MOVIES 目录DIRECTORY_DOWNLOADS 目录DIRECTORY_DCIM 相机拍照或录像文件的存储目录DIRECTORY_DOCUMENTS 文件文档目录

Stng externalStoragePublicDirectory = .getPath;

以上便是获取相机DCIM目录,对应获取的路径为:/storage/emulated/0/DCIM。

    存储目录

getRootDirectory

对应获取分区根路径:/

getDataDirectory

对应获取用户数据目录路径:/data

getDownloadCacheDirectory

对应获取用户缓存目录路径:/cache

相关概念区别

    getFileDir和getCacheDir区别

这两个都位于内部存储目录/data/data/packagename/下面,位于同别,前者是file目录下面,后面是cache目录下。

    getFileDir和getExternalFiDir(Stng type)区别

前者位于内部存储目录/data/data/packagename/file下面,后者位于外部存储目录/storage/emulated/0/Andid/data/packagename/fi下面,它们都存在于应用包名下面,也就是说属于应用的,所以当卸载后,它们也会被删除的。

对于前面提到的级能,我们从端的需要放到外部存储目录下面,而不是内部存储目录,因为内部存储目录的空间很小。另外我也做了相关,如果将apk放到内部存储目录file下面的话,安装时会出现问题,提示解析包出错。

    数据和缓存的区别

在中有数据和缓存这两个概念,那么这两者分别的是什么目录下面的数据呢?

数据

数据的是保存在中所有数据,就是上面提到的位于packagename下面的所有文件,包含内部存储(/data/data/packagename/)和外部存储(/storage/emulated/0/Andid/data/packagename/)。当然除了SD卡上面的数据,SD卡上面的数据当卸载之后还会存在的。

缓存

缓存是程序运行时的临时存储空间,它可以存放从络的临时,从用户的角度出发缓存对用户并没有太大的影响,但是缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从络上获取。为了在缓存的时候能够正常与应用相关的缓存,请将缓存文件存放在getCacheDir或者 getExternalCacheDir路径下。

以上便是Andid中管存储目录的一些知识。

点赞