You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 16设备中下载代码频繁抛出SocketException: Software caused connection abort异常的问题求助

Android 16设备中下载代码频繁抛出SocketException: Software caused connection abort异常的问题求助

各位好,我遇到了一个非常棘手的问题,想请大家帮忙分析排查下:

我们有一款Android应用,其中包含API请求和文件下载的功能。其中下载ZIP文件的代码在旧版Android系统上一直稳定运行没有问题(下载的文件保存在应用私有存储中),原代码如下:

URL downloadUrl = new URL(downloadUrlS);
URLConnection connection = downloadUrl.openConnection();
connection.connect();

InputStream input = new BufferedInputStream(connection.getInputStream());
FileOutputStream output = new FileOutputStream(downloadedFile);

byte[] data = new byte[32768];
long total = 0;
while ((count = input.read(data)) != -1) {
    total += count;
    output.write(data, 0, count);
}
output.flush();

output.close();
input.close();

但从Android 16开始,这段代码频繁抛出SocketException异常。关键是,同一APK在旧版本设备、同一网络环境下完全正常运行,所以我排除了代码本身和网络环境的问题,推测是Android 16在网络连接策略上做了某些变更导致的。我们测试了多个厂商的Android 16设备,均存在这个问题,看来不是某一厂商的定制问题。

错误总是发生在调用input.read()方法的时候,以下是完整的错误栈:

java.net.SocketException: Software caused connection abort
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:118)
    at java.net.SocketInputStream.read(SocketInputStream.java:173)
    at java.net.SocketInputStream.read(SocketInputStream.java:143)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readFromSocket(ConscryptEngineSocket.java:994)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.processDataFromSocket(ConscryptEngineSocket.java:958)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.readUntilDataAvailable(ConscryptEngineSocket.java:873)
    at com.android.org.conscrypt.ConscryptEngineSocket$SSLInputStream.read(ConscryptEngineSocket.java:846)
    at com.android.okhttp.okio.Okio$2.read(Okio.java:138)
    at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
    at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
    at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
    at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:277)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:338)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)

另外,下载的文件大小差异非常大,从几KB到完整下载完成都有,但只有大约10%的尝试能成功完成下载。

我查阅了Android 16的更新日志,没有找到与连接管理相关的明确变更说明,于是尝试显式设置了一些连接参数来避免超时或者长连接相关的问题,但修改后仍然抛出完全相同的异常。修改后的代码如下:

connection = (HttpURLConnection) downloadUrl.openConnection();
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(15000);
connection.setReadTimeout(30000);
connection.setUseCaches(false);
connection.setRequestProperty("Accept-Encoding", "identity");
connection.setRequestProperty("Connection", "close");

connection.connect();

有没有同行遇到过类似的问题?或者有相关的解决方案、内部信息可以分享?非常感谢大家的帮助!

火山引擎 最新活动