配置网站关联性和动态规则

如需支持应用链接,您必须创建一个名为 assetlinks.json 的 Digital Asset Links JSON 文件,并将其发布到您网站上的一个已知位置。此文件会公开声明哪些应用有权处理您网域的链接,Android 设备会从您的服务器检索此文件,以验证您的深层链接。

对于 Android 15 及更高版本中的动态应用链接,assetlinks.json 文件也是您定义动态规则配置的位置,例如路径、片段和查询参数的模式匹配器。搭载 Android 15(API 级别 35)或更高版本且安装了 Google 服务的 Android 设备会定期检索该文件,并将您的动态配置与应用清单中的静态配置合并。

本指南介绍了如何准备 assetlinks.json 文件并将其发布到您的网站上。如果您愿意,也可以通过 Play 深层链接工具或 Android Studio App Links Assistant 生成 assetlinks.json 文件。 如需了解详情,请参阅应用链接开发者工具。

声明网站关联性

您必须在网站上发布 Digital Asset Links JSON 文件,以指明与该网站关联的 Android 应用并验证应用的网址 intent。JSON 文件使用以下字段来标识关联的应用:

  • package_name:在应用的 build.gradle 文件中声明的应用 ID。
  • sha256_cert_fingerprints:应用的签名证书的 SHA256 指纹。您可以使用以下命令通过 Java keytool 生成指纹:

keytool -list -v -keystore my-release-key.keystore

  • 此字段支持多个指纹,可用于支持应用的不同版本,例如调试 build 和生产 build。如果您的应用使用的是 Play 应用签名,则在本地运行 keytool 生成的证书指纹通常与用户设备上的证书指纹不匹配。您可以在 Play 管理中心开发者账号的 Release > Setup > App signing 下验证您是否为应用使用了 Play 应用签名;如果使用了,您还会在同一页面上找到应用的正确 Digital Asset Links JSON 代码段。

以下示例 assetlinks.json 文件向 com.example Android 应用授予了链接打开权限:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

将一个网站与多个应用相关联

一个网站可以在同一个 assetlinks.json 文件中声明与多个应用的关联。以下文件列表展示了一个声明文件示例,该文件声明了与两个应用的关联,并位于 https://www.example.com/.well-known/assetlinks.json:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

不同的应用可能会处理同一网站托管下不同资源的链接。例如,app1 可以为 https://example.com/articles 声明 intent 过滤器,而 app2 可以为 https://example.com/videos 声明 intent 过滤器。

将多个网站与单个应用相关联

多个网站可以在各自的 assetlinks.json 文件中声明与同一应用的关联。以下文件列表展示了如何声明 example.com 和 example.net 与 app1 的关联。第一个列表显示 example.com 与 app1 的关联:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

下一个列表展示了 example.net 与 app1 的关联性。只有这些文件的托管位置不同(.com 和 .net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

配置动态规则

借助 Android 15 及更高版本中的动态应用链接,您可以使用服务器端深层链接匹配规则,这些规则可与您在应用清单中静态定义的规则协同工作。assetlinks.json 文件是您定义动态规则的位置。此信息可选择是否包含。

搭载 Android 15(API 级别 35)或更高版本且安装了 Google 服务的 Android 设备会定期从您的服务器检索此文件,并将您的动态规则配置与应用清单中的静态配置合并。以下是包含动态规则的 assetlinks.json 文件示例:

[
  {
    "relation": [
      "delegate_permission/common.handle_all_urls"
    ],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.app",
      "sha256_cert_fingerprints": [...]
    },
    "relation_extensions": {
      "delegate_permission/common.handle_all_urls": {
        "dynamic_app_link_components": [
          {"?": {"dl": "*"}},
          {"#": "app"},
          {"/": "/products/*"},
          {"/": "/shoes", "?": {"in_app": "true"}},
          {"/": "*", "exclude": true}
        ]
      }
    }
  }
]

代码要点

  • Dynamic App Links 添加了一个名为 dynamic_app_link_components 的新 Digital Asset Links 关系扩展,您可以在其中配置动态规则。
  • 动态规则可以包含路径、片段和查询参数的模式匹配器。
  • 您还可以将任何格式匹配器标记为排除,这样匹配的网址就不会打开您的应用。
  • 此示例展示了路径 ("/")、fragment ("#") 和查询参数 ("?") 的匹配器示例,以及排除的匹配器 ("exclude")
  • 如果文件中的任何字段格式有误或为空,Android 会舍弃动态规则,并且设备会回退到应用清单中静态定义的规则。

动态规则只能指定在应用清单文件中声明的网域范围内适用的规则。请参阅声明动态规则部分。

声明动态规则

动态应用链接支持新的 dynamic_app_link_components 关系扩展,其中包含一个规则对象数组。每条规则都是使用路径、片段和查询参数的模式匹配器定义的,这些参数会打开您的应用。匹配器也可以单独排除,这样它们就不会打开您的应用。所有这些都是可选的。

  • 路径匹配
    • 按键:“/”
    • 值:单个字符串,与网址路径匹配的表达式
  • 片段匹配
    • 按键:“#”
    • 值:单个字符串,与网址片段匹配的表达式
  • 查询参数匹配
    • 按键:“?”
    • 值:用于匹配网址查询参数中的键值对的字典。
    • 例如,字典 {"?", {"dl": "*", "in_app":"true"} 将与查询字符串“?in_app=true&dl=abc”匹配。
    • 字典中键值对的顺序无需与查询字符串中键值对的顺序一致。此外,字典不需要与查询字符串中的所有键值对匹配,但必须为每个字典条目找到匹配项。
    • 例如,字典也会匹配查询字符串“?lang=en&in_app=true&tz=pst&dl=abc”,但不匹配查询字符串“?lang=en&tz=pst&dl=abc”
  • 已排除
    • 键:“exclude”
    • 值:dynamic_app_link_components 中定义的每条规则的可选 true/false 值(请参阅示例)。

您可以在模式匹配器中使用以下特殊字符:

  • “*”匹配零个或多个字符,直到在匹配字符串中找到模式中通配符后面的字符
  • “?”匹配任意单个字符
  • “?*”匹配 1 个或多个字符

值没有其他字符限制。

对动态规则进行排序

规则的声明顺序很重要。Android 会按顺序评估每条规则,直到找到匹配项。

以下示例展示了顺序如何影响处理。第一条规则匹配所有路径(“*”),但排除匹配项(exclude: true),这意味着它会排除所有网址,使其无法打开应用。在这种情况下,系统永远不会评估允许“/path1”的第二条规则。

dynamic_app_link_components: [
  {"/": "*", "exclude": true},
  {"/": "/path1"}
]

不过,在下一个示例中,由于“/path1”规则是首先声明的,因此系统会先评估该规则,并会为与“/path1”匹配的网址打开应用。第二条规则(排除所有网址,使其无法打开应用)将排在第二位进行评估,但前提是第一条规则不匹配。

dynamic_app_link_components: [
  {"/": "/path1"},
  {"/": "*", "exclude": true}
]

如果在已声明的组件列表中未找到匹配项,则该网址不会打开应用。在以下示例中,没有任何路径与“/path3”匹配,因此设备会将此路径视为已排除。

dynamic_app_link_components: [
  {"/": "/path1"},
  {"/": "/path2"}
]

如果您希望 dynamic_app_link_components 仅排除某些网址部分,但允许所有其他部分,则此行为非常重要。在以下示例中,如果省略允许所有剩余路径的最终规则,则意味着所有网址都会从应用中排除。

dynamic_app_link_components: [
  {"/": "/path1", "exclude": true},
  {"/": "*"}
]

正确限定动态规则的范围

在定义要在 Android 15 及更高版本中与动态应用链接搭配使用的服务器端规则时,请务必适当限定其范围,以便它们与应用清单中声明的静态 intent 过滤器搭配使用并进行补充。

在 assetlinks.json 文件中声明的动态规则只能为您在应用的 AndroidManifest.xml 文件中声明的主机指定规则。动态规则无法扩展您在应用清单中静态声明的网址规则的范围。

因此,我们建议您在动态和静态规则中采用以下方法:

  • 在应用清单中,设置范围尽可能广泛的规则,例如仅声明架构和网域
  • 依靠服务器端动态规则进行进一步优化,例如路径级路由。

采用这种理想配置后,您就可以根据需要在 assetlinks.json 文件中动态添加新的应用链接路径,因为您知道这些路径会符合您在应用清单中设置的宽泛范围。

为确保正确处理您的规则,请在针对给定网站、关系和应用的语句中仅声明一个 dynamic_app_link_components 对象。

  • 查找针对同一网站、关系和应用声明 dynamic_app_link_components 对象的多个语句。
  • 查找在单个语句中声明的多个 dynamic_app_link_components 对象

在这种情况下,Android 无法保证将使用哪种动态规则配置。

动态规则与早期 App Links 配置的兼容性

如果您已支持 App Links,则可以直接在现有的 assetlinks.json 文件中添加对动态 App Links 的支持。用于验证应用链接的关系字段保持不变,您可以添加用于动态规则的新关系扩展字段,而无需进行任何其他更改。

搭载 Android 14(API 级别 34 或更低级别)的 Android 设备会忽略动态规则的新关系扩展字段,而搭载 Android 15 及更高版本的设备会将这些规则与清单定义的规则合并。

发布 JSON 验证文件

您必须在以下位置发布 JSON 验证文件:

https://domain.name/.well-known/assetlinks.json

请确保以下几点:

  • assetlinks.json 文件在部署时的“content-type”为 application/json。
  • 无论应用的 intent 过滤器是否将 HTTPS 声明为数据协议,都必须能够通过 HTTPS 连接访问 assetlinks.json 文件。
  • assetlinks.json 文件必须可直接访问,且不包含任何重定向(无 301 或 302 重定向)。
  • 如果您的应用链接支持多个主机网域,则必须在每个网域上发布 assetlinks.json 文件。请参阅支持多个主机的应用链接。
  • 请勿在清单文件中使用公众可能无法访问的测试网址(例如,只能通过 VPN 访问的网址)发布应用。在这种情况下,解决方法是配置 build 变体,以便为开发 build 生成不同的清单文件。

请参阅以下相关指南: