2016-12-01 49 views
3

我在AndroidManifest.xml文件數明顯佔位符定義清單的地方持有人的build.gradle

build.gradle我要動態地填充這取決於我的味道這些價值觀並建立類型。

我該怎麼做?

我寫,做以下

def getKey() { 
    def KeyToReturn = "" 
    android.applicationVariants.all { variant -> 
     printout("getKey: ${variant.name}") 
     def flavor = "default"; 
     if (variant.productFlavors.size() > 0) 
      flavor = variant.productFlavors.get(0); 


     def buildType = variant.buildType.name 

     if (buildType == "debug" || buildType == "staging") { 
      if (flavor.name == "one") { 
       KeyToReturn = test_key_1 
      } 
      if (flavor.name == "two") { 
       KeyToReturn = test_key_2 
      } 

     } 
     if (buildType == "release") { 
      if (flavor.name == "one") { 
       KeyToReturn = live_key_1 
      } 
      if (flavor.name == "two") { 
       KeyToReturn = live_key_2 
      } 
     } 
    } 
    printout("KeyToReturn:" + KeyToReturn) 
    return KeyToReturn 
} 

我有這個在我的android.defaultConfig功能

defaultConfig { 
    minSdkVersion 15 
    targetSdkVersion 23 
    versionCode getVersionCode1() 
    versionName getVersionName1() + "" 
    manifestPlaceholders = [key: getKey()] 
} 

這是我的AndroidManifest.xml中相關部分包含

<meta-data 
      android:name="key" 
      android:value="${key}"/> 

問題是,當我在構建的AndroidManifest.xml文件 $ {key}值是一個空字符串。

如何正確填充此值?在AndroidManifest.xml文件特定構建味

回答

1

添加按照build.gradle

resValue "string", "key", <key value>

那麼你可以參考的是如下

@string/key

編輯:

buildTypes { 
    release { 
     resValue "string", "key", <key value> 
    } 
    debug { 
     resValue "string", "key", <some other key value> 
    } 
} 
+1

這有什麼好明顯的佔位符。 – CommonsWare

+0

@CommonsWare也許我誤解了這個問題,但是我正在積極地在'AndroidManifest.xml'中使用這種方法來佔位符,例如下面爲intent過濾器設置特定產品風格的方案'' –

+0

我有一個不同的值,它取決於它是否是調試以及風味類型。我如何考慮這兩點? –

3

您可以根據產品風格(和AFAIK構建類型)將它們添加到適當的閉包中來定義清單佔位符。

this sample app,我使用產品的口味,以使用不同的規則爲Android 7.0的network security configuration

productFlavors { 
    thawte { 
     resValue "string", "app_name", "CA Validation Demo" 
     applicationId "com.commonsware.android.downloader.ca.thawte" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_thawte'] 
     buildConfigField "String", "URL", WARES 
    } 
    verisign { 
     resValue "string", "app_name", "Invalid CA Validation Demo" 
     applicationId "com.commonsware.android.downloader.ca.verisign" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_verisign'] 
     buildConfigField "String", "URL", WARES 
    } 
    system { 
     resValue "string", "app_name", "System CA Validation Demo" 
     applicationId "com.commonsware.android.downloader.ca.system" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_verisign_system'] 
     buildConfigField "String", "URL", WARES 
    } 
    pin { 
     resValue "string", "app_name", "Cert Pin Demo" 
     applicationId "com.commonsware.android.downloader.ca.pin" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_pin'] 
     buildConfigField "String", "URL", WARES 
    } 
    invalidPin { 
     resValue "string", "app_name", "Cert Pin Demo" 
     applicationId "com.commonsware.android.downloader.ca.invalidpin" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_invalid_pin'] 
     buildConfigField "String", "URL", WARES 
    } 
    selfSigned { 
     resValue "string", "app_name", "Self-Signed Demo" 
     applicationId "com.commonsware.android.downloader.ca.ss" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_selfsigned'] 
     buildConfigField "String", "URL", SELFSIGNED 
    } 
    override { 
     resValue "string", "app_name", "Debug Override Demo" 
     applicationId "com.commonsware.android.downloader.ca.debug" 
     manifestPlaceholders= 
       [networkSecurityConfig: 'network_override'] 
     buildConfigField "String", "URL", SELFSIGNED 
    } 
} 

我可以再引用佔位符的正常表現:

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:networkSecurityConfig="@xml/${networkSecurityConfig}"> 
+0

我有一個不同的值,它取決於它是否是調試和風味類型。我如何考慮這兩點? –

+0

@LenaBru:我的頭頂,我不知道。您在答案中列出的方法無效。充其量,對於所有構建變體,您將具有相同的值,其中該值將是循環處理的最後一個變體。請理解'build.gradle'不會構建您的應用程序,而是構建'build.gradle'中的對象模型。該對象模型 - 幾秒鐘,幾分鐘或幾小時後 - 將構建您的應用程序。所以,你的函數在循環中使用相同的N個構建變體進行N次評估。 – CommonsWare

+0

庫迫使我在清單文件中使用元數據,而不是在代碼中傳遞值,並且您說我絕對沒有辦法做到這一點?我需要單獨的應用程序? –

相關問題