Android Gradle构建学习(二):构建定制

Manifest属性

通过SDL可以配置一下manifest选项:

  • minSdkVersion
  • targetSdkVersion
  • versionName
  • applicationId (有效的包名 -- 更多详情请查阅ApplicationId 对比 PackageName)
  • package Name for the test application
  • Instrumentation test runner

在android元素中的defaultConfig元素中定义所有配置。
在构建文件中定义的强大之处在于它是动态的。 例如,可以从一个文件中或者其它自定义的逻辑代码中读取版本信息:

def computeVersionName() {
    ...
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        versionCode 12
        versionName computeVersionName()
        minSdkVersion 16
        targetSdkVersion 16
    }
}

注意:不要使用与在给定范围内的getter方法可能引起冲突的方法名。例如,在defaultConfig{...}中调用getVersionName()将会自动调用defaultConfig.getVersionName()方法,你自定义的getVersionName()方法就被取代掉了。

Build Types构建类型

默认情况下,Android Plugin会自动给项目设置同时构建应用程序的debug和release版本。 两个版本之间的不同主要围绕着能否在一个安全设备上调试,以及APK如何签名。

Debug版本可采用默认签名。Release版本在构建过程中没有签名,需要稍后再签名。

这些配置通过一个BuildType对象来配置。默认情况下,这两个实例都会被创建,分别是一个debug版本和一个release版本。

Android plugin允许像创建其他构建类型一样定制debug和release实例。这需要在buildTypes的DSL容器中配置:

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }

        jnidebug.initWith(buildTypes.debug)
        jnidebug {
            packageNameSuffix ".jnidebug"
            jnidebugBuild true
        }
    }
}

以上代码片段实现了以下功能:

  • 配置默认的debug构建类型
  • 将debug版本的包名设置为.debug以便能够同时在一台设备上安装debug和release版本的apk。
  • 创建了一个名为jnidebug的新构建类型,并且这个构建类型是debug构建类型的一个副本。
  • 继续配置jnidebug构建类型,允许使用JNI组件,并且也添加了不一样的包名后缀。

创建一个新的构建类型就是简单的在buildType标签下添加一个新的元素,并且可以使用initWith()或者直接使用闭包来配置它。

签名配置

对一个应用程序签名需要以下:

  • 一个Keystory
  • 一个keystory密码
  • 一个key的别名
  • 一个key的密码
  • 存储类型
    位置,键名,两个密码,还有存储类型一起形成了签名配置。

默认情况下,debug被配置成使用一个debug keystory。 debug keystory使用了默认的密码和默认key及默认的key密码。 debug keystory的位置在$HOME/.android/debug.keystroe,如果对应位置不存在这个文件将会自动创建一个。
可以创建其他配置或者自定义内建的默认配置。通过signingConfigs这个DSL容器来配置:

android {
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
        }

        myConfig {
            storeFile file("other.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }

    buildTypes {
        foo {
            debuggable true
            jniDebugBuild true
            signingConfig signingConfigs.myConfig
        }
    }
}

以上代码片段修改debug keystory的路径到项目的根目录下。在这个例子中,这将自动影响其他使用到debug构建类型的构建类型。

这里也创建了一个新的Single Config(签名配置)和一个使用这个新签名配置的新的Build Type(构建类型)。

注意:只有默认路径下的debug keystory不存在时会被自动创建。更改debug keystory的路径并不会自动在新路径下创建debug keystory。如果创建一个新的不同名字的SignConfig,但是使用默认的debug keystore路径来创建一个非默认的名字的SigningConing,那么还是会在默认路径下创建debug keystory。换句话说,会不会自动创建是根据keystory的路径来判断,而不是配置的名称。

依赖关系

Gradle项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的Gradle项目。

1. 本地二进制包依赖
可以在compile配置中,添加对本地jar包或aar包的依赖

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

android {
    ...
}

注意:这个dependencies DSL标签是标准Gradle API中的一部分,所以它不属于android标签

这个compile配置将被用于编译main application。它里面的所有东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。 以下是添加依赖时可能用到的其它一些配置选项:

  • compile main application(主module)。
  • androidTestCompile test application(测试module)。
  • debugCompile debug Build Type(debug类型的编译)。
  • releaseCompile release Build Type(发布类型的编译)。

APK默认配置了两个或两个以上的编译配置:compile和< buildtype >Compile. 创建一个新的Build Type将会自动创建一个基于它名字的新配置。

2. 远程二进制包依赖
Gradle支持从Maven或者Ivy仓库中拉取文件。首先必须将仓库添加到列表中,然后必须在依赖中声明Maven或者Ivy声明的文件。

repositories {
   //maven仓库
    mavenCentral()
}


dependencies {
    //maven文件
    compile 'com.google.guava:guava:11.0.2'
}

android {
    ...
}

注意:mavenCentral()是指定仓库URL的简单方法。Gradle支持远程和本地仓库。

3. 多项目设置

Gradle项目也可以通过使用多项目配置依赖于其它Gradle项目。多项目配置的实现通常是在一个根项目路径下将所有项目作为子文件夹包含进去。

例如,给定以下项目结构:

MyProject/
 + app/
 + libraries/
    + lib1/
    + lib2/

我们可以定义3个项目。Grand将会按照以下名字映射它们:

:app
:libraries:lib1
:libraries:lib2

每一个项目都拥有自己的build.gradle文件来声明自己如何构建。 另外,在根目录下还有一个setting.gradle文件用于声明所有项目。 这些文件的结构如下:

MyProject/
 | settings.gradle
 + app/
    | build.gradle
 + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

其中setting.gradle的内容非常简单,这里定义了哪一个文件夹才是真正的Gradle项目。

include ':app', ':libraries:lib1', ':libraries:lib2'

其中:app项目可能依赖于这些库,这是通过以下依赖配置声明的:

dependencies {
    compile project(':libraries:lib1')
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,179评论 8 72
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,447评论 25 708
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,969评论 6 342
  • 天下其实就在一张地图里。指点江山的开始,也是从地图上找到自己的位置开始的。水系 山脉和疆域才能尽收眼底。 在阅读...
    Andylee阅读 666评论 0 2