前言
最近使用gradle编译安卓的时候又出现了gradle下载超时的问题,经常性地手动下载再复制到目录,确实每次都做,每次都很繁琐。
于是有了今天这个软件地诞生,先放个截图。
一、简要的代码片段
小工具是使用jetpack compose for desktop编写的,实际上也没有什么技术含量,简单地分享几个代码片段。
- 点击按钮时启动下载线程
Button({
for (fName in gradleFileNames.split("\n")) {
val fileName = fName.trim().removeSuffix(".zip")
if (fileName.isNotEmpty()) {
gradleFileDirName = getFolderName("https://services.gradle.org/distributions/${fileName}.zip")
val src = "${gradleSrcUrl}/${fileName}.zip"
val tarFilePath = "${gradleDir}\\wrapper\\dists\\${fileName}\\${gradleFileDirName}\\$fileName.zip"
thread {
Downloader.download(src, tarFilePath) { status ->
println("callback status $status")
appendTaskStatus(status)
}
}
}
}
}) {
Text("下载")
}
- 读取服务器文件的内容
fun fileContent(fileUrl: String): String?{
try {
val conn = URI(fileUrl).toURL().openConnection()
if(conn.contentType.startsWith("text/plain;")) { //text/plain; charset=utf-8
val contentStream = conn.content as InputStream
val content = contentStream.readAllBytes().decodeToString()
return content
}
}catch (e: Exception){
println("exception $e")
}
return null
}
- 下载网络二进制文件
fun download(fileURL: String, savePath: String, callback: (DownloadStatus)->Unit){
callback(DownloadStatus("新的任务 from $fileURL, to $savePath", fileURL, savePath))
try {
val conn = URI(fileURL).toURL().openConnection()
val inputStream = conn.getInputStream()
val tarDir = File(File(savePath).parent)
if(!tarDir.exists()){
if(!tarDir.mkdirs()){
callback(DownloadStatus("创建目标文件夹失败 $tarDir", fileURL, savePath))
return
}
}
callback(DownloadStatus("开始下载 $fileURL", fileURL, savePath))
val tmpPath = "$savePath.tmp"
val tarFile = File(tmpPath)
tarFile.createNewFile()
val buff = inputStream.readAllBytes()
val fos = FileOutputStream(tarFile)
fos.write(buff)
fos.close()
inputStream.close()
callback(DownloadStatus("下载完成 $savePath", fileURL, savePath))
File(tmpPath).renameTo(File(savePath))
} catch (e: Exception) {
println("catch a exception $e")
callback(DownloadStatus("下载失败: $e", fileURL, savePath))
}
println("download finish $fileURL, to $savePath")
}
- 其中DownloadStatus的定义(用于整合下载状态)
class DownloadStatus(
val message: String,
val fromUrl: String="",
val toPath: String="",
val error: String="",
val date: String= Date().toString(),
val attachedList: MutableList<DownloadStatus> = mutableListOf()
)
二、小工具下载
公众号《微代码人生》,回复关键词 “gradle下载器
" 获取。
三、使用方法
-
(选)如果有自定义的gradle目录,需要设置环境变量
GRADLE_HOME
指向你的gradle文件夹;
如果使用默认的,可以忽略此步骤。 -
打开本软件,自动获取
GRADLE_HOME
/ 默认的gradle目录。
你也可以手动设置 -
idea sync的时候会在状态栏显示正在下载哪个版本的gradle,记下它然后取消执行
-
在本软件的gradle版本中写入刚才idea下载的版本号
-
点击下载按钮,即可开始下载
-
下载完成后,在idea中执行sync,就自动会跳过该版本的漫长下载过程了。
注1. 如果需要更换版本,别忘了更换distributionUrl
属性值。
该属性位于项目根目录\gradle\wrapper\gradle-wrapper.properties
文件中。
注2. 如果在sync过程中,还需要下载gradle-src
, 那就修改distributionUrl
属性-bin
为-all
, 并用本软件进行下载all版本的gradle包,重新sync即可。