重拾Android - Gradle
为了学业以及毕设内容,重新捡起了Android开发。
安装AndroidStudio与SDKTools倒是没啥问题,只要网络顺畅一切ok。
但最麻烦的问题来了,就是每次都会遇上的Gradle Sync问题,迫不得已学了一遍Gradle(虽然说之前搞的时候也没正儿八经学过)。
Gradle是基于Apache Ant(2000年)、Apache Maven(2004年)产生的一款高效易用的项目管理工具,弥补了Ant和Maven的不足。其使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置(但个人感觉过于简化了反而有些地方理不清楚),以面向Java为主,还支持Kotlin、Scala、Groovy、C/C++、JavaScript语言。
Gradle文件分析
这里通过IDEA构建一个Gradle+Java结构的项目来分析
在Preference- Build,Execution,Deployment - Gradle
可以查看项目的Gradle配置
项目结构中的build.gradle
文件就是项目中的gradle配置文件,可能会有些出入,但大致结构是一样的。
plugins {
id 'java'
}
/**
* 项目路径
*/
group 'org.example'
/**
* 项目版本
*/
version '1.0-SNAPSHOT'
/**
* 指定所使用的仓库,默认的mavenCentral()表示使用中央仓库,此刻项目中的所有jar包都会从中央仓库下载到本地指定目录
* mavenLocal()表示使用本地仓库
*/
repositories {
//Maven本地仓库
MavenLocal()
// Maven中央仓库
mavenCentral()
}
/**
* 每个jar包的坐标都位于dependencies属性内
* 每个jar包包含三个属性
* group:name:version
* 长格式:group:'',name:'',version:''
* 短格式: 'group:name:version'
* 可以从Maven中央仓库找到所需包的写法
*/
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test {
useJUnitPlatform()
}
Maven中央仓库:Maven Repository: Search/Browse/Explore
父子工程依赖
在父工程中,存在一个setting.gradle
文件,其中写有各个子工程的项目名
rootProject.name = 'GradleDemo'
include 'GradleChild1'
include 'GradleChild2'
若要由父工程的gradle给子工程提供依赖,需要在父工程的build.gradle
中使用allprojects{}
将所有内容包起来
allprojects {
apply plugin: 'java' // 这里写法不太一样
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
test {
useJUnitPlatform()
}
}
若子工程A还需要引入子工程B,需要在子工程的build.gradle
中配置好dependencies()
//子工程Child2引入Child1
dependencies {
implementation project(":GradleChild1")
}
Gradle+Maven本地仓库
一般Gradle有一个自己的本地仓库,但大概率自己本地也会有一个Maven仓库。在一些情况下我们不希望Gradle再下一遍
在Preference- Build,Execution,Deployment - Gradle
中,修改Use Gradle from
为Specified location
,并指定本地的Maven仓库,一般为Maven下的repository
文件夹。
同时添加mavenLocal()
先从本地寻找依赖。
但我测试完有点后悔,因为Gradle和Maven的仓库结构是不太一样的,两个混在一起后,会在当前使用的仓库中补充上以上文件,对于有强迫症的我来说就好像想吃白米饭但老爸总喜欢在里面加些红枣红薯balabala的一起煮。
Android+Gradle问题
对于这种从头开始的环境搭建问题,建议还是老老实实跑出一个HelloWorld
,往往能避免很多直接上手项目的坑。
Could not find method google() for arguments [] on repository container.
重新捡起Android是为了跑起师兄的祖传代码,虽说在工程的readme中已经说明了可以先断网,将
gradle-3.3
版本导入本地,重新启动后以本地方式启动,最后就可以连上网了。但由于gradle早期(2019年3月份前)没有在国内设置cdn,所以当时下载贼慢,受网络环境影响贼大。
虽说我刚开始学Android是在19年,但当时还是觉得很慢,而且实验室网络环境一直不行,每次同步都得在回寝室才能完成
// building.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
google() //出问题所在
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
google()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
出现这种原因一种可能性是使用的Gradle版本过低,可以通过两种方法修改
- 方法一:在项目文件
gradle-wapper.properties
中将distributionUrl
一项改为更高版本 - 方法二:在
File - Project Structure - Project
中将Gradle Version
修改为更高版本
修改完成后进行同步,有可能会提示如Minimum supported Gradle version is 4.10.1. Current version is 4.10.
,继续修改更高的就可以了。
到2022年重新捡起Android,还是能明显感受到Gradle同步的速度快得多了。但仍有一些包会卡很久。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库