将Target SDK从30升级到33时遇android:exported接收器错误求助
将项目Target SDK版本从30升级到33后出现编译错误,提示需为receiver明确设置android:exported="true",但项目的AndroidManifest.xml中并未声明任何receiver。
错误截图:
项目的AndroidManifest.xml代码:
<?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=""> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="com.android.vending.BILLING" /> <application android:name="com.Coading.freecode.MyApp" android:allowBackup="true" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.CamScanner" android:usesCleartextTraffic="true"> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" tools:replace="android:authorities"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" tools:replace="android:resource" /> </provider> <activity android:name="com.Coading.freecode.activity.BaseActivity" /> <activity android:name="com.Coading.freecode.activity.SplashActivity" android:screenOrientation="portrait" 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="com.Coading.freecode.activity.MainActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan" /> <activity android:name="com.Coading.freecode.activity.ScannerActivity" android:screenOrientation="portrait" /> <activity android:name="com.yalantis.ucrop.UCropActivity" android:theme="@style/uCropStyle" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.IDCardPreviewActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.CropDocumentActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.CurrentFilterActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.SavedDocumentActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.DocumentEditorActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustNothing" /> <activity android:name="com.Coading.freecode.activity.SavedEditDocumentActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.SavedDocumentPreviewActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.NoteActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.ImageToTextActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.GroupDocumentActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.PDFViewerActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.QRGenerateActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.QRReaderActivity" android:screenOrientation="portrait" /> <activity android:name="com.Coading.freecode.activity.PrivacyPolicyActivity" android:screenOrientation="portrait" /> <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="ocr" /> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="@string/admob_app_id" /> </application> </manifest>
问题核心是引入的第三方依赖库中声明了BroadcastReceiver,但未添加android:exported属性。Android 12(API 31)及以上要求所有组件(Activity、Service、Receiver)若带有intent-filter或需被外部调用,必须明确设置该属性。
解决步骤:
定位未设置exported的receiver
打开Android Studio,通过Build > Analyze APK选择编译生成的APK,在弹出窗口中查看合并后的AndroidManifest.xml;或者直接访问项目目录下app/build/intermediates/merged_manifests/debug/AndroidManifest.xml,找到缺失android:exported属性的BroadcastReceiver。手动补全属性
在自身的AndroidManifest.xml中添加对应receiver声明,用tools:replace覆盖属性。例如找到第三方库的com.example.library.SomeReceiver,可添加:<receiver android:name="com.example.library.SomeReceiver" android:exported="true" <!-- 需接收系统广播设true,仅内部使用设false --> tools:replace="android:exported" />升级第三方依赖版本
主流开源库基本已适配Android 12+,升级AdMob、UCrop等依赖到最新版本,新版本通常会自动给组件添加android:exported属性。
内容的提问来源于stack exchange,提问作者tfih313

