hi 大家好,我是 DHL。就职于美团、快手、小米。公众号:ByteCode,专注有用、有趣的硬核原创内容,Kotlin、性能优化、系统源码、图解算法、大厂面经。
Android 14 要来了,做好准备要开始适配 Android 14 了,这篇文章主要介绍在 Android 14 上一些功能和权限的变更,接下来我们一起来看一下这些行为的变更对我们的 App 产生哪些影响。
必须提供前台服务类型
从 Android 14 开始,如果使用了前台服务需要指定至少一个前台服务类型。如果没有指定,那么在调用 startForeground()
方法的时候,将会抛出 MissingForegroundServiceTypeException
异常。
为了帮助开发人员更好的使用前台服务,Android 10 在 <service>
元素中增加了 android:foregroundServiceType
屬性,在这个属性中指明前台服务类型,我们也可以将多种前台服务类型合并使用,代码如下所示。
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
</application>
</manifest>
Android 提供了以下前台服务类型:
- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted
Android 14 新增了一些前台服务类型:
- health
- remoteMessaging
- shortService
- specialUse
- systemExempted
运行时动态注册广播接收器必须指定导出行为
在 Android 14 上,运行时通过 Context#registerReceiver()
动态注册广播接收器,需要设置标记 RECEIVER_EXPORTED
或 RECEIVER_NOT_EXPORTED
,标识是否导出该广播,避免应用程序出现安全漏洞,如果注册的是系统广播,则不需要指定标记。
隐式意图限制
Android 14 限制 App 使用隐式意图,如果通过一个隐式意图启动一个 exported = false
的组件,将会抛出异常。
例如我在 manifest
中声明了一个 exported = false
的组件 activity
,同时也声明了一个隐式意图。
<activity
android:name=".AppActivity"
android:exported="false">
<intent-filter>
<action android:name="com.example.action.APP_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
如果我们使用下面的方式,通过隐式意图打开 activity
将会抛出异常。
// Throws an exception when targeting Android 14.
context.startActivity(Intent("com.example.action.APP_ACTION"))
如果要启动 exported = false
的组件,应该使用显示意图。
// This makes the intent explicit.
val explicitIntent = Intent("com.example.action.APP_ACTION")
explicitIntent.apply {
package = context.packageName
}
context.startActivity(explicitIntent)
更安全动态加载程序代码
在 Android 14 上,如果你的 App 使用了动态加载程序代码,需要指定为只读状态,否则系统将会抛出异常。示例代码如下所示。
val jar = File("DYNAMICALLY_LOADED_FILE.jar")
val os = FileOutputStream(jar)
os.use {
// Set the file to read-only first to prevent race conditions
jar.setReadOnly()
// Then write the actual file content
}
val cl = PathClassLoader(jar, parentClassLoader)
SCHEDULE_EXACT_ALARM 权限
在 Android 12 上新增 SCHEDULE_EXACT_ALARM
权限,可设置精确闹钟时间,可以调用 setAlarmClock()
、setExact()
setExactAndAllowWhileIdle()
等等方法设置精确闹钟时间, 但是需要在 manifest
中申明 android.permission.SCHEDULE_EXACT_ALARM
权限。
https://developer. android. com/about/versions/12/behavior-changes-12 #exact -alarm-permission
从 Android 14 开始 SCHEDULE_EXACT_ALARM
权限,不在授予 Android 13 以上的版本为目标的应用程序,该权限默认为拒绝状态。
只能终止自己的应用程序
从 Anroid 14 开始,当我们调用 ActivityManager#killBackgroundProcesses()
方法时,只能终止自己的应用程序,如果传入其他应用程序的包名,不会对其他应用程序产生影响,Logcat 也会输出相应的提示。
Invalid packageName: com.example.anotherapp
可安装目标 App targetSdkVersion 下限
从 Android 14 开始,无法安装 targetSdkVersion < 23
的 App,这一目的主要为了提高使用者的安全性和隐私权。
比如某些恶意 App 设置 targetSdkVersion == 22
,避免受到 Android 6.0 Marshmallow
权限的影响,Android 14 变更会让恶意 App 更难躲过更严谨的安全性和隐私权措施,如果你尝试安装 targetSdkVersion < 23
的 App,将会安装失败。
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
使用者无法关闭通知的变更
调用 Notification.Builder#setOngoing(true)
或 NotificationCompat.Builder#setOngoing(true)
方法可以防止使用者关闭前台通知,从 Android 14 开始允许使用者关闭这类型的通知,但是但在下列情況下,使用者无法关闭通知:
- 手机锁定时
- 点击全部清除通知的按钮(避免不慎关闭通知)
字体缩放 200%
从 Android 14 开始,系统支持 200% 的字体缩放倍数,为低视能使用者提供符合无障碍网页内容规范 (WCAG) 的额外无障碍选项。
如果您已经使用缩放像素 (sp) 单位来定义文字大小,则此改动可能不会对您的应用程式造成太大影响。
关于 Android 12 和 Android 13 功能和权限的变更,点击下方链接前查看:
全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎在看、点赞、分享给身边的小伙伴,我会持续分享原创干货!!!
我开了一个云同步编译工具(SyncKit),主要用于本地写代码,同步到远程设备,在远程设备上进行编译,最后将编译的结果同步到本地,代码已经上传到 Github,欢迎前往仓库 hi-dhl/SyncKit 查看。
Hi 大家好,我是 DHL,就职于美团、快手、小米。公众号:ByteCode ,分享有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂面经,真诚推荐你关注我。
- 公众号:ByteCode
- 哔哩哔哩: space.bilibili.com/498153238
- 掘金: juejin.im/user/259450…
- 博客: hi-dhl.com
- Github: github.com/hi-dhl
最新文章
- Android 13这些权限废弃,你的应用受影响了吗?
- Android 12 已来,你的 App 崩溃了吗?
- 国外大厂面试题, 7 个 Android Lifecycle 重要的知识点
- Android 利器,我开发了云同步编译工具
- Twitter 上有趣的代码
- 谁动了我的内存,揭秘 OOM 崩溃下降 90% 的秘密
- 反射技巧让你的性能提升 N 倍
- 90%人不懂的泛型局限性,泛型擦除,星投影
- 揭秘反射真的很耗时吗,射 10 万次耗时多久
- Google 宣布废弃 LiveData.observe 方法
- 影响性能的 Kotlin 代码(一)
- 揭秘 Kotlin 中的 == 和 ===
开源新项目
-
云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 SyncKit
-
KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit
-
最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice
-
LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,在线阅读