(周期计划-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


这是一个主推面试踩坑的公众号!

因为身边的同学从事互联网相关职业的比较多,并且大家闲时聊天时总会吐槽找工作有很多坑,所以打算把身边同学找工作的经验,统统收集起来。提供给想从事这方面同学,希望圈内好友可以共同进步,共同少踩坑。

(周期计划-4)从公司项目配置看Gradle
个人公众号
上一篇:Pod必备知识: SecurityContexts


下一篇:Kubernetes必备知识: Selectors