Android - 基于构建类型的gradle动态配置

时间:2013-09-12 14:40:53

标签: android gradle android-gradle

我正在开发一款连接到我服务器的Android应用。像往常一样,我的服务器在开发期间是在笔记本电脑上,它的ip正在改变我想检测我的开发机器的IP地址,即

InetAddress.getLocalHost().getCanonicalHostName()

...并将其注入android strings.xml文件,以便我的Android应用程序在开发过程中连接到正确的ip。

我正在努力确定在哪里获取信息每次运行后可以执行哪种类型的buildType:

android { 
    buildTypes.each { buildType ->
        if(buildType.name == 'debug') {
            def host = InetAddress.getLocalHost().getCanonicalHostName()
        }
    }
}

让我们说主持人现在就确定了。但是我仍然不确定如何替换strings.xml文件中的host以连接到正确的主机。 我无法调用processResources,因为引发了以下异常:

Could not find method processResources() for argument [build_11onjivreh0vsff0acv5skf836$_run_closure3@cbbe2cf] on project

任何建议或源代码都将不胜感激。

2 个答案:

答案 0 :(得分:11)

有一个更简单的解决方案:在static final中使用BuildConfig

buildTypes {
    debug {
        def host = InetAddress.getLocalHost().getCanonicalHostName()
        buildConfig "public static final String API_HOSTNAME = \"" + host + "\";"
    }

    release {
        buildConfig "public static final String API_HOSTNAME = \"whateveritisforreleasebuilds\";"
    }
}

BuildConfig.API_HOSTNAME将保留远程地址。

答案 1 :(得分:7)

最新版本需要以下语法:

buildTypes {
    debug {
        buildConfigField "boolean", "ENVIRONMENT", "true"
    }
    release {
        buildConfigField "boolean", "ENVIRONMENT", "false"
    }
}

或者使用布尔类型:

BuildConfig.ENVIRONMENT.equals("production"); // String type

然后您将其用作

if (BuildConfig.ENVIRONMENT) { ... } // boolean type

var data = [{
    label: 'Cars',
    children: [{
        label: 'Volkswagan',
        children: [{
            label: 'Passat'
        }]
    }, {
        label: 'Toyota'
    }]
 }, {
     label: 'Fruits',
     children: [{
        label: 'Grapes'
    }, {
        label: 'Oranges'
    }]
 }];

function filter(data, query){}
filter(data,'ra'); //['Grapes', 'Oranges']