这是一个很长的故事,我将尽力提供尽可能多的细节。
几个月来,我一直在使用android studio 3.x.x来构建我的应用程序,直到最近它开始为我提供最新的稳定版4.0.1的更新。
我进行了更新,并且按预期的方式进行了无忧无虑,所有插件均无错误更新,并且代码首先在新的android studio中编译,项目在测试中运行良好,然后我将其上传到Play商店的内部测试轨道(问题从这里开始)。
该应用程序开始在某些设备中显示某种锁定或无限循环错误...这很奇怪,因为运行调试版本时使用的设备完全相同,这时我认为有些proguard rules
是问题。因此,我调整了build.grade
文件,以使debug
构建与release
构建具有相同的设置(缩小并缩小TRUE)。
编译后,该应用程序可以在仿真器和有问题的设备中顺利运行...
我再次将其上传到Google Play,然后从那里下载该应用程序不起作用...
我进行了非常详尽且烦人的代码调试,以便以某种方式锁定什么方法,我发现了这个可疑者:
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.readTimeout(15000, TimeUnit.MILLISECONDS);
httpClientBuilder.writeTimeout(15000, TimeUnit.MILLISECONDS);
httpClientBuilder.connectTimeout(15000, TimeUnit.MILLISECONDS);
httpClientBuilder.retryOnConnectionFailure(true);
httpClientBuilder.followRedirects(true);
httpClientBuilder.followSslRedirects(true);
httpClientBuilder.connectionPool(DEFAULT_CONNECTION_POOL);
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(10);
dispatcher.setMaxRequestsPerHost(10);
httpClientBuilder.dispatcher(dispatcher);
okHttpClient = httpClientBuilder.build();
private boolean isInternetOK(){
boolean ret = false;
try {
okHttpClient.newCall(new Request.Builder().get().url("https://www.google.com").build()).execute();
ret true;
} catch (Exception e) {
}
return ret;
}
在启动器活动中,在开始登录之前,我验证用户互联网连接是否正常(这是简单的代码),并且httpclient
的超时时间为15秒,因此连接或快速失败。
对于我来说,为什么这种特定方法在开发商店中有效,而在从Play商店提供服务(在相同的设备和相同的构建配置中)中却不起作用,这是没有意义的
我花了几个小时试图解决问题...直到我决定将android studio降级到我使用的先前版本。以及自己解决的问题!
因此,我100%确信问题与android studio 4.0.1及其gradle插件以及它们与"com.squareup.okhttp3:okhttp:3.12.12"
的交互方式有关
这是我的观察结果:
1- android studio 4.0.1生成的apk为4.18MB,而3.6.3生成的4.33MB apk(相同的build.config
和相同的proguard.rules
)
2-将android studio更新为4.0.1后,proguard.rules开始显示很多错误,就像这里所说的:Unresolved class name proguard-rules Android Studio 4.0,但仍然可以正常编译(并且可以在缩小和缩小的情况下很好地进行调试)>
3-项目中唯一的区别是android studio版本和com.android.tools.build:gradle
依赖项,因为它必须遵循android studio版本。
据我所知,如果有人可以帮助我,我将提供更多信息,甚至提供从不同版本编译的apk ...现在我需要睡觉了,因为今天是23:30,今天是星期六,在这次垃圾邮件更新中,我失去了7个小时的生命
答案 0 :(得分:4)
如果您的方法在某些设备上不起作用,则可能对检查互联网很有帮助
您还可以获得有关错误的确认,这是由于检查互联网或其他任何原因造成的
boolean hasActiveInternetConnection() {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
return !ipAddr.equals("");
} catch (Exception e) {
return false;
}
}
答案 1 :(得分:0)
将此行添加到您的AndroidManifest.xml
文件中,
<application
android:usesCleartextTraffic="true"
即使您面临同样的问题,
尝试此配置,更新项目级别build.gradle
文件,
classpath 'com.android.tools.build:gradle:3.6.4'
在gradle/wrapper/gradle-wrapper.properties
文件中更新
distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip
然后clean project
尝试File-> Invalid Cache / Restarts...