1 问题背景
博主最近要有一个学习任务:
掌握OkHttp的使用方法:
1.get、post请求 传递参数
2.OkHttp进行get请求下载文件
3.下载文件的同时 利用前期掌握的线程知识 显示下载进度
因此博主想找一个基于OkHttp实现的多线程、断点续传Android下载工具项目,并参考其中的源码。接着有幸阅读到了这篇文章:Android 实现一个简单的文件下载工具,其具体详细介绍了如何从零创建一个多线程、断点续传的下载工具APP,同时提供了这个项目的GitHub网站:Github-SheHuan/DUtil。
但是现在的问题在于:这个项目是2017年4月搭建的,博主在2020年12月把这个Android项目导入Android Studio时,遇到了各种不兼容的Bug,幸运的是最终解决了这些兼容问题,因此想通过这篇博客记录本次Android Studio正确配置并运行Android老项目解决方案。
同样的问题,在2022年1月13日,博主我需要构建安卓新手引导蒙版库huburt-Hu/NewbieGuide,它是一个Android 快速实现新手引导层的库,通过简洁链式调用,一行代码实现引导层的显示。目前这个项目的最后更新时间为2019年6月27日,该项目的Gradle包版本号为4.4,安卓Gradle工具版本号是3.1.2,而博主用的是2022年的“Android Studio Arctic Fox | 2020.3.1 Patch 4”,果不其然,参照原有的代码,我们是无法构建成功项目的,提示部分库找不到。最终该项目的解决方案便是:升级Gradle和Gradle Plugin的版本号、配置国内可访问的Maven仓库链接、升级“com.android.support:appcompat-v7”库至“androidx.appcompat:appcompat”。
2 问题复现
通过git clone https://hub.fastgit.org/SheHuan/DUtil.git
命令从远程仓库把代码下载到本地。
接着在Android Studio中打开这个项目。
果不其然,Android Studio的Event Log提示我们出错了:
11:48 AM
Gradle sync failed: Unsupported method: SyncIssue.getMultiLineMessage().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.
Consult IDE log for more details (Help | Show Log) (11 s 492 ms)
把这段错误提示翻译过来:
Gradle sync失败:不支持的方法:SyncIssue.getMultiLineMessage()。
您连接到的Gradle版本不支持该方法。
要解决这个问题,你可以改变/升级你连接到的Gradle的目标版本。
或者,您可以忽略这个异常,并从模型中读取其他信息。
参考IDE日志获取更多细节(帮助|显示日志)(11 秒 492 毫秒)
其实,我们可以仔细思考一下:该项目的作者是在2017年4月依靠这份同样的代码编译并成功运行APP,因此该项目配置的Gradle版本在2017年4月的Android Studio是可以完美运行的。同时博主也检查了当前项目配置的Gradle版本和安卓Gradle Plugin插件版本,分别是2.14.1-all
和2.2.0
,它们两都是符合Google文档Android Gradle 插件版本说明的要求,但是需要注意的是安卓Gradle Plugin插件版本必须要跟当前Android Studio的版本不要差别太大,不然也是无法正常构建项目的,可以参考安卓官方文档《Android Gradle 插件版本说明》。
因此,正确的解决方案便是:升级该项目的Gradle版本和Gradle Plugin插件版本。
3 解决方案
3.1 确定当前Gradle和Gradle Plugin的最新版本号
虽然我们想把当前项目的Gradle和Gradle Plugin升级,问题是:那么多的Gradle版本和Gradle Plugin插件版本,我们具体要把当前的老项目升级到哪个版本呢?
最好的版本就是最新的版本,如果你不知道当前Android支持的最新版本,可以在Android Studio中新建一个Hello World安卓项目,该项目的Gradle版本和Gradle Plugin插件版本便是最新的。
例如,2020年12月,博主新建的Hello World安卓项目的/gradle/wrapper/gradle-wrapper.properties
描述的Gradle版本为:6.5-bin
,wrapper.properties
的全部内容如下所示。:
#Fri Dec 18 15:53:49 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
build.gradle
描述的Gradle Plugin版本为:4.1.1
,build.gradle
的部分内容如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
确定了当前Gradle和Gradle Plugin的最新版本号后,我们在当前老项目中把Gradle和Gradle Plugin版本号进行修改。
3.2 添加google() Maven仓库并同步项目
升级好Gradle和Gradle Plugin后,我们再编译一下这个老项目,发现又报错了,截图如下:
其中报错日志为:
Could not find com.android.tools.build:gradle:4.1.1.
Searched in the following locations:
- https://jcenter.bintray.com/com/android/tools/build/gradle/4.1.1/gradle-4.1.1.pom
If the artifact you are trying to retrieve can be found in the repository but without metadata in 'Maven POM' format, you need to adjust the 'metadataSources { ... }' of the repository declaration.
Required by:
project :
Add google Maven repository and sync project
Open File
很显然是因为在build.gradle
中没有google()
这个Maven仓库,从而导致无法找到com.android.tools.build:gradle:4.1.1.
的下载路径,因此正确的做法便是Add google Maven repository and sync project
。
这个问题主要是从指定的Maven仓库中找不到对应的库,可能的原因是没有访问Google的能力,可以参考文档《简书-AndroidStudio SSL peer shut down incorrectly 问题》来配置国内互联网可访问的Maven仓库。
当我们点击Add google Maven repository and sync project
后,Android Studio便开始去下载Gradle Plugin等工具了,我们也可以看到build.gradle
的仓库中也分别多了两行代码google()
:
3.3 成功编译运行APP
接着我们便可以成功编译运行APP。
本文参考文献:
[1]安卓官网-Android Gradle 插件版本说明
[2]Gradle sync failed: Unsupported method: SyncIssue.getMultiLineMessage(). (Android Studio)
[3]Android 实现一个简单的文件下载工具
[4]简书-AndroidStudio SSL peer shut down incorrectly 问题