欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android的Gradle插件

程序员文章站 2022-06-29 14:31:56
...

我只是技术搬运工,如果搬运有误,请不吝指出,谢谢Android的Gradle插件
            
    
    博客分类: Android androidgradlebuildfravor 

AndroidGradle插件

Android的编译系统包含了Gradle插件。Gradle是一个先进的构建工具包,它可以管理依赖,并允许你定义自己的构建逻辑。Android Studio 使用一个Gradle的包装来完全整合Gradle插件。AndroidGradle插件也可以独立于Android Studio运行。这样就意味着,你可以从装有Android Studio的机器的命令行或者是从没有安装Android Studio的机器上(比如持续集成服务器)构建你的Android apps

 

构建配置

你项目的构建配置文件是build.gradle文件,它是一个纯文本文件,使用了Gradle的语法和选项,Android插件为你的构建配置如下几个方面:

 

构建变种(Build Variants)这个构建系统可以生成不同产品的APK,并且可以为相同的模块配置不同的配置。当你想为你的应用构建不同的版本,但是又不想为不同的版本创建不同的项目或模块,这是非常有用的。

 

依赖(Dependencies)这个构建系统可以管理项目的以来,并且支持依赖本地系统文件和运程仓库。这样可以免去了手工的为你的项目收索,下载,拷贝相应的包文件。

 

清单条目(Manifest entries)这个构建系统可以让你使用构建变量的配置来指定manifest文件元素的值。这些构建变量的值覆盖了manifest文件的值。这是有用的,如果你想为你的多个某块生成多个APK,这样每个APK可以有不同的名字,minimum SDK版本,或者是target SDK版本。如果多个manifest文件存在,将被合并到优先的buildTypeproductFlavor, /main文件,librarymanifest中。

 

签名。 构建系统可以让你指定特定的签名设置。它可以在构建的过程中自动对你的APK进行签名。

 

ProGuard.构建系统可以让你为各自的变体(bariant)指定特定不同的ProGuard。在构建的过程中构建系统将执行ProGuard从而混淆你的class.

 

测试.对于大多数模板,构建系统创建一个测试目录(androidTest),并且生成一个测试的APK。所以你不需要单独创建一个测试项目。构建系统在构建过程中将会运行测试代码。

 

Gradle构建文件通过Groovy语法的领域特定语音来描述和操纵构建逻辑。Groovy是一种动态语音,可以自定义构建逻辑,并且和Gradle插件提供的特定元素进行交互。

 

通过公约构建

Android 构建系统为项目结构和其他构建项预制了智能的默认值。如果你的项目是按照这些公约来的,你的Gradle构建文件将非常简单。当一些公约不适合你的项目的时候,构建系统的灵活性将允许你配置构建过程每个方面。例如,你需要替换模块目录默认的源码目录文件,你可以在模块构建文件中指定一个新的目录结构。

项目和模块设置

Android Stuidio的表现中,一个项目(Project)是开发结构的顶层结构。Android Studio的项目包含了项目文件和一个或多个应用模块。一个模块是你应用的一个组件,你可以独立地构建,测试,bebug。模块包含了你应用的源码和资源文件。Android Studio项目可以包含多种模块。

 

Android 库模块包含了可复用的代码和资源。构建系统将为库模块生成AAR包。

 

App Engine 模块包含了App Engine 继承的代码和资源。

 

java 库模块包含了可复用的代码。构建系统生成了Jar包。

 

Android Studio项目包含了一个顶层项目的Gradle配置文件,它允许你为所有在项目中的应用模块配置常用的配置。每个应用模块还有自己用用的build.gradle文件为了配置特定的配置项。

 

项目构建文件

默认的,项目级的Gradle文件使用buildscript来定义Gradle的仓库和依赖。这样允许不同的项目使用不同的Gradle版本。支持的仓库包括:JCenter,Maven,Central,lvy。这个例子声明了使用JCenter仓库和使用了1.0.1版本的Gradle插件的类路径依赖结构的构建脚本。

buildscript {
    repositories
{
        jcenter
()
   
}
    dependencies
{
        classpath
'com.android.tools.build:gradle:1.0.1'

       
// NOTE: Do not place your application dependencies here: they belong
       
// in the individual module build.gradle files
   
}
}

allprojects
{
   repositories
{
       jcenter
()
   
}
}

注: Android Studio项目的SDK位置被定义在local.properties文件的sdk.dir设置中,或者是通过环境变量ANDROID_HOME.

模块构建文件

应用模块的Gradle构建文件允许你配置模块的构建设置,包括覆盖 src/main中的manifest设置和设置自定义的包选项。

 

android 设置

         compileSdkVersion

         buildToolsVersion

defaultConfig productFlavors

         manifest的属性,如 applicationId,minSdkVersion,targetSdkVersion和测试信息。

buildTypes

         构建属性,如debuggable,ProGuard,debug签名,版本名后缀,和测试信息。

dependencies

 

这个例子应用了Android插件,使用了默认的配置用来覆盖几个manifest的属性,创建了两个构建类型:releasedebug, 并且声明了几个依赖。

apply plugin:'com.android.application'
  
  android {
      compileSdkVersion 20
      buildToolsVersion "20.0.0"
  
      defaultConfig {
          applicationId "com.mycompany.myapplication"
          minSdkVersion 13
          targetSdkVersion 20
          versionCode 1
          versionName "1.0"
      }
  
      buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
          }
           debug {
              debuggable true
          }
      }
  }
  
  dependencies {
      compile fileTree(dir:'libs', include:['*.jar'])
      compile 'com.android.support:appcompat-v7:20.0.0'
      compile project(path:':app2, configuration: 'android-endpoints')
  }

注: 你可以注入一个自定义的构建逻辑用来设置属性的值,这个构建逻辑可以定义为一个函数,并且被属性调用,例如:

def computeVersionName(){
    ...
  }
  
  android {
      defaultConfig {
          versionName computeVersionName()
          ...
      }
  }

 

依赖

Android构建系统管理了项目的依赖,并且支持模块依赖,二进制依赖,和运程二进制依赖。

 

模块依赖

         一个应用模块可以包含其他模块的依赖在它的构建文件中。当你构建这个模块的时候,构建系统将装配它需要的模块。

 

本地依赖

         如果在你的本地系统中,有你模块依赖的存档文,如JAR文件,你可以在你的模块构建文件中声明依赖。

 

运程依赖

         当一些运程仓库的依赖是有效的,你不需要必须下载和拷贝它们到你的项目中。Android Studio构建系统支持运程仓库依赖,比如 Maven, 依赖管理,如: lvy

 

         许多流行的软件库和工具在公共Maven仓库是有效的。对于这些依赖,你只需要指定Maven的坐标,这是唯一标示远程仓库每个元素。在构建系统中,Maven坐标的格式是:group:name:version。比如,16.0.1版本的Google Guava库的Maven坐标是: com.google.guava:guava:16.0.1.

 

         Maven*仓库广泛的用来分发许多库和工具。

构建任务

Android Studio的构建系统定义了一个分层的构建任务集合:顶层或 anckor 任务调用依赖任务产生他们的集合构造输出。顶层构建任务是:

 

assemble

         构造项目输出

 

check

         运行检查和测试

 

build

         运行 assemble check

 

clean

         执行clean

 

Android插件提供了connectedCheckdeviceCheck任务用来检查 连接的模拟的远程的设备。Gradle任务可以通过点击右边距的Gradle选项卡来查看。

 

你可以看到有效任务的类表,并且可以从Android Studio和命令行执行任何任务,就像 Building and Running from Android Studio Build the project from the command line中描述的。

 

Gradle包装

Android Studio的项目包含了Gradle包装,包含了:

一个JAR文件

一个属性文件

一个Windows平台的Shell脚本

一个Linux平台的Shell脚本

注:你应该将这些文件都提交到你的源码控制系统中。

 

使用Gradle包装(而不是使用本地安装的Gradle)可以确保你一直运行在local.properties文件中定义的Gradle版本。如果你咬为你的项目配置一个新版本的Gradle,编辑这个属性文件。

 

Android Studio从你项目的Gradle包装目录中读取属性文件,并且从这个目录中运行这个包装,因此你可以可以对多个要求不同版本Gradle的项目进行无缝工作。

 

注: Android Studio不用Shell脚本,因此当从IDE中构建是,你对其的改变不会起任何作用。你可以在Gradle的构建文件中定义自己的逻辑。

 

你可以在没有安装Android Studio的机器上,从命令行中执行这些脚本,从而构建你的项目。

 

注意:当你创建一个项目是,只能使用从可行任来源的Gradle包装脚本和JAR包,像由Android Studio生成的。

 

构建变种

你应用的没个版本在构建系统中表现为一个构建变量。构建变量是由项目flavors和构建类型组成。项目flavors代表了一个应用的构建版本,如免费和付费。 构建类型代表了每个应用构建包的版本,如debugrelease。构建系统为每个项目flavor和构建类型的组合生成APK

 

默认情况下,Android Studio配置了默认的设置,在build.gradle文件中的defaultconfig,和两个构建类型(debugreleas)。这样会生成两个构建变种,debugrelease,构建系统将为每个构建变种生成APK

 

添加两个项目flavorsdemofull,随同默认的构建类型debugrelease,将产生4个构建变种,各自有各自的配置:

demoDebug

demoRelease

fullDebug

fullRelease

 

资源合并于多个Android应用:

构建变种基于buildTypeproductFlavor的构建设置

主要的资源集合,一般位于 src/main/res

库项目的依赖,它通过在arr捆绑的资源对象来提供资源。

 

从低到高的合并次序是:libraries/dependencies-> main src -> productFlavor -> buildType

 

有些应用不只一个维度的复杂特性组合,但是它们依然表现为同一个应用。比如,除了有一个demofull版本的应用,一些游戏有可能包含了特定 CPU/ABI的二进制文件。构建系统的灵活性使产生如下变种称为可能:

x86-demoDebug

x86-demoRelease

x86-fullDebug

x86-fullRelease

arm-demoDebug

arm-demoRelease

arm-fullDebug

arm-fullRelease

mips-demoDebug

mips-demoRelease

mips-fullDebug

mips-fullRelease

这个项目将包含两个构建类型(debug release)和两个维度的项目 flavors,一个是app的类型(demofull),还有一个是 CPU/ABI(X86,ARM,或者 MIPS).

 

源码目录

为了为你的应用构建不同的版本,构建系统从以下的地方集合源码和资源文件:

src/main/ -主源码目录(对于所有变种的默认配置)

src/<buildType>- 源码目录

src/<productFlavor>/ -源码目录

 

注: 构建类型(buildtype) product flavor 的源码 目录是可选的, 因为Android Studio不会为你创建这些目录。当你添加 build typesproduct flavors到构建配置文件中的时候,你应该创建这些目录。如果这些目录不存在,构建系统不会使用这些目录。

 

对于那些没有定义任何flavors的项目来说 ,构建系统使用了defaultConfig设置,主要的app目录和默认的构建类型目录。比如,生成默认的debugreleas构建变种,没有product flavors,构建系统使用:

src/main/  (默认的配置)

src/releas/ (构建类型)

src/debug/(构建类型)

 

对于使用了flavor维度的项目来说,构建系在每个维度的flavor源码目录合并。比如,为了生成arm-demo-release构建变种,构建系统合并:

src/main/ (默认配置)

src/release/ (构建类型)

src/demo/ (flavor – 应用类型维度)

src/arm/ (flavor – ABI维度)

这些目录的源码被集合起来生成这个构建变种的输出。

 

你可以在不同的目录中使用相同的类目,只要这些目录在一通过变种中不被一起使用。

构建系统统一回集合所有的manifest到一个manifest中,因此每个构建变种可以定义不同的组件或者是权限在最终的manifest manifest合并的从低到高的优先级是: libraries/dependencies-> main src -> productFlavor -> buildType

 

构建系统会合并来自所有源码目录的资源。如果在一个构建变种中,存在不同目录包含相同名字的资源,优先次序按照以下: build type的资源覆盖—>product flavorà覆盖main目录的资源à覆盖任何库。

 

注:构建变种可以使你服用一般的activities, 应用逻辑,不同版本的资源文件。