2016-03-16 6 views
10

Ich möchte eine Variable test überreichen, die ich pro Geschmack als Definition zum NDK anders einstelle. Aber aus irgendeinem Grund übergibt er immer den Wert des letzten Geschmacks. HierWie man Variable nach Gradararomen einstellt

ist die build.gradle:

apply plugin: 'com.android.library' 

def test 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 
    defaultPublishConfig "flavorARelease" 
    publishNonDefault true 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 17 

     ndk { 
      moduleName "test" 
      ldLibs "log" 
     } 
    } 

    productFlavors {  
     flavorA { 
      test = 1 
     } 

     flavorB { 
      test = 2 
     }  
    } 

    buildTypes {  
     debug { 
      ndk { 
       if (cFlags == null) { cFlags = "" } 
       cFlags = cFlags + " -DLOGGING=1 -DTEST="+test+" " 
      } 
      minifyEnabled false 
     } 
     release { 
      ndk { 
       if (cFlags == null) { cFlags = "" } 
       cFlags = cFlags + " -DLOGGING=0 -DTEST="+test+" " 
      } 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.1' 
} 

Und hier sind die CFLAG Linien aus dem erzeugten Android.mk

build/Zwischenprodukte/NDK/Flavora/debug/Android.mk:

LOCAL_CFLAGS := -DLOGGING=1 -DTEST=2 

Ich erwartete -DTEST=1 hier

build/Zwischenprodukte/NDK/flavorB/debug/Android.mk:

LOCAL_CFLAGS := -DLOGGING=1 -DTEST=2 

Also, wo ist mein Fehler? Oder wie kann ich mein Ziel erreichen? Bitte beachten Sie auch, dass das eigentliche Problem komplexer ist und ich diese, wenn möglich, im Segment "BuildTypes" definieren möchte.

Antwort

8

fand ich die Lösung:

Zuerst statt def test ein neues Feld

productFlavors.all { 
    ext.dTest = null 
} 

Dann ist dieses Feld in jedem Geschmack (Code unverändert)

productFlavors {  
    flavorA { 
     dTest = 1 
    } 

    flavorB { 
     dTest = 2 
    }  
} 

für alle productFlavors angeben gesetzt Und schließlich können Sie dies in den buildTypes

tun

Hier die vollständige Datei:

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 
    defaultPublishConfig "flavorARelease" 
    publishNonDefault true 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 17 

     ndk { 
      moduleName "dTest" 
      ldLibs "log" 
     } 
    } 

    productFlavors.all { 
     ext.dTest = null 
    } 

    productFlavors {  
     flavorA { 
      dTest = 1 
     } 

     flavorB { 
      dTest = 2 
     }  
    } 


    buildTypes {  
     all { 
      productFlavors { 
       all { 
        ndk { 
         if (cFlags == null) { cFlags = "" } 
         cFlags = cFlags + " -DTEST="+dTest+" " 
        } 
       } 
      } 
     } 
     debug {   
      minifyEnabled false 
      ndk { 
       if (cFlags == null) { cFlags = "" } 
       cFlags = cFlags + " -DLOGGING=1 " 
      } 
     } 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

      ndk { 
       if (cFlags == null) { cFlags = "" } 
       cFlags = cFlags + " -DLOGGING=0 " 
      } 
     } 
    } 

} 
+0

** Test-ConventionTask erstreckt **. Daher werden Ihre productFlavors nicht erstellt, da Sie ein reserviertes Schlüsselwort als Variable verwenden. –

+0

Ich bin mir nicht sicher, ob Sie auf die Frage oder die Lösung verweisen. In meinem realen Projekt ist es nicht "Test", sondern eine Menge verschiedener Variablen. Wenn dieses Beispiel wegen der Verwendung von "test" fehlerhaft ist, können Sie es beheben? Da ich schon wieder mit Gradle verrostet bin, habe ich mit diesem Problem schon wieder Probleme gehabt. - Würden alle Vorkommen von "test" zu "dTest" schon den Trick machen? – Torge

+0

Ich bezog mich auf die ** productFlavors **, wo Sie 'Test' erklärten. Ich ging voran und benannte die Variable um. Vielen Dank! –

3

können Sie verwenden buildConfigField

productFlavors { 
    demo { 
     buildConfigField "int", "FOO", "1" 
     buildConfigField "String", "FOO_STRING", "\"foo1\"" 
    } 
    full { 
     buildConfigField "int", "FOO", "2" 
     buildConfigField "String", "FOO_STRING", "\"foo2\"" 
    } 
} 
+1

Und wie würden Sie dieses von C in #ifdef zugreifen? Dies funktioniert nur für Java AFAIK. – Torge

Verwandte Themen