Android 项目在 Android Studio 4.0.1 编译时无法运行
Posted
技术标签:
【中文标题】Android 项目在 Android Studio 4.0.1 编译时无法运行【英文标题】:Android project won't work when compiled by Android Studio 4.0.1 【发布时间】:2020-12-05 12:08:17 【问题描述】:这是一个很长的故事,我会尽力提供尽可能多的细节。
几个月来,我一直在使用 android studio 3.x.x 构建我的应用程序,直到最近它才开始为我提供最新的稳定版 4.0.1 的更新。
我更新了,它应该是无忧无虑的,所有插件都更新没有错误,代码首先在新的 android studio 中编译,项目在测试中运行良好,然后我上传到 play store 的内部测试轨道(问题从这里开始)。
该应用程序开始在某些设备中显示某种锁定或无限循环错误...这很奇怪,因为运行调试版本时相同的设备很好,此时我认为某些 proguard rules
是问题。所以我调整了build.grade
文件,以使debug
构建具有与release
构建相同的设置(缩小并缩小为真)。
编译后,应用程序在模拟器和有问题的设备中运行顺畅... 我再次将它上传到谷歌播放,并从那里下载该应用程序不起作用......
我做了一个非常详尽和烦人的代码调试,以便以某种方式锁定什么方法,我发现了这个嫌疑人:
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 生成的 apk 为 4.33MB(相同的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 个小时的生命
【问题讨论】:
创建一个同名同包的空项目,删除app/main目录下的所有文件并从旧项目复制,同步gradle 您必须在com.android.tools.build:gradle
中进行哪些更改?可以发一下吗?
@ReazMurshed, NONE...此插件必须更新为与 android studio 版本兼容...所以您总是更改 android studio 版本此导入必须编辑...
【参考方案1】:
如果您的方法在某些设备上不起作用,检查互联网可能会对您有所帮助
您还可以确认您的错误是由于检查互联网或任何其他原因造成的
boolean hasActiveInternetConnection()
try
InetAddress ipAddr = InetAddress.getByName("google.com");
return !ipAddr.equals("");
catch (Exception e)
return false;
【讨论】:
这可能是检查互联网连接的另一种方法,但由于我在代码的许多其他点中使用 okhttp,因此简单替换互联网连接测试不会使项目工作 @RafaelLima 您可以在代码的其他部分使用 Retrofit 而不是 okhttp 这不是你应该在这里做的建议。第一次改造在内部使用 okhttp,所以如果这不起作用,改造也不会起作用。第二个建议如此大的变化,比如将整个 api 切换为一个不稳定的问题,就像说“从头开始”【参考方案2】:将此行添加到您的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...
【讨论】:
以上是关于Android 项目在 Android Studio 4.0.1 编译时无法运行的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 中过时的 Kotlin 运行时警告
Android Gradle 插件将自定义 Gradle 插件上传到自建 Maven 仓库 ⑤ ( 使用 Sonatype Nexus 搭建 Maven 仓库 )
visual studio除了6还有哪个版本用得多而又不占内存?如何实现多visual studi