gradle 版本下载地址
https://services.gradle.org/distributions/
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+
|
版本与包的对应关系
一 句话说明 Gradle
Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。
例:输入 苹果,梨子,香蕉。 输出 水果沙拉。 这就是构建的含义。叫做——make或者build
1:
灵活的语言构建规则
——构建的方式:利用一个基于java的语言——Groovy。 一门把java语言写的像脚本一样简单的语言。
Groovy把我们写完的语言编译为 javaclass 然后启动 虚拟机执行。
2:
Gradle是一种DSL
:—— 它的特别的一种语言。
二 Groovy介绍
Groovy是一种动态语言,
Groovy扩展了Java语言。
具有像Python, Ruby 和 Smalltalk 语言特性的灵活动态语言
一:
变量定义可以使用关键字def,
定义变量的时候可以不指定其类型,
函数定义时也可以不指定。
返回值也可以不指定类型,最后一行就是返回值
二
作为动态语言,Groovy世界中的所有事物都是对象
java中的基本数据类型 ,在Groovy中都是 包装类。
Groovy中的容器类很简单,就三种:
List:链表,
Map:键-值表,
Range:范围,它其实是List的一种拓展。
三 闭包
三 Gradle 是设么
Gradle只是运用到Groovy的一小部分基础。
Gradle是一个工具,同时它也是一个编程框架。
一 何是编程框架
每一个待编译的工程都叫一个Project。每一个Project在构建的时候都包含一系列的Task
gradle 只是制定规责。 制定Task 。 然后具体操作由各种插件完成。 例:编译java代码的task 用 java插件完成。
task是Gradle中的一种数据类型,它代表了一些要执行或者要干的工作。不同的插件可以添加不同的Task。每一个Task都需要和一个Project关联。
setting.gradle 告诉Gradle这个multiprojects包含哪些子projects:
build.gradle 构建。
apply 是一个函数。
apply plugin: 'com.android.library' <==如果是编译Library,则加载此插件
apply plugin: 'com.android.application' <==如果是编译Android APP,则加载此插件
apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle" 读取AndroidManifest.xml中
的versionName,或者是copy jar包/APK包到指定的目录
// 声明是Android程序,apply方法,加载 编译 android App 时 加载此插件
apply plugin: 'com.android.application'
android {
// 编译SDK的版本
compileSdkVersion 21
// build tools的版本
buildToolsVersion "21.1.1"
defaultConfig {
// 应用的包名
applicationId "me.storm.ninegag"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
}
// java版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release {
// 是否进行混淆
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
// 移除lint检查的error
lintOptions {
abortOnError false
}
}
dependencies {
// 编译libs目录下的所有jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.2'
compile 'com.etsy.android.grid:library:1.0.5'
compile 'com.alexvasilkov:foldable-layout:1.0.1'
// 编译extras目录下的ShimmerAndroid模块
compile project(':extras:ShimmerAndroid')
}
apply plugin: 'com.android.application'//说明module的类型,com.android.application为程序,com.android.library为库
android {
compileSdkVersion 22//编译的SDK版本
buildToolsVersion "22.0.1"//编译的Tools版本
defaultConfig {//默认配置
applicationId "com.nd.famlink"//应用程序的包名
minSdkVersion 8//支持的最低版本
targetSdkVersion 19//支持的目标版本
versionCode 52//版本号
versionName "3.0.1"//版本名
}
sourceSets {//目录指向配置
main {
manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest文件
java.srcDirs = ['src']//指定source目录
resources.srcDirs = ['src']//指定source目录
aidl.srcDirs = ['src']//指定source目录
renderscript.srcDirs = ['src']//指定source目录
res.srcDirs = ['res']//指定资源目录
assets.srcDirs = ['assets']//指定assets目录
jniLibs.srcDirs = ['libs']//指定lib库目录
}
debug.setRoot('build-types/debug')//指定debug模式的路径
release.setRoot('build-types/release')//指定release模式的路径
}
signingConfigs {//签名配置
release {//发布版签名配置
storeFile file("fk.keystore")//密钥文件路径
storePassword "123"//密钥文件密码
keyAlias "fk"//key别名
keyPassword "123"//key密码
}
debug {//debug版签名配置
storeFile file("fk.keystore")
storePassword "123"
keyAlias "fk"
keyPassword "123"
}
}
buildTypes {//build类型
release {//发布
minifyEnabled true//混淆开启
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆规则文件
signingConfig signingConfigs.release//设置签名信息
}
debug {//调试
signingConfig signingConfigs.release
}
}
packagingOptions {
exclude 'META-INF/ASL2.0'//排除一些文件
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/MANIFEST.MF'
}
lintOptions {
abortOnError false//lint时候终止错误上报,防止编译的时候莫名的失败
}
}
dependencies {
compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar']) //编译lib目录下的.jar文件
compile project(':Easylink')//编译附加的项目
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//编译来自Jcenter的第三方开源库
}
Gradle常用命令
gradle --help
gradle tasks //列出task列表
gradle asD (gradle assembleDebug) //编译debug打包
gradle asR (gradle assembleRelease) //编译release打包
gradle asD --refresh-dependencies //强制刷新依赖
gradle asD --parallel //并行编译
gradle asD --parallel-threads 3
gradle build gradle clean
直接执行gradle build会生成debug包和release包如果不想要debug包可以使用gradleasR命令。
上面大家接触了一些命令如./gradlew -v./gradlew clean./gradlew build, 这里注意是./gradlew,./代表当前目录,gradlew代表 gradlewrapper,意思是gradle的一层包装,大家可以理解为在这个项目本地就封装了gradle,即gradle wrapper,在9GAG/gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本。只要下载成功即可用grdlew wrapper的命令代替全局的gradle命令。z理解了gradlewrapper的概念,下面一些常用命令也就容易理解了。
·./gradlew-v版本号
·./gradlewclean清除9GAG/app目录下的build文件夹
·./gradlewbuild检查依赖并编译打包
这里注意的是./gradlew build命令把debug、release环境的包都打出来,如果正式发布只需要打Release的包,该怎么办呢,下面介绍一个很有用的命令assemble,如
·./gradlewassembleDebug编译并打Debug包
·./gradlewassembleRelease编译并打Release的包
除此之外,assemble还可以和productFlavors结合使用,具体在下一篇多渠道打包进一步解释。
·./gradlewinstallRelease Release模式打包并安装
·./gradlewuninstallRelease卸载Release模式包
实际应用:
1:当打包os包出现问题时
当您在Android上安装APK时,系统将按照由Build确定的顺序在APK的lib文件夹内查找本机库目录(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips64,mips)。SUPPORTED_ABIS。
如果您的应用程序碰巧有一个缺少lib的arm64-v8a目录,则不会从另一个目录安装缺少的lib,这些lib不会混合。 这意味着您必须为每个架构提供一整套库。
因此,要解决您的问题,您可以从构建中删除您的64位库,或者将abiFilter设置为仅打包32位体系结构
ndk {
abiFilters
"armeabi",
"armeabi-v7a",
"x86",
"mips"
}