Android Studio 4.0.1编译的Android项目无法正常工作。

10

这是一个很长的故事,我将尽可能提供详细信息。

几个月以来,我一直在使用 Android Studio 3.x.x 构建我的应用,直到最近它开始为我提供更新到最新稳定版4.0.1。

我更新了,一切都像应该的那样顺利进行,所有插件都没有错误地更新,代码在新的Android Studio中首次编译,测试中项目运行良好,然后我上传到Play商店的内部测试轨道(问题就从这里开始了)。

在某些设备上,这个应用程序开始显示某种锁定或无限循环错误......这很奇怪,因为同样的设备在运行调试版本时没问题,此时我认为是一些proguard规则的问题。所以,我调整了build.grade文件,以使debug构建具有与发布构建相同的设置(shrink和minify为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生成的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文件......现在我需要睡觉,因为今天是星期六,我失去了我的生活中的7个小时在这个垃圾更新中。

创建一个同名和包名的空项目,从旧项目中删除 app/main 目录下的所有文件并复制到新项目中,同步 Gradle。 - Style-7
1
你在 com.android.tools.build:gradle 中具体做了哪些更改?能否请您发布一下? - Reaz Murshed
@ReazMurshed,这个插件必须更新以与Android Studio版本兼容...所以每次更改Android Studio版本时,都必须编辑此导入。 - Rafael Lima
2个回答

4

如果您的方法在某些设备上无法正常运行,检查互联网可能会对您有所帮助。

您还可以确认您的错误是由于检查互联网或其他原因导致的。

boolean hasActiveInternetConnection() {
    try {
        InetAddress ipAddr = InetAddress.getByName("google.com");
        return !ipAddr.equals("");
    } catch (Exception e) {
        return false;
    }
}

这可能是检查互联网连接的另一种方法,但由于我在代码的许多其他点使用okhttp,简单地替换互联网连接测试并不能使项目正常工作。 - Rafael Lima
@RafaelLima 你可以在你的代码的其他部分使用 Retrofit 代替 okhttp。 - Abdur Rehman
这并不是建议你在这里做的事情。首先,Retrofit 内部使用 OkHttp,所以如果它不能正常工作,Retrofit 也无法正常工作。其次,建议像切换整个 API 这样的大改变来解决一个不稳定的问题就像是说“从头开始”。 - Rafael Lima

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

然后 清除项目

尝试 文件->无效缓存/重新启动...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接