一)命令行编译:

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>/- thesource directory
  • src/<productFlavor>/- thesource 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


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android高版本不兼容低版本gradle问题
  6. Android中把assets目录下所有图片转换成bitmap存入list集合
  7. android 常用系统修改和设置
  8. 在eclipse中查看Android各版本源代码
  9. Android(安卓)NDK在Mac OS 上面编译FFmpeg时遇见的坑?

随机推荐

  1. Samtec公司推出14Gbps FireFly FMC高速通
  2. 从图灵机、图灵测试到人工智能:什么决定了
  3. 基于Xilinx Zynq Z7045 SoC的CNN的视觉识
  4. 旅行场景下的个性化营销平台揭秘
  5. 包教包会,7段代码带你玩转Python条件语句
  6. 数据分析必备:掌握这个R语言基础包1%的功
  7. 身高2m,体重2kg,这样的数据“看上去很好”?
  8. 解读人工智能、大数据和云计算的关系,大佬
  9. 运算符,分支,循环结构
  10. 进程间通信