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

Bar*_*art 4 android gradle android-gradle-plugin

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

InetAddress.getLocalHost().getCanonicalHostName()
Run Code Online (Sandbox Code Playgroud)

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

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

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

假设现在确定该主机.但是我仍然不确定如何替换strings.xml文件中的host以连接到正确的主机.我无法调用processResources,因为抛出以下异常:

Could not find method processResources() for argument [build_11onjivreh0vsff0acv5skf836$_run_closure3@cbbe2cf] on project
Run Code Online (Sandbox Code Playgroud)

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

flx*_*flx 11

有一个更简单的解决方案:使用static finalin 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\";"
    }
}
Run Code Online (Sandbox Code Playgroud)

BuildConfig.API_HOSTNAME 将保留远程地址.

  • 在Gradle/Android Gradle插件的更高版本中,您必须使用`buildConfigField`(而不是`buildConfig`),如[本答案中所述](http://stackoverflow.com/a/20678232/56285). (6认同)

Mar*_*cny 7

最新版本需要以下语法:

buildTypes {
    debug {
        buildConfigField "String", "ENVIRONMENT", "\"development\""
    }
    release {
        buildConfigField "String", "ENVIRONMENT", "\"production\""
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用布尔类型:

buildTypes {
    debug {
        buildConfigField "boolean", "ENVIRONMENT", "true"
    }
    release {
        buildConfigField "boolean", "ENVIRONMENT", "false"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你会用它作为

BuildConfig.ENVIRONMENT.equals("production"); // String type
Run Code Online (Sandbox Code Playgroud)

要么

if (BuildConfig.ENVIRONMENT) { ... } // boolean type
Run Code Online (Sandbox Code Playgroud)