2016-11-21 3 views
1

BuildConfig.DEBUG(または同等の)

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.SOURCE) 
public @interface Test { 
    boolean type(); 
} 

私はビルドタイプに基づいて異なるようにtypeパラメータの希望(それが自動的に変更されます) 。

だから私はことをのようなものを行うことができます:

@Test(type = BuildConfig.DEBUG) 
public class Example { 
} 

しかしBuildConfig.DEBUGの値が一定ではないので、もちろんExampleクラスのコードはコンパイルされません。

これを回避する方法はありますか?たぶんgradleのいくつかの他のパラメータを指定しますか?私は手動で特定のビルドのtypeを変更するソリューションには興味がありません。この方法または他の方法。私はビルドで自動的にそれを行う方法を探しています。

答えて

4

のGradleのAndroidプラグインによって

あなたはGradleのbuildConfigFieldを使用することができます。たとえば、あなたもあなたのBuildConfigに他のいくつかのタイプを追加することができますbuildConfigField

android { 
    ... 
    buildTypes { 
     debug { 
      buildConfigField "boolean", "TYPE", "true" 
     } 
     release { 
      buildConfigField "boolean", "TYPE", "false" 
     } 
     ... 
    }  
} 

、その後

@Test(type = BuildConfig.TYPE) 
public class Example { 
} 

については 。

android { 
    buildTypes { 
     debug { 
      buildConfigField "int", "A_INT", "1" 
      buildConfigField "String", "A_STRING", "\"string_1\"" // <---note the escape 
     } 

     release { 
      buildConfigField "int", "A_INT", "2" 
      buildConfigField "String", "A_STRING", "\"string_2\"" 
     } 
    } 
} 

、あなたが複数の味を持っている場合、あなたはそれぞれの味のフィールドを定義することができます。同一の規則で

productFlavors { 
    // Define separate dev and prod product flavors. 
    dev { 
     buildConfigField "boolean", "IS_DEV", "true" 
    } 

    prod { 
     buildConfigField "boolean", "IS_DEV", "false" 
    } 
} 

、あなたはresValueを使用して、リソースに値を追加することができます。

android { 
    buildTypes { 
     debug{ 
      resValue "string", "dev_name", "Alice" 
     } 

     release { 
      resValue "string", "dev_name", "Bob" 
     } 
    } 
} 

コード

あなたはSRC /デバッグ/ Javaの/ your.package.nameとのsrc /リリース/ javaの下で異なる値を持つ同じクラスの下の値を使用してクラスを配置することができます/ your.package.name

デバッグバージョン

public final class MyConfigurations { 
    public static final boolean TYPE = true; 
    ... 
} 

リリースバージョン

public final class MyConfigurations { 
    public static final boolean TYPE = false; 
    ... 
} 

そして、あなたはまた、アンドロイドのGradleプラグインの同じロジックで味で遊ぶことができます(実際にも、このソリューションは、そのプラグインによって異なります)

+0

それはトンという実際には非常に驚きです彼は2つの理由のために働いているようだ。私は確かに 'BuildConfig.DEBUG'の代わりに自分のカスタム' buildConfigField'(私はそれらを頻繁に使用しています)を使ってみましたが、成功したことは覚えていません。D 2. ' BuildConfig'クラスの 'DEBUG'フィールドとあなたの 'TYPE'フィールドはまったく同じように見えますが、Android Studioでは' BuildConfig.DEBUG'を使用することはできません。 –

+0

今のところ、あなたは賞金のための最善の候補者です。それをしばらく続けてみましょう。誰か他の解決策も出てくるかどうかがわかります。 –

+0

確かに、BuildConfig.DEBUGとBuildConfig.TYPEは本当に異なっています。はい、どちらも静的constですが、TYPEには静的で事前定義された値がありますが、BuildConfig.DEBUGは 'parseBoolean(" true/false ")で評価されます。 –