关于AndroidStudio导入项目的正确方式,修改Gradle配置

前言

在安卓的引擎AndroidStudio导入过程中,github存在许多老项目,他们的安卓版本号以及Gradle各不相同,固有此篇文章解决

安装AndroidStudio以及下载SDK

相关链接:https://blog.csdn.net/qq_38436214/article/details/105073213

对比有关文件

以下project为项目目录节点

build.gradle文件详解

根目录下的gradle文件

  • project/build.gradle:

这个是gradle 插件配置有关于插件版本下面讲解

1、repositories闭包,声明了jcenter()的配置
2、dependencies闭包,声明了一个Gradle插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
buildscript {

repositories { //repositories闭包
google()
jcenter() //代码托管库:设置之后可以在项目中轻松引用jcenter上的开源项目
}
dependencies { //dependencies闭包
classpath 'com.android.tools.build:gradle:3.0.0' 声明gradle插件,插件版本号为3.0.0
//gradle是一个强大的项目构建工具,不仅可以构建Android,还可以构建java,C++等
//此处引用android的插件
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
google()
jcenter() //代码托管库:设置之后可以在项目中轻松引用jcenter上的开源项目
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

warpper文件

  • project/gradle/warpper/gradle-wrapper.properties

这个是有关于gradle版本文件 distributionurl 是studio下载gradle的path

1
2
3
4
5
#Sun Oct 02 21:29:47 CST 2016 
distributionBase GRADLE USER_HOME
distributionPath-wrapper/dists
zipStoreBase-GRADLE USER HOME zipStorePath=wrapper/dists
distributionurl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

app目录下的gradle文件

  • project/app/bulid.gradle

简单版本

简单的例子:

如果只关注gradle安装的话,只要看compileSdkVersion targetSdkVersion buildToolsVersion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 声明是Android程序,
//com.android.application 表示这是一个应用程序模块,可直接运行
//com.android.library 标识这是一个库模块,是依附别的应用程序运行
apply plugin: 'com.android.application'

android {
//编译sdk的版本,也就是API Level,例如API-19、API-20、API-21等等。
compileSdkVersion 26
//build tools的版本,其中包括了打包工具aapt、dx等等。
//这个工具的目录位于你的sdk目录/build-tools/下
buildToolsVersion '26.0.2'

//关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

defaultConfig { //默认配置
applicationId "com.hebbe.espressotest" //应用程序的包名
minSdkVersion 22 //最小sdk版本,如果设备小于这个版本或者大于maxSdkVersion将无法安装这个应用
targetSdkVersion 26 //目标sdk版本,充分测试过的版本(建议版本)
versionCode 1 //版本号,第一版是1,之后每更新一次加1
versionName "1.0" //版本名,显示给用户看到的版本号

//Instrumentation单元测试
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

buildTypes { //build配置
release {
minifyEnabled false //是否对代码进行混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) //本地依赖
//远程依赖,com.android.support是域名部分,appcompat-v7是组名称,26.1.0是版本号
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12' //声明测试用列库
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

完整版本

这个是补充的完整版本

1、apply plugin,声明是Android应用程序还是库模块
2、android 闭包,配置项目构建的各种属性,compileSdkVersion用于指定项目的编译SDK版本,buildToolsVersion用于指定项目构建工具的版本。

-defaultConfig闭包:默认配置,应用程序包名,最小 sdk 版本,目标 sdk 版本,版本号,版本名
buildTypes闭包:指定生成安装文件的配置,是否对代码进行混淆
signingConfigs 闭包:签名信息配置
sourceSets 闭包:源文件路径配置
lintOptions 闭包:lint 配置

3、dependencies 闭包,指定当前项目的所有依赖关系,本地依赖,库依赖以及远程依赖
4、repositories闭包,仓库配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
// 声明是Android程序,
//com.android.application 表示这是一个应用程序模块,可直接运行
//com.android.library 标识这是一个库模块,是依附别的应用程序运行
apply plugin: 'com.android.application'

android {
//程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关
lintOptions {
//即使报错也不会停止打包
abortOnError false
//打包release版本的时候是否进行检测
checkReleaseBuilds false
}

//编译sdk的版本,也就是API Level,例如API-19、API-20、API-21等等。
compileSdkVersion 26
//build tools的版本,其中包括了打包工具aapt、dx等等。
//这个工具的目录位于你的sdk目录/build-tools/下
buildToolsVersion '26.0.2'

//关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

defaultConfig { //默认配置
applicationId "com.hebbe.espressotest" //应用程序的包名
minSdkVersion 22 //最小sdk版本,如果设备小于这个版本或者大于maxSdkVersion将无法安装这个应用
targetSdkVersion 26 //目标sdk版本,充分测试过的版本(建议版本)
versionCode 1 //版本号,第一版是1,之后每更新一次加1
versionName "1.0" //版本名,显示给用户看到的版本号

archivesBaseName = "weshare-$versionName" //指定打包成Jar文件时候的文件名称
ndk {
moduleName "hebbewifisafe" //设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
//引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a" //, "x86" 显示指定支持的ABIs
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}

//当方法数超过65535(方法的索引使用的是一个short值,
//而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex。这里面坑很深啊
multiDexEnabled true

//Instrumentation单元测试
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

//默认的一些文件路径的配置
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'//指定清单文件
res.srcDirs = ['res']//指定res资源目录
assets.srcDirs = ['assets'] //asset资源目录
jni.srcDirs 'src/main/jni' //jni代码目录
jniLibs.srcDir 'src/main/jniLibs' //jni库目录
java.srcDirs = ['src']//指定java源代码目录
resources.srcDirs = ['src']//指定resource目录
aidl.srcDirs = ['src']//指定aidl目录
renderscript.srcDirs = ['src']//指定source目录
}
debug.setRoot('build-types/debug')//指定debug模式的路径
release.setRoot('build-types/release')//指定release模式的路径
}

//multiDex的一些相关配置,这样配置可以让你的编译速度更快
dexOptions {
//让它不要对Lib做preDexing
preDexLibraries = false
//开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
incremental true
javaMaxHeapSize "4g" //增加java堆内存大小
}

signingConfigs {//签名配置
release {//发布版签名配置
storeFile file("fk.keystore")//密钥文件路径
storePassword "123456"//密钥文件密码
keyAlias "fk"//key别名
keyPassword "123456"//key密码
}
debug {//debug版签名配置
storeFile file("fk.keystore")
storePassword "123456"
keyAlias "fk"
keyPassword "123456"
}
}
//指定生成安装文件的配置,常有两个子包:release,debug,注:直接运行的都是debug安装文件
buildTypes {
//release版本的配置,即生成正式版安装文件的配置
release {
zipAlignEnabled true //是否支持zip
shrinkResources true // 移除无用的resource文件
minifyEnabled false //是否对代码进行混淆,true表示混淆
//指定混淆时使用的规则文件;
// proguard-android.txt指所有项目通用的混淆规则,proguard-rules.pro当前项目特有的混淆规则
//release的Proguard默认为Module下的proguard-rules.pro文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable false //是否支持调试
//ndk的一些配置
ndk {
// cFlags "-std=c++11 -fexceptions -O3 -D__RELEASE__" // C++11
// platformVersion = "19"
moduleName "hebbewifisafe" //设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
//引入库,比如要用到的__android_log_print
abiFilters "armeabi", "x86", "armeabi-v7a"//, "x86"
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
//采用动态替换字符串的方式生成不同的release.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('release.apk')) {
def timeStamp = new Date().format('yyyyMMddHH');
def fileName = "WeShare-${defaultConfig.versionName}" + "-" + timeStamp + "-lj-" + ".apk";
output.outputFile = file("${outputFile.parent}/${fileName}")
}
}
}
jniDebuggable false //关闭jni调试
}
debug {//debug版本的配置
minifyEnabled false
zipAlignEnabled true
shrinkResources true // 移除无用的resource文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable true
// jniDebuggable true
ndk {
cFlags "-std=c++11 -fexceptions -g -D __DEBUG__" // C++11
}
jniDebuggable true
}
}

packagingOptions
{
exclude 'META-INF/ASL2.0'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/MANIFEST.MF'
}

compileOptions {
//在这里你可以进行 Java 的版本配置,
//以便使用对应版本的一些新特性
}
productFlavors {
//在这里你可以设置你的产品发布的一些东西,
//比如你现在一共软件需要发布到不同渠道,
//且不同渠道中的包名不同,那么可以在此进行配置;
//甚至可以设置不同的 AndroidManifest.xml 文件。
hebbe {
}
googlePlay {
}
solo {
}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
//所谓ProductFlavors其实就是可定义的产品特性,
//配合 manifest merger 使用的时候就可以达成在一次编译
//过程中产生多个具有自己特性配置的版本。

//上面这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
}

//指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
//本地依赖:可以对本地Jar包或目录添加依赖关系
//库依赖:可以对项目中的库模块添加依赖关系
//远程依赖:可以对jcenter库上的开源项目添加依赖
//标准的远程依赖格式是 域名:组织名:版本号
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) //本地依赖
//远程依赖,com.android.support是域名部分,appcompat-v7是组名称,26.1.0是版本号
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation project(':hello')//库依赖
testImplementation 'junit:junit:4.12' //声明测试用列库
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
//声明是要使用谷歌服务框架
apply plugin: 'com.google.gms.google-services'
//第三方依赖库的本地缓存路径
task showMeCache << {
configurations.compile.each { println it }
}
//使用maven仓库。android有两个标准的library文件服务器,一个jcenter一个maven。两者毫无关系。
//jcenter有的maven可能没有,反之亦然。
//如果要使用jcenter的话就把mavenCentral()替换成jcenter()
repositories {
mavenCentral()
}

版本问题

在安装gradle的时候有多个工具的版本会冲突 :

Java(JDK),gradle,gradle插件(插件和gradle不是一个东西)

Java和Gradle

Java version First Gradle version to support it
8 2.0
9 4.3
10 4.7
11 5.0
12 5.4
13 6.0
14 6.3
15 6.7
16 7.0
17 7.3
18 7.5
19 7.6
20 8.1

gradle和gradle插件

插件版本 所需的 Gradle 版本 Kotlin版本 AS版本
1.0.0 - 1.1.3 2.2.1 - 2.3
1.2.0 - 1.3.1 2.2.1 - 2.9
1.5.0 2.2.1 - 2.13
2.0.0 - 2.1.2 2.10 - 2.13
2.1.3 - 2.2.3 2.14.1+
2.3.0+ 3.3+
3.0.0+ 4.1+
3.1.0+ 4.4+
3.2.0 - 3.2.1 4.6+ 1.2.51+
3.3.0 - 3.3.3 4.10.1+ 1.3.0+(rec:1.3.21) rec:3.3.2+
3.4.0 - 3.4.3 5.1.1+
3.5.0 - 3.5.4 5.4.1+
3.6.0 - 3.6.4 5.6.4+
4.0.0+ 6.1.1+
4.1.0+ 6.5+

下载过慢或下载失败问题

在Android studio中 如果自带的下载的gradle的话,会比较慢(最好魔法),甚至会下载失败,那么就有个解决方法

选出对应版本

在官方的下载链接中找到warpper中的distributionurl(上文有提及)路径对应的zip,并下载。

(这里可以使用迅雷复制下载链接去下载)

处理warpper文件

打开Android studio 让他自动生成warpper文件,看到有下载gradle下载后关闭

注:这边的Android studio 默认是C:/user/.gradle 文件下 gradle 会比较大(1-2G)

可以在Android studio-> File 菜单 ->Setting -> Build, Execution, Deployment-> Build Tools-> Gradle -> 修改 Gradle user home : 到指定的文件夹

放入Zip文件

点开 Android studio-> File 菜单 ->Setting -> Build, Execution, Deployment-> Build Tools-> Gradle -> Gradle user home

Gradle user home 就是存放gradle 的目录地址

粘贴Gradle user home 到我的电脑

继续点击文件夹 warpper/dists/gradle-7.5-bin/f1wOcc9nuoDeivz97x2xlu9sv

里面会有 gradle-7.5-bin.zip.lck 和 gradle-7.5-bin.zip.part

把刚才下载的zip复制进去

点开Android studio 大象图标(右上)或者重启 Android studio

等待解压就好了

总结

在导入gradle中还是有很多坑的,比如说版本不一致,下载失败等等等

相关链接

https://blog.csdn.net/Qhx20040819/article/details/131911031

https://blog.csdn.net/u011897062/article/details/109357551

https://www.bilibili.com/video/BV1AW411i76x/?spm_id_from=333.999.0.0

https://services.gradle.org/distributions/

https://www.bilibili.com/video/BV1GQ4y1t7y8/?spm_id_from=333.337.search-card.all.click&vd_source=d19e47552f1614194f0d0b0662850083