将项目从VS2019(Professional 16.11.0)迁移至VS2022(Community)后遇Android 12+ `android:exported`配置错误及java.exe退出码1问题求助
android:exported问题及java.exe exited with code 1错误 我来帮你搞定这个迁移后碰到的Android兼容性问题!你遇到的情况其实是Android 12(API 31)及以上版本的强制安全规则导致的——所有带有<intent-filter>的组件(Activity、Service、Receiver、ContentProvider)都必须显式指定android:exported属性,你只设置了Receiver肯定不够,这就是为啥没生效的原因,另外那个java.exe exited with code 1错误基本是Manifest不合法引发的编译失败,咱们一步步来解决:
1. 全面检查并修复所有带Intent Filter的组件
打开你的AndroidManifest.xml,挨个排查以下组件,确保每个带<intent-filter>的都加上android:exported:
- 主Activity/其他带启动Intent的Activity:比如带
<action android:name="android.intent.action.MAIN" />的启动页,一般要设为android:exported="true"(因为要被系统启动) - Services:如果你的服务有对外的Intent Filter,同样要显式设置这个属性
- Receivers:除了你已经设置的,再确认所有带Intent Filter的Receiver都没漏掉
- ContentProviders:如果有对外暴露的Provider,也要检查
举个正确的示例:
<activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".BootCompletedReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
2. 别忘了处理代码中特性生成的Manifest内容
Xamarin会自动从代码里的[Activity]、[BroadcastReceiver]等特性生成Manifest内容,如果你代码里没设置Exported属性,自动生成的部分就会缺这个字段,也会导致问题。
检查你的代码组件:
- Activity示例:
[Activity(Label = "@string/app_name", Exported = true, MainLauncher = true)] public class MainActivity : AppCompatActivity { // 你的代码逻辑 }
- BroadcastReceiver示例:
[BroadcastReceiver(Exported = true)] [IntentFilter(new[] { Intent.ActionBootCompleted })] public class BootCompletedReceiver : BroadcastReceiver { // 你的代码逻辑 }
小贴士:如果组件只在App内部使用,不需要对外暴露,可以设为
Exported = false,但只要有Intent Filter,就必须显式设置这个属性,不能省略。
3. 解决java.exe exited with code 1错误
当你把所有android:exported的问题修复后,这个错误大概率会自动消失。如果还是存在,试试这几个操作:
- 清理并重建项目:右键项目 → Clean,然后右键 → Rebuild
- 手动删除
bin和obj文件夹:找到项目目录下的这两个文件夹删掉,再重新编译(有时候缓存会搞事情) - 检查SDK和目标框架:确认VS2022里安装了API 31及以上的Android SDK,并且项目的目标框架设置为Android 12+(项目属性 → Android Manifest → 目标框架)
- 更新Xamarin.Android包:在NuGet包管理器里,把Xamarin.Android相关的包更到最新稳定版本
4. 验证最终生成的Manifest
编译后,你可以去obj\Debug\android\AndroidManifest.xml这个路径看最终生成的Manifest文件,确认所有带Intent Filter的组件都有android:exported属性,没有遗漏。
要是做完这些还没解决,可以把生成的Manifest内容和详细的编译错误日志贴出来,这样能更精准定位问题~
内容的提问来源于stack exchange,提问作者neha

