(周期计划-4)从公司项目配置看Gradle
2018年技术周期计划:周期计划-4(2018/1/21-2018/1/28)
写在前面
不知不觉自己已经在北京呆了半年的时间,自己所在的实习公司也已经工作了四个月的时间。时间真的好快,自己马上就要失去学生这个身份了...
这次周期计划是关于Gradle的内容,为什么有这个计划,是因为这段时间公司把项目整体升级到了3.0,借用升级的计划,Leader增加了很多的配置信息以及Gradle,让这个项目的依赖管理更有条理性。
因此基于这个背景就有了这篇博客的想法。
开始
首先让我们简单捋一捋Gradle在项目中出现的关系。我们安卓项目使用的gradle文件,本质上使用的是gradle中android安卓插件。
比如说:classpath 'com.android.tools.build:gradle:3.0.1'
看名字我们就能明白它是关于android的插件,而它所依赖的才是真生的gradle,我们可以在同级的gradle-wrapper文件中看到它的路径,默认是一个https链接地址,因此会涉及到下载问题,所以大家懂得...我们可以自行下载,然后链接一下本地地址....
接下来让看一下我们常见的配置,也就是默认生成的gradle脚本内容。
项目根Gradle:
buildscript {
repositories {
//使用jCenter存储库
jcenter()
}
dependencies {
//使用3.0.0版Gradle的Android插件的库(只影响运行构建的代码,而不影响项目)
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
根目录下的gradle是一些外层的内容,对我们编写安卓代码本身没有过多的直接牵扯。
这里顺带提一下,和项目gradle同级别下有一个local.properties文件。它里边记录了我们的SDK,NDK路径。它和我们通过设置ANDROID_HOME的环境变量添加SDK的方式没有任何区别。
Module的Gradle:
按照官方的话说:默认情况下,只需要编译目标和编译工具的版本。也就是说android{}标签下,我们只需要compileSdkVersion 和 buildtoolsVersion 属性即可(3.0之后默认生成的gradle文件没有看到buildtoolsVersion,猜测默认使用最新版本)...
当然,默认会帮我们生成很多内容。接下来让我们逐一了解一下。
//项目类型(最常见还有库类型:apply plugin: 'com.android.library')
apply plugin: 'com.android.application'
android {
//SDK的版本号(API Level),比如:API-19之类
compileSdkVersion 26(编译app时候用的sdk,并不会影响app真实行为)
//buildtoolsVersion:(构建工具的版本,其中包括了打包工具aapt等内容)
defaultConfig {
applicationId "com.example.mbenben.gradletest"(包名)
minSdkVersion 15(最小支持安卓系统版本)
targetSdkVersion 26(系统版本会根据此进行对应的处理,比如6.0我们知道需要动态申请权限,低于6.0则不需要。)
versionCode 1(App的版本,每次发版都要+1)
versionName "1.0"(App的版本)
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
//定制release版本内容
release {
//是否启动混淆
minifyEnabled false
//混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
android部分以外就是我们的依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
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'
}
如果我们需要什么依赖找到对应的依赖地址即可,我们的gradle会自动去jcenter()库,去下载,当然有时我们所依赖的库需要其他代码库,我们只需要按需在项目gradle中repositories对应添加即可。
以上是一些基础gradle的内部,如果有更多的需要可以在这个网站深入了解:http://tools.android.com/tech-docs/new-build-system/user-guide
深入1.0
公司关于gradle的配置文件进行过差不多俩次的迭代,第一次较为普通,我在此称为1.0时代。
2.0时代变动的内容比较多,因此关于2.0的内容,为了避免篇幅过长,会把它单抽出来。
接下来的内容是关于公司的1.0时代的gradle配置思路。
首先
公司的项目第一步会新建一个自己的gradle文件用于存放公司的配置信息。比如:根gradle同级下,定义dependencies.gradle
ext {
compileSdkVersion = 26
buildToolsVersion = "26.0.2"
targetSdkVersion = 22
minSdkVersion = 19
supportLibraryVersion = '25.3.1'
//当然还可以定义一些依赖库的配置
dependencies = [
appCompat : "com.android.support:appcompat-v7:$supportLibraryVersion",
cardView : "com.android.support:cardview-v7:$supportLibraryVersion",
recyclerView : "com.android.support:recyclerview-v7:$supportLibraryVersion",
design : "com.android.support:design:$supportLibraryVersion",
rxAndroid : 'io.reactivex:rxandroid:1.2.1',
rxJava : 'io.reactivex:rxjava:1.2.1',
//省略部分内容
}
非常清晰的我们可以看到,我们正常项目中所常用的配置信息的版本号。
那么这个文件怎么使用呢?
在根gradle中引入它:apply from: 'dependencies.gradle'
那么这样我们就可以在项目gradle中通过ext得到我们所声明的内容:
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "对应自己的包名"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
//省略部分内容
}
dependencies {
//省略部分内容
Map<String, String> dependencies = rootProject.ext.dependencies
compile dependencies.appCompat
compile dependencies.cardView
compile dependencies.recyclerView
compile dependencies.design
compile dependencies.palette
compile dependencies.rxAndroid
compile dependencies.rxJava
}
通过这种方式,可以比较快捷的去修改/查看自己的项目/库配置信息。方便统一的去管理。
在1.0时代,除了对项目配置信息管理以外还讲版本内容抽取了出来。比如:我们会在主项目的根目录下创建version.properties文件,内容非常简单,只用来记录我们的版本信息:
VERSION_NAME=1.0.1
VERSION_CODE=2
接下来我们需要做的就是去获取这俩个变量
//定义一个用于获取VersionCode的方法
def getVersionCodeProperty() {
//因为是同级目录,直接通过文件名,拿到文件对象
def versionPropsFile = file('version.properties')
def versionProps = new Properties()
//装载文件对象
versionProps.load(versionPropsFile.newReader())
//获取变量名
return versionProps.getProperty('VERSION_CODE').toInteger()
}
def getVersionNameProperty() {
def versionPropsFile = file('version.properties')
def versionProps = new Properties()
versionProps.load(versionPropsFile.newReader())
return versionProps.getProperty('VERSION_NAME')
}
//使用
android{
//省略部分内容
versionCode getVersionCodeProperty()
versionName getVersionNameProperty()
//省略部分内容
}
这样我们在修改版本号的时候可以避免重复同步gradle的过程,而且也可以方便我们去管理版本号这种东西。
尾声
关于gradle的一些理解就先记录这样。这次博客内容将是关于公司2.0的配置信息升级,以及一些gradle的一些快捷的用法。
本菜开源的一个自己写的Demo,希望能给Androider们有所帮助,水平有限,见谅见谅…
https://github.com/zhiaixinyang/PersonalCollect
这是一个主推面试踩坑的公众号!
个人公众号因为身边的同学从事互联网相关职业的比较多,并且大家闲时聊天时总会吐槽找工作有很多坑,所以打算把身边同学找工作的经验,统统收集起来。提供给想从事这方面同学,希望圈内好友可以共同进步,共同少踩坑。