Android 12 deep-linking配置多应用时App chooser不弹出问题
问题原因
Android 12(API 级别 31)调整了经过域名校验的 App Links 处理逻辑,这是你遇到问题的核心原因:
- 只要应用在
AndroidManifest.xml的 deep link 对应<intent-filter>中配置了android:autoVerify="true",且系统校验域名下的assetlinks.json匹配该应用的包名、SHA256 签名,系统就会默认将该域名的链接处理权直接绑定给应用,不会主动弹出应用选择器。 - 当有多个应用同时通过同个域名的 App Links 校验时,系统会按照应用安装顺序分配默认处理权:先安装且校验通过的应用会直接拿到默认打开权限,后续安装的同校验通过应用不会触发选择器弹窗,唤起链接时会直接跳转到已设为默认的先装应用。
除此之外几个容易误判的配置问题也会导致该现象:
- 两个应用的 intent-filter 匹配规则不完全一致:比如其中一个应用配置了更精准的
pathPrefix/pathPattern,系统会优先匹配规则精度更高的应用,跳过选择器步骤。 - 系统已经留存了旧的默认配置:哪怕你后续调整了
assetlinks.json,如果之前已经给其中一个应用授予了“默认打开支持的链接”权限,系统不会主动重置该设置,依然会直接跳转。 assetlinks.json配置错误:比如签名填错、文件返回的 Content-Type 不是application/json、域名重定向导致系统拉取配置失败,此时系统不会按 App Links 规则处理,但如果其中一个应用之前被设为默认打开,依然会直接跳转。
解决方案
根据你是开发测试场景,还是正式上线场景,选择对应方案即可:
开发测试阶段快速调出选择器
不需要修改正式配置,直接重置系统默认链接绑定关系即可:
- 方案1:通过 adb 命令清除两个应用的默认链接处理权限,执行以下两条命令,替换对应包名即可:
adb shell pm set-app-links --package 第一个应用包名 0 all adb shell pm set-app-links --package 第二个应用包名 0 all
执行完成后再次唤起 deep link,只要两个应用都通过了域名校验,系统就会弹出选择器。
- 方案2:临时移除两个应用 intent-filter 上的
android:autoVerify="true"属性,此时链接会被当做普通自定义 Scheme Deep Link 处理,只要两个应用的 intent-filter 匹配规则一致,唤起时会直接弹出选择器。注意测试完成后要把正式需要做 App Links 校验的应用的该属性加回去。 - 方案3:手动在系统设置中操作:分别进入两个应用的「应用信息-默认打开-支持的链接」,先关闭“打开支持的链接”开关再重新打开,清除旧的默认绑定记录即可。
正式上线场景固定展示双应用选项
如果要面向普通用户实现唤起时始终展示两个可选项,不要给两个应用的同域名 intent-filter 同时开启autoVerify,推荐两种实现方式:
- 方式1:仅保留一个应用的
autoVerify="true"配置作为默认兜底,另一个应用的同域名 intent-filter 移除该属性,此时系统不会给第二个应用绑定默认处理权限,未设置默认应用时唤起就会弹出选择器。 - 方式2:如果是自有场景内触发 deep link 跳转,主动通过代码构建强制选择器,不依赖系统默认逻辑,示例代码如下:
// 构建目标deep link的intent val targetIntent = Intent(Intent.ACTION_VIEW, Uri.parse("你的deep link完整地址")) // 查询所有可响应该intent的应用 val resolveInfos = packageManager.queryIntentActivities(targetIntent, PackageManager.MATCH_DEFAULT_ONLY) if (resolveInfos.size > 0) { // 强制构建选择器intent启动 val chooser = Intent.createChooser(targetIntent, "选择打开应用") startActivity(chooser) }
注意:不要故意写错
assetlinks.json让系统校验失败来触发选择器,这种方式会导致你的 deep link 可以被任意第三方恶意应用劫持,存在安全风险。
内容的提问来源于stack exchange,提问作者Pratibha
相关产品推荐
相关产品推荐

