[关闭]
@Awille 2018-12-15T09:48:09.000000Z 字数 4377 阅读 91

Gradle For Android(note)

Android note


Introduction of Gradle for Android

构建生命周期。

由于task之间会互相依赖,为了简化构建过程,构建工具会生成一个动态的模型流,叫做Directed Acyclic Graph(DAG)。没有依赖的任务会被优先执行。
构建的三个阶段:
1. 初始化阶段:根据setting.gradle确定要被加载的模块,即创建项目实例,每个build.gradle对应一个项目实例。一般一个模块会有一个项目实例。
2. 配置阶段:每个项目实例会创建和配置task,构建DAG。
3. 执行阶段:按照DAG执行相应的task

项目结构

Gradle 使用资源集(source set)的概念,一个资源集就是一组源文件,他们会被一起执行和编译。

Gradle Warpper

该工具的作用就是自动帮我们针对项目安装对应版本的gradle,它只是单纯的包装了gradle,免去了我们手动安装正确版本的gradle的过程。
若将项目从as转到eclipse时,需要我们自己安装gradle,之后执行

gradle wrapper --gradle-version 2.4

来生成wrapper。
gradle wrapper 可以分为三部分
myapp/
├── gradlew //linux 跟mac的shell脚本
├── gradlew.bat //windows下的批处理脚本
└── gradle/wrapper/
├── gradle-wrapper.jar //上面两个脚本需要使用的jar
└── gradle-wrapper.properties //配置文件 决定gradle运行版本之类的

 gradlew tasks 

以上命令可以查看所有的task列表,加上--all参数可以查看每个task的具体介绍。

基本自定义构建

理解gradle文件

实际构建配置在buildscript当中, buildscript中的配置项我们可以理解为我们的gradle文件本身运行所需要的配置。
在模块的gradle当中,android是占比最大的代码块, 其中的defaultconfig代码块优先于mainifest文件中的配置,包括applicationID,versioncode,versionname等。
targetsdkversion:
API的全称是Application Programming Interface, 高api版本兼容低api版本,而低api版本不能兼容高api版本。
Android 7.0定义的手机系统的版本,该系统的版本对外开放的应用程序接口被定义为API 24,如果开发者想要在开发的APP中使用Android 7.0系统提供的功能,这些功能包括:多窗口支持、通知显示变更、JIT/AOT编译、快速的应用安装路径等等,那么新手在创建的Android项目的时候就需要选择API 24的应用程序接口。
跟版本系统与api等级对照表:

platform version API Level
Android 4.4-4.0 19 - 14
Android 5.1-5.0 22-21
Android 6.0 23
Android 7.0 24

如果你的targetsdkversion事24, minsdkversion是11, 当你调用api14的方法是,编译器检测到你的程序可能要运行在api为11的版本上,那么编译器会提示你当前方法正常生效需要在api14以上的平台运行。这里的编译器版本是compilesdkversion来决定的。 所以在一般来说,在构建程序的时候,三根版本的选择一般是:
minsdkversion <= targetsdkversion <= compilesdkversion

有关application ID 与 manifest文件当中的packagename

AndroidManifest.xml中的packagename一个作为应用的唯一标志,这与applicationID相同,另一个是在R资源类中被用作包名。比如你构建付费版和免费版两个app,application ID不同,可以保证这两个安装到同一个手机之上,但是这两个app用的是同一个资源集,所以packagename作为R资源文件的包名可以完美的解决这个问题。

在底层,Android Studio同步实际上运行了generateDebugSources任务来生成所有必需的类。

2.3.2 BuildConfig和资源
自SDK工具版本升级到17之后,构建工具都会生成一个叫作BuildConfig的类,该类包含一个按照构建类型设置值的DEBUG常量。如果有一部分代码你只想在debugging时期运行,比如logging,那么DEBUG会非常有用。你可以通过Gradle来扩展该文件,这样在debug和release时,就可以拥有不同的常量。

这些常量可用于切换功能或设置服务器URL,例如:

android {
    buildTypes {
        debug {
            buildConfigField "String", "API_URL",
            "\"http://test.example.com/api\""
            buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
        }
        release {
            buildConfigField "String", "API_URL",
            "\"http://example.com/api\""
            buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
        }
    }
}

上面的buildConfigField中的字段,在构建过程中会生成buildconfig的类。使用的时候可以采用BuildConfigField.xxx来进行使用。其中配置的时候,字符串必须要用专一双引号括起来。包括资源文件的配置,也可以采用类似于上面的方式,资源文件的标识符为resValue 如下:(buildconfigFied当中一般是自定义变量的配置)

debug {
  resValue "string", "app_name", "Example DEBUG"
}

gardle允许在project对象上添加额外属性即自定义值, 不过要通过ext代码块,使用代码块当中的自定义值时,调用方法为:

ext {
       compileSdkVersion = 22
       buildToolsVersion = "22.0.1"
}
android {
       compileSdkVersion rootProject.ext.compileSdkVersion
       buildToolsVersion rootProject.ext.buildToolsVersion
 }

带cmd参数执行task:

gradlew printProperties -Pcmd="Hello from the command line"

在顶层的gradle当中,可以定义默认任务,

defaultTasks 'clean', 'assembleDebug'

在没有定义默认任务之前,系统的默认的任务为help任务,所以只是单纯执行gradlew不指定task的话,会执行help任务,如果做了上面代码的制定,gradlew就是直接执行clean跟assembleDebug任务。

依赖仓库

gradle支持三种不同的依赖库:Maven,lvy和静态文件或文件夹。
一个依赖的组成:group:name:version, 例如com.google.code.gson:gson:2.3
其中name是唯一一定需要的字段,group和version可选,但是田间version可以确保你的版本不会自动更新。

远程仓库

自有maven仓库定义:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           credentials { //添加凭证
                username 'user'
                password 'secretpassword'
           }
       }
}

自有lvy仓库定义:

repositories {
       ivy {
           url "http://repo.acmecorp.com/repo"
       }
}

本地仓库:配置绝对url即可

repositories {
    maven {
        url "../repo"
    }
}

本地依赖

文件依赖

添加jar文件为依赖:

dependencies {
    compile files('libs/domoarigato.jar')
}

一次性添加整个文件夹下的jar文件:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

依赖项目:

创建依赖项目的使用模块:使用该模块的时候,要使用android提供的library插件,帮助打包成aar文件,让aar文件可以被使用。

apply plugin: 'com.android.library'

创建构建variant

源集

当创建一个新的构建类型时,gradle会创建一个新的源集。源集目录名称和variant名称相同。但是该目录不会自动创建,所以在创建变体之前你要去手动创建该源集目录。
使用不同的源集的时候,资源会被一种的特殊的方式处理。 Drawables和layout文件将完全覆盖在main资源集中有相同名称的资源,但是values文件中的文件则不会被覆盖。
manifest文件与之类同。如果你为一个构建类型创建了一个manifest文件,那么你不必从main源集中拷贝整个manifest文件,只需添加需要的标签即可。Android插件将会合并manifest。

product flavor

用来创建同一个app的不同版本,通过在android代码块当中添加productFlavors代码块来添加flavor版本。

android {
       productFlavors {
           red {
               applicationId 'com.gradleforandroid.red'
               versionCode 3
           }
           blue {
               applicationId 'com.gradleforandroid.blue'
                           minSdkVersion 14
               versionCode 4
           }
     }
}

由于productflavor与defaultconfig字段同级,所以所有的flavor版本配置属性是相同的。同样productflavor也是可以拥有自己的源集的,源集目录名为:flavor + vaiantname.
flavorDimension数组定义了维度,维度的顺序非常重要。当结合两个flavor时,它们可能定义了相同的属性或资源。在这种情况下,flavor维度数组的顺序就决定了哪个flavor配置将被覆盖。在上一个例子中,color维度覆盖了price维度。该顺序也决定了构建variant的名称。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注