Gradle学习之Android-DSL AppExtension篇

AntonioShare2019-01-25 16:58:06

AppExtension篇


前言:上一篇文章已经讲解了Gradle的语法篇,接下来我们要开始学习android-gradle-dsl了,不过我上一篇漏写了一节函数,这个我打算接下来补上,俗话说的好磨刀不误砍柴工,上一篇文章我们的刀已经磨好了,下面我们开始收获我们的成果了,或者说该应用实战了。

Gradle学习之Groovy语法篇

什么是AppExtension

其实就是一个队gradle配置android项目的一个拓展,对于android studio build.gradle 配置如下的属于AppExtension

  1. apply plugin: 'com.android.application'

其实这里你可以认为是一个编译好的jar包,里面放置了一下方法,属性之类的东西,那么问题来了,这个jar报什么时候引入的呢,这里我们可以去看项目根目录的build.gradle 配置文件,如下

  1. buildscript {

  2.    repositories {

  3.        jcenter()

  4.        google()

  5.    }

  6.    dependencies {

  7.        classpath 'com.android.tools.build:gradle:3.2.0'

  8.    }

  9. }

可能这个比喻不太恰当,但是我们可以先这样理解

AppExtension包含的常用属性

1. applicationVariants 这个属性是一个DomainObjectSet集合

  1. DomainObjectSet<ApplicationVariant> applicationVariants

官方解释是:Returns a collection of build variants that the app project includes.(返回App构建变种的集合) 大概是这个意思哈,何为变种呢,其实我们可认为是不同版本的集合,比如测试版,uat版本,金丝雀版本,正式版本,可以有不同的logo,不同的app_name,这种就叫做变体或变种。

内部方法较多,这里就不一一展开了,我们来看下android studio里面常用的方法吧 如果赶兴趣课访问https://docs.gradle.org/current/javadoc/org/gradle/api/DomainObjectSet.html 查看更多方法及属性

  1. android.applicationVariants.all { variant ->

  2.   variant.outputs.all {

  3.            outputFileName = "${project.getName()}_${variant.versionName}_${variant.versionCode}_${variant.name}.apk"

  4.        }

  5. }

这段代码是对生成的apk文件进行重命名,这样每次打包出来的人家就不会再是默认的,可以根据文件名来区分版本等信息。

2. buildToolsVersion 指定构建项目时要使用的SDK构建工具的版本。

  1. String buildToolsVersion

buildToolsVersion 构建工具的版本,这里指Android SDK构建工具的版本号,是一个String类型,这里也就解释了为啥我们创建的buildToolsVersion需要用''包起来,因为类型是String嘛,下面我们展示一下创建项目默认的配置,值得注意的是下图的buildToolsVersion并不是一个属性而是一个方法,类似于我们的get,set方法,用一个方法来设置值这样也很符合封装的概念

  1. android {

  2.    compileSdkVersion 27

  3.    buildToolsVersion '27.0.1'

  4.    // buildToolsVersion ('27.0.1')

  5.    defaultConfig {

  6.        applicationId "com.tjtech.flutterapp"

  7.        minSdkVersion 16

  8.        targetSdkVersion 27

  9.        versionCode 1

  10.        versionName 'v1.0.0'

  11.        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

  12.    }

  13.    buildTypes {

  14.        release {

  15.            signingConfig signingConfigs.release

  16.        }

  17.    }

  18. }

当然如果你的gradle的插件版本高于或正好3.0.0,那么这个属性不设置也是可以的,gradle默认会给你设置一个与插件版本相匹配的最低buildToolsVersion版本

3. compileSdkVersion指定用于编译项目的SDK code。

  1. String compileSdkVersion

compileSdkVersion 同样也是一个String类型的数据,在Android studio里面的配置确实int类型,这样就让人很奇怪了,按说如果compileSdkVersion这个属性是String类型,设置的时候应该也是String才对,然而当写法如下的时候

  1. android {

  2.    compileSdkVersion '28'

  3.    buildToolsVersion '27.0.1'

  4.    defaultConfig {

  5.        applicationId "com.tjtech.gradle"

  6.        minSdkVersion 15

  7.        targetSdkVersion 28

  8.        versionCode 1

  9.        versionName "1.0"

  10.        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

  11.    }

  12. }

以上代码是会报错的错误 Failed to find target with hash string '28' in: /Users/antonio/Library/Android/sdk Install missing platform(s) and sync project 这个错误告诉你你没有安装对应版本的sdk,但是其实我本地安装过了28版本的sdk,那问题就来了,这是为什么呢,答案就在BaseExtension类里面的两个方法

  1.    public void compileSdkVersion(String version) {

  2.        this.checkWritability();

  3.        this.target = version;

  4.    }

  5.    public void compileSdkVersion(int apiLevel) {

  6.        this.compileSdkVersion("android-" + apiLevel);

  7.    }

看到这里应该发现了问题,compileSdkVersion是一个方法,并且有重载,分别可以传int型的和String型的,而String型的应该为 android-版本 这样的格式才是可以正常接收的,那么我们下面再来列举下例子

传String的正确做法

  1. android {

  2.    compileSdkVersion 'android-28'

  3.    //或compileSdkVersion('android-28')

  4.    buildToolsVersion '27.0.1'

  5.    defaultConfig {

  6.        applicationId "com.tjtech.gradle"

  7.        minSdkVersion 15

  8.        targetSdkVersion 28

  9.        versionCode 1

  10.        versionName "1.0"

  11.        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

  12.    }

  13. }

传int的正确做法

  1. android {

  2.    compileSdkVersion 28

  3.    //或 compileSdkVersion(28)

  4.    buildToolsVersion '27.0.1'

  5.    defaultConfig {

  6.        applicationId "com.tjtech.gradle"

  7.        minSdkVersion 15

  8.        targetSdkVersion 28

  9.        versionCode 1

  10.        versionName "1.0"

  11.        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

  12.    }

  13. }

想比之下也能解释为啥默认创建的配置是这样了。 好了今天的文章就先到这里了,AppExtension的属性太多,一篇文章写完,后期我会继续讲解剩下的一些配置理解。

大家都在读

徐汇三少齐聚Google I/O 2018 参悟大道

Gradle学习之Groovy语法篇

Jenkins与Sonar的欢乐

Centos 持续化集成之Jenkins

本公众号聚焦于『技术开发前沿、生活感悟、』,欢迎大家关注AntonioShare:




Copyright © 温县电话机虚拟社区@2017