Android文件存储目录结构

本文介绍了Android应用在不同系统版本下的数据存储策略,包括如何避免卸载应用后遗留垃圾数据,以及API 6.0及以后版本的权限管理。探讨了内外部存储的区别,并提供了获取存储路径的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。
大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。

这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数据。

并且在API 6.0之后,根目录文件存储是需要用户授权的,就算你在AndroidManifest.xml中配置了存储权限,用户不授权也是写不进去了。

SD卡读写权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果你想让你的应用被卸载后,与该应用相关的数据也清除掉,该怎么办呢?


通过context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据

如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。并且

这个方法获得的文件存储路径适用于6.0以后系统,只要AndroidManifest.xml配置读写权限了,就不需要用户再授权了。 

正常开发中获取存储路径的方法是:

public String getDiskCacheDir(Context context) {  
    String cachePath = null;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return cachePath;  
}  

可以看到,当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。

设置->应用->应用详情里面的”清除数据“与”清除缓存“选项分别对应的是data/data/<application package>/和data/data/<application package>/cache


external storage (外部存储):

Environment.getExternalStorageDirectory()SD根目录:/mnt/sdcard/ (6.0后写入需要用户授权)

context.getExternalFilesDir(dir)路径为:/mnt/sdcard/Android/data/< package name >/files/… 

context.getExternalCacheDir()路径为:/mnt/sdcard//Android/data/< package name >/cache/…

internal storage(内部存储):

context.getFilesDir()路径是:/data/data/< package name >/files/…

context.getCacheDir()路径是:/data/data/< package name >/cach/…


红米2A:
根目录
根目录->system-----------------------------------------------------------Environment.getRootDirectory()
根目录->system->app(放置系统自带软件.apk文件)
根目录->cache-------------------------------------------------------------Environment.getDownloadCacheDirectory()
根目录->data(需要root)--------------------------------------------------Environment.getDataDirectory()
根目录->data->app(放置自己安装APP.apk文件)
根目录->data->data-------------------------------------------------------Environment.getDataDirectory()
根目录->data->data->com.luoguopeng.ldrone(联想目录:/data/user/0/com.luoguopeng.ldrone/cache)
根目录->data->data->com.luoguopeng.ldrone->app_Map_Assert
根目录->data->data->com.luoguopeng.ldrone->cache---------context.getCacheDir()
根目录->data->data->com.luoguopeng.ldrone->database
根目录->data->data->com.luoguopeng.ldrone->files
根目录->data->data->com.luoguopeng.ldrone->lib(放置.so)
根目录->data->data->com.luoguopeng.ldrone->share_prefs
根目录->mnt/shell/emulated/0------------------------------------------Environment.getExternalStorageDirectory()
根目录->mnt/shell/emulated/0->Android
根目录->mnt/shell/emulated/0->Android->data
根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone
根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone->cache--------context.getExternalCacheDir()
根目录->mnt/shell/emulated/0->Android->data->com.luoguopeng.ldrone->files/DCIM----context.getExternalFilesDir(Environment.DIRECTORY_DCIM)
根目录->mnt/shell/emulated/0->DCIM---------------Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值