Android:lint id AppLinksAutoVerifyWarning总是失败,但AppLink工作正常

时间:2017-03-07 13:35:40

标签: android lint applinks

我遇到的问题是 AppLinksAutoVerifyWarning 的lint测试总是失败并显示错误消息:

  

应用链接自动验证失败       ../../src/debug/AndroidManifest.xml:17:此主机不支持应用程序的应用程序链接。检查数字资产链接JSON文件:   https://myhost/.well-known/assetlinks.json

我正在使用特定于目标的 AndroidManifest 进行调试构建,如上所示。对于那些调试版本,我将.debug后缀附加到我的包名称。因此,调试版本将具有包ID mypackage.debug ,而版本构建将只获得 mypackage 。两个版本都使用相同的版本密钥签名(由于sharedUserId),我确保assetlinks.json中的指纹与签名的指纹匹配。对于myhost,有一个有效的ssl证书。

我上传了 assetlinks.json 文件,并支持 mypackage.debug mypackage ,并确保其具有正确的 application / json mimetype。

  • 在手机上,应用链接工作正常
  • 使用digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://myhost&relation=delegate_permission/common.handle_all_urls进行验证不会提供任何错误
  • 使用adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "http://myhost"测试AppLink正常
  • 我使用developers.google.com/digital-asset-links/tools/generator重新创建,上传并测试了 assetlinks.json ,这样可以验证确定并且不会生成包含不同内容的json文件
  • 使用textmate验证的json语法
  • 我还尝试将 intent-filter 从调试 AndroidManifest 移动到主清单,将其移动到其他没有其他意图的活动中过滤

所以一切似乎都很好,只是lint无法正常工作。我可能只是禁用了lint检查,但我宁愿把它打开,所以我知道什么时候有真正的问题。

我观察到的一件事:如果我将应用程序链接的 intent-filter https 更改为 http ,则lint中的错误消息会发生变化to:... has incorrect JSON syntax这更奇怪,因为android本身和谷歌验证服务似乎验证它很好。 (可能与我们将所有流量从http转发到https有关)

当前的意图过滤器是:

  <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="myhost"
                    android:pathPrefix="/open_app"
                    android:scheme="https"/>


   </intent-filter>

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,所以我查看了lint检查的源代码:

            switch (result.getValue().mStatus) {
            case STATUS_HTTP_OK:
                List<String> packageNames = getPackageNameFromJson(
                        result.getValue().mJsonFile);
                if (!packageNames.contains(packageName)) {
                    context.report(ISSUE_ERROR, host, context.getLocation(host), String.format(
                            "This host does not support app links to your app. Checks the Digital Asset Links JSON file: %s",
                            jsonPath));
                }
                break;

我失败了,因为assetlinks.json中的包名与我的清单中的包名不匹配。事实证明我的团队中只有一半人将我们的顶级项目转换为图书馆项目,并更改了顶级项目包名称。但是如果assetlinks.json在包名上有拼写错误,也会发生这种情况。