适配 Android 14,功能和权限的变更,你的应用受影响了吗
hi
这是 dhl
的第 85 篇原创文章个人微信: hi-dhl
Hi 大家好,我是 DHL,大厂全栈程序员,就职于 美团、快手、小米。分享技术干货和编程知识点,包含性能优化、系统源码、算法、数据结构、大厂面经
Android 14 要来了,做好准备要开始适配 Android 14 了,这篇文章主要介绍在 Android 14 上一些功能和权限的变更,接下来我们一起来看一下这些行为的变更对我们的 App 产生哪些影响。
必须提供前台服务类型
从 Android 14 开始,如果使用了前台服务需要指定至少一个前台服务类型。如果没有指定,那么在调用 startForeground()
方法的时候,将会抛出 MissingForegroundServiceTypeException
异常。
为了帮助开发人员更好的使用前台服务,Android 10 在 <service>
元素中增加了 android:foregroundServiceType
屬性,在这个属性中指明前台服务类型,我们也可以将多种前台服务类型合并使用,代码如下所示。
<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
,同时也声明了一个隐式意图。
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
将会抛出异常。
context.startActivity(Intent("com.example.action.APP_ACTION"))
如果要启动 exported = false
的组件,应该使用显示意图。
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 也会输出相应的提示。
可安装目标 App targetSdkVersion 下限
从 Android 14 开始,无法安装 targetSdkVersion < 23
的 App,这一目的主要为了提高使用者的安全性和隐私权。
比如某些恶意 App 设置 targetSdkVersion == 22
,避免受到 Android 6.0 Marshmallow
权限的影响,Android 14 变更会让恶意 App 更难躲过更严谨的安全性和隐私权措施,如果你尝试安装 targetSdkVersion < 23
的 App,将会安装失败。
使用者无法关闭通知的变更
调用 Notification.Builder#setOngoing(true)
或 NotificationCompat.Builder#setOngoing(true)
方法可以防止使用者关闭前台通知,从 Android 14 开始允许使用者关闭这类型的通知,但是但在下列情況下,使用者无法关闭通知:
手机锁定时
点击全部清除通知的按钮(避免不慎关闭通知)
字体缩放 200%
从 Android 14 开始,系统支持 200% 的字体缩放倍数,为低视能使用者提供符合无障碍网页内容规范 (WCAG) 的额外无障碍选项。
如果您已经使用缩放像素 (sp) 单位来定义文字大小,则此改动可能不会对您的应用程式造成太大影响。
关于 Android 12 和 Android 13 功能和权限的变更,点击下方链接前查看:
全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎 在看、点赞、分享 给身边的小伙伴,我会持续分享原创干货!!!
推荐阅读:
往期视频
Hi 大家好,我是 DHL,大厂全栈程序员,就职于 美团、快手、小米。分享技术干货和编程知识点,包含性能优化、系统源码、算法、数据结构、大厂面经,欢迎关注我。
哔哩哔哩:https://space.bilibili.com/498153238
掘金:https://juejin.im/user/2594503168898744
博客:https://hi-dhl.com
Github:https://github.com/hi-dhl
👇🏻 真诚推荐你关注我👇🏻
因微信公众号更改了推送机制
可能无法及时看到最新文章
将公众号设为 星标
或常为文章点 在看
即可及时收到最新文章
欢迎前往 博客 查看更多 Kotlin、Jetpack 、动画算法图解、系统源码分析等等文章。以及开源项目、LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解。
https://www.hi-dhl.com