android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify
升级到android 12后,应用程序无法编译。它显示
"Manifest合并失败,有多个错误,请看日志"。
合并后的清单中显示错误。
合并错误:错误:android:exported需要为.NET指定明确的值。针对Android 12和更高版本的应用程序,当相应的组件定义了一个意图过滤器时,需要为
android:exported
明确指定一个值。详见https://developer.android.com/guide/topics/manifest/activity-element#exported。主清单(该文件)
我已经用android:exported="false"
设置了所有的活动。但它仍然显示这个问题。
我的舱单文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="eu.siacs.conversations">
<uses-sdk tools:overrideLibrary="net.ypresto.androidtranscoder" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="22" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-feature
android:name="android.hardware.location"
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-feature
android:name="android.hardware.location.network"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.microphone"
android:required="false" />
<application
android:name=".Application"
android:allowBackup="false"
android:allowClearUserData="true"
android:appCategory="social"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_app_launch"
android:label="@string/app_name"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_security_configuration"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_app_launch_round"
android:theme="@style/ConversationsTheme"
android:usesCleartextTraffic="true"
android:windowSoftInputMode="adjustPan|adjustResize"
tools:replace="android:label"
tools:targetApi="q">
<activity
android:name=".ui.search.GroupSearchActivity"
android:exported="true" />
<activity
android:name=".ui.profileUpdating.FavouritesActivity"
android:exported="true" />
<activity
android:name=".ui.profileUpdating.NameActivity"
android:exported="true" />
<activity
android:name=".ui.CompulsoryUpdateActivity"
android:exported="true" />
<activity android:name=".ui.payments.doPayment.DoPaymentActivity"
android:exported="true" />
<activity android:name=".ui.individualList.IndividualListActivity"
android:exported="true" />
<activity android:name=".ui.payments.setPayment.SetPaymentActivity"
android:exported="true" />
<activity android:name=".ui.login.otpActivity.OTPActivity"
android:exported="true" />
<activity android:name=".ui.login.loginActivity.LoginActivity"
android:exported="true" />
<service android:name=".services.XmppConnectionService" android:exported="true" />
<receiver android:name=".services.EventReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.ACTION_SHUTDOWN" />
<action android:name="android.media.RINGER_MODE_CHANGED" />
</intent-filter>
</receiver>
<activity
android:name=".ui.ShareLocationActivity"
android:label="@string/title_activity_share_location"
android:exported="true"/>
<activity
android:name=".ui.SearchActivity"
android:label="@string/search_messages"
android:exported="true" />
<activity
android:name=".ui.RecordingActivity"
android:configChanges="orientation|screenSize"
android:theme="@style/ConversationsTheme.Dialog"
android:exported="true" />
<activity
android:name=".ui.ShowLocationActivity"
android:label="@string/title_activity_show_location"
android:exported="true" />
<activity
android:name=".ui.SplashActivity"
android:theme="@style/SplashTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.ConversationsActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:minWidth="300dp"
android:minHeight="300dp"
android:exported="true"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ui.ScanActivity"
android:screenOrientation="portrait"
android:exported="true"
android:theme="@style/ConversationsTheme.FullScreen"
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name=".ui.UriHandlerActivity"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="xmpp" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:host="im.app.in" />
<data android:pathPrefix="/i/" />
<data android:pathPrefix="/j/" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="imto" />
<data android:host="jabber" />
</intent-filter>
</activity>
<activity
android:name=".ui.StartConversationActivity"
android:label="@string/title_activity_start_conversation"
android:launchMode="singleTop"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
<activity
android:name=".ui.SettingsActivity"
android:label="@string/title_activity_settings"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
</intent-filter>
</activity>
<activity
android:name=".ui.ChooseContactActivity"
android:label="@string/title_activity_choose_contact"
android:exported="true" />
<activity
android:name=".ui.BlocklistActivity"
android:label="@string/title_activity_block_list"
android:exported="true"/>
<activity
android:name=".ui.ChangePasswordActivity"
android:label="@string/change_password_on_server"
android:exported="true"/>
<activity
android:name=".ui.ChooseAccountForProfilePictureActivity"
android:enabled="false"
android:label="@string/choose_account"
android:exported="true">
<intent-filter android:label="@string/set_profile_picture">
<action android:name="android.intent.action.ATTACH_DATA" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<activity
android:name=".ui.ShareViaAccountActivity"
android:label="@string/title_activity_share_via_account"
android:launchMode="singleTop"
android:exported="true" />
<activity
android:name=".ui.EditAccountActivity"
android:launchMode="singleTop"
android:exported="true"
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.ConferenceDetailsActivity"
android:label="@string/action_muc_details"
android:exported="true"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ui.ContactDetailsActivity"
android:exported="true"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ui.PublishProfilePictureActivity"
android:label="@string/mgmt_account_publish_avatar"
android:exported="true"
android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ui.PublishGroupChatProfilePictureActivity"
android:exported="true"
android:label="@string/group_chat_avatar" />
<activity
android:name=".ui.ShareWithActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
<!-- the value here needs to be the full class name; independent of the configured applicationId -->
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="eu.siacs.conversations.services.ContactChooserTargetService" />
</activity>
<activity
android:name=".ui.TrustKeysActivity"
android:label="@string/trust_omemo_fingerprints"
android:exported="true"
android:windowSoftInputMode="stateAlwaysHidden" />
<activity
android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:exported="true"
android:theme="@style/Base.Theme.AppCompat" />
<activity android:name=".ui.MemorizingActivity"
android:exported="true" />
<activity
android:name=".ui.MediaBrowserActivity"
android:exported="true"
android:label="@string/media_browser" />
<service android:name=".services.ExportBackupService" android:exported="true"/>
<service android:name=".services.ImportBackupService" android:exported="true"/>
<service
android:name=".services.ContactChooserTargetService"
android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.chooser.ChooserTargetService" />
</intent-filter>
</service>
<service android:name=".services.CompulsoryUpdateService" android:exported="true"/>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.files"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<provider
android:name=".services.BarcodeProvider"
android:authorities="${applicationId}.barcodes"
android:exported="false"
android:grantUriPermissions="true" />
<activity
android:name=".ui.ShortcutActivity"
android:label="@string/contact"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.CREATE_SHORTCUT" />
</intent-filter>
</activity>
<activity
android:name=".ui.MucUsersActivity"
android:exported="true"
android:label="@string/group_chat_members" />
<activity
android:name=".ui.ChannelDiscoveryActivity"
android:exported="true"
android:label="@string/discover_channels" />
<activity
android:name=".ui.RtpSessionActivity"
android:autoRemoveFromRecents="true"
android:exported="true"
android:launchMode="singleInstance"
android:supportsPictureInPicture="true" />
</application>
</manifest>
我的第二个舱单文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="eu.siacs.conversations">
<application tools:ignore="GoogleAppIndexingWarning">
<activity
android:name=".ui.ManageAccountActivity"
android:label="@string/title_activity_manage_accounts"
android:launchMode="singleTask"
android:exported="true"/>
<activity
android:name=".ui.MagicCreateActivity"
android:label="@string/create_new_account"
android:launchMode="singleTask"
android:exported="true"/>
<activity
android:name=".ui.EasyOnboardingInviteActivity"
android:label="@string/invite_to_app"
android:launchMode="singleTask" />
<activity
android:name=".ui.ImportBackupActivity"
android:label="@string/restore_backup"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.conversations.backup" />
<data android:scheme="content" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/vnd.conversations.backup" />
<data android:scheme="file" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="content" />
<data android:host="*" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.ceb" />
<data android:pathPattern=".*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
</intent-filter>
<intent-filter>
<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:host="*" />
<data android:mimeType="*/*" />
<data android:pathPattern=".*\\.ceb" />
<data android:pathPattern=".*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
</intent-filter>
</activity>
</application>
</manifest>
我的gradle文件。
import com.android.build.OutputFile
// Top-level build file where you can add configuration options common to all
// sub-projects/modules.
buildscript {
ext.kotlin_version = "1.5.21"
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
gradlePluginPortal()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath 'com.google.gms:google-services:4.3.8'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
repositories {
google()
mavenCentral()
jcenter()
maven { url 'https://jitpack.io' }
}
configurations {
conversationsFreeCompatImplementation
}
dependencies {
implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'org.sufficientlysecure:openpgp-api:10.0'
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.exifinterface:exifinterface:1.3.2'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'androidx.emoji:emoji:1.1.0'
implementation 'com.google.android.material:material:1.4.0'
conversationsFreeCompatImplementation 'androidx.emoji:emoji-bundled:1.1.0'
implementation 'org.bouncycastle:bcmail-jdk15on:1.64'
//zxing stopped supporting Java 7 so we have to stick with 3.3.3
//https://github.com/zxing/zxing/issues/1170
implementation 'com.google.zxing:core:3.4.1'
implementation 'de.measite.minidns:minidns-hla:0.2.4'
implementation 'me.leolin:ShortcutBadger:1.1.22@aar'
implementation 'org.whispersystems:signal-protocol-java:2.8.1'
implementation 'com.makeramen:roundedimageview:2.3.0'
implementation "com.wefika:flowlayout:0.4.1"
implementation 'net.ypresto.androidtranscoder:android-transcoder:0.3.0'
implementation 'org.jxmpp:jxmpp-jid:1.0.1'
implementation 'org.osmdroid:osmdroid-android:6.1.10'
implementation 'org.hsluv:hsluv:0.2'
implementation 'org.conscrypt:conscrypt-android:2.5.2'
implementation 'me.drakeet.support:toastcompat:1.1.0'
implementation "com.leinardi.android:speed-dial:3.2.0"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2"
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2'
implementation 'com.google.guava:guava:30.1.1-android'
implementation 'org.webrtc:google-webrtc:1.0.32006'
// Lifecycle Helper
implementation "androidx.activity:activity-ktx:1.3.0-rc02"
implementation "androidx.fragment:fragment-ktx:1.3.6"
//Navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
//CardView
implementation "androidx.cardview:cardview:1.0.0"
//Country Code Picker
implementation 'com.hbb20:ccp:2.5.3'
//Firebase
implementation 'com.google.firebase:firebase-bom:28.3.0'
implementation 'com.google.firebase:firebase-auth-ktx:21.0.1'
implementation 'androidx.browser:browser:1.3.0'
//OTP view
implementation 'com.github.mukeshsolanki:android-otpview-pinview:2.1.2'
//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//Gson
implementation 'com.google.code.gson:gson:2.8.7'
//Multidex
implementation 'androidx.multidex:multidex:2.0.1'
//Round Image
implementation 'de.hdodenhof:circleimageview:3.1.0'
// Button with image and text
implementation 'com.github.Omega-R:OmegaCenterIconButton:0.0.4@aar'
//Razor pay
implementation 'com.razorpay:checkout:1.6.10'
//Mixpanel Tracking
implementation 'com.mixpanel.android:mixpanel-android:5.9.1'
//Loading screen
implementation 'com.wang.avi:library:2.1.3'
//Loading
implementation 'com.wang.avi:library:2.1.3'
//Form
implementation 'com.quickbirdstudios:surveykit:1.1.0'
}
ext {
travisBuild = System.getenv("TRAVIS") == "true"
preDexEnabled = System.getProperty("pre-dex", "true")
abiCodes = ['armeabi-v7a': 1, 'x86': 2, 'x86_64': 3, 'arm64-v8a': 4]
}
android {
compileSdkVersion 31
defaultConfig {
minSdkVersion 24
targetSdkVersion 31
versionCode 44
versionName "2.0.4"
multiDexEnabled = true
archivesBaseName += "-$versionName"
applicationId "com.app.app"
resValue "string", "applicationId", applicationId
def appName = "app"
resValue "string", "app_name", appName
buildConfigField "String", "APP_NAME", "\"$appName\""
}
splits {
abi {
universalApk true
enable true
}
}
configurations {
compile.exclude group: 'org.jetbrains' , module:'annotations'
}
dataBinding {
enabled true
}
dexOptions {
// Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false.
preDexLibraries = preDexEnabled && !travisBuild
jumboMode true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
flavorDimensions("mode", "distribution", "emoji")
productFlavors {
conversations {
dimension "mode"
}
free {
dimension "distribution"
versionNameSuffix "+f"
}
compat {
dimension "emoji"
versionNameSuffix "c"
}
}
sourceSets {
conversationsFreeCompat {
java {
srcDir 'src/freeCompat/java'
srcDir 'src/conversationsFree/java'
}
}
}
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
versionNameSuffix "r"
}
debug {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
versionNameSuffix "d"
}
}
if (new File("signing.properties").exists()) {
Properties props = new Properties()
props.load(new FileInputStream(file("signing.properties")))
signingConfigs {
release {
storeFile file(props['keystore'])
storePassword props['keystore.password']
keyAlias props['keystore.alias']
keyPassword props['keystore.password']
}
}
buildTypes.release.signingConfig = signingConfigs.release
}
lintOptions {
disable 'MissingTranslation', 'InvalidPackage','AppCompatResource'
}
subprojects {
afterEvaluate {
if (getPlugins().hasPlugin('android') ||
getPlugins().hasPlugin('android-library')) {
configure(android.lintOptions) {
disable 'AndroidGradlePluginVersion', 'MissingTranslation'
}
}
}
}
packagingOptions {
exclude 'META-INF/BCKEY.DSA'
exclude 'META-INF/BCKEY.SF'
}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
if (baseAbiVersionCode != null) {
output.versionCodeOverride = (100 * variant.versionCode) + baseAbiVersionCode
}
}
}
}
app/build/intermediates/manifest_merge_blame_file/
下的文件中寻找。但如果在清单合并过程中构建失败,那么也许责备文件甚至没有生成。在这种情况下,我真的不知道。
- Michael 2021-07-28
androidx.fragment:fragment-testing:1.3.6
:(
- anotherdave 2021-09-01
我遇到了这个问题,我使用的其中一个库没有正确设置。
Find location
首先,我们需要找到错误的确切位置和/或原因,
这可以通过不同的方法来完成(见下文)。
Find by inspecting merged-manifest (approach #1)
你可以通过做步骤找到它。
将目标SDK设置为30(以消除31以上的错误)。
打开应用程序的清单(
AndroidManifest.xml
),并点击编辑窗格底部的"Merged Manifest
"标签:
如果你把
build.gradle
配置成这样:allprojects { buildDir = "${rootProject.rootDir}/build/${project.name}" }
类似的东西应该在一个子路径中,比如说。
build/my-app/intermediates/merged_manifest/debug/AndroidManifest.xml
进入所有库的单独清单文件(如果创建了合并后的清单,您可以跳过这一步,直接查看合并后的清单即可)。
搜索是否有任何 entry 类型的活动、服务、接收者或提供者不具有
exported
属性,对于每个条目,请遵循“修复找到的条目”部分(或参见一次用于如何设置exported
属性)。将目标SDK设置为31(或改变为30之前的任何版本)。
Find by console logs (approach #2)
在Git-bash中运行类似于以下的程序。
./gradlew assembleDebug --stacktrace --info | tee my-logs.txt
打开
my-logs.txt
文件(上一步创建的,在你喜欢的文本编辑器中).现在,确切的位置在日志中是隐藏的,因此,在创建的
my-logs.txt
文件中搜索,这些关键词:activity#
service#
receiver#
provider#
这应该能找到类似的东西。
activity#androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity
ADDED from [androidx.test:core:1.2.0] C:\Users\Admin\.gradle\caches\transforms-3\709730c74fe4dc9f8fd991eb4d1c2adc\transformed\jetified-core-1.2.0\AndroidManifest.xml:27:9-33:20
- 打开前面步骤确实找到的
AndroidManifest.xml
文件,搜索是否有任何activity
、service
、receiver
或provider
类型的条目 没有exported
属性,请参阅下面的“修复找到的条目”部分(了解如何设置每个条目的exported
属性)。
注意(在撰写本文时)单独通过
--stacktrace
不包括位置信息 ;-)
Fix found entries
如果找到的条目的真正(而不是构建生成的)来源在根项目的清单中(或在你可以改变的地方),将exported
属性直接设置为其中的相应需求(通常是false
),例如:
<receiver
android:name="<name_of_the_entry>"
android:exported="false or true"
tools:node="merge" />
注意
android:exported="..."
和tools:node="merge"
都是上面设置的。
但是,如果发现条目的规范写在第三方库的清单中(这是你无法改变的真实来源),那么通过将其添加到我们的根项目的清单中来覆盖上述库的规范,例如,像。
<provider
android:name="com.squareup.picasso.PicassoProvider"
android:exported="false"
tools:node="merge"
tools:overrideLibrary="com.squareup.picasso.picasso" />
注意这次
tools:overrideLibrary="..."
也被设置了。有关详细信息,请参阅文档,
和/或 SDK 中的类似问题。
manifest.xml
中的所有条目添加tools:node="merge"
条目。
- Jakoss 2021-08-24
修复这样的问题可能有点麻烦,因为 IDE 没有提供错误的详细信息,它只是告诉你有一个没有导出参数的 Activity、Receiver 或 Service,但没有告诉你是哪一个是。正如 Jakos 建议的那样,您可以手动检查合并的清单,或使用 this脚本,以防生成的清单太大。
之后,你可以通过添加导出的属性来修改受影响的条目,如果它是你项目的一部分,或者覆盖它,如果它是一个库的一部分,你可以用。
<activity android:name="name_of_the_activity_inside_library>"
android:exported="false|true"
tools:node="merge" />
更新: 当针对 android S 并且检测到此问题时,清单合并任务似乎失败而没有生成清单,因此我的建议是使用低于 31 的 targetSdk 编译应用程序,然后手动或使用我链接的脚本检查生成的清单. (您可以在 build 文件夹或通过检查生成的 apk 找到合并的清单)
将targetSdkVersion
改回 30
你可以在 31 离开 compileSdkVersion
然后点击运行
对于插桩测试,如果您正在使用 compose 测试,请确保在 compose.ui 依赖项之外添加 androidx.test.ext:junit
androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.4"
android:exported="true"
的工作相结合,你也可以使用ktx版本的androidx.test.ext:junit-ktx
。
- Renato 2021-10-30
检查你的build.gradle
文件是否有以下内容:
debugImplementation "androidx.fragment:fragment-testing:<version>"
如果存在,则将其改为。
androidTestImplementation "androidx.fragment:fragment-testing:<version>"
它应该一直是androidTestImplementation
,但之前存在一些依赖问题,因此有必要使用debugImplementation
作为解决方法。 IDE 实际上会提示您执行此操作。但显然它已针对 SDK 31 进行了修复,如果将其保留为 debugImplementation,则会收到来自依赖包中的 manifest.xml
的 android:exported
-missing 清单错误。
Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]... androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }
- L3n95 2021-10-19
在构建失败后,进入AndroidManifest.xml,在底部点击合并清单,查看哪些活动有intent-filter
但没有exported=true
属性。 或者你可以直接获得那些出错的活动。
将这些活动添加到您的应用程序清单中,并添加android:exported="true"
和应用程序tools:node="merge"
,这将为活动添加导出的属性,从而产生错误。 示例:
<activity
android:name="<activity which is giving error>"
android:exported="true"
tools:node="merge" />
你必须这样做一次,一旦库的开发者更新了他们的库,你就可以将其删除。
tools:node="merge"
将保留所有其他开发者打算拥有的字段。没有它,你的修改将取代原来的。我强烈建议加入tools:node="merge"
更多细节请点击 developer.android.com/studio/build/manifest-merge 。
- Build3r 2021-09-13
作为目标 sdk 更新到 31 android 12,因此您必须在 manifest.xml 中的活动午餐器中执行 android 导出
android:exported="true"
我的问题是test:core:1.3.0(见屏幕截图)。
我不得不覆盖这个库的清单条目,并声明android:exported
属性:
<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity"
android:exported="true"
tools:node="merge"/>
<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
android:exported="true"
tools:node="merge"/>
<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
android:exported="true"
tools:node="merge"/>
androidx.test.ext:junit
的版本换成1.1.3
来解决这个问题了。这个解决方案不需要任何硬编码重写(以及任何其他lib的更新/文件修改),这种情况下,它更好地
- Egor 2022-01-29
<activity
android:name=".MainActivity"
android:exported="true" <** add this line on AndroidManifest.xml**
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
</activity>
我不确定你用什么来编码,但为了在 Android Studio 中设置它,打开你的项目清单并在“活动”部分下,输入 android:exported="true "(如果您喜欢,则为 false)。 我附上了一个例子。
如果您的应用以Android 12或更高版本为目标,您必须在应用的清单文件中声明这些归属标签。 如果应用组件包括LAUNCHER类别,请将android:exported设置为true。
<activity
android:name="com.test.activity.SplashActivity"
android:clearTaskOnLaunch="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:noHistory="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
android:exported="true">
还要检查Androidmanifest中的接收器或服务,如果你正在使用任何接收器或服务,请根据要求设置android:exported="true"或false。
<receiver
android:name="com.test.receiver.ShareReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.test.fcm.android.action.broadcast" />
</intent-filter>
</receiver>
<service
android:name="com.google.android.gms.tagmanager.InstallReferrerService"
android:exported="true" />
同时更新你所有的gradle依赖性。
我已经按照要求更新了以下的依赖关系。
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.razorpay:checkout:1.6.15'
希望它也能对你有所帮助。
我碰巧知道安卓12系统中的这个问题。Android SDK中已经提出了一个错误。为了解决你的问题,这里有一个文件,你可以在android studio中添加并运行该方法。
然后运行def方法,并尝试建立。 这是经过测试的工作方法。
如果你确定在清单文件中的每个元素都添加了导出,但仍有此错误,只需......。
- 切换到项目目录,打开app/build/intermediates/merged_manifest中的合并清单文件。
- 搜索任何包含intent-filter且没有导出属性的组件。
- 在您的清单文件中覆盖此组件,将其复制粘贴到您的主清单文件中去。
提示:如果你找不到合并文件,因为它已经无法生成.临时降级到targetSdkV30版本,并编译SdkV30版本,构建项目以生成该文件,然后按照上述步骤操作,然后升级到31(android12)。
发现这个解决方案这里,对我有用。这是razorpay官方github提供的。他们已经提到他们会在下一个版本中修复它。
<receiver
android:name="com.razorpay.RzpTokenReceiver"
android:exported="false">
<intent-filter>
<action android:name="rzp.device_token.share" />
</intent-filter>
</receiver>
<activity
android:name="com.razorpay.CheckoutActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@style/CheckoutTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<data
android:host="rzp.io"
android:scheme="io.rzp" />
</intent-filter>
</activity>
情况1:没有子模块或库
这个问题从SDK 31开始。如果你没有任何库或子模块,请添加
android:exported="true" <!-- or false as required -->
你可以在标签上点击右键,Android Studio会向你建议。
情况2:有子模块或库
如果你有其他要导入的库或模块,你也必须覆盖它们。关于这一点,请看 "合并清单 "标签。 或者你可以打开
<ProjectRoot>/app/build/intermediates/merged_manifest/<your flavor>/AndroidManifest.xml
在一个编辑器中。我更喜欢第二种方法,因为合并后的清单不允许从Android Studio中搜索。
- 复制<activity>、<receiver>或任何其他导致构建错误的东西。
- 将它们粘贴到主运载工具上
- 根据需要添加android:exported="true"或者android:exported="false"。
- 重建工作
情况3:如果上述任何一项都不起作用
如果上述方法都不奏效,你将不得不等待,直到你的库提供商做出必要的改变。在他们做出改变之前,你可以将SDK版本恢复到30或更低。降低SDK应该可以暂时解决这个问题。
如果你正在使用flutter,升级flutter_local_notifications
到最新版本(现在是9.3.2)可能会解决这个错误..
这是在升级您的TargetSDK 32或支持API Android 12的Android Studio后最常见的问题。
与此相关,这是我的错误。
这些错误是:。
Error:
android:exported needs to be explicitly specified for element <receiver#com.onesignal.BootUpReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
D:\iptvapp\iptvapp\app\src\main\AndroidManifest.xml:99:9-103:20 Error:
android:exported needs to be explicitly specified for element <receiver#com.onesignal.UpgradeReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
然后通过使用合并后的Mainfest Clikc在Libirary上有错误的instacne onesingal。
然后复制错误,如果其接收部分,并将其添加到您的主清单文件中,如下所示,用
安卓:导出
设置为真实就可以了。
和他们
<receiver android:name="com.onesignal.BootUpReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver android:name="com.onesignal.UpgradeReceiver" android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
工作得很顺利!
我的问题是,我们使用的是较早的2.38.1版本的刀柄。
"com.google.dagger:hilt-android:2.38.1"
"com.google.dagger:hilt-android-gradle-plugin:2.38.1"
"com.google.dagger:hilt-android-compiler:2.38.1"
"com.google.dagger:hilt-android-testing:2.38.1"
"com.google.dagger:hilt-android-testing:2.38.1"在引擎盖下依赖于核心测试库1.3.0,该库确实设置了导出的属性。
要解决这个问题,请确保你使用的是最新的匕首柄版本(2.40.5版可以)。
"com.google.dagger:hilt-android:2.40.5"
"com.google.dagger:hilt-android-gradle-plugin:2.40.5"
"com.google.dagger:hilt-android-compiler:2.40.5"
"com.google.dagger:hilt-android-testing:2.40.5"
我在使用sdk 31时遇到了这个错误,并发现解决办法在我的build.gradle文件中。我在编译测试依赖中使用了implementation
,而不是testImplementation
。
我知道这似乎不相关,但是当您查看带有误用测试依赖项的合并清单时,您会看到为 InstrumentedActivity
添加的标签将缺少 exported=true
字段。
引用 关于 android 12 中这种行为变化的官方文档,您应该寻找包含intent-filter
的活动,这些活动需要通过明确设置android:exported
的值来更新。
构建日志应该准确地指向停止你的构建的带有未声明的导出标志的活动。你应该在install
gradle的命令的控制台输出的最后几行之间看到类似这样的东西:
> java.util.concurrent.ExecutionException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/xxxxx.tmp/base.apk (at Binary XML file line #129): YOUR.FULLY.QUALIFIED.NAME.FAILING.ACTIVITY: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present
YOUR.FULLY.QUALIFIED.NAME.FAILING.ACTIVITY
应该指向阻止你构建的具体活动。
对于还在使用Flutter的人来说,除了在应用程序的<活动中放上exported=true,你还需要在安装的插件的<活动中放上它。 因为我使用的是simpleauthflutter包,它在androidmanifest中生成了一个活动,我把exported=true放上了。这是唯一可行的方法,看起来会是这样的
添加
tools:node="merge"
到
<activity...
和升级
androidx.core.test
到最新的版本。
将像一个魅力的工作:)
复制并粘贴gradle脚本到根build.gradle文件的上方。
并执行该任务
doAddAndroidExportedIfNecessary(如果需要的话)。
(为缺失的活动--服务--接收者自动添加所需标签)
doAddAndroidExportedForDependencies
(用于自动添加所需的标签到缺少活动-服务-接收者的依赖关系)。
希望这个脚本可以解决你的问题。
就我而言,我将fragment-testing
更新为1.5.3
版本,这对我有帮助:
dependencies {
debugImplementation androidx.fragment:fragment-testing:1.5.3
}
当我们把targetSkdVersion=31改成最新的12版本时,这个错误就会发生,如果我们没有在启动器活动中使用android:exported="true"和在其他intent_filter、服务或广播接收器中使用android:exported="false"我们应该像这样只在启动器活动中写android:exported="true":
<activity
android:name="com.abc.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
并为服务或广播接收器等写上android:exported="false",就像这些。
<service android:name="com.startapp.sdk.adsbase.InfoEventService"
android:exported="false"/>
<service
android:name="com.startapp.sdk.adsbase.PeriodicJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver android:name="com.startapp.sdk.adsbase.remoteconfig.BootCompleteListener"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
但是,如果这些服务或广播接收器在实现的库中使用,这意味着它将在库的清单文件中。因此,我们将从这些库的清单文件中复制这些服务和广播接收器等,并将其粘贴到我们的主活动清单中,就像上面我将start.io sdk的intent_fileter、服务或广播接收器植入我的应用程序中复制到我的主清单文件。
如何将合并舱单文件复制到主舱单文件
- 打开你的项目的AndroidManifest.xml。
- 在窗口的底部,点击合并后的舱单标签。
- 寻找任何包括intent-filter标签且缺少android:exported属性的活动。
- 现在将所有这些复制到主清单文件中。
只要更新你的所有依赖关系,就应该可以工作了。
只需在你的AndroidManifest.xml中添加这个内容即可。
android:exported="true"
在您的 <activity>
内
暂时的解决方案
将compileSdk、targetSdk改成
编译SDK 30 目标SDK 30
在gradle文件中