【发布时间】:2023-03-31 02:44:01
【问题描述】:
我已经在 Android Studio 中实现了 Flavor,现在我尝试将每个 Flavor 放在它自己的目录中,并有自己唯一的名称 - 遗憾的是,在某些情况下,名称与风味名称不同。 :(
我们有工具取决于它是否相同,所以如果我可以在 gradle 中实现它,那就更好了。
我有一个使用版本名称后缀值作为目录名称的示例,并且可以正常工作。但是我想做的是在风味配置中的某处指定一个将使用的值,但是我发现当您设置一个具有相同名称的属性时,最后一个获胜 - 而不是每个都按照配置中指定的方式使用。
例如,假设我有两种口味:Jimbo 和 Randolph。但是,我想将 Jimbo.apk 放在“jimmy”文件夹中,将 Randolph.apk 放在“randy”文件夹中。如何为每个将被拾取并用于存储生成的 APK 的值(目录)指定一个值(目录)?为了增加复杂性,我将 applicationVariants.all 中的当前 APK 重命名。
在下面的代码中,我希望以某种方式将 versionNameSuffix 替换为我可以通过某种方式指定的变量。
这是我所拥有的:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
defaultConfig {
applicationId "com.mycompany.default"
minSdkVersion 14
targetSdkVersion 23
versionCode 11
versionName "1.0.11"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
signingConfig signingConfigs.config
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
productFlavors {
Randolph {
applicationId 'com.mycompany.randy'
versionNameSuffix 'randy'
}
Jimbo {
applicationId 'com.mycompany.jimmy'
versionNameSuffix 'jimmy'
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def path = "C:/AndroidBuilds/MyCompany.Build/" + variant.productFlavors[0].versionNameSuffix + "/"
logger.error("Path = " + path)
def SEP = "-"
def flavor = variant.productFlavors[0].name
def version = variant.versionCode
def newApkName = path + version + SEP + flavor
logger.error("newApkName = " + newApkName)
output.outputFile = new File(newApkName + ".apk")
}
}
}
dependencies {
}
}
更新
根据使用任务的问题,我尝试了这种方法,但设置目录的问题仍然存在 - 使用属性 (archivesBaseName) 使用最后一组,因此所有文件都复制到该目录。这是一个示例。由于我要创建超过 100 种口味,因此我希望每种口味都发送到它自己的目录并由配置驱动。这是我尝试过的:
productFlavors {
Randolph {
applicationId 'com.mycompany.randy'
setProperty("archivesBaseName", "randy")
}
Jimbo {
applicationId 'com.mycompany.jimmy'
setProperty("archivesBaseName", "jimmy")
}
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def path = "C:/AndroidBuilds/MyCompany.Build/" + archivesBaseName + "/"
logger.error("Path = " + path)
def SEP = "-"
def flavor = variant.productFlavors[0].name
def version = variant.versionCode
def newApkName = path + version + SEP + flavor
logger.error("newApkName = " + newApkName)
output.outputFile = new File(newApkName + ".apk")
def copyApkTask = tasks.create(name: "copy" + variant.name + "Apk") {
copy {
def newName = newApkName + ".apk"
logger.error("from = " + newName)
logger.error("into = " + path)
logger.error("old name = " + version + SEP + flavor + ".apk")
logger.error("new name = " + flavor + ".apk")
from newName
into path
rename (version + SEP + flavor + ".apk", flavor + ".apk")
}
}
copyApkTask.mustRunAfter variant.assemble
}
}
在上面的示例中,我添加了一个任务,以另外将具有不同名称的 APK 复制到特定于风味的目录。所有 APK 最终都复制到最后指定的 `archivesBaseName,即“jimmy”。所以最后一个赢了。我希望它会像一个变量一样。我不希望有 100 多个 if 语句来执行此操作,并且更愿意在 Gradle 中执行此操作。我开始怀疑是否需要进行外部 Ant 调用才能使这一切正常工作。
【问题讨论】:
-
移动 apk 的 afterTask 对你有用吗?
-
@lionscribe 如果它可以使用配置中的元素。如果在构建之后不需要辅助操作,那就太好了(如果是这样,我会坚持使用我的旧 Ant 脚本,它运行良好)。
-
不确定你的意思,afterTask 被添加到你的 Gradle 文件中,并被 Gradle 自动调用。
-
@lionscribe 我已经更新了问题以显示任务的使用 - 但问题实际上不在任务范围内。更多的是尝试设置一个我可以在为所有风格运行 gradle 时访问的变量(例如,有点像用版本名称覆盖)。它可能在 Gradle 中 - 我只是没有找到它。感谢您的帮助,谢谢!
标签: android android-studio gradle android-productflavors