我已经将模拟器版本和Android SDK版本更新到Android S (Android 12)。更新后,我无法运行项目。我不能运行Hello, World!项目(空项目),但我可以建立Gradle以及,但我不能运行项目。我总是得到错误:
Manifest合并失败:针对Android 12及更高版本的应用程序失败
需要为android指定一个显式值:当
相应的组件定义了一个意图过滤器。看到
https://developer.android.com/guide/topics/manifest/activity-element#exported
获取详细信息。
我该怎么解决呢?
以下是截图:
使用Android 12 SDK时如何解决此问题?
这个问题是应用这个问题的解决方案之后的问题,和这个问题不一样。而且,这个问题比这个更古老。
在你的清单,添加android:exported="true"或android:exported="false "在你的默认启动活动属性。
完成了!你可以在Android 12上运行你的应用程序。
<manifest ... >
<activity
android:name=".ui.dashboard.DashboardActivity"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</manifest>
根据需要设置“android:exported”的值。
广播接收器是否可以从其应用程序之外的非系统源接收消息——如果可以,则为"true",如果不能,则为"false"。如果“false”,广播接收器只能接收由系统、相同应用程序的组件或具有相同用户ID的应用程序发送的消息。
如果未指定,默认值取决于广播接收器是否包含意图过滤器。如果接收端包含至少一个意图过滤器,则默认值为“true”。否则,默认值为false。
此属性不是限制广播接收器外部曝光的唯一方法。您还可以使用权限限制可以发送消息的外部实体(请参阅permission属性)。
来自Android文档
我还必须添加android:exported="true"到我在清单中声明的所有接收器。所以我有这样的东西:
<receiver android:name=".alarms.AlarmReScheduler"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<!-- For HTC devices -->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
我不认为你应该把android:exported="true"添加到所有东西。你应该只在那些Broadcast接收器需要对Android OS可见时添加它。这段代码中的Intent过滤器意味着我想让Android OS唤醒我的Android应用程序并执行一个操作。
Android .intent.action. boot_completed就是一个很好的例子,因为Android OS会向安装在设备中的每个应用程序发送广播。所以从技术上讲,这意味着任何带有动作的intent过滤器的Broadcast接收器都应该声明android:exported="true"。
如果你在你的清单中没有找到一个没有“android: exported = false”标签的活动,那么它很可能是在你的依赖项中…为了精确定位,首先将“compileSdkVersion”降级为30,将“targetSdkVersion”降级为30,这样它就可以构建了。
android {
compileSdkVersion("android-S")
buildToolsVersion "30.0.3"
defaultConfig {
...
minSdkVersion 23
targetSdkVersion("S")
...
}
之后,在主manifest.xml窗口中有一个带有“merged manifest”的选项卡。在那里,你可以检查哪些活动没有“android: exported = false”属性。
在我的案例中,这是因为第三方工具:
文件建立。Gradle (: app):
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
//and
debugImplementation "com.github.markzhai:blockcanary-android:1.5.0"
releaseImplementation "com.github.markzhai:blockcanary-no-op:1.5.0"
此外,对于服务,我必须添加属性:
<service
android:name=".autofillservice.MyAutofillService"
android:exported="true"
android:permission="android.permission.BIND_AUTOFILL">
and
<service
android:name="com.demo.myApp.my_access.MyAccessService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
由于我的问题是在第三方依赖,它不会很快更新,我只是添加了一个<活动>声明与标志android:exported="true"和export ="false"需要覆盖初始声明的地方,也因为我需要这个依赖在调试中,我只添加了一个新的AndroidManifest.xml文件在src/ Debug:
leak_canary:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="leakcanary.internal.activity.LeakActivity"
android:exported="true"
android:icon="@mipmap/leak_canary_icon"
android:label="@string/leak_canary_display_activity_label"
android:taskAffinity="com.squareup.leakcanary.${applicationId}"
android:theme="@style/leak_canary_LeakCanary.Base">
<intent-filter android:label="@string/leak_canary_import_hprof_file">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:mimeType="*/*" />
<data android:host="*" />
<data android:pathPattern=".*\\.hprof" />
<data android:pathPattern=".*\\..*\\.hprof" />
<data android:pathPattern=".*\\..*\\..*\\.hprof" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.hprof" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.hprof" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.hprof" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.hprof" />
</intent-filter>
</activity>
<activity
android:name="leakcanary.internal.RequestStoragePermissionActivity"
android:excludeFromRecents="true"
android:exported="false"
android:icon="@mipmap/leak_canary_icon"
android:label="@string/leak_canary_storage_permission_activity_label"
android:taskAffinity="com.squareup.leakcanary.${applicationId}"
android:theme="@style/leak_canary_Theme.Transparent" />
<receiver
android:name="leakcanary.internal.NotificationReceiver"
android:exported="false" />
</application>
</manifest>
你不妨只是使用tools:node="merge"属性,并声明android:exported=true|false作为LeoFarage善意的建议。
在你的清单,添加android:exported="true"或android:exported="false "在你的默认启动活动属性。
完成了!你可以在Android 12上运行你的应用程序。
<manifest ... >
<activity
android:name=".ui.dashboard.DashboardActivity"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</manifest>
根据需要设置“android:exported”的值。
广播接收器是否可以从其应用程序之外的非系统源接收消息——如果可以,则为"true",如果不能,则为"false"。如果“false”,广播接收器只能接收由系统、相同应用程序的组件或具有相同用户ID的应用程序发送的消息。
如果未指定,默认值取决于广播接收器是否包含意图过滤器。如果接收端包含至少一个意图过滤器,则默认值为“true”。否则,默认值为false。
此属性不是限制广播接收器外部曝光的唯一方法。您还可以使用权限限制可以发送消息的外部实体(请参阅permission属性)。
来自Android文档