Android 12如何配置Activity仅系统访问 exported=false无法启动
问题根因
你配置android:exported="false"后应用无法启动,是因为Splash Activity通常是配置了ACTION_MAIN+CATEGORY_LAUNCHER的应用入口,需要被系统桌面(Launcher,独立系统应用)拉起。设为exported=false后,所有外部应用包括系统Launcher都无法访问该Activity,自然会出现应用无法启动的问题。
正确配置方案
不要直接将入口Splash Activity设为不导出,通过系统级权限校验实现仅系统应用可访问的效果,配置步骤如下:
- 首先在
AndroidManifest.xml中声明自定义权限,将权限保护级别设置为signature|privileged,该级别权限仅系统签名应用、预装在系统priv-app目录的特权应用可获取,普通第三方应用无权限申请:
<!-- 替换为你自己应用的包名作为权限前缀,避免和其他应用权限重名 --> <permission android:name="com.your.app.package.ALLOW_SYSTEM_ACCESS_SPLASH" android:protectionLevel="signature|privileged" />
- 给Splash Activity显式设置
android:exported="true",同时绑定上面声明的访问权限,系统会自动对所有尝试访问该Activity的外部应用做权限校验:
<activity android:name=".SplashActivity" android:exported="true" android:permission="com.your.app.package.ALLOW_SYSTEM_ACCESS_SPLASH"> <!-- 原有的LAUNCHER intent-filter配置保持不变 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
配置效果说明
- 系统Launcher等系统级应用默认持有该级别权限,可以正常拉起Splash Activity,不影响应用正常启动流程。
- 普通第三方应用无法获取该自定义权限,尝试唤起Splash Activity时会被系统直接拦截,从系统层面杜绝未授权交互,比在代码里手动判断调用者包名的方案更可靠,不存在被伪造包名绕过的风险。
- 同应用内的其他组件跳转访问Splash Activity不受该权限限制,不需要额外申请权限。
内容的提问来源于stack exchange,提问作者KIM JONG YUNG
相关产品推荐
相关产品推荐

