2014-03-19 53 views
3

我有我的應用程序有多種口味的情況。例如。開發,階段,生產口味。如何從build.gradle更改.java文件中的某些值?

因此,dev將指向dev服務器url,dev app id等等,並用於舞臺和製作。

variant.mergeResources.doLast { 
     File valuesFile = file("${buildDir}/res/all/${variant.dirName}/values/values.xml") 
     println("Replacing app id in " + variant.dirName) 
     String content = valuesFile.getText('UTF-8') 
     def appid; 
     String variantDirName = variant.dirName; 
     if (variantDirName.contains("dev")) { 
      appid = '1234_dev' 
     } else if(variantDirName.contains("stage")) { 
      appid = '1234_stage' 
     } else if(variantDirName.contains("prod")) { 
      appid = '1234_prod' 
     } else { 
      appid = '1234_unknown' 
     } 
     content = content.replaceAll(/some_app_id/, appid) 
     valuesFile.write(content, 'UTF-8') 
    } 

哪裏我的strings.xml是 - - 對於應用程序ID是存在於我的strings.xml,我可以使用下面的代碼替換它們

<string name="app_id">some_app_id</string> 

現在,服務器的URL都存儲在我的Config.java文件作爲正常恆

public static final String BASE_URL = "http://dev.blahblah.com"; 

所以現在的問題是如何在Config.java這條線從我的build.gradle文件,這取決於不同的風味改變?

+1

爲什麼不與你從閱讀相應名稱的屬性文件?你可以從一個靜態的初始化程序做到這一點 – fge

+0

如何告訴我的Config.java使用來自屬性文件的url?你可以用你的方法發表答案嗎?這似乎是一個好方法。如果您使用示例進行說明,則更好。謝謝 – rohit

+0

這取決於你如何得到app_id。我不知道android ... – fge

回答

5

你不應該編輯像這樣的現有任務的輸出,這將打破增量支持,並且每次構建時,都會重新運行mergeResource任務(因爲它的輸出已更改)。

在這種情況下,我想簡單地使用resConfigbuildConfigField動態地在BuildConfig

+0

謝謝。我剛在網上找到某個地方。這是我認爲的完美方法。 – rohit

+0

你介意給予更多的信息,更具體的解釋:1。原來的問題,你如何改變一個java文件中的值? 2.你如何使用buildConfigField中創建的常量?我找不到任何文件。謝謝! – JohnRock

+1

buildConfigField將在生成的類「<您的包名稱> .BuildConfig」中創建一個新的常量。 –

8

創建資源和恆定場可以使用BuildConfig作爲澤維爾傷心。例如:

在產品口味

productFlavors { 
    develop { 
     applicationId "com.dexode.cree.develop" 
     ext.enableCrashlytics = false 

     buildConfigField "String", "API_URL", "\"https://api.test.dexode.com/2.3\"" 
    } 
    beta { 
     applicationId "com.dexode.cree.beta" 
     ext.enableCrashlytics = true 

     buildConfigField "String", "API_URL", "\"https://api.dexode.com/2.3\"" 
    } 
    production { 
     ext.enableCrashlytics = true 
     buildConfigField "String", "API_URL", "\"https://api.dexode.com/2.3\"" 
    } 

所以,現在你BuildConfig樣子:

public final class BuildConfig { 
    public static final boolean DEBUG = Boolean.parseBoolean("true"); 
    public static final String APPLICATION_ID = "com.dexode.cree.develop.debug"; 
    public static final String BUILD_TYPE = "debug"; 
    public static final String FLAVOR = "develop"; 
    public static final int VERSION_CODE = 1; 
    public static final String VERSION_NAME = "1.0.0.0_debug"; 
    // Fields from product flavor: develop 
    public static final String API_URL = "https://api.test.dexode.com/2.3"; 
} 
代碼

和用法:

RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint(BuildConfig.API_URL); 

記住刷新文件BuildConfig的內容。 AndroidStudio喜歡緩存文件。您可以點擊文件 - >同步

Documentation about Flavors

相關問題buildConfigField depending on flavor + buildType

相關問題