android 在发布版本中添加 DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION

nim*_*adi 15 android broadcastreceiver android-permissions android-13

使用 api 级别 33 构建我的应用程序后,android 正在合并清单中添加新权限

    <permission android:name="com.my.package.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature"/>
    <uses-permission android:name="com.my.package.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"/>
Run Code Online (Sandbox Code Playgroud)

我有一个广播接收器,这个权限与此有什么关系吗?我应该更改任何代码吗?有谁知道添加此内容的原因吗?

        <receiver android:enabled="true" android:exported="true" android:name="com.my.package.EventReceiver">
            <intent-filter>
                <action android:name="com.my.package.event"/>
            </intent-filter>
        </receiver>
```
Run Code Online (Sandbox Code Playgroud)

Ket*_*tal 12

来自https://developer.android.google.cn/about/versions/13/features#runtime-receivers

\n
\n

更安全地导出上下文注册的接收器

\n

为了帮助提高运行时接收器的安全性,Android 13 引入了让您的应用能够指定是否应导出已注册的广播接收器并使其对设备上的其他应用可见的功能。在以前版本的 Android 上,设备上的任何应用程序都可以向动态注册的接收器发送不受保护的广播,除非该接收器受到签名权限的保护。

\n

此导出配置适用于至少执行以下一项操作的应用程序:

\n\n
\n

AndroidManifest.xml中的该节点是为了更安全地导出上下文注册的接收器而进行的配置,ContextCompat需要使用此权限来处理广播接收器。

\n

一旦满足了必要的条件,就可以这样使用。更多详细信息,请参阅文档

\n

在 Gradle 中添加依赖项。

\n
dependencies {\n    val core_version = "1.9.0"\n    implementation("androidx.core:core:$core_version")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在应用程序代码中:

\n
// Create an instance of BroadcastReceiver.\nval br: BroadcastReceiver = MyBroadcastReceiver()\n// Create an instance of IntentFilter.\nval filter = IntentFilter(APP_SPECIFIC_BROADCAST)\n// Choose whether the broadcast receiver should be exported and visible to other apps on the device. If this receiver is listening for broadcasts sent from the system or from other apps\xe2\x80\x94even other apps that you own\xe2\x80\x94use the RECEIVER_EXPORTED flag. If instead this receiver is listening only for broadcasts sent by your app, use the RECEIVER_NOT_EXPORTED flag.\nval listenToBroadcastsFromOtherApps = false\nval receiverFlags = if (listenToBroadcastsFromOtherApps) {\n    ContextCompat.RECEIVER_EXPORTED\n} else {\n    ContextCompat.RECEIVER_NOT_EXPORTED\n}\n// Register the receiver by calling registerReceiver():\nContextCompat.registerReceiver(context, br, filter, receiverFlags)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

如果您不需要使用此功能并希望在 AndroidManifest.xml 中删除此节点,您可以这样做:

\n
<uses-permission\n    android:name="${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"         \n    tools:node="remove" />\n
Run Code Online (Sandbox Code Playgroud)\n

将以上代码写入AndroidManifest.xml,合并manifest时DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION将会被移除

\n

  • 您能否解释一下这与自动添加到清单中的权限有何关系?(并请清楚标明引用自Android网站的内容。) (5认同)