无法从 ../android-sdk/platform-tools/api/api-versions.xml java.io.IOException 加载 api 描述:流已关闭

cannot load api descriptions from ../android-sdk/platform-tools/api/api-versions.xml java.io.IOException: Stream closed

我将 android studio 更新到 v2020.3.1(北极狐)之后。我无法 运行 我的项目,因为我总是收到此错误消息。

cannot load api descriptions from ../Android/android-sdk/platform-tools/api/api-versions.xml java.io.IOException: Stream closed

我已经尝试恢复到 v4.2.2,仍然出现同样的错误。

注:我用的是Ubuntu20.04

我真的不确定是什么导致了这个问题,但是使缓存无效并重新启动 AS 已经解决了我的问题。

我的疯狂猜测是 AS Arctic Fox 依赖于 JDK 11 到 运行,也许 IDE 查找的是错误的 jdk 版本

我找到了解决办法!原来,我只需要将SDK文件夹中的platform-tools降级到v31.0.2.

我们可以在https://androidsdkmanager.azurewebsites.net/Platformtools上下载。

我最近也遇到了这个问题,我进一步调查了这个问题,因为我无法降级平台工具版本(因为它发生在构建服务器上,我无法控制平台工具版本,由 Microsoft 控制)。

以下是我的发现: 此问题仅出现在大型 Android 项目中,可能涉及多个模块。

问题的原因与 class SdkUtils 有关(参见 the source file)。 SdkUtils class 硬引用文件 platform-tools/api/api-versions.xml,但使用最新的平台工具 (31.0.3),此文件不再存在。

SdkUtils class 中实现的回退是它将从资源中读取 api 版本(通过执行 getClass().getClassLoader().getResource("api-versions.xml").openStream();)。对于小型 Android 项目,这很好。但我注意到,对于较大的 Android 项目,并行构建多个模块/任务,其中一些流会关闭(因此会出现 Stream Closed 异常)。

我向 google 提出了一个问题,他们正在努力修复它(参见 the issuetracker link here)。

虽然 Google 正在以适当的方式解决此问题,但最简单的解决方案是降级您的 platform-tools 1 版本(如另一个答案中所述)。

但是,如果您像我一样不控制平台工具版本(因为在我的情况下它由 AzureDevops 管理),我创建了一个临时解决方法。我在我的 CI/CD 管道中添加了一个 bash 任务,我将 api-versions.xml 文件复制到平台工具,因此它将使用该文件而不是资源。 看起来是这样的:

steps:
  - bash: |
    echo Android sdk location: $ANDROID_SDK_ROOT
    mkdir $ANDROID_SDK_ROOT/platform-tools/api/
    cp $ANDROID_SDK_ROOT/platforms/android-30/data/api-versions.xml $ANDROID_SDK_ROOT/platform-tools/api/

我从 platforms/android-30/data/api-versions.xml 复制,因为那是他们将在 google 的官方修复中使用的文件(但可能不是硬编码 android-30,而是动态地基于你的构建设置)。

我复制了这个片段的contents of the file

https://gitlab.com/-/snippets/2164806

platform-tools 目录中它抱怨无法加载 /api/api-versions.xml 并且错误不再出现。

无需降级平台工具。