Android6到Android 15重点适配

1、安卓6到安卓15适配主要内容:①②③④⑤⑥⑦⑧⑨
Android 6:
新增运行时权限,区分普通权限和危险权限,危险权限除了在清单文件即AndroidManifest.xml文件中注册,还需要在需要权限的代码位置动态申请,比如相机、电话、定位、存储。android6.0 之前,我们把app需要用到的权限全部罗列在Manifest清单文件中。

Android 7:
禁止在您的应用外部公开 file:// URI。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。

Android 8:
①、通知渠道id
Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。targeSdk升级到26之后,所有的通知的实现都需要提供通知渠道,如果不提供通知渠道的话,所有通知在8.0系统上面都不能正常展示。 需要有渠道id 、渠道name
②、后台执行限制
应用在后台运行,需要调用 Context.startForegroundService()启动服务。且应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。
③、允许安装未知来源应用
8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。
④、 取消隐式广播
移除掉了所有的隐式广播(即清单文件中注册的广播),所以请使用显示广播进行注册(即代码注册)。
⑤、权限
之前对于隐私权限只要申请一个就会将其在的权限组全部通过,android 8.0以后申请单个只给单个;

Android 9:
①、限制非 Activity 环境中启动 Activity
不能从非 Activity 环境中启动 Activity,除非您传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。
②、HTTP接口请求限制
Android 9.0 限制了明文流量(即HTTP接口)的网络请求,非加密的流量请求都会被系统禁止,或者直接使用HTTPS接口。解决办法在 res 目录下新建xml文件夹,添加network_security_config.xml文件或者在Application属性中添加如下配置 android:usesCleartextTraffic="true"
③、对非 SDK 接口的限制
现已禁止访问特定的非 SDK 接口,无论是直接访问,还是通过 JNI 或反射进行间接访问。尝试访问受限制的接口时,会生成 NoSuchFieldException 和 NoSuchMethodException 之类的错误。
④、限制后台对传感器的访问
App后台运行时,以下行为受限: 麦克风、摄像头、陀螺仪、加速度计等传感器。
⑤、前台服务
Android 8.0 增加startForegroundService()来创建一个前台服务,在Android 9.0 调用该函数时,还需要额外添加FOREGROUND_SERVICE权限,这是普通权限,否则会发生 SecurityException 异常。
⑥、 硬件序列号
在 Android 9 中,Build.SERIAL 始终设置为 “UNKNOWN” 以保护用户的隐私。
如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE 权限,然后调用 getSerial()。

Android 10:
①、后台运行时访问设备位置信息需要权限
Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限(危险权限)。该权限允许应用程序在后台访问位置。如果请求此权限,则还必须请求ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION权限。只请求此权限无效果。
②、限制了对剪贴板数据的访问权限
除非您的应用是默认输入法 (IME) 或是目前处于焦点的应用,否则它无法访问 Android 10 或更高版本平台上的剪贴板数据。
③、分区存储
分区存储将外部存储分成两部分:
(1)App-specific directory (沙盒目录)
APP只能在Context.getExternalFilesDir()目录下通过File的方式创建文件,APP卸载的时候,这个目录下的文件会被删除;无法通过File的方式在其他路径创建文件。getExternalFilesDir
(2)Public Directory 公共目录
公共目录包括:多媒体公共目录(Photos, Images, Videos, Audio)和下载文件目录(Downloads)。
APP可以通过MediaStore 或者 SAF(System Access Framework)的方式访问其中的文件。APP卸载后,文件不会被删除。
Android Q以上移除了WRITE_EXTERNAL_STORAGE权限,应用不需要这个权限就可以向沙盒内存储文件,也可以通过媒体数据库的方式保存媒体数据至特定位置。
requestLegacyExternalStorage的作用是允许应用访问外部存储的所有文件,而不需要遵循Android 10及以上版本对外部存储访问的限制。
App卸载后,对应的沙盒目录也会被删除,如果APP想要在卸载时保留沙盒目录下的数据,要在 AndroidManifest.xml 中声明 android:hasFragileUserData=“true”,这样在 APP卸载时就会有弹出框提示用户是否保留应用数据。
④、标识符和数据
Build.getSerial()
TelephonyManager.getImei()
getDeviceId()、getMeid()、getSimSerialNumber()、getSubscriberId()
序列号、国际移动设备身份码、移动设备标识号、设备的唯一标识符
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能正常使用以上这些方法。

Android11:
①、强制执行分区存储
将应用更新为以 Android 11 为目标平台后,您将无法使用requestLegacyExternalStorage,而且也没有其他标记可以提供停用分区存储。所有文件访问权限 MANAGE_EXTERNAL_STORAGE,用来获取所有文件的管理权限。
②、电话号码相关权限
Android 11.0 更改了应用在读取电话号码时使用的与电话相关的权限。则必须请求 READ_PHONE_NUMBERS 权限,而不是 READ_PHONE_STATE 权限。
③、前台位置信息访问权限
如果应用的功能在下列某种情况下访问设备的当前位置信息,系统就会认为应用需要使用前台位置信息:
属于应用的某个 Activity 可见。
应用的某个前台服务正在运行中。当有前台服务在运行时,系统会显示一条常驻通知来提醒用户注意。当应用被置于后台时(例如当用户按设备上的主屏幕按钮或关闭设备的显示屏时),其位置信息访问权限会得到保留。
建议你声明 location 的前台服务类型,如以下代码段所示。在 Android 10(API 级别 29)及更高版本中,你必须声明此前台服务类型。
android:foregroundServiceType="location"
④、后台位置信息访问权限
除了前台位置信息部分所述的两种情况之外,如果应用在任何其他情况下访问设备的当前位置信息,系统就会认为应用需要使用后台位置信息。后台位置信息精确度与前台位置信息精确度相同,具体取决于应用声明的位置信息权限。
在 Android 10.0(API 级别 29)及更高版本中,你必须在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便请求在运行时于后台访问位置信息。
⑤、单次授权
从 Android 11.0(API 级别 30)开始,每当你的应用请求与位置、麦克风或相机相关的权限时,面向用户的权限对话框都会包含仅限这一次选项,如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。
⑥、自定义消息框视图(Toast)被屏蔽
Android 11.0上不允许后台显示自定义视图的Toast,如果想要从后台显示Toast,可以使用普通Toast。

Android 12:
①、定位权限:大概位置
在搭载 Android 12.0 或更高版本的设备上,用户可以要求你的应用只能访问大致位置信息。
如果你的应用请求 ACCESS_COARSE_LOCATION 但未请求 ACCESS_FINE_LOCATION,则此变更不会影响你的应用。
如果你的应用请求 ACCESS_FINE_LOCATION 运行时权限,你还应请求 ACCESS_COARSE_LOCATION 权限,以便处理用户授予应用大致位置访问权限的情形。你应该在单个运行时请求中包含这两项权限。
粗略位置: 精确到2平方公里的位置值,请求 ACCESS_COARSE_LOCATION 权限可以获得。
精确位置: 精确到50米以内的位置值,请求 ACCESS_FINE_LOCATION 权限可以获得。
②、PendingIntent可变性
适配的具体就是在创建 PendingIntent时,使用 PendingIntent.FLAG_MUTABLE (可变的) 或 PendingIntent.FLAG_IMMUTABLE(不可变的) 标志。否则运行时会报 IllegalArgumentException。
③、蓝牙权限
如果您的应用程序面向Android 12或更高版本,使用蓝牙功能时请在应用程序的清单文件中声明以下权限:
BLUETOOTH_SCAN:允许蓝牙设备扫描。
BLUETOOTH_CONNECT:允许蓝牙设备连接。
BLUETOOTH_ADVERTISE:允许当前蓝牙设备可以被其他蓝牙设备发现。
④、更安全的组件导出
以Android 12.0 为目标平台的App,如果其包含的四大组件中使用到了 intent 过滤器(intent-filter),则必须显示声明 android:exported 属性,否则App将无法在 Android 12.0 及更高系统版本的设备上安装。
⑤、 应用启动画面
从Android 12.0 开始,所有的App在每次启动时(特指冷启动与温启动),系统都会为我们加上一个默认的启动画面。

Android 13:
①、细化的媒体权限
需要访问其他应用已经创建的媒体文件,必须请求以下一项或多项细化的媒体权限,而不是 READ_EXTERNAL_STORAGE 或者 WRITE_EXTERNAL_STORAGE 权限。
图片和照片:READ_MEDIA_IAMGES
视频:READ_MEDIA_VIDEO
音频:READ_MEDIA_AUDIO
如果用户之前向您的应用授予了 READ_EXTERNAL_STORAGE 权限,系统会自动向您的应用授予细化的媒体权限。否则,当应用请求上表中显示的任何权限时,系统会显示面向用户的对话框。
②、通知运行时权限
Android13则引入了新的运行时通知权限:android.permission.POST_NOTIFICATIONS。
③、广告 ID 需要权限
使用 Google Play 服务广告 ID 且以 Android 13(API 级别 33)及更高版本为目标平台的应用必须在其清单文件中声明常规 AD_ID权限。如果你的应用以 Android 13.0 或更高版本为目标平台且未声明此权限,系统会自动移除广告 ID 并将其替换为一串零。
④、BroadcastReceiver变更
从Android 13开始,以Android13(API 33+)为目标平台的应用,注册静态广播时,需设置对其他应用的可见性:
若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
⑤、 在后台使用身体传感器需要新的权限
Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。
如果您的应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,您还必须声明新的 BODY_SENSORS_BACKGROUND 权限。

Android 14:
①、 应用只能终止自己的后台进程
从 Android 14 开始,当您的应用调用 killBackgroundProcesses() 时,该 API 只能终止您自己应用的后台进程。
②、最低可安装的目标 API 级别
从 Android 14 开始,targetSdkVersion 低于 23 (Android 6.0)的应用无法安装。
③、对于以 Android 14 为目标平台的应用,Android 会通过以下方式限制应用向内部应用组件发送隐式 intent:
隐式 intent 只能传送到android:exported="true"组件。
应用必须使用显式 intent 传送到android:exported="false"的组件,或将该组件标记为android:exported="true"。
如果应用通过未指定组件或软件包的 intent 创建可变待处理 intent,系统现在会抛出异常。
这些变更可防止恶意应用拦截意在供应用内部组件使用的隐式 intent。
④、支持JDK17
Gradle版本最低需要升级至7.4.2,建议升级到8.0.1,如果Gradle升级到8.0以上,jdk需要升级至17以上
⑤、 前台服务类型
targetSdkVersion 34 的情况下,必须为应用内的每个前台服务(foreground-services) 指定至少一种[前台服务]
前台服务类型是在 Android 10 引入的,通过 android:foregroundServiceType 可以指定 <service> 的服务类型,可供选择的前台服务类型有:
camera、location、health、mediaplayback、phoncall
⑥、授予对照片和视频的部分访问权限
Android 14 引入了“所选照片访问权限”,可让用户授权应用访问其媒体库中的特定图片和视频,而不是授予对给定类型的所有媒体内容的访问权限。
⑦、检测用户何时截取设备屏幕截图
为了打造更加标准化的屏幕截图检测体验,Android 14 引入了可保护隐私的屏幕截图检测 API。借助此 API,应用可以按 activity 注册回调。如果用户在该 activity 可见时截取屏幕截图,系统会调用这些回调并通知用户。
注意:该回调未提供实际屏幕截图的图片。用户截取屏幕截图后,屏幕上的内容将由您的应用决定。

Android 15:①②③④⑤⑥⑦⑧⑨
①、 处理最低sdk适配
最低可安装TargetSDK级别为24(Android 7.0)
②、 支持 16 KB 页面大小
Linux 内核限制: Android 基于 Linux 内核,而 Linux 不支持混合页面大小。
CPU 运行模式: CPU 运行时页面大小是全局设置,要么是 4K,要么是 16K,无法混用。
影响:
正面影响: 提升系统内存性能,缩短应用启动时间,降低功耗,加快相机启动速度等。
负面影响: 使用了 .so 动态库的应用需重新编译才能兼容,否则大概率崩溃。

③、 私人空间
私人空间允许用户在其设备上创建一个单独的空间,在额外的身份验证层下,可以让敏感应用得到隔离。
私人空间使用单独的用户配置文件,当用户锁定私人空间时,配置文件将处于暂停,同时 App 耶不再活动,用户可以选择使用设备锁或单独的锁定来保护私人空间。
私人空间应用显示在启动器的单独容器中,并且在私人空间锁定时从最近的视图、通知、设置和其他应用中隐藏。
用户生成和下载的内容(媒体、文件)和帐户在私人空间和主空间之间分开,当私人空间解锁时,系统共享表和照片选择器可用于让应用访问跨空间的内容。
④、将无法安装和使用32位应用
⑤、 新的前台服务类型mediaProcessing
变更内容:引入mediaProcessing前台服务类型,适用于像转码媒体文件这样的操作。
适配须知:系统允许一个应用的媒体处理服务在24小时内运行总共6个小时,之后系统会调用正在运行的服务的Service.onTimeout(int, int)方法。

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

推荐阅读更多精彩内容

  • [toc] 2018面试总结 重载以及重写的区别: 重写(override)重写是子类对父类的允许访问的方法的实现...
    间歇性丶神经病患者阅读 347评论 0 1
  • 整理一些常见的Android面试题(针对于2~3年开发经验中所遇到的问题) synchronized锁静态方法和非...
    appzy阅读 2,304评论 4 18
  • Java equals和==、hashCode的区别 == 比较栈中存储的值是否相同 equals 如果不重写e...
    小的橘子阅读 2,994评论 1 27
  • 一、Java基础1、String类为什么是final的,运行速度,或者说是执行速度,在这方面运行速度快慢为:Str...
    取名废同学阅读 874评论 0 0
  • 经典链接: 1.android最全知识点 2.android开源项目 3.启舰android开发 4.java面试...
    this_is_for_u阅读 448评论 1 8