这里只站在开发者的角度,谈论一下 Android 5.0 之后的版本的主要变化
Android 5.0 L
- 开始支持64位的处理器
- 开始全面由 Dalvik 虚拟机转成ART虚拟机
Android 6.0 M
- 增加全新的动态权限机制(运行时权限)
- 取消支持 Apache HTTP 客户端
Android 7.0 N
- 系统权限的更改,分享私有文件内容的推荐方法是使用 FileProvider,禁止向你的应用外公开 file:// URI
Android 8.0 O
- 通知渠道 — Notification Channels
- 画中画模式 — PIP
Android 9.0 P
- 异型屏适配
- 使用前台服务,必须请求 FOREGROUND_SERVICE 权限
- 不能直接非 Activity 环境中(比如Service,Application)启动 Activity,否则会崩溃报错。保活的说法从此之后越来越少
Android 10 Q
-
新增深色主题的背景(暗黑模式)
-
用户存储权限的变更
- 在外部存储设备中为每个应用提供了一个“隔离存储沙盒”,任何其他应用都无法直接访问您应用的沙盒文件。
- 文件是应用的私有文件,因此不再需要任何权限即可在外部存储设备中访问和保存自己的文件。
- 此变更可让您更轻松地保证用户文件的隐私性,并有助于减少应用所需的权限数量。
- 根目录($rootDir):/storage/emulated/0(不一定,不同设备可能不同),通过Environment.getExternalStorageDirectory()获取。
- 应用程序目录( a p p l i c a t i o n D i r ) : applicationDir): applicationDir):rootDir/Andorid/data/包名
- 应用缓存目录:$applicationDir/cache,通过Context.getExternalCacheDir()获取。
- 应用文件目录:$applicationDir/files, 通过Context.getExternalFilesDir(String type),type为空字符串时获取。type系统提供了很多常用的类型,比如图片和下载等等:
public static String DIRECTORY_MUSIC = "Music";
public static String DIRECTORY_ALARMS = "Alarms";
public static String DIRECTORY_NOTIFICATIONS = "Notifications";
public static String DIRECTORY_PICTURES = "Pictures";
public static String DIRECTORY_MOVIES = "Movies";
public static String DIRECTORY_DOWNLOADS = "Download";
public static String DIRECTORY_DCIM = "DCIM";
public static String DIRECTORY_DOCUMENTS = "Documents";
Environment.getExternalStorageDirectory(): /storage/emulated/0
Context.getExternalCacheDir(): /storage/emulated/0/Android/data/com.learn.test/cache
Context.getExternalFilesDir(""): /storage/emulated/0/Android/data/com.learn.test/files
Context.getExternalFilesDir("test"): /storage/emulated/0/Android/data/com.learn.test/files/test
Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES): /storage/emulated/0/Android/data/com.learn.test/files/Pictures
具体路径在 sd 卡的 Android 目录下面,此目录下有 data、media、obb、obj
data 目录下拥有所有已安装的app的包名为路径的文件夹
访问这些文件不需要申请动态权限,这些文件会随着app的卸载而删除,且并不会使app本身越用越大,跟内部存储是两个地方
- 引入了新的位置权限 ACCESS_BACKGROUND_LOCATION,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行
Android 11 R
- 更改了应用在读取电话号码时使用的与电话相关的权限
- TelecomManager 类中的 getLine1Number() 方法、TelecomManager 类中的 getMsisdn() 方法
- 也就是当用到这两个API的时候,原来的READ_PHONE_STATE权限不管用了,需要READ_PHONE_NUMBERS权限才行
- 需要 APK 签名方案 v2
Android 12 S
- 前台服务优化
- JDK版本强制JDK11
- 蓝牙权限
- 将蓝牙扫描与位置权限进行了分离,解决了长久以来打开蓝牙需要申请定位权限的系统级 bug
- 引入了 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT 权限。这些权限可让以 Android 应用更轻松地与蓝牙设备互动,不再需要申请设备位置信息相关权限。
- 应用启动页
- 系统会在应用的冷启动和暖启动时,使用新的启动页 SplashScreen,该启动页默认由应用ICON + 应用主题的windowBackground内容构成
- 所有的App在每次启动时(特指冷启动与温启动),系统都会为我们加上一个默认的启动画面