更新Gradle后运行Android应用触发AAPT错误:'TODO'与exported(boolean类型属性)不兼容,寻求解决建议
解决AAPT错误:'TODO' 与 exported 属性不兼容
嘿,这个问题根源很清晰:你在AndroidManifest.xml里给MainActivity的android:exported属性填了TODO,但这个属性必须是布尔值(true/false),再加上你的targetSdkVersion设为31(对应Android 12),系统强制要求所有带<intent-filter>的Activity必须显式声明这个属性的布尔值,这就触发了AAPT报错。
具体修复步骤:
- 打开你的
AndroidManifest.xml,定位到MainActivity的声明块:<activity android:name="com.example.recyclerview.MainActivity" android:exported="TODO" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" android:set="true" /> </intent-filter> </activity> - 把
android:exported="TODO"改成android:exported="true"——因为这个Activity是应用的启动页(包含MAIN和LAUNCHER的intent-filter),需要被系统外部调用,所以必须设为true。 - 顺便删掉
<category>标签里无效的android:set="true"属性,这个属性不属于category标签的合法属性,留着可能引发其他编译问题。
修复后的代码片段:
<activity android:name="com.example.recyclerview.MainActivity" android:exported="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
为什么会有这个要求?
从Android 12(API 31)开始,Google为了强化应用安全性,强制要求所有带有<intent-filter>的组件(Activity、Service、BroadcastReceiver)必须显式指定exported属性:
- 如果组件需要被外部应用或系统触发(比如启动页、分享接收页),设为
true - 如果组件仅在应用内部使用,不需要外部访问,设为
false
更新Gradle后触发这个问题,是因为Gradle升级后通常会同步更新编译SDK版本,当编译到API 31及以上时,这个强制校验就会生效。
内容的提问来源于stack exchange,提问作者Junta
相关产品推荐
相关产品推荐

