安卓开发的都会知道Gradle是什么?但是只是知道它是做什么的。对于初学者更不会去管内部代码的意思。

想当初,自己也是那样,不知道Gradle里面的代码意义何在,在网上看大神的博客,也只能吸收三分之一,做过几个项目之后,不得不对Gradle进行解读了;

   


1.什么是Gradle?


Gradle是一种依赖管理工具,基于Groovy语言,面向java应用为主,它抛弃了基于xml的各种繁琐配置,取而代之的是一种基于Groovy的领域特定(DSL)语言,as中新建项目成功后自动下载Gradle


 


2.编译过程分为三个阶段:


(1)初始化阶段:创建新的project对象,如果有多个build.gradle也会创建多个project


(2) 配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为最后一个阶段做准备


(3)执行阶段:在这个阶段,gradle会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里;




3.Gradle文件中代码具体含义:

下面根据我之前开发的一个项目中的Gradle文件进行讲解:(这个文件我有删除的地方,不能透漏给大家,不过知识点还是很全面的)

红色字体是代码,黑色字体是对代码的讲解(如果有不对的地方还是希望大神们多多提点)

代码如下:

//Library工程必须加载此插件。注意,加载了Android插件就不要加载Java插件了。因为Android
 
//插件本身就是拓展了Java插件
 
apply plugin: 'com.android.application'
 

 
android {
 
/*
 
*compileSdkVersion告诉gradle使用哪个版本Android SDK编译你的应用,
 
* 使用任何新添加的API就要使用对应level的Android SDK.
 
* 他们三者的关系
 
minSdkVersion <= targetSdkVersion <= compileSdkVersion
 
理想情况下应该是
 
minSdkVersion (lowest possible) <=targetSdkVersion == compileSdkVersion (latest SDK)
 
理想情况下:用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为。
 
* */
 
 
 compileSdkVersion 24 
  //是你sdk版本号,也就是你API的leavel 例如:API-19、API-20、API-21等等。
 
 
 buildToolsVersion "24.0.1"  
 //是你构建工具的版本 其中包括你的打包工具aapt,dx等
 
//默认配置
 
 
 defaultConfig {
 
applicationId "你的包名"
 
/*
 
*minSdkVersion限制安装application所需要的系统最低版本,
 
* 低于该版本的系统都不可以安装该application。
 
* 同时不能使用该level版本SDK所不具备的API
 
* */
 
 
 minSdkVersion 14
 
/*
 
*targetSdkVersion是Android提供向前兼容的主要依据
 
* ,表明该application已经兼容从minSdkVersion至tartgetSdkVersion之间所有api的变化。
 
* 在targetSdkVersion更新之前系统不会应用最新的行为变化。
 
* */
 
 
 targetSdkVersion 23
 
versionCode 3
 
versionName "1.0.6"
 
renderscriptSupportModeEnabled true 
  //系统自带图片的模糊效果
 
/*


* Android基于JAVA语言,JAVA语言在编译之后都会生成字节码文件.class,


* 在Android中,这些文件都被存储在一个.dex文件中。由于DEX文件的格式限制,


* 其中的Method、Field、Class的个数都不能超过short类型的最大值65535,


* 如果超过了这个值,就会报错误。




为了解决这个问题,Google - Android在API 21的时候为广大程序员提供了一个通用的解决方案,


就是今天要说的MultiDex方案。这个方案让Android系统可以在原始的DEX文件存满之后自动生成一个新的DEX文件,


从而解决这个DEX溢满的问题。


* */
 
 
 multiDexEnabled = true
 
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 
/*设置想兼容所有cpu的abi*/
 
 
 ndk {
 
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a','x86','x86_64'
 
}
 
/*
 
*manifestPlaceholders 可以替换androidmanifest文件中的标签,
 
* 可作为快速渠道打包替换渠道名的一种方式,
 
* 也可以自定义标签用来替换需要的文本,多作为不同环境不同key的修改。
 
* */
 
 
 manifestPlaceholders = [
 
JPUSH_PKGNAME: applicationId,
 
JPUSH_APPKEY : "您的JPUSH_APPKEY ",
 
JPUSH_CHANNEL: "developer-default",
 
]
 
}
 
//签名信息配置
 
 
 signingConfigs {
 
config {
 
keyAlias 'bluemodemo.keystore'
 
keyPassword 'bluemodemo'
 
storeFile file('D:签名文件目录')
 
storePassword 'bluemodemo'
 
}
 
}
 
//打包apk重命名
 
 
 buildTypes {
 
 
 release {  
 //发布版本的签名设置
 
 
 minifyEnabled false 
  //是否启用Proguard 就是对代码进行混淆和压缩
 
 
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 
signingConfig signingConfigs.config
 
}
 
 
 debug { 
  //调试版本的签名设置
 
 
 signingConfig signingConfigs.config
 
}
 
}
 
}
 
//buildscript中的声明是gradle脚本自身需要使用的资源。
 
// 可以声明的资源包括依赖项、第三方插件、maven仓库地址等。
 
// 而在build.gradle文件中直接声明的依赖项、仓库地址等信息是项目自身需要的资源。
 
buildscript { 
 //这个属于在buildscript中的声明
 
 
 repositories {
 
mavenCentral()
 
}
 
//利用Gradle配置ndk环境
 
 
 dependencies {
 
classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.0'
 
}
 
}
 
//依赖配置
 
dependencies {
 
compile fileTree(include: ['*.jar'], dir: 'libs') 
 //libs下的所有jar包引入
 
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
 
//
 
exclude group: 'com.android.support', module: 'support-annotations'
 
})
 
compile 'com.android.support:appcompat-v7:24.2.1'
 
testCompile 'junit:junit:4.12'
 
compile 'com.android.support:design:24.2.1'
 
compile project(':lib_litepal')/ 
 /项目的引入
 

 
}






针对Gradle的总结,我总结了这么多,希望对大家有所帮助,Gradle文件是安卓开发的核心,初学者一定要仔细专研