Gradle 动态编译-利用配置文件指定不同软件版本对应的服务器地址

1.需求:

1.能够在配置文件中指定不同软件版本对应的服务器地址,免除开发人员多次修改服务器地址的工作,避免错误。
2.同时生成不同版本的apk,避免重复无意义的工作。

2.改进:

思路:
引入 Jenkins 服务自动打包,在gradle脚本中,使用 buildConfigField 声明一个字段,编译成功后,会为这个字段生成静态常量,我们可以在代码中使用这个常量。然后在gradle 的 buildTypes中配置不同的编译类型(比如测试,开发,上线三种类型),每个类型指定不同的字段的值。而在成功build后,gradle会为不同的类型环境生成不同的apk包,一次性就生成了测试,开发,上线三个apk包。

3.实现方式:

  1. 修改 build.gradle , 配置buildTypes 下的 buildConfigField字段
 buildTypes {
 release {
   minifyEnabled false
   buildConfigField("String","API_HOST","\"http://www.jinlinbao.com\"")
  }
 debug{
   debuggable true
   minifyEnabled false
   buildConfigField("String","API_HOST", "\"http://192.168.1.245\"")
 }
}

注意上面带下划线字体的部分。
这个方法需要三个参数,分别是字段变量类型,变量名,和值。比如这里的
“String”, “API_HOST”, “\”http://192.168.1.245\”” // 一定注意 右斜杠后面跟着转义字符分号
就会生成:
public static finalString API_HOST = “http://192.168.1.245“;

2.. 修改 build.gradle , 配置 defaultConfig 下的 buildConfigField字段 ,这是为了代码编译的方便,使得在各个环境下都有 API_HOST 这个字段。
buildConfigField(“String”,”API_HOST”, “\”http://192.168.1.232\”“)

3.. 配置完成后,先build工程,生成BuildConfig类,然后可以在代码中使用:
String str =BuildConfig.API_HOST;

下面是完整的配置文件:

android {
    signingConfigs { //签名配置
        debug {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('./keystore/debug.keystore')
            storePassword 'android'
        }
        release {
            keyAlias 'china317'
            keyPassword 'china317'
            storeFile file('./keystore/express-release.jks')
            storePassword 'china317'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.china317.zhzg.driver.application"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 2
        versionName "2.0.1"
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            buildConfigField("String","API_HOST", "\"测试服务器地址\"")
     buildConfigField("String", "VER_ENV","\"dev\"")//自动更新版本参数
            signingConfig signingConfigs.debug //签名
        }
        release {
           minifyEnabled false
           buildConfigField("String","API_HOST", "\"正式服务器地址\"")
           buildConfigField("String", "VER_ENV","\"prod\"")
          signingConfig signingConfigs.release//签名
            applicationVariants.all { variant ->
                variant.outputs.each {output ->
                    def outputFile =output.outputFile
                    def fileName;
        if (outputFile != null &&outputFile.name.endsWith('.apk')) {
       if(variant.buildType.name.equals('release')) {
               fileName = "应用名_${variant.buildType.name}.apk"
       } else if(variant.buildType.name.equals('debug')) {
              fileName = "应用名_${variant.buildType.name}.apk"
       }
         output.outputFile = newFile(outputFile.parent, fileName)
      }
      }
     }
        }
    }
}

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile *
}

4.利用applicationVariants.all{*}为不同版本的apk命名不同的名称。

5.生成不同版本的APK
在AndroidStudio右上侧打开Gradle窗口,双击assemble,即可同时生成各个版本的APK.如下图:
Gradle 动态编译-利用配置文件指定不同软件版本对应的服务器地址_第1张图片

6.下面是代码演示:

public class MainActivity extends Activity{
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   String str =   BuildConfig.API_HOST;
   TextView txt1 = (TextView) findViewById(R.id.txt1);
   txt1.setText(str);
  }
}

你可能感兴趣的:(Adnroid技术文档)