升级Target SDK至31后Android 12应用启动权限异常求助
问题描述
将应用Target SDK版本升级至31后,应用可在Android 11正常运行,但无法在Android 12启动。已为所有使用intent filter的Activity添加android:exported属性,仍出现权限拒绝错误,无法启动应用。
错误日志
ProcessException: 进程异常退出: 启动: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x20000000 cmp=..包名..MainActivity (包含附加信息) } 执行'start'时发生异常: java.lang.SecurityException: 权限拒绝: 从null (pid=7644, uid=2000)启动Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30000000 cmp=..包名..MainActivity (包含附加信息) },该组件未从uid 11272导出 at com.android.server.wm.ActivityTaskSupervisor.checkStartAnyActivityPermission(ActivityTaskSupervisor.java:1335) at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1252) at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:883) at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1871) at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1742) at com.android.server.am.ActivityManagerService.startActivityAsUserWithFeature(ActivityManagerService.java:3543) at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:596) at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:201) at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97) at android.os.ShellCommand.exec(ShellCommand.java:38) at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:10429) at android.os.Binder.shellCommand(Binder.java:986) at android.os.Binder.onTransact(Binder.java:860) at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:6049) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3034) at android.os.Binder.execTransactInternal(Binder.java:1220) at android.os.Binder.execTransact(Binder.java:1179) 命令: /Users/flipitnews/Library/Android/sdk/platform-tools/adb -s RZ8M22CVXEF shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x20000000 --ez enable-dart-profiling true com.flipitnews.finance/com.flipitnews.finance.flipitnews_flutter_app.MainActivity #0 RunResult.throwException (package:flutter_tools/src/base/process.dart:123:5) #1 _DefaultProcessUtils.run (package:flutter_tools/src/base/process.dart:275:19) <asynchronous suspension> #2 AndroidDevice.startApp (package:flutter_tools/src/android/android_device.dart:677:28) <asynchronous suspension> #3 FlutterDevice.runCold (package:flutter_tools/src/resident_runner.dart:504:33) <asynchronous suspension> #4 ColdRunner.run (package:flutter_tools/src/run_cold.dart:57:28) <asynchronous suspension> #5 AppDomain.launch.<anonymous closure> (package:flutter_tools/src/commands/daemon.dart:641:9) <asynchronous suspension> #6 AppDomain.launch (package:flutter_tools/src/commands/daemon.dart:639:5) <asynchronous suspension> #7 RunCommand.runCommand (package:flutter_tools/src/commands/run.dart:596:15) <asynchronous suspension> #8 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:1209:27) <asynchronous suspension> #9 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19) <asynchronous suspension> #10 CommandRunner.runCommand (package:args/command_runner.dart:209:13) <asynchronous suspension> #11 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9) <asynchronous suspension> #12 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19) <asynchronous suspension> #13 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5) <asynchronous suspension> #14 run.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:62:9) <asynchronous suspension> #15 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:150:19) <asynchronous suspension> #16 main (package:flutter_tools/executable.dart:91:3) <asynchronous suspension>
排查与解决方法
- 确认Launcher Activity的
android:exported配置:检查AndroidManifest.xml中带有MAIN和LAUNCHERintent-filter的MainActivity,确保android:exported="true",且配置未被其他合并的Manifest覆盖。示例配置:<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> - 检查所有带intent-filter的组件:Android 12要求所有包含
<intent-filter>的组件(包括Service、BroadcastReceiver、ContentProvider)都必须显式声明android:exported属性,不止Activity。比如第三方推送SDK的Receiver、后台Service等,都要补充该属性。 - 处理第三方库的组件:如果依赖的第三方库未适配Android 12,其组件可能缺少
android:exported。可以在自己的AndroidManifest.xml中重新声明这些组件并添加android:exported属性,覆盖库中的配置。 - 清理缓存并重新构建:执行以下命令清理项目缓存,避免旧配置残留:
flutter clean flutter pub get flutter run - 检查Manifest合并结果:在Android Studio中打开
AndroidManifest.xml,切换到Merged Manifest标签,查看最终生成的Manifest中所有组件的android:exported属性是否正确,确认没有被意外覆盖。
内容的提问来源于stack exchange,提问作者Lalit Rawat
相关产品推荐
相关产品推荐

