Android: 导出需要为 < activity > 显式指定

升级到 android 12之后,应用程序没有进行编译

“明示合并因多个错误而失败,请参阅日志”

在合并清单中显示错误:

合并错误: 错误: android: 导出需要显式指定为。当相应的组件定义了一个意图过滤器时,针对 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>


我的档案:

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
}
}


}
}
156438 次浏览

我不确定您使用什么来编写代码,但是为了在 Android Studio 中设置它,请打开项目的清单,并在“活动”部分下放置 输出 = “ true”(如果您喜欢这样,也可以放置 false)。我举了一个例子。

我遇到了这个问题,我使用的一个库没有正确设置它。

找到位置

首先,我们需要找到错误的确切位置和/或原因,
这可以通过不同的方法来实现(见下文)。

通过检查合并清单 (第一步)来查找

你可以通过以下步骤找到它:

  • 将目标 SDK 设置为30(以消除31 + 错误)。

  • 打开应用程序的清单(AndroidManifest.xml) ,点击编辑面板底部的“ Merged Manifest”选项卡:
    Merged Manifest in Android Studio

    如果你像下面这样配置 build.gradle:

    allprojects {
    buildDir = "${rootProject.rootDir}/build/${project.name}"
    }
    

    类似的东西应该在子路径中,比如:

    build/my-app/intermediates/merged_manifest/debug/AndroidManifest.xml
    
  • 转到所有库的单个清单文件(如果创建了合并的清单,则可以跳过此步骤,只查看合并的清单)

  • 搜索是否有任何 进入类型的活动、服务、接收者或提供者没有 exported属性,对于每个条目,请在“修复找到的条目”部分下面(或者查看一次如何设置 exported属性)。

  • 将目标 SDK 设置回31(或更改为30之前的任何设置)。

通过控制台日志 (方法 # 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文件,搜索是否有任何 进入类型的 activityservicereceiverprovider没有 exported属性,并参见下面的“修复找到的条目”部分(如何设置每个条目 exported属性)。

注意(在编写本文时)单独传递 --stacktrace不包括位置 信息; -)

修复找到的条目

如果找到条目的真实(非构建生成)源在 root-project 的清单中(或者您可以更改的位置) , 将 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 中的类似问题

构建失败后,转到 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" />

你必须这样做一次,你可以删除这一次库开发人员更新他们的库。

修复这样的问题可能有点麻烦,因为 IDE 没有提供错误的详细信息,它只是告诉你有一个 Activity、 Receiver 或 Service 没有导出参数,但是没有告诉你它是哪一个。按照 Jakos 的建议,您可以手动检查合并的清单,或者在生成的清单太大时使用 这个剧本

之后,您可以通过添加导出属性(如果它是项目的一部分)来修改受影响的条目,或者通过以下方法重写它(如果它是库的一部分) :

<activity android:name="name_of_the_activity_inside_library>"
android:exported="false|true"
tools:node="merge" />

更新: 当针对 android S 时,清单合并任务似乎没有生成清单,这个问题被检测到,所以我的建议是使用低于31的 targetSdk 来编译应用程序,然后手动或使用我链接的脚本来检查生成的清单。(您可以在构建文件夹中找到合并的清单,或者通过 检查找到生成的 apk)

临时解决方案

改为

30 TargetSdk 30

在档案里

我碰巧知道机器人12的问题。Android SDK 中已经出现了一个 bug。在您的问题的解决方案这里是一个文件,您可以添加到 android 工作室和运行的方法。

启用 android 导出文件

然后运行 def 方法并尝试构建。 经过试验和测试的工作方法。

我得到了这个错误抛出了什么目标 sdk 31,并发现解决方案是在我的 build.gradle 文件。我在撰写测试依赖项上使用的是 implementation,而不是 testImplementation

看起来似乎没有关系,我知道,但是当你看你的合并清单与滥用的测试依赖,你会看到为 InstrumentedActivity添加的标签,这将是缺少的 exported=true字段。

检查你的 build.gradle文件:

debugImplementation "androidx.fragment:fragment-testing:<version>"

如果有的话,改成:

androidTestImplementation "androidx.fragment:fragment-testing:<version>"

它应该一直是 androidTestImplementation,但是之前有一些依赖性问题,所以有必要使用 debugImplementation作为解决方案。IDE 实际上提示您这样做。但是很明显,它是为 SDK 31修复的,如果您将它作为 debug 实现保留,您将得到 android:exported缺失的清单错误,这个错误来自于依赖包中的 manifest.xml

作为目标 sdk 更新到31 android 12,因此您必须在 Manif.xml 中的活动午餐中执行 android 导出

 android:exported="true"

对于检测测试,如果使用组合测试,请确保除了 compose.ui 依赖项之外还添加了 androidx.test.ext:junit

androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.4"

只要更新所有的依赖项,就可以工作了

引用 官方文件显示机器人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应该指向阻塞构建的特定活动。

这里还有设置 android:exported与影响的联系

我遇到的问题是测试: 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"/>

enter image description here

如果您确定要将导出的元素添加到清单文件中的每个元素并且仍然得到这个错误,那么简单地说:

  1. 切换到项目目录,并在应用程序生成中间件 merge _ manifest 中打开合并的清单文件
  2. 搜索任何包含意图过滤器且没有导出属性的组件
  3. 在清单文件中覆盖此组件,方法是将其复制到主清单文件

提示: 如果您找不到合并文件,因为它已经生成失败。临时降级到 targetSdkVersion 30并编译为 targetSdkVersion 30并构建项目以生成该文件,然后按照上述步骤升级到31(android 12)

如果你的应用针对 Android 12或更高版本,你必须在应用的清单文件中声明这些属性标签。 如果 app 组件包含 LAUNCHER 类别,则将 android: 导出为 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: export = “ 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" />

同时更新你所有的等级依赖。

我已经根据需求更新了下面的依赖项。

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'

希望对你也有帮助。

我的问题是,我们使用的是旧的柄版本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.匕首: hilt-android-test: 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"

targetSdkVersion改回30
你可以在31点离开 compileSdkVersion
然后打 < strong > Run

找到了这个解决方案 给你,为我工作。这是由官方 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: 使用子模块或库

如果要导入其他库或模块,也必须重写它们。有关这一点,请参见“合并清单”选项卡。 或者你可以打开

应用程序/构建/中间层/合并 _ 清单/ 香味 >/AndroidManifest.xml

我更喜欢第二种方法,因为合并清单不允许从 Android Studio 进行搜索。

  1. 复制 < 活动 > 、 < 接收者 > 或任何其他导致构建错误的内容。
  2. 粘贴到主要舱单
  3. 根据需要添加 android: export = “ true”或 android: export = “ false”
  4. 重建

案例3: 如果上述方法都不起作用

如果以上所有方法都不起作用,则必须等待库提供程序进行必要的更改。在他们做出更改之前,您可以将 SDK 版本恢复到30或更低版本。降低 sdk 可以暂时解决这个问题。

如果您正在使用 flutter,将 flutter_local_notifications升级到最新版本(现在是9.3.2)可以解决这个错误。

<activity
android:name=".MainActivity"
android:exported="true" <** add this line on AndroidManifest.xml**
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
</activity>

对于仍在使用 Flutter 的有问题的用户,除了将 export = true 放入应用程序的 < activity 之外,还需要将其放入已安装插件的 < activity 中。 当我使用 simpleauthflutter 包时,它会在 android 清单中生成一个活动,然后输入 export = true。这是唯一的办法。 它会像这样:

这是在使用 API Android 12支持升级 TargetSDK 32或 Android Studio 之后最常见的问题。

把这些联系起来是我的错误:

enter image description here

这些错误是:

 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,该库对 instacne 有错误 单声道。

enter image description here

然后复制错误(如果它是接收方部分)并将其添加到主清单文件中,如下所示

出口

设定为真。

还有他们

 <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>

非常有效!

tools:node="merge"

<activity...

升级

androidx.core.test

到最新版本。

会像魔法一样奏效:)

复制并粘贴根 build.gradle 文件上面的 gradle 脚本

安卓12的级别脚本需要合并

执行任务

必要时出口

(用于自动添加缺少活动-服务-接收者所需的标记)

为依赖出口

(用于自动添加依赖项所需的标记,缺少活动-服务-接收者)

希望这个脚本可以解决你的问题

在我的情况下,我更新 fragment-testing1.5.3版本,这对我有帮助:

dependencies {
debugImplementation androidx.fragment:fragment-testing:1.5.3
}

只需将它添加到 AndroidManifest.xml 中

android:exported="true"

在你的 <activity>里面

当我们为最新版本12设置 targetSkdVersion = 31,并且错误导致 如果我们没有在启动器活动中使用 android: export = “ true”和 < strong > android: export = “ false”出现在其他 intentfilter、 service 或者 Broadcasting 接收器中时,就会发生此错误。 我们应该只为启动器活动编写 android: export = “ 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: export = “ 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 的意图过滤器,服务或广播接收器到我的主要文件。

如何复制合并清单文件到主清单文件

  • 打开项目的 AndroidManifest.xml。
  • 在窗口底部,单击“合并清单”选项卡。
  • 寻找任何包含一个意图过滤器标记并且缺少 android: export 属性的活动
  • 现在复制所有这些到主清单文件。

通过短语“ intent- 过滤器”搜索,然后将“ android: export = “ false”添加到每个 top xml 元素

<receiver
android:name=".listener.SmsListener"
android:enabled="true"
android:exported="false"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
我的问题是,我没有找到所有缺失的 android:exported

我一直在寻找遗失的 android:exported="true|false"。到处添加它我看到的。问题仍然存在。

解决方案

我有 buildToolsVersion = "28.0.3"在评级,所以合并清单错误日志没有帮助我在所有。

所以我升级到 buildToolsVersion = "31.0.0"合并清单告诉我丢失的出口在哪里。

转到 AndroidManifest.xml 单击合并清单选项卡并在 project 中查找 Keword 错误: android: export 需要为 element < activity # com 显式指定。Cpa.accountManagement.ui.authenticated.splash.醒目水花活动 > 。当相应的组件定义了一个意图过滤器时,针对 Android 12或更高版本的应用程序需要为 android:exported指定一个显式值。详情请参阅 https://developer.android.com/guide/topics/manifest/activity-element#exported。App 主清单(此文件) ,第52行

找到“ SplashActivity”标记并添加 android: export = “ true”

对于那些仍然面临这个错误,没有找到解决办法..。

添加这是清单文件:

<service
android:name="org.jitsi.meet.sdk.ConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>