有些人可能已经观看了Android Studio Gradle i/o,Xavier Ducrohet在他的演讲中提到了如何使用Android Gradle构建系统。我的问题是,文档和演示缺乏快速入门信息,或者至少对我而言是这样。在我的下面的代码中,我试图解决Gradle Android插件系统的使用问题,我确定我做对了一些步骤,也有一些步骤做错了。(我没有多少使用Ant或Maven)
也许我会逐步介绍一下我到目前为止所做的事情。
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 16
signingStoreLocation = "debug.keystore"
signingStorePassword = "***************"
signingKeyAlias = "***************"
signingKeyPassword = "**************"
}
首先,我正在配置调试构建的默认设置(或者每个使用默认设置的构建...这意味着没有构建类型或口味?)
源集:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['com.project.maingradle', 'com.otherproject.changedsourcefilesforthisproject']
res.srcDirs = ['res', 'resfromotherprojectusingpartsofsamecode']
assets.srcDirs = ['assets']
}
}
在这一步中,我已经定义了源集。这是我遇到的第一个问题。如果我有相同的代码想要用于两个项目,是否可以定义更多的源集,如下所示:
sourceSets {
main {...}
srcsetforanotherproject {...}
}
我应该根据底层的src文件夹定义sourceSets吗?还是应该像我的第一个sourceSets声明那样定义一组不同的,例如res文件夹,就像Xavier Ducrohet提到的那样?(也不清楚我是否只能以这种方式为res文件夹执行此操作,还是也可以为java src代码文件夹执行此操作,例如java.srcDirs = ['com.project.maingradle','com.otherproject.changedsourcefilesforthisproject']。
签名配置:
signingConfigs {
debugRelease {
storeFile file("debug.keystore")
}
release {
storeFile file("release.keystore")
}
testflight {
storeFile file("testflight.keystore")
}
}
在这一步中,我已经定义了不同版本所使用的不同密钥。应该没问题...
构建类型:
buildTypes {
debugRelease.initWith(buildTypes.release)
testflight.initWith(buildTypes.release)
sourceSets.debugRelease.setRoot("src/release")
sourceSets.debugRelease.setRoot("src/release")
sourceSets.debugRelease.setRoot("src/release")
debugRelease {
packageNameSuffix ".debugRelease"
versionNameSuffix "-DEBUG"
debuggable true
signingConfig signingConfigs.debug
}
testflight {
packageNameSuffix ".testflight"
versionNameSuffix "-TESTFLIGHT"
signingConfig signingConfigs.testflight
}
release {
packageNameSuffix ".release"
versionNameSuffix "-RELEASE"
runProguard true
proguardFile getDefaultProguardFile('proguard-android.txt')
signingConfig signingConfigs.release
}
}
这一步比Gradle Android插件的任何其他步骤都更清晰地解释了。除非有预定义的发布或调试设置在后台工作,否则我不知道...我是否需要澄清它...至少我认为需要,因为使用了namesuffixes、ProGuard或为此构建声明密钥(signingConfig)。
味道:
flavorGroups "abi", "version"
productFlavors {
arm {
flavorGroup "abi"
}
standardproject1 {
flavorGroup "version"
minSdkVersion 7
targetSdkVersion 14
packageName "com.project.maingradle.normal"
sourceSet sourceSets.main
}
standardproject2 {
flavorGroup "version"
minSdkVersion 6
targetSdkVersion 14
packageName "com.otherproject.normal"
sourceSet sourceSets.main
}
testflightproject1 {
flavorGroup "version"
minSdkVersion 7
targetSdkVersion 14
packageName "com.project.maingradle.testflight"
sourceSet sourceSets.main
}
testflightproject2 {
flavorGroup "version"
minSdkVersion 6
targetSdkVersion 14
packageName "com.otherproject.testflight"
sourceSet sourceSets.main
}
}
}
个人认为,口味是最有趣的部分。Xavier Ducrohet说,如果你想为不同的口味构建使用不同的密钥,则不应在构建类型中定义密钥(而应在口味中声明)?我不知道我是否理解正确。
无论如何...我在这里尝试定义不同的口味,以便使用不同的设置进行构建,例如,不同系统的SDK版本控制,独占的包名称和设置一个依赖源集,就像您在示例中看到的那样。我不确定的是,构建类型如何依赖于口味...它们只是将每个口味乘以每个构建类型吗?还有...在口味中设置sourceSet(如果可以设置更多sourceSet),像这样设置是否可以?
gradle build
吗?我只看到我的build/apk
文件夹中有一个未签名的apk文件。 - Jan-Terje Sørensen