在Android中使用Gradle

一)命令行编译:

1)以debug模式编译

windows:

 gradlew.bat assembleDebug

Mac and Linux:

 chmod +x gradlew

gradlew assembleDebug

编译后,APK存放在app/build/outputs/apk/目录下

2)查看工程的编译任务:

./gradlew tasks

3)以Release模式编译

编译非签名版本:

 gradlew.bat assembleDebug 或gradlew assembleRelease

编译后,APK存放在bin/目录下,命名为<your_module_name>-unsigned.apk

4)编译签名版本:

通过在模块的build.gradle中添加storeFile,storePassword,keyAlias和keyPassword等项来提供keystore路径和key alias等信息,示例如下:

...
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}
...
编译后,APK存放在build/目录下,命名为<your_module_name>-release.apk


二)配置Gradle脚本

Android Stutio 工程包含一个顶层的build file(针对工程)和多个build file(针对模块,每个模块都有一个build file).

大多数情况下,我们只需要编写模块的build file,示例如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile project(":lib")
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

其中,apply plugin: 'com.android.application' 加载Gradle版本的Android插件, 它会把Android特有的编译任务添加到工程中,使得android{....}可以用来配置编译选项。

其中defaultConfig用来动态的设置核心配置和AndroidManifest.xml的配置信息,它会覆盖AndroidManifest.xml中的对应配置。buildTypes用来控制如何编译和打包应用程序。编译系统默认定义两种编译类型:debug和release. release版本默认情况下是非签名版本。

如果使用Android Studio的话,修改build file后需要执行同步(sync)操作使新的修改生效。


1)使用dependencies{...}来处理依赖

dependencies {
    // Module dependency
    compile project(":lib")

    // Remote binary dependency
    compile 'com.android.support:appcompat-v7:19.0.1'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
三种类型的依赖:

1.模块依赖

compile project(":lib") 需要依赖工程中的lib模块。编译时会包含lib模块进来。

2,远程二进制文件依赖

compile 'com.android:support:appcompat-v7:19.0.1 通过制定Android support Library的Maven坐标来声明依赖Android support Library的19.0.1版本。如果本地的Android SDK没有Android support Library的话,会使用SDK管理器来下载并安装它。

3,本地二进制文件依赖

compile fileTree(dir: 'libs', include: ['*.jar']) 声明依赖于app/libs目录下的所有jar包。

更多信息可以参考Gradle用户指南中的 Dependency ManagementBasics 。支持的repository包括JCenter, Maven Central 或 Ivy.  大多数流行的软件库和工具都可以在公用的Maven仓库里找到,编译系统使用的Maven坐标(Maven coordinates)格式为:group:name:version.如,16.0.1版本的Google Guava库的Maven坐标为: com.google.guava:guava:16.0.1.

2)运行 Proguard

在release版本中,添加Proguard:

...
android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
...
关于 minifyEnabled

Android Studio升级到1.0以后将runProguard函数已经被废弃并且停止使用了改成minifyEnabled

所以, minifyEnabled 主要用来控制是否运行混淆的

getDefaultProguardFile('proguard-android.txt')会获取Android SDK中的默认ProGuard配置, Android Stutio 会在模块的根目录下添加proguard-rules.pro文件,用来添加定制的ProGuard规则。

3)Application ID

在build.gradle文件的android部分可以设置applicationId,该属性用来在发布时唯一的标识应用程序,并且只能在build.gradle中设置,不可以AndroidManifest.xml文件中设置。

在build type中的application ID可以作为后缀添加到product flavors中设置的属性后面。

   productFlavors {
        pro {
            applicationId = "com.example.my.pkg.pro"
        }
        free {
            applicationId = "com.example.my.pkg.free"
        }
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
    ....
   
该属性与package name不一样,后者仍然需要在Manifest文件中设置,用来处理源代码中的资源R类等。

4)编译变量(Build variants)

编译变量包含两个维度:Product Flavor和Build types。Product Flavor创建应用程序的不同产品版本(如完整版和Demo版等)。Build types在不同产品版本的基础上给出不同的编译和打包设置(debug,release,develop等)。两者组合形成一个编译变量(完整debug版,完整release版,Demo_debug版等)。

创建Product flavor需要如下三步:

 1.在编译脚本中定义Product flavor

 2.为每个flavor创建自己的源文件目录

 3.添加该flavor需要的源文件到上述目录

...
android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        demo {
            applicationId "com.buildsystemexample.app.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.buildsystemexample.app.full"
            versionName "1.0-full"
        }
    }
}
...
productFlavors支持与defaultConfigs(对所有flavor都适用)相同的属性,使用时覆盖 defaultConfigs的对应项。

尽管默认的build.gradle文件中只显示release编译类型,实际上系统默认release和debug两种编译类型。 这样上述配置产生如下编译变量:

demoDebug

demoRelease

fullDebug

fullRelease

可以通过Android Stutio的Build按钮或命令行调用assemble任务来编译工程。

注:Build->Make Project只编译所有新修改的源文件,Build->Rebuild Project编译工程中的所有源文件。Android Stutiode 工程配置默认使用Maven Central Repository.

三)Gradle版本的Android插件

上一节脚本中的android{}里面的内容都是由Gradle版本的Android插件支持的

1)必需配置项:

o    compileSdkVersion

o    buildToolsVersion

注意:Android Stutio工程的SDK位置可以在local.properties文件中的sdk.dir配置中设置或通过ANDROID_HOME环境变量配置。

2)自定义配置逻辑

通过定义函数注入自定义编译逻辑,如:

def computeVersionName() {
  ...
}

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

3)Gradle Wrapper

Android Stutio工程包含Gradle Wraper, 它包含:

  •  一个jar包
  • 一个属性文件
  • Windows平台使用的脚本
  • Mac和Linux平台使用的脚本

使用Gradle wrapper(而不是本地Gradle安装)可以保证你总是使用local.properties文件中的Gradle版本来运行程序。

我的工程的/gradle/wrapper目录如下,


使用Android Studio自动添加的,没有平台使用的脚本。其中gradle-wrapper.properties内容如下:

#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

注意:Andorid Studio不使用脚本文件,因此对它们的修改在使用IDE编译时不起作用,因此,自定义的编译逻辑应该在Gradle build文件中定义。

4)源文件目录

编译app的每个版本时,编译系统会合并如下目录的源文件:

  •   src/main/ - the main source directory (the default configuration common to allvariants)
  •   src/<buildType>/ - the source directory
  •   src/<productFlavor>/ - the source directory
上述<buildType>和<productFlavor>目录需要自己创建。

没有定义productFlavor时,系统使用defaultSetting配置, main目录和默认的编译类型文件夹。

这些目录下的源文件和Manifest文件的合并优先级从低到高依次是:libraries/dependencies -> main src -> productFlavor-> buildType.

如,生成arm-demo-release 编译变量, 编译系统需要合并如下文件夹中的源文件和Manifest文件:

·        src/main/ (default configuration)

·        src/release/ (build type)

·        src/demo/ (flavor - app type dimension)

·        src/arm/ (flavor - ABI dimension)

关于Manifest的合并具体规则,详见:https://developer.android.com/tools/building/manifest-merge.html


  

你可能感兴趣的:(android,gradle)