windows:
gradlew.bat assembleDebug
Mac and Linux:
chmod +x gradlew
gradlew assembleDebug
编译后,APK存放在app/build/outputs/apk/目录下
./gradlew tasks
编译非签名版本:
gradlew.bat assembleDebug 或gradlew assembleRelease
编译后,APK存放在bin/目录下,命名为<your_module_name>-unsigned.apk
通过在模块的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 } } } ...
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)操作使新的修改生效。
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.
在release版本中,添加Proguard:
... android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ...
Android Studio升级到1.0以后将runProguard函数已经被废弃并且停止使用了改成minifyEnabled。
所以, minifyEnabled 主要用来控制是否运行混淆的getDefaultProguardFile('proguard-android.txt')会获取Android SDK中的默认ProGuard配置, Android Stutio 会在模块的根目录下添加proguard-rules.pro文件,用来添加定制的ProGuard规则。
在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" } } ....
编译变量包含两个维度: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" } } } ...
尽管默认的build.gradle文件中只显示release编译类型,实际上系统默认release和debug两种编译类型。 这样上述配置产生如下编译变量:
demoDebug
demoRelease
fullDebug
fullRelease
可以通过Android Stutio的Build按钮或命令行调用assemble任务来编译工程。
注:Build->Make Project只编译所有新修改的源文件,Build->Rebuild Project编译工程中的所有源文件。Android Stutiode 工程配置默认使用Maven Central Repository.
上一节脚本中的android{}里面的内容都是由Gradle版本的Android插件支持的。
o compileSdkVersion
o buildToolsVersion
注意:Android Stutio工程的SDK位置可以在local.properties文件中的sdk.dir配置中设置或通过ANDROID_HOME环境变量配置。
通过定义函数注入自定义编译逻辑,如:
def computeVersionName() { ... } android { defaultConfig { versionName computeVersionName() ... } }
Android Stutio工程包含Gradle Wraper, 它包含:
使用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文件中定义。
编译app的每个版本时,编译系统会合并如下目录的源文件:
src/main/
- the main source directory (the default configuration common to allvariants)src/<buildType>/
- the source directorysrc/<productFlavor>/
- the source directory没有定义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