Android Studio 오류: "매니페스트 병합 실패:Android 12인치용 앱
에뮬레이터 버전과 Android SDK 버전을 Android S(Android 12)로 업데이트했습니다.업데이트 후 프로젝트를 실행할 수 없습니다.Hello, World! 프로젝트(빈 프로젝트)는 실행할 수 없지만 Gradle도 만들 수 있지만 프로젝트는 실행할 수 없습니다.항상 다음 오류가 발생합니다.
12 을 대상으로 하는 은 Android 12에 대해 인 값을 지정해야 합니다.
android: exported
해당 컴포넌트에 의도 필터가 정의되어 있는 경우.상세한 것에 대하여는, https://developer.android.com/guide/topics/manifest/activity-element#exported 를 참조해 주세요.
어떻게 하면 고칠 수 있죠?
다음은 스크린샷입니다.
Android 12 SDK를 사용할 때 이 문제를 해결하려면 어떻게 해야 합니까?
이 질문은 해결책을 적용한 후의 문제에 대한 질문으로, 이 질문과는 다릅니다.그리고 이 질문은 이것보다 더 오래된 질문입니다.
하다를 지정해야 합니다.를 지정해야 .android:exported="false"
★★★★★★★★★★★★★★★★★」android:exported="true"
매니페스트:
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.MyApplication.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
설명서에 기재되어 있는 바와 같이:
앱이 Android 12를 대상으로 하고 의도 필터를 사용하는 활동, 서비스 또는 브로드캐스트 수신기를 포함하는 경우 이러한 앱 구성 요소에 대해 Android: 내보낸 속성을 명시적으로 선언해야 합니다.
경고: 액티비티, 서비스 또는 브로드캐스트 수신기가 의도 필터를 사용하고 있고 Android:export에 대해 명시적으로 선언된 값이 없는 경우 Android 12를 실행하는 장치에 앱을 설치할 수 없습니다.
또한 'Android:exported' 값에 true/false를 사용할 때 선택합니다.
매니페스트에서 기본 시작 활동 특성에 Android:syslog="true" 또는 Android:syslog="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의 응용 프로그램에 의해 송신된 메시지뿐입니다.
지정되지 않은 경우 기본값은 브로드캐스트리시버에 의도 필터가 포함되어 있는지 여부에 따라 달라집니다.수신기에 적어도1 개의 의도 필터가 포함되어 있는 경우, 디폴트치는 「true」입니다.그렇지 않으면 기본값은 "false"입니다.
이 속성은 브로드캐스트 수신기의 외부 노출을 제한하는 유일한 방법은 아닙니다.권한을 사용하여 메시지를 보낼 수 있는 외부 엔티티를 제한할 수도 있습니다(권한 속성 참조).
Android 설명서
매니페스트에서 "exported: exported = false" 태그가 없는 활동이 있는 위치를 찾지 못한 경우 종속성에 있을 수 있습니다.정확한 위치를 특정하려면 먼저 "compileSdkVersion"을 30으로 다운그레이드하고 "targetSdkVersion"을 30으로 다운그레이드합니다.
android {
compileSdkVersion("android-S")
buildToolsVersion "30.0.3"
defaultConfig {
...
minSdkVersion 23
targetSdkVersion("S")
...
}
그런 다음 메인 manifest.xml 창에 "merge manifest" 탭이 나타납니다.여기서 "exported: exported = false" 특성이 없는 액티비티를 정확하게 검사할 수 있습니다.
제 경우 서드파티 툴이 원인입니다.
build.gradle(: 앱):
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">
그리고.
<service
android:name="com.demo.myApp.my_access.MyAccessService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
문제가 서드파티 의존관계에 있어 곧 업데이트되지 않을 예정이기 때문에 초기 선언을 덮어쓸 필요가 있는 곳에 activity="true" 및 export="false" 플래그가 있는 <액티비티> 선언을 추가했을 뿐입니다.또한 Debug only에서 이 의존관계가 필요하기 때문에 src/debug에 새로운 AndroidManifest.xml 파일을 추가했습니다.
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="false" Atribute를 사용하여 LeoFarage가 친절하게 제안한 대로 Android:false=true|false를 선언하는 것이 좋습니다.
Android 12를 대상으로 한 프로젝트에서도 같은 문제가 발생했습니다.
문제는 이 프로젝트가 꽤 큰 규모여서AndroidManifest.xml
파일, 및android:exported
많은 곳에서 실종되었습니다.
그래들 태스크를 만들어서 부족한 부분을 채우고android:exported
자동으로 속성을 지정합니다.
여기 링크가 있습니다.
당신의 질문은 이 게시물 때문에 중복될 가능성이 있습니다: 당신의 질문은 일주일 전에 게시되었지만 Android 12를 대상으로 한 매니페스트 합병에 실패했습니다.국기가 안 보여요.
또 다른 답변을 명확히 하기 위해, Android:export가 당신의 주요 활동에 대해 사실로 설정되어야 합니다. 그렇지 않으면 Android Studio에서 '시작 성공' 메시지를 보내도 실행이 되지 않습니다. 다른 앱은 물론 Android 시스템 자체에서도 실행이 불가능하기 때문입니다.
<activity
android:name=".MainActivity"
android:exported="true"
병합된 매니페스트에 포함된 다른 작업의 경우 일반적으로 false로 설정됩니다.
는 또한 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★android:exported="true"
모든 것을 receiver
가 매니페스트에 선언되었습니다.그래서 이런 생각이 들었어요.
<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"
모든 것에 대해서요.브로드캐스트 Android OS입니다.이 코드의 Intent 필터는 Android OS가 Android 앱을 웨이크업하여 작업을 수행하기를 원했다는 것을 의미합니다.
android.intent.action.BOOT_COMPLETED
Android OS가 장치에 설치된 모든 응용 프로그램에 브로드캐스트를 전송하기 때문에 매우 좋은 예입니다.엄밀히 말하면 브로드캐스트리시버는 「」를 선언할 .android:exported="true"
.
Android 12를 대상으로 한 앱용
앱의 targetSdkVersion을 S(32 또는 31)로 변경하여 새로운 동작을 활성화합니다.
그런 다음 Manifest에서 Android:exorted=" 속성을 지정합니다. 참 또는 거짓은 액티비티에 따라 다릅니다.
시작 또는 주요 활동과 같은 Laucher 작업의 경우 Android:sys="true"를 사용하고 나머지 작업의 경우 Android:sys="false"를 사용합니다.
예:
//it's **true** for laucher Activity
<activity android:name=".SplashActivity"
android:exported="true" />
//it's **false** for rest Activities
<activity android:name=".MainActivity"
android:exported="false" />
런처 활동에서 "안드로이드: 내보내기"를 선언합니다.
<activity android:name=".MainActivity"
android:exported = "false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
true인 경우 "filename: exported= true"는 모든 앱에서 작업에 액세스할 수 있으며 정확한 클래스 이름으로 시작할 수 있음을 의미합니다.
false "false: exported = false"인 경우 동일한 사용자 ID를 가진 동일한 응용 프로그램의 구성 요소 또는 권한이 있는 시스템 구성 요소에서만 활동을 시작할 수 있음을 의미합니다.
상세한 것에 대하여는, 여기를 참조해 주세요.
의 버전 androidTestImplementation 'androidx.test.ext:junit:1.1.1'
다음과 같은 최신 버전으로 이동합니다. androidTestImplementation 'androidx.test.ext:junit:1.1.3'
build.gradle 앱 레벨에서.
//런처 액티비티에 필요한 메모
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.MyApplication.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
수취인에게 요구되다
<receiver android:name=".Musicreceiver"
android:exported="true">
</receiver>
서비스에 필요
<service
android:name=".service.LoggerService"
android:enabled="true" />
는, 「이러다」를.android:exported="true"
가 있었던 은 변화한 것이다.compileSdkVersion
★★★★★★★★★★★★★★★★★」targetSdkVersion
30까지.
2개의 build.gradle 파일 중 하나에서 대상 행을 찾을 수 있습니다.SDK 31. 30으로 변경한 후 그래들 동기(메인 코드 창 위에 "Sync now"를 클릭할 수 있는 작은 막대가 나타납니다)를 실행하면 됩니다.
언급URL : https://stackoverflow.com/questions/67412084/android-studio-error-manifest-merger-failed-apps-targeting-android-12
'programing' 카테고리의 다른 글
별도의 서브스트링을 만들지 않고 C스트링의 특정 부분만 출력할 수 있습니까? (0) | 2022.07.03 |
---|---|
Vue 테스트 유틸리티의 "스텁된 하위 구성 요소"란 무엇입니까? (0) | 2022.07.03 |
vue js에 있는 구글 맵의 infow에서 @click inside를 사용하여 함수를 트리거하는 방법은 무엇입니까? (0) | 2022.07.03 |
내부에 변이가 없는 Action vuex를 호출하는 것이 나쁜가요? (0) | 2022.07.03 |
Spring Boot App이 부팅 즉시 항상 종료되는 이유는 무엇입니까? (0) | 2022.07.03 |