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

Android:lint id AppLinksAutoVerifyWarning总是失败,但AppLinks工作正常,android,lint,applinks,Android,Lint,Applinks,我遇到的问题是,AppLinksAutoVerifyWarning的lint测试总是失败,并显示错误消息: 应用程序链接自动验证失败 ../../src/debug/AndroidManifest.xml:17:此主机不支持指向您的应用程序的应用程序链接。检查数字资产链接JSON文件: 我正在使用特定于目标的AndroidManifest进行调试构建,正如您在上面看到的。对于那些调试版本,我在包名后面附加了一个.debug后缀。因此,调试版本将具有包id mypackage.debug和发布版

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

应用程序链接自动验证失败 ../../src/debug/AndroidManifest.xml:17:此主机不支持指向您的应用程序的应用程序链接。检查数字资产链接JSON文件:

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

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

  • 在手机上,应用程序链接工作正常
  • 使用
    digitalAssetLink.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“测试AppLinkhttp://myhost“工作正常
  • 我用
    developers.google.com/digital asset links/tools/generator
    重新创建、上传并测试了assetlinks.json,它验证了ok,并且不会生成包含不同内容的json文件
  • 使用textmate验证json语法
  • 我还尝试将意图过滤器从调试AndroidManifest移动到主清单,将其移动到没有其他意图过滤器的其他活动
看来一切都很好,只是皮棉坏了。我可以禁用皮棉检查,但我更希望打开它,以便在出现真正的问题时能够知道

我观察到的一件事是:如果我将应用程序链接的意图过滤器从https更改为http,那么来自lint的错误消息将更改为:
。。。有不正确的JSON语法
,这更奇怪,因为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>

我刚刚遇到了同样的问题,所以我查看了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;
开关(result.getValue().mStatus){
案例状态\u HTTP\u正常:
List packageNames=getPackageNameFromJson(
result.getValue().mJsonFile);
如果(!packageName.contains(packageName)){
报告(发布错误,主机,context.getLocation(主机),String.format(
“此主机不支持指向您的应用的应用链接。请检查数字资产链接JSON文件:%s”,
jsonPath);
}
打破
这对我来说是失败的,因为assetlinks.json中的包名与我清单中的包名不匹配。结果表明,我的团队中有人仅完成了将顶级项目转换为库项目的一半,并更改了顶级项目包名。但如果assetlinks.json在包名上输入错误,也可能发生这种情况。