参考资料: https://www.jianshu.com/p/a34c644e3431 https://mp.weixin.qq.com/s/YNMKhqvVjmWsOzh24mDCsw https://mp.weixin.qq.com/s/Sx4fejCDTTI7nlzDpcZfKg
在近期的app安全检测中,说的app存在胡乱操作存储卡的行为,建议将被测系统自身数据存放在系统的安装目录下。那么什么是系统的安装目录,应该怎么做?我们今天一步步来深入了解一下。
Andorid系统有五种数据持久化的方式:
android持久化方式
Android手机的存储分为:内部存储和外部储存,在Android4.4以前,手机机身存储就叫内部存储,插入的SD卡就是外部存储,但是在Android4.4以后这两个存储的定义又有了一些些变化,新的手机不再有外插SD卡的概念,采取了内置闪存(eMMC、UFS等)的方式,所以内部存储和外部存储在新的Android手机上已经在同一个硬件上了。手机机身自带的存储也是外部存储,如果再插入SD卡的话也叫外部存储,不过现在也几乎没有在采用扩展卡内存这种方式来增加手机存储空间了,手机自带的外部存储足矣,除此以外还有一种公有目录存储,它返回的目录全都是共享的公有目录。同时也是造成Android手机文件存储混乱的罪魁祸首! 。
内部存储位于系统中很特殊的一个位置,对于设备中每一个安装的 App,系统都会在 data/data/packagename/xxx 自动创建与之对应的文件夹。如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。对于这个内部目录,用户是无法访问的,除非获取root权限。
内部存储空间的获取都需要使用Context,当然Activity中也可以省略
String fileDir = this.getFilesDir().getAbsolutePath();
打印:
通常对应 内部存储的路径为 data/data/packagename/files,但我的测试手机是小米,而华为和小米手机获取到的路径为:data/user/0/packagename/files。注意:/data/user/0/ 等同于 /data/data/
说明:
String cacheDir = this.getCacheDir().getAbsolutePath();
通常对应内部存储的路径为:data/data/packagename/cache,但我的测试手机是小米,而华为和小米手机获取到的路径为:data/user/0/packagename/cache。该目录内的文件在设备内存不足时会优先被删除掉,所以存放在这里的文件是没有任何保障的,可能会随时丢掉。
说明:
代码:
String dir =this.getDir("spanner",MODE_PRIVATE).getAbsolutePath();
Log.e(TAG, "onCreate: "+dir);
打印:
说明:
外部存储也需要通过context来获取,同时在app卸载之后,这些文件也会被删除。类似于内部存储. 外部存储并不总是可用的,因为外部存储可以移除(早期设备)或者作为USB存储设备连接到PC,访问前必须检查是否挂载(mounted): 我这里展示判断外部存储是否存在的操作代码:
private void getExternalStotageState(){
//获取状态
String externalStorageState =Environment.getExternalStorageState();
//判断是否存在
if(externalStorageState.equals(Environment.MEDIA_MOUNTED)){
Log.e("externalStorageState", "sd卡已经安装,可以进行相关文件操作");
}else{
Log.e("externalStorageState", "sd卡状态:"+externalStorageState);
}
}
代码:
String externalCacheDir =this.getExternalCacheDir().getAbsolutePath();
Log.e("externalCacheDir", externalCacheDir);
结果:
说明:
public static String DIRECTORY_MUSIC = "Music";
String externalFileDir =this.getExternalFilesDir(DIRECTORY_MUSIC).getAbsolutePath();
Log.e("externalFileDir", externalFileDir);
打印:
getExternalFilesDir(String type),type类型你可以根据自己存储文件的类型来定义,会响应的创建出该文件夹。
说明:
代码:
//获取外存媒体文件
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
File[] files =this.getExternalMediaDirs();
for (File file : files) {
Log.e("file_dir", file.getAbsolutePath());
}
}
打印:
说明:
公有目录里面的文件是可以被自由访问,即文件的数据对其他应用或者用户来说都是可以访问的,当应用被卸载之后,其卸载前创建的文件仍然保留。
对于公有目录上面的文件路径需要通过Environment获取
//SD卡外部存储路径
String externalStoragePath =Environment.getExternalStorageDirectory().getPath();
Log.e("externalStoragePath", externalStoragePath);
打印:
String eSPublicMusic = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
Log.e("externalStoragePath共享音乐", eSPublicMusic);
结果:
说明:
对应获取系统分区根路径:/system
对应获取用户数据目录路径:/data
对应获取用户缓存目录路径:/cache,
清除数据清除的是保存在app中所有数据,就是上面提到的位于packagename下面的所有文件,包含内部存储(/data/data/packagename/)和外部存储(/storage/emulated/0/Android/data/packagename/)。当然除了SD卡上面的数据,SD卡上面的数据当app卸载之后还会存在的。
缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取。为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者 getExternalCacheDir()路径下。