Android 11 内存适配

compileSDKversion
这个是编译期间你所使用的api版本,一般越高越好,越高表示开发时可以
使用的api越新,并且可以避免使用被抛弃的sdk。

minSdkVersion
这个是支持的最小SDK版本,很好理解,在小于minSdkVersion的手机系统上无法安装

targetSdkVersion
为兼容而生,使开发的app在各个版本的手机系统上表现一致,如果实际手机系统低于开发时定义的targetAPI,那么会以系统api版本为准。而如果实际手机系统的api版本高于开发时定义的targetApi,则会以targetSDK版本为准,缺点就是这样会放弃了新版本的一些特性

在Android 10之前的版本上,我们在做文件的操作时都会申请存储空间的读写权限。但是这些权限完全被滥用,造成的问题就是手机的存储空间中充斥着大量不明作用的文件,并且应用卸载后它也没有删除掉。
为了解决这个问题,Android 10 中引入了Scoped Storage 的概念,通过添加外部存储访问限制来实现更好的文件管理。

存储基本知识

首先明确一个概念,外部储存和内部储存。

  • 内部储存:/data 目录。
    获取本应用的内部储存路径,读写该路径下的文件不需要申请储存空间读写权限,且卸载应用时会自动删除。
一般我们使用getFilesDir()  方法,对应的目录:`//data/data/com.face.myapplication/files`

 getCacheDir() 方法,对应的目录`/data/user/0/com.face.myapplication/cache` 

  • 外部储存:/storage 或 /mnt 目录。一般我们使用getExternalStorageDirectory()方法获取的路径来存取文件。
外部存储 App私有目录 (App卸载的时候,会被清除。)

Android/data/--->存储各个App的外部私有目录
与内部存储类似,命名方式是:Android/data/xx------>xx指应用的包名。
如:/sdcard/Android/data/com.fish.myapplication

读写App外部私有目录

    private void testAppDir(Context context) {
        //4个基本方法
        File fileDir = context.getExternalFilesDir(null);
        //API>=19
        File[] fileList = context.getExternalFilesDirs(null);

        File cacheDir = context.getExternalCacheDir();
        //API>=19
        File[] cacheList = context.getExternalCacheDirs();

        //指定目录,自动生成对应的子目录
        File fileDir2 = context.getExternalFilesDir(Environment.DIRECTORY_DCIM);
    }

只要拿到根目录,就可以遍历寻找其它子目录/文件。

    private void testOtherDir(Context context) {
        File rootDir = Environment.getExternalStorageDirectory();
    }
   返回的rootDir路径:/storage/emulated/0/。

其它目录

比如各个App在/sdcard/目录下创建的目录,如支付宝创建的目录:alipy/,微博创建的目录: com.sina.weibo/,qq创建的目录:com.tencent.mobileqq/等。

image

以下目录无需存储权限即可访问:
1、App自身的内部存储
2、App自身的自带外部存储-私有目录

剩下的都需要申请存储权限,Android 10.0前后对于存储作用域访问的区别就体现在如何访问剩余这些目录内的文件。

其中比较容易混淆的是: 内部存储与外部存储里的App私有目录,两者命名风格很像。

不同点:
/data/data/com.fish.myapplication/ 位于内部存储,一般用于存储容量较小的,私密性较强的文件。而/sdcard/Android/data/com.fish.myapplication/ 位于外部存储,作为App私有目录,一般用于存储容量较大的文件,即使删除了也不影响App正常功能。

相同点:
属于App专属,App自身访问两者无需任何权限。
2、App卸载后,两者皆被删除。
3、两者目录下增加的文件最终会被统计到"设置->存储和缓存"里。

因为不同厂商、系统版本的原因,所以上述的方法并没有一个固定的文件路径。了解了上面的概念,那我们所说的外部储存访问限制,可以认为是针对getExternalStorageDirectory()路径下的文件。

Android 10.0 ( targetSdkVersion 改为 29)访问方式变更

在Android 10 之前 ,用户可以随意在SD 卡创建文件目录,比如我们能够直接在/sdcard/目录下创建目录/文件。事实上,很多App就是这么干的,目录结构很乱,而且App卸载后,对应的目录并没有删除,于是就是遗留了很多"垃圾"文件,久而久之不处理,用户的存储空间越来越小。
总结弊端如下:
1、在设置里"Clear storage"或者"Clear cache"并不能删除该目录下的文件
2、卸载App也不能删除该目录下的文件
3、App可以随意修改其它目录下的文件,如修改别的App创建的文件等,不安全

好处:
1、此处新建的目录不会被设置里的App存储用量统计,让用户"看起来"自己的App占用的存储空间很小
2、方便操作文件

面对众多App随意新建目录/文件的现象,Google在Android 10.0上重拳出击了引入Scoped Storage、分区存储,原理如下:

  • App访问自身内部存储空间与 访问外部存储空间的App私有目录不需要任何权限(这个与Android 10.0之前一致)

  • 外部存储空间-共享存储空间、外部存储空间-其它目录 App无法通过路径直接访问,不能新建、删除、修改目录/文件等, 需要通过Uri访问

适配

最简单粗暴的方法就是在 AndroidManifest.xml 中添加 android:requestLegacyExternalStorage="true" 来请求使用旧的存储模式。但是我不推荐此方法。因为在下一个版本的Android中,此条配置将会失效

  • requestLegacyExternalStorage 是什么?通过翻查官方文档,大概知道了这个属性的意思:在配置targetSdk >= 29,应用搭载在Android 10及以上版本的手机运行时,可以暂时停用「分区存储」
在AndroidManifest.xml 里application标签下添加:
<application
  android:requestLegacyExternalStorage="true"
  ...>

image

作者:wang_desire
链接://www.greatytc.com/p/e5d1ecf7aaf5

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容