无法从 ../android-sdk/platform-tools/api/api-versions.xml 加载 api 描述 java.io.IOException: Stream closed

Nur*_*izi 14 android android-studio android-studio-arctic-fox

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

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

我尝试恢复到 v4.2.2,仍然遇到相同的错误。

注意:我使用的是 Ubuntu 20.04

jep*_*bio 14

我复制了此片段的文件内容:

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

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

无需降级平台工具。

  • 这应该是公认的答案!顺便说一句,根据此问题的评论 https://issuetracker.google.com/issues/196847367?pli=1 它应该在 AGP 7.1 canary 12 中修复。 (3认同)

Hyl*_*ron 6

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

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

问题的原因与类 SdkUtils 有关(请参阅源文件)。SdkUtils 类对该文件有硬引用platform-tools/api/api-versions.xml,但使用最新的平台工具 (31.0.3),该文件不再存在。

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

我向谷歌提出了一个问题,他们正在尝试修复它(请参阅此处的问题跟踪器链接)。

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

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

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/
Run Code Online (Sandbox Code Playgroud)

我从 复制platforms/android-30/data/api-versions.xml,因为这是他们也将在谷歌官方修复中使用的文件(但可能不是硬编码的 android-30,而是根据您的构建设置动态地进行)。