安卓开发的都会知道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文件是安卓开发的核心,初学者一定要仔细专研