您能否列出Android应用程序可以在其中存储数据的所有可能目录,并说明每个目录中存储的数据类型?

评论

另请参阅:特殊的Android SD卡文件夹列表? /是否可以重组SD卡?因为那里很乱/我可以在内部SD中删除哪些目录? /检查应用程序使用什么存储空间?

加上Android文件夹层次结构/ SMS消息存储在文件系统上的什么位置? /在文件系统中的什么位置安装了应用程序?

#1 楼

所有应用程序(无论是否具有root用户)都具有默认数据目录,即/data/data/<package_name>。默认情况下,应用程序数据库,设置和所有其他数据都在此处。如果应用程序希望存储大量数据,或者出于其他原因希望“对内部存储好”,则SDCard上会有一个相应的目录(Android/data/<package_name>)。

除此之外,所有这些应用程序可以将数据存储在SD卡上的任何位置,因为没有限制-许多应用程序都可以这样做。他们可以自由使用目录名称(并且可以再次使用),这通常使得难以确定卡上所有“垃圾”的用途以及可以删除其中的任何内容。

尽管正如汤姆(Tom)所指出的那样,根应用程序几乎可以将数据存储在设备上的任何地方,但它们通常遵循与其他应用程序相同的规则。

您可以找到Android目录层次结构的一般说明在这里我的答案。对于您的特定问题,我可能会在/data/data/<package_name>(和相应的SD部件)上添加更多详细信息: /> databases/:应用程序的库和帮助程序

lib/:其他相关文件

files/:首选项和设置

shared_prefs/:很好,缓存

这个地方可能有更多目录,或更少目录-都取决于应用程序。他们可以在自己的“主目录”中(这基本上就是Linux所说的),将文件放置在所需的位置。通常,这些文件和目录只能由应用程序本身访问(当然,还有根目录),而不是存储在SDCard上的文件和目录,所有应用程序都可以访问。

评论


评论不作进一步讨论;此对话已移至聊天。

–安德鲁·T。♦
12月11日12:58

#2 楼

Android 4.4中的存储发生了一些重大变化(请参阅Android的存储之旅)。因此,以下内容通常适用于Android 4.4以上版本,尤其是6以上版本。
这是我对Android设备上的磁盘空间使用方式有详细的回答。应用程序的文件(通过系统和应用程序本身)保存在不同类别的内部和外部存储中。
DIRECTORY                                                    DESCRIPTION / API
=====================================================================================
APP CODE
========
/data/app/<pkg>*                                             (user apps installation directory)
/data/app/<pkg>*/base.apk                                    (original `.apk` file)
/data/app/<pkg>*/lib/<arch>/*.so                             (shared libraries)
/data/app/<pkg>*/oat/<arch>/base.[art|odex|vdex]             (compiled executable code)
/data/dalvik-cache/<arch>/*.[art|dex|oat|vdex]               (compiled executable code, only for system apps)
/data/misc/profiles/cur/<user_id>/<pkg>/primary.prof         (ART profile)
/data/misc/profiles/ref/<pkg>/primary.prof                   (ART profile)

INTERNAL STORAGE
================
/data/user[_de]/<user_id>/<pkg>                              getDataDir
/data/user[_de]/<user_id>/<pkg>/files                        getFilesDir
/data/user[_de]/<user_id>/<pkg>/[code_]cache                 getCacheDir or getCodeCacheDir
/data/user[_de]/<user_id>/<pkg>/databases                    getDatabasePath
/data/user[_de]/<user_id>/<pkg>/no_backup                    getNoBackupFilesDir
/data/user[_de]/<user_id>/<pkg>/shared_prefs                 getSharedPreferences

EXTERNAL STORAGE
================
/storage/emulated/obb/<pkg>/*.obb                            (shared by multi-users, exposed in following view)
/storage/emulated/<user_id>/Android/obb/<pkg>/*.<pkg>.obb    getObbDirs
/storage/emulated/<user_id>/Android/media/<pkg>              getExternalMediaDirs
/storage/emulated/<user_id>/Android/data/<pkg>/             
/storage/emulated/<user_id>/Android/data/<pkg>/files         getExternalFilesDirs
/storage/emulated/<user_id>/Android/data/<pkg>/[code_]cache  getExternalCacheDirs



上述所有路径都在内部和外部存储中(主要和次要)是应用的私有目录,无需请求任何权限即可访问各自的应用。应用程序还可以在其私有存储中创建其他目录(无法通过API明确提供)。卸载应用程序后,所有属于该应用程序的所有目录都将被删除。 )如果授予了WRITE_EXTERNAL_STORAGE许可(getExternalStorageDirectory返回/storage/emulated/<user_id>)。对于辅助外部存储和可移动存储,使用SAF。请参阅如何将文件保存到外部SD卡中的详细信息?。
但是,在Android 10中,不建议直接写入主外部共享存储(不再提供getExternalStorageDirectorygetExternalStoragePublicDirectory)。应用程序需要使用Android的内置内容提供商之一; MediaStore(用于媒体文件)或SAF(用于任何其他类型的文件)。使用可采用存储时,/data路径可能会替换为/mnt/expand/[UUID]。使用辅助外部存储(例如SD卡)时,将/storage/emulated替换为/storage/[UUID]


对于多个用户/配置文件,不同的设备所有者始终是<user_id>。由于历史原因,0是到/data/user/0的符号链接。二级外部存储仅对设备所有者可用。


OBB目录在用户/配置文件之间共享(最多Android 9)以节省空间。 FUSE / /data/data始终将sdcardfs公开为/storage/emulated/obb


/storage/emulated/<user_id>/Android/obb是FBE设备上的设备加密存储,可让某些应用在启动时运行而无需用户凭据。代码。从名称中可以明显看出每个目录的描述,有关详细信息,请参见API文档。


当操作系统清除缓存时,存储空间不足,使应用程序超过分配的配额排在最前面。

缓存和/data/user_de目录未备份到云中。请参阅官方文档。



#3 楼

您所提出的问题的答案太大。不过,我可以为您提供一个涵盖基础知识的基本答案。

有两种应用程序:根和非根应用。

根应用基本上可以存储/可以在任何地方修改文件。非root用户的应用程序只能在以下位置存储/修改文件:/sdcard/及其后的每个文件夹。大多数情况下,已安装的应用程序将其自身存储在/sdcard/Android/data/sdcard/Android/obb中。某些应用程序将其保存的游戏/配置数据文件存储在/sdcard/APPNAME/ ,或仅在/sdcard/
上才能使用根应用程序,您需要已扎根Android设备并获得其中一个超级用户应用程序的许可。