Android StudioでFlavorsを実装しましたが、今ではFlavorを独自のディレクトリに配置しようとしています - 悲しいことに、フレーバー名。私は、Gradleの中ですべてのより良い。Flavorに固有の出力ディレクトリを指定するAndroid Studio Gradle
ていることにやってのけることができるので、もし:(
私たちは、私はディレクトリ名としてバージョン名のサフィックス値を使用しているサンプルを持って、同じであること、それに応じたツールを持っていますしかし、私がしたいのは、使用されるフレーバー設定のどこかで値を指定することですが、同じ名前でプロパティを設定すると、指定されたものとして使用されるのではなく、最後のものが勝ちます
例えば、2つのFlavors: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 {
}
}
UPDATE
、私はこのアプローチを試みたが、ディレクトリの設定の問題が残っている - (archivesBaseName
をプロパティを使用して、 )最後の1つのセットが使用されるので、すべてのファイルがそのディレクトリにコピーされます。ここにそれのサンプルがあります。私は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
@lionscribe config内の要素を使用できる場合。ビルド後に二次的なアクションを必要としないようにすることは非常にうれしいことです(もしそうなら、うまく機能した私の古いAntスクリプトに固執するでしょう)。 –
あなたが何を意味するかわからない、afterTaskはあなたのGradleファイルに追加され、Gradleによって自動的に呼び出されます。 – lionscribe