2016-03-16 39 views
10

Chcę przekazać zmienną test, którą ustawiam odmiennie dla każdego smaku jako zdefiniowany w NDK. Ale z jakiegoś powodu zawsze przekazuje wartość ostatniego smaku.Jak ustawić zmienną według smaków stopniowych

Oto 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' 
} 

A oto linie CFLAG z wygenerowanym Android.mk

build/półproduktów/NDK/flavorA/debug/Android.mk:

LOCAL_CFLAGS := -DLOGGING=1 -DTEST=2 

Spodziewałem -DTEST=1 tutaj

build/półproduktów/NDK/flavorB/debug/Android.mk:

LOCAL_CFLAGS := -DLOGGING=1 -DTEST=2 

Więc gdzie jest mój błąd? Albo jak mogę osiągnąć mój cel? Proszę również wziąć pod uwagę, że prawdziwy problem jest bardziej złożony i jeśli to możliwe, chcę je zdefiniować w segmencie "buildTypes".

Odpowiedz

8

znalazłem rozwiązanie:

First zamiast def test określić nowe pole dla wszystkich productFlavors

productFlavors.all { 
    ext.dTest = null 
} 

Wtedy to pole jest ustawione w każdym smaku (kod niezmienione)

productFlavors {  
    flavorA { 
     dTest = 1 
    } 

    flavorB { 
     dTest = 2 
    }  
} 

I wreszcie możesz to zrobić w buildTypes

Tutaj pełnego pliku:

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 rozciąga ConventionTask **. Dlatego Twój produkt Smaki nie będzie budowany, ponieważ używasz zastrzeżonego słowa kluczowego jako zmiennej. –

+0

Nie jestem pewien, czy odwołujesz się do pytania lub rozwiązania. W moim prawdziwym projekcie nie jest to "test", ale zestaw różnych zmiennych. Jeśli ten przykład zostanie uszkodzony z powodu użycia 'testu', czy możesz to naprawić? Ponieważ jestem naprawdę zardzewiały z gradle ponownie, ponieważ zmagałem się z tym problemem z powrotem. - Czy zmiana wszystkich wystąpień 'testu' na' dTest' już załatwi sprawę? – Torge

+0

Miałem na myśli ** productFlavours **, w którym zadeklarowałeś 'Test'. Poszedłem do przodu i zmieniłem nazwę zmiennej. Dzięki! –

3

Można użyć buildConfigField

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

Jak uzyskać dostęp do tego z C w #ifdef? Działa to tylko dla Java AFAIK. – Torge

Powiązane problemy