Java CI中的Android配置值

Java CI中的Android配置值,java,android,gradle,continuous-integration,azure-devops,Java,Android,Gradle,Continuous Integration,Azure Devops,我是android新手,但我已经在考虑是否有一种方法可以将一些重要的应用配置纳入持续集成。我们使用VisualStudioOnline进行构建和发布。 例子。 目前,我们有Constants.java文件,其中存储了一些imp配置值,如服务器URL,对于部署在例如dev、test uat production上的每个环境应用程序,这些值将是不同的。因此,目前,在代码进入vso进行构建和发布之前,需要手动检查代码。是否可以在环境的持续集成中以某种方式对其进行配置,并从中选择,以便不需要手动检查。请

我是android新手,但我已经在考虑是否有一种方法可以将一些重要的应用配置纳入持续集成。我们使用VisualStudioOnline进行构建和发布。 例子。 目前,我们有Constants.java文件,其中存储了一些imp配置值,如服务器URL,对于部署在例如dev、test uat production上的每个环境应用程序,这些值将是不同的。因此,目前,在代码进入vso进行构建和发布之前,需要手动检查代码。是否可以在环境的持续集成中以某种方式对其进行配置,并从中选择,以便不需要手动检查。

请参见:

查看此函数
readApiKey()
它从环境或
.properties文件中读取密钥。然后看这一行:

buildConfigField(“String”、“API\u PUBLIC\u KEY”、readApiKey(KeyType.PUBLIC\u KEY))
它用值加载字符串资源

如果你有不同的版本和不同的价值观,那就是口味的来源。你可以读出来


您只需使用Replace Tokens步骤/任务来替换每个环境的per值

  • 安装
  • 将替换令牌任务添加到发布定义的每个环境中(目标文件**\Constants.java)
  • 为发布定义的每个环境添加环境变量(例如,服务器,每个环境的相同变量名)
  • 修改Constants.java文件,将必要的值替换为#{server}#,并签入更改(开发人员可以使用特定值修改此文件,如果需要在本地计算机上调试/运行应用程序,则不签入更改)
  • 之后#{server}#将替换为服务器环境的值

  • 我的解决方案怎么样?它符合你的要求吗?
    apply plugin: 'com.android.application'
    apply from: '../codequality/quality.gradle'
    
    /*
     * Read API key from CI server or from keys.properties file
     */
    enum KeyType {
        PUBLIC_KEY,
        PRIVATE_KEY
    }
    
    def readApiKey(KeyType type) {
        String apiKey = ""
        if (System.getenv("CIENV")) {
            if (type == KeyType.PUBLIC_KEY) {
                apiKey = System.getenv("PB_KEY")
            } else apiKey = System.getenv("PR_KEY")
        } else {
            Properties props = new Properties()
            try {
                props.load(new FileInputStream(new File(getRootDir().getAbsolutePath() + "/keys.properties")))
                if (type == KeyType.PUBLIC_KEY) {
                    apiKey = props.getProperty("api_pb_key")
                } else apiKey = props.getProperty("api_pr_key")
            } catch (FileNotFoundException fnfe) {
                println("Please create a keys.properties file in the root directory of the project")
            }
        }
        return "\"$apiKey\"";
    }
    
    println 'PUBLIC KEY Log' + readApiKey(KeyType.PUBLIC_KEY)
    println 'Private Key Log' + readApiKey(KeyType.PRIVATE_KEY)
    
    android {
        compileSdkVersion rootProject.ext.compileSdkVersion
        buildToolsVersion rootProject.ext.buildToolsVersion
    
        dataBinding {
            enabled true
        }
    
        testOptions {
            unitTests.returnDefaultValues = true
        }
    
        defaultConfig {
            applicationId "co.tonespy.dummarvel"
            minSdkVersion rootProject.ext.minSdkVersion
            targetSdkVersion rootProject.ext.targetSdkVersion
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            // Setting up picked up data to String resource
            buildConfigField("String", "API_PUBLIC_KEY", readApiKey(KeyType.PUBLIC_KEY))
            buildConfigField("String", "API_PRIVATE_KEY", readApiKey(KeyType.PRIVATE_KEY))
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    
        // support dependencies
        ....
    
        // test dependencies
        testCompile "junit:junit:$jUnitVersion"
        androidTestCompile("com.android.support.test.espresso:espresso-core:$espressoCoreVersion", {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        testCompile "org.mockito:mockito-core:$mockitoVersion"
        compile "com.android.support:support-v4:$supportLibraryVersion"
    }