Android applinks 在已发布的版本中不起作用,但在本地安装中可以正常工作

Posted

技术标签:

【中文标题】Android applinks 在已发布的版本中不起作用,但在本地安装中可以正常工作【英文标题】:Android applinks not working in released build but work correctly from a local install 【发布时间】:2020-11-08 14:36:50 【问题描述】:

我有一个使用应用链接的game。从我的计算机运行调试和发布版本时,应用链接工作正常,但不适用于从 Google Play 下载的版本。使用 Google Play 版本时,我会收到一个对话框,询问应由哪个应用打开链接。

我使用“App Signing by Google Play”并了解发布 APK 由 Google 签名并且具有不同的签名。我已将 Google Play 上列出的应用签名证书中的 SHA-256 证书指纹添加到我的 assetlinks.json,因此它包含来自本地和 Google Play 版本的指纹。

我还从 Google Play 下载了一个派生的 APK,并确保指纹与 assetslinks.json 文件中的指纹匹配。

这是一个示例 URL,当在 android 中单击该 URL 时,应打开应用程序,它适用于本地构建,但不是在 Google Play 版本中。相反,我会收到一个对话框,询问应由哪个应用打开链接。

https://letsdraw.fun/ec?parent=Z0ibN7m-H8jO1jCiMRQtY23VTpKjnIch

我正在从实时发布版本的 logcat 中写出 SHA256 指纹,以仔细检查它是否正确,一切看起来都很好。

原始签名APK和Google Play签名APK可以从here下载。这两个 APK 都是从 Google Play 下载的,一个是“原始的”,一个是“派生的”,所以除了签名之外它们应该是相同的。有趣的是,它们的尺寸略有不同。 11,590,297 字节与 11,601,619 字节。

查看adb shell dumpsys package domain-preferred-apps的输出,原来签名的apk是

  Package: com.scribble.exquisitecorpse
  Domains: letsdraw.fun scribble-cloud.appspot.com scribble-cloud-v24-test-dot-scribble-cloud.appspot.com
  Status:  always : 200000000

而 Google Play 签名的 apk 是

  Package: com.scribble.exquisitecorpse
  Domains: letsdraw.fun scribble-cloud.appspot.com scribble-cloud-v24-test-dot-scribble-cloud.appspot.com
  Status:  ask

使用@ymindstorm 提到的测试页面进行测试时

https://developers.google.com/digital-asset-links/tools/generator

我收到消息

成功!主机letsdraw.fun 授予应用程序深度链接到 com.scribble.exquisitecorpse.

您对造成这种情况的原因有什么建议吗?

更新: 我现在已将此作为错误报告给 Google,因为我无法弄清楚发生了什么。 https://issuetracker.google.com/issues/162564916

【问题讨论】:

您是否在同一设备/模拟器上进行所有测试?还是您的本地版本在模拟器上运行,而 Google Play 版本在真实设备上运行? 您是否将 .well-known/assetlinks.json 文件添加到网站根目录? web.letsdraw.fun/.well-known/assetlinks.json返回错误:未找到 @karllindmark 全部在多个真实设备上测试。 @TheDude android 版本不使用网络。字首。 letsdraw.fun/.well-known/assetlinks.json 您是否尝试在您的资产链接中仅保留来自 Google Play 的 SHA-256。它适用于本地版本和实时版本的行为类似于深层链接这一事实可能表明您的数字资产链接存在一些问题。 【参考方案1】:

我最终得到了Google 的帮助……这不是错误。

构建过程正在从network_security_config.xml 文件合并到主机中,因此即使指定了AndroidManifest.xml 文件:

        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:host="letsdraw.fun" android:pathPrefix="/ec" android:scheme="https" />
            <data android:host="letsdraw.fun" android:pathPrefix="/restore" android:scheme="https" />
        </intent-filter>

构建过程中的文件也指定了其他主机:

        <intent-filter
            android:autoVerify="true">

            <action
                android:name="android.intent.action.VIEW" />

            <category
                android:name="android.intent.category.DEFAULT" />

            <category
                android:name="android.intent.category.BROWSABLE" />

            <data
                android:scheme="http"
                android:host="scribble-cloud-v24-test-dot-scribble-cloud.appspot.com"
                android:pathPrefix="/ec" />

            <data
                android:scheme="https"
                android:host="scribble-cloud.appspot.com"
                android:pathPrefix="/ec" />

            <data
                android:scheme="https"
                android:host="letsdraw.fun"
                android:pathPrefix="/ec" />

            <data
                android:scheme="https"
                android:host="letsdraw.fun"
                android:pathPrefix="/restore" />
        </intent-filter>

在this 页面上声明

仅当系统为所有用户找到匹配的数字资产链接文件时 清单中的主机然后将您的应用程序设置为默认应用程序 指定 URL 模式的处理程序。

问题是我的测试主机没有返回与其他主机相同的assetlinks.json 文件。

构建您的 APK 后,使用 IntelliJ 或 Android Studio 转到 Build | Analyze Apk 并打开刚刚构建的 APK 以检查您的主机是否正确,assetlinks.json 文件返回正确的签名。

为什么要像这样合并清单文件?希望我们能找到here!

【讨论】:

【参考方案2】:

documentation 声明:

要为您的应用启用链接处理验证,请在您的应用清单中包含android.intent.action.VIEW 意图操作和android.intent.category.BROWSABLE 意图类别的任一网络 URL 意图过滤器中设置 android:autoVerify="true" [...]

android:autoVerify="true" 出现在您的任何一个意图过滤器中时,将您的应用安装在搭载 Android 6.0 及更高版本的设备上会导致系统尝试验证与您应用的任何意图过滤器中的 URL 关联的所有主机。验证涉及以下内容:

系统检查所有意图过滤器,包括:

操作:android.intent.action.VIEW 类别:android.intent.category.BROWSABLEandroid.intent.category.DEFAULT 数据方案:http 或 https 对于在上述意图过滤器中找到的每个唯一主机名,Android 会在相应网站上查询位于 https://&lt;hostname&gt;/.well-known/assetlinks.json 的数字资产链接文件。

只有当系统为清单中的所有主机找到匹配的数字资产链接文件时,它才会将您的应用程序建立为指定 URL 模式的默认处理程序。

因此,为了让您跳过消歧对话框,您需要验证您的应用配置是否正确,并且assetlinks.json 在正确的位置可用。 根据经验,常见的陷阱是:

忘记autoVerify 在一个语句中声明了多个链接,并且每个域中都没有正确的关联文件 忘记之前已授予开发应用程序特殊权限 安装了多个应用程序并尝试将自己注册为链接的解析器

您可以使用这个方便的工具来检查您的配置文件是否正确:

https://developers.google.com/digital-asset-links/tools/generator

【讨论】:

谢谢。它适用于一个签名而不是另一个签名这一事实表明存在签名问题而不是应用程序配置问题。使用测试仪的链接,我收到消息Success! Host letsdraw.fun grants app deep linking to com.scribble.exquisitecorpse.,这表明所有配置都正确。

以上是关于Android applinks 在已发布的版本中不起作用,但在本地安装中可以正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Android APPLink的使用

Android 12 上的 AppLinks - 仅打开浏览器

android appLink

如何获取 AppLinks/通用链接的任何应用程序的 URI 方案?

如何在已发布的 Android 应用上添加广告?

android 在已删除的包中没有收到 Intent ACTION_PACKAGE_REMOVED