2017-08-17 9 views
0

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呼び出しを行う必要があるかどうか疑問に思っています。

+1

apkを動かすafterTaskはあなたのために働くでしょうか? – lionscribe

+0

@lionscribe config内の要素を使用できる場合。ビルド後に二次的なアクションを必要としないようにすることは非常にうれしいことです(もしそうなら、うまく機能した私の古いAntスクリプトに固執するでしょう)。 –

+0

あなたが何を意味するかわからない、afterTaskはあなたのGradleファイルに追加され、Gradleによって自動的に呼び出されます。 – lionscribe

答えて

1
、次いでプロパティ(flavorName +「_archivesBaseName)を使用してそれにアクセスします。

[OK]を、最終的にこの特定のリンクは本当に私が必要なものである変数の代入で助け:基本的にあなたが味の中に変数を割り当てることができます

Android Studio: Gradle Product Flavors: Define custom properties

ここで実際に行ってきました、私がやってしまったものです私が始めたときよりももう少し先に、今度はFlavorをAPK名として使うことも、指定することもできます(私はそれを台無しにされて、知っているが、歴史はそのようにすることができます!):

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.whenObjectAdded { flavor -> 
      // Add the property 'myCustomProperty' to each product flavor and set the default value to 'customPropertyValue' 
      flavor.ext.set('directoryPath', '') 
      flavor.ext.set('apkName', '') 
     } 

     productFlavors { 
      Randolph { 
       applicationId 'com.mycompany.randy' 
       directoryPath = 'randy' 
       apkName = 'RandyBoy' // If you want the APK name be different than the flavor 
      } 
      Jimbo { 
       applicationId 'com.mycompany.jimmy' 
       directoryPath = 'jimmy' 
      } 
     } 

     applicationVariants.all { variant -> 
      variant.outputs.each { output -> 
       def path = "C:/AndroidBuilds/MyCompany.Build/" + variant.productFlavors[0].directoryPath + "/" 
       def SEP = "-" 
       def apkName = variant.productFlavors[0].apkName 
       def flavor = variant.productFlavors[0].name 
       if (apkName != '') 
        flavor = apkName; 
       def version = variant.versionCode 
       def newApkName = path + version + SEP + flavor 
       logger.error("newApkName = " + newApkName) 
       output.outputFile = new File(newApkName + ".apk") 
      } 
     } 
    } 

    dependencies { 
     } 

} 

だからproductFlavors.whenObjectAddedは、各味によって上書きされている各フレーバーのデフォルト値を設定します。 applicationVariants.allでは、apkNameがオーバーライドされているかどうかがチェックされ、使用されている場合はフレーバ名が使用されます(バージョンコードはその前にタップされます)。ディレクトリはフレーバによって直接設定されます。

@lionscribeに大きな感謝です。彼は私にこれをより明確に考えさせた。

+0

うれしいです。自分の答えではなく、自分の答えを受け入れるようにしてください。将来のユーザーはそれを見つけるでしょう。 – lionscribe

+0

します。 Android StudioとGradleが殺害されています。 :) –

+0

それは、年齢の古い選択、能力対単純さです。私は前者を選ぶ。 – lionscribe

1

問題は、setPropertyがProjectプロパティを設定しているため、常に上書きされることです。簡単な解決策はVarients Extra Propertyを使用することです。このようなもの。

productFlavors { 
    Randolph { 
     applicationId 'com.mycompany.randy' 
     ext.archivesBaseName = "randy" } 
    Jimbo { 
     applicationId 'com.mycompany.jimmy' 
     ext.archivesBaseName=jimmy" } 
    } 

次に、あなたは

def path = "C:/AndroidBuilds/MyCompany.Build/" + variant.ext.archivesBaseName + "/" 

としてタスクでアクセスされます私はそれをテストしていない、それはバグがあり、いくつかの調整が必要な場合があります。

更新
これはGradleのは、それが味のオブジェクトに定義されている場合にのみ、フレーバオブジェクトのEXTプロパティに設定されますよう、十分ではありません。それ以外の場合は、プロジェクトである親オブジェクトまたはルートオブジェクトに設定されます。このためには、最初にフレーバオブジェクトのプロパティを定義する必要があります。これは@Stephenが以下に答えたときに行うことができます。彼のテストされた方法に従います。

さらに3つのオプションがあります。
1. "Jimbo_archivesBaseName"のようなフレーバー名をあらかじめ保留することで、各フラビルに異なる変数名を使用します。各フレーバー名のパスを設定し、
2.グローバルHashMapの変数
3フレーバー名に基づいてパスを返す関数を使用

+0

私はそれを以前に試みましたが、それはまだ最後のものを選択しました。私はすぐに投稿する予定です。しかし、助けてくれてありがとう! –

+0

@stephen私はちょうどより多くのオプションで答えを更新しました。 – lionscribe

+0

私はそれを働かせるために使用したソリューションを追加しました。 –

関連する問題