Android HttpUrlConnection在Release包中无法工作求助
问题描述
我通过Web API获取换行符分隔的文件名列表,将每行字符串存入List集合。该方法在模拟器调试、真机调试模式下均正常运行,但生成签名Release APK安装到手机后无法工作,触发catch代码块,异常消息为null、响应码0、响应消息为空,错误日志如下:
02-11-2023 10:55:38 CET null 0 15000 _____________________________________________
相关代码如下:
public class MbtilesFileNamesFromServer { private String url; public MbtilesFileNamesFromServer(String url) { this.url = url; } protected List<String> GetFileNames() { HttpURLConnection urlConnection = null; List<String> fileNamesArray = new ArrayList<>(); int code = 0; String response=""; try { URL url = new URL(this.url); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(15000); urlConnection.setReadTimeout(10000); urlConnection.setRequestMethod("GET"); urlConnection.setDoInput(true); urlConnection.connect(); code = urlConnection.getResponseCode(); response=urlConnection.getResponseMessage(); if (code == 200) { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); if (in != null) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = bufferedReader.readLine()) != null) fileNamesArray.add(line); } in.close(); } return fileNamesArray; } catch (Exception e) { AppendErrLog(e.getMessage() + " " + String.valueOf(code) +" "+response+" "+ String.valueOf(urlConnection.getConnectTimeout())); urlConnection.disconnect(); } finally { urlConnection.disconnect(); } return fileNamesArray; } }
排查思路与解决建议
- 检查网络权限:确认
AndroidManifest.xml中是否声明了<uses-permission android:name="android.permission.INTERNET"/>,Release打包时权限可能被意外移除或未配置。 - 配置混淆规则:ProGuard混淆可能破坏了
HttpURLConnection、URL等相关类的逻辑,在proguard-rules.pro中添加以下规则:-keep class java.net.HttpURLConnection { *; } -keep class java.net.URL { *; } -keep class java.io.BufferedReader { *; } -keep class java.io.InputStreamReader { *; } - 排查HTTPS证书问题:若API使用HTTPS协议,Release环境可能未信任服务器证书。优先使用正规CA签发的证书,若需自定义信任,需在代码中添加证书校验逻辑(注意安全风险)。
- 完善异常日志:当前仅打印
e.getMessage(),建议在catch块中添加e.printStackTrace()或记录e.toString(),获取完整堆栈信息定位具体异常原因。 - 验证URL有效性:检查传入的URL在Release环境中是否正确,是否存在未转义的特殊字符,导致连接失败。
- 确认线程执行环境:Android禁止主线程执行网络请求,调试模式可能有宽松限制,但Release包会严格触发异常。若
GetFileNames()在主线程调用,需移至子线程(如Coroutine、AsyncTask或普通Thread)执行。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

