1.一个应用可能需要基于多个标准来创建多个版本
例如:一个应用不同省份版本不同,“js”,"zj"
这个功能的实现就是使用 Flavor Dimensions 。每一个 Dimensions 代表一个维度,并且 flavor 都被分配到一个指定的 Dimensions 中
flavorDimensions("province", "product")
productFlavors {
js {//江苏
dimension "province"
}
zj {//浙江
dimension "province"
}
ahaschool {
dimension "product"
applicationIdSuffix ".ahaschool"
}
这样就能生成 jsAhaschool zjAhaschool
每一个 Variant 版本的配置由几个 Product Flavor 对象决定:
- android.defaultConfig
- 一个来自 province 组中的对象
- 一个来自 product 组中的对象
android.flavorDimensions 中定义的 Dimensions 排序非常重要(Variant 命名和优先级等)
flavorDimensions 中的排序决定了哪一个 flavor 覆盖哪一个,这对于资源来说非常重要,因为一个 flavor 中的值会替换定义在低优先级的 flavor 中的值。
flavorDimensions 使用最高的优先级定义,因此在上面例子中的优先级为:
province>product>defaultconfig
flavorDimensions 项目同样拥有额外的 sourceSet ,类似于 Variant 的 sourceSet ,只是少了 Build Type:
允许在 flavor-combination 的层次上进行定制。它们拥有过比基础的 flavor sourceSet 更高的优先级,但是优先级低于 Build Type 的 sourceSet 。
2.当默认的项目结构不适用的时候
重新为Java项目配置sourceSets可以使用以下方法:
sourceSets {
main {
java {
srcDir 'src/java'
}
resources {
srcDir 'src/resources'
}
}
}
以下是一个示例,它使用了旧项目结构中的main源码,并且将androidTest
sourceSet组件重新映射到tests文件夹。
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest.setRoot('tests')
}
}
3.开发App时经常遇到Release版和Debug版共存问题
有两种方法可以避免这种情况:1. 使用同一个签名;2. 使用不同包名。
// 方法1 (签名配置方法可以Google)
android {
buildTypes {
debug {signingConfig signingConfigs.xxxConfig}
release {signingConfig signingConfigs.xxxConfig}
}
}
// 方法2
android {
buildTypes {
debug {packageNameSuffix ".debug"}
}
}
4.Release版打包的apk文件名
通过下面的代码可以自动为生成的apk文件附加上版本和build日期,这里可以根据你的需求添加各种信息上去。
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
def today = new Date()
if (variant.buildType.getName().equals("release")) {
println "Change output apk name"
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + "-" + today.format('yyyyMMdd') + ".apk"))
}
}
}
}
}
General Tasks(通用任务)
-
assemble
这个task将会组合项目的所有输出。 -
check
这个task将会执行所有检查。 -
build
这个task将会执行assemble和check两个task的所有工作 -
clean
这个task将会清空项目的输出。
signing configurations(签名配置)
对一个应用程序签名需要以下:
- 一个Keystory
- 一个keystory密码
- 一个key的别名
- 一个key的密码
- 存储类型
默认情况下,debug
被配置成使用一个debug keystory。 debug keystory使用了默认的密码和默认key及默认的key密码。 debug keystory的位置在$HOME/.android/debug.keystroe,如果对应位置不存在这个文件将会自动创建一个。
signingConfigs {
debug {
storeFile file("debug.keystore")
}
myConfig {
storeFile file("other.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
Running Proguard(运行 Proguard)
android {
buildTypes {
release {
runProguard true
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
productFlavors {
flavor1 {
}
flavor2 {
proguardFile 'some-other-rules.txt'
}
}
}
配置一个外部库的jar包依赖
dependencies {
compile files('libs/foo.jar')
}
这个compile
配置将被用于编译main application。它里面的所有东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。 以下是添加依赖时可能用到的其它一些配置选项:
compile
main application(主module)。androidTestCompile
test application(测试module)。debugCompile
debug Build Type(debug类型的编译)。releaseCompile
release Build Type(发布类型的编译)。
因为没有可能去构建一个没有关联任何Build Type(构建类型)的APK,APK默认配置了两个或两个以上的编译配置:compile
和< buildtype >Compile. 创建一个新的Build Type将会自动创建一个基于它名字的新配置。
远程:
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.guava:guava:11.0.2'
}
Java Compilation options(Java编译选项)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
参考资料: