我将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,仍然遇到同样的错误。
注意:我使用的是Ubuntu 20.04。
我将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,仍然遇到同样的错误。
注意:我使用的是Ubuntu 20.04。
https://gitlab.com/-/snippets/2164806
在platform-tools
目录中,它抱怨无法加载/api/api-versions.xml
,错误不再显示。platform-tools
。我最近也遇到了这个问题,并进一步调查了这个问题,因为我无法降级platform-tools版本(因为它是在构建服务器上发生的,我不能控制platform-tools版本,它由Microsoft控制)。
以下是我的发现: 只有在大型Android项目中才会出现此问题,可能涉及多个模块。
问题的原因与SdkUtils类相关(请参见源文件)。 SdkUtils类对文件platform-tools/api/api-versions.xml
有硬引用,但是使用了最新的platform-tools(31.0.3),该文件已不存在。
SdkUtils类中实现的回退方法是从资源中读取api-versions(通过执行getClass().getClassLoader().getResource("api-versions.xml").openStream();
)。对于小型Android项目来说,这很好。但是,我注意到,在较大的Android项目中,存在多个模块/任务同时进行编译,其中一些流被关闭(因此会出现“ 流关闭”异常)。
我已向Google提出了问题,他们正在努力解决这个问题(请参见此处的issuetracker链接)。
在Google以适当的方式解决此问题之前,最简单的解决方法是降级您的platform-tools版本1个版本(如另一个答案所述)。
但是,如果您像我一样无法控制platform-tools版本(因为在我的情况下是由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/
platforms/android-30/data/api-versions.xml
中复制,因为这是谷歌官方修复时将使用的文件(但也许不是硬编码的android-30,而是根据您的构建设置动态确定)。platform-tools
降级至v31.0.2即可。我们可以在https://androidsdkmanager.azurewebsites.net/Platformtools上下载它。sdk文件夹
中的platform-tools
文件夹,然后通过上面链接下载了下面的版本来替换之前删除的platform-tools
文件夹。 - if_alan