查看原文
其他

适配 Android 14,功能和权限的变更,你的应用受影响了吗

程序员DHL ByteCode 2023-12-27

hi 这是 dhl 的第 85 篇原创文章

个人微信: hi-dhl

Hi 大家好,我是 DHL,大厂全栈程序员,就职于 美团、快手、小米。分享技术干货和编程知识点,包含性能优化、系统源码、算法、数据结构、大厂面经

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_EXPORTEDRECEIVER_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 功能和权限的变更,点击下方链接前查看:

全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎 在看点赞分享 给身边的小伙伴,我会持续分享原创干货!!!


推荐阅读

Android 11 提高 App 冷启动速度 5% 以上

被裁现状,给找工作的同学一些建议

微信黑科技

往期视频


Hi 大家好,我是 DHL,大厂全栈程序员,就职于 美团、快手、小米。分享技术干货和编程知识点,包含性能优化、系统源码、算法、数据结构、大厂面经,欢迎关注我。

  • 哔哩哔哩https://space.bilibili.com/498153238

  • 掘金https://juejin.im/user/2594503168898744

  • 博客https://hi-dhl.com

  • Githubhttps://github.com/hi-dhl

👇🏻 真诚推荐你关注我👇🏻

因微信公众号更改了推送机制

可能无法及时看到最新文章

 将公众号设为 星标 

或常为文章点 在看

即可及时收到最新文章


欢迎前往 博客 查看更多 Kotlin、Jetpack 、动画算法图解、系统源码分析等等文章。以及开源项目、LeetCode / 剑指 offer / 国内外大厂面试题 / 多线程 题解。

https://www.hi-dhl.com

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存