卷起来,开始适配 Android 14

6,670 阅读4分钟

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


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


我开了一个云同步编译工具(SyncKit),主要用于本地写代码,同步到远程设备,在远程设备上进行编译,最后将编译的结果同步到本地,代码已经上传到 Github,欢迎前往仓库 hi-dhl/SyncKit 查看。


Hi 大家好,我是 DHL,就职于美团、快手、小米。公众号:ByteCode ,分享有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂面经,真诚推荐你关注我。


最新文章

开源新项目

  • 云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 SyncKit

  • KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit

  • 最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,在线阅读