初识gradle
gradle是什么
我刚开始接触Android的时候,一直以为gradle就是个像maven一样管理依赖的东西。写代码接触的多了才慢慢了解gradle是一个构建Android项目的工具,依赖管理只是他的一个小小的功能。
gradle咋用
在Android Studio里,我们一说要配置什么版本的gradle基本上就是打开File->Project Structure配置Project选项里的Gradle Version 和 Android Plugin Version这两个东西。配好了等着Android Studio自动把东西下载好,就可以编写自己的Android程序了。
或者在gradle-wrapper.properties里配置
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
project build.gradle里配置
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
怎么要配两个,两个版本还要对应上,版本对应关系还贼乱…真麻烦
gradle不是专门为Android设计的,他能构建任意的java、C++、Python项目。有通用部分,必然需要对应的针对Android的插件。
gradle文件
build.gradle (project)
创建一个Android项目的时候里面就已经写好了3个代码节点(专业点叫闭包)
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
buildscript 用于gradle构建,repositories 使用的一些依赖的maven仓库,一般就写这两个google()和jcenter(),dependencies 使用到的依赖,主要就是gradle的android插件了。
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
}
allprojects 是指作用于整个项目的,repositories 我们编码时需要使用到的依赖的maven仓库。想要引入某些github上的第三方项目,它都会让你加一个 maven { url ‘https://jitpack.io’ }。这里加的不需要加到buildscript 的repositories 中,以前我加依赖仓库两个一起加。
task clean(type: Delete) {
delete rootProject.buildDir
}
最后还有一个task,这个task是gradle执行的基础单位,它定义的一个任务我们点build都是在加载、执行一个个的task。
这里定义了一个名字叫clean的task,我们可以在gradle窗口中找到这个task
在other中找到clean,双击他就能执行这个task
我们在代码中插入一句打印的语句
task clean(type: Delete) {
delete rootProject.buildDir
println 'this is cleanTask'
}
双击执行,看到我们打印的一句话
附:
build的时候有时候会报一堆错,还没有具体提示。这时候我们可以看一下是哪个task出现了问题,比如出了这么个东西,还没有其他提示了。
他告诉我们task compileAnotherReleaseJavaWithJavac执行失败了。
我们在terminal中输入gradlew compileAnotherReleaseJavaWithJavac -stacktrace
或者加-info就能输出更详细的错误信息
build.gradle (module)
一上来就是一句
apply plugin: 'com.android.application'
看起来是应用了什么插件,有些module应用的插件是
apply plugin: 'com.android.library'
这两个其实就是gradle project中全局配置的那个gradle android插件的一部分
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
}
应用插件会在gradle 的config阶段执行,application插件中包含一些build可执行app的逻辑,而library插件中会执行一些build module的逻辑。
接下来就是一个叫android的节点了,它主要作用是配置这个android项目的版本、结构等。
android {
compileSdkVersion 28
buildToolsVersion '28.0.0'
defaultConfig {
applicationId "com.test.useless"
minSdkVersion 22
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
compileSdkVersion 常见但是不怎么修改,它主要配置android项目编译sdk版本,这个版本一般是用最高版本。我们平时使用的sdk中的方法大部分都是兼容的,假如使用的方法只有高版本有,android studio会提示你这个方法需要
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.XXX) {
...
}else{
...
}
如果你想要app兼容更多的设备,就需要对低版本做不同的处理,用不同的逻辑实现高版本sdk的方法。如果不需要低版本设备这部分用户,可以设置minSdkVersion,这个配置不允许app安装在比minSdkVersion更低版本设备上。
targetSdkVersion 这个配置也是比较重要的,以前我都是设置成和compileSdkVersion 版本一样,这样做可能存在问题。这个配置是说app设计时是为哪些版本的android设备提供服务的。比如我设计时是为了从android19 到android 28的用户服务的,于是我设置minSdkVersion为19,targetSdkVersion 为28。经过严格的android版本兼容测试,我保证从19~28 用户的所有逻辑、显示效果等都一致,此时android发布了新版本29,市面上出现了android 29的设备。我们希望以后能给android 29的用户使用新特性,我们升级了compileSdkVersion 到29,使用了一些29中新方法(28以前没有的)。但是我们发现有些方法在28以前和29中表现效果不一样,我们希望这些方法效果和以前一样,设置targetSdkVersion 还是28,app在安装到android 29的设备上时使用的还是28的方法,这样保证29用户与28用户表现是一致的,还能单独为29用户提供新特性带来的用户体验。
versionCode versionName 这两个是控制app版本的,app启动时一般通过这两个属性来判断是否需要更新。
applicationId 配置的是app的安装包名,这个必须要唯一,手机不能安装包名一样的两个app。
buildTypes中配置构建app的设置,一般分为release、debug,这里面可以设置包名后缀、缩减代码(有的叫开启混淆)、签名文件等。
buildTypes {
debug {
applicationIdSuffix '.debug'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
applicationIdSuffix 包名后缀可以为app安装后的包名添加一个后缀,配置不同的后缀可以让设备安装多个app。
minifyEnabled 缩减代码 就是把代码的类名、变量等替换为a、b、c、d,这样有效的减少代码文件的大小,并且加大了反编译后代码阅读的难度以防破解。
proguardFiles 配置哪些类名等不替换为a、b、c、d
signingConfig 签名文件,使用这个要在开始配置签名文件的信息。
android {
signingConfigs {
release {
keyAlias 'test'
keyPassword '123456'
storeFile file('H:/keystore/test.jks')
storePassword '123456'
}
}
}
配置好后执行gradlew assembleRelease时会生成签名后的apk