You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:19:28