使用BuildConfig自定义常量



 在正常项目开发中,我们经常会用到网络访问来连接我们自己的服务器,在开发中与正式环境中往往用到不同的接口地址,正常情况下,我们会在代码中自定义一个String常量来存储HTTP头地址,在开发阶段使用测试地址,上线打包时更换为正式地址。而用Android Studio开发项目时,我们可以用更优雅的方式来解决这个问题,即在BuildConfig中来自定义这个接口地址。

      BuildConfig是android studio在打包时自动生成的一个java类,在项目工程的build/generated/source/buildConfig目录下,打开这个目录可以发现会有多个不同的目录来存放BuildConfig.java类,一般会有androidTest、debug、release等多个目录,这些目录中的BuildConfig类中有相同的常量字段,但这里常量字段的值是完全可以自定义的,这样我们就可以通过定义一些常量使其在debug以及release中生成不同的字段,这里我们来定义一个HTTP_BASE字段来使其在debug中使用测试地址而在release中使用正式地址。

     在build.gradle中的buildTypes下,我们可以为release以及debug定义我们所需要的常量:

[html]  view plain  copy 
 
  1. buildTypes {  
  2.         release {  
  3.             minifyEnabled true  
  4.             signingConfig signingConfigs.release  
  5.             proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'  
  6.             buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/release/"')  
  7.         }  
  8.   
  9.         debug {  
  10.             signingConfig signingConfigs.debug  
  11.             proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'  
  12.             buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/debug"')  
  13.         }  
  14. }  

如上所示,我们可以使用buildConfigField()方法来自定义一些 常量,进入该方法源码

[java]  view plain  copy 
 
  1. /** 
  2.  * Adds a new field to the generated BuildConfig class. 
  3.  * 
  4.  * 

    The field is generated as:   = ; 

  5.  * 
  6.  * 

    This means each of these must have valid Java content. If the type is a String, then the 

  7.  * value should include quotes. 
  8.  * 
  9.  * @param type the type of the field 
  10.  * @param name the name of the field 
  11.  * @param value the value of the field 
  12.  */  
  13. public void buildConfigField(  
  14.         @NonNull String type,  
  15.         @NonNull String name,  
  16.         @NonNull String value) {  
  17.     ClassField alreadyPresent = getBuildConfigFields().get(name);  
  18.     if (alreadyPresent != null) {  
  19.         logger.info("BuildType({}): buildConfigField '{}' value is being replaced: {} -> {}",  
  20.                 getName(), name, alreadyPresent.getValue(), value);  
  21.     }  
  22.     addBuildConfigField(AndroidBuilder.createClassField(type, name, value));  
  23. }  
该方法需要传入三个参数,第一个参数为要定义的常量的类型,第二个参数为该常量的命名,第三个参数为该常量的值,明白了这个方法使用方法后,我们就可以在buildTypes中的release和debug下来自定义某些场景下所需要的值,需要注意的是,当我们定义这些值时,release和debug下这些值的type、name必须相同,这是毋庸置疑的,value就是我们想要在release和debug下所需要的不同的值。当添加好这些值后,rebuild一下项目,然后在BuildConfig类中,这些我们刚刚定义的值就会显示出来,这些值就可以在整个module中使用了。  

 在正常项目开发中,我们经常会用到网络访问来连接我们自己的服务器,在开发中与正式环境中往往用到不同的接口地址,正常情况下,我们会在代码中自定义一个String常量来存储HTTP头地址,在开发阶段使用测试地址,上线打包时更换为正式地址。而用Android Studio开发项目时,我们可以用更优雅的方式来解决这个问题,即在BuildConfig中来自定义这个接口地址。

      BuildConfig是android studio在打包时自动生成的一个java类,在项目工程的build/generated/source/buildConfig目录下,打开这个目录可以发现会有多个不同的目录来存放BuildConfig.java类,一般会有androidTest、debug、release等多个目录,这些目录中的BuildConfig类中有相同的常量字段,但这里常量字段的值是完全可以自定义的,这样我们就可以通过定义一些常量使其在debug以及release中生成不同的字段,这里我们来定义一个HTTP_BASE字段来使其在debug中使用测试地址而在release中使用正式地址。

     在build.gradle中的buildTypes下,我们可以为release以及debug定义我们所需要的常量:

[html]  view plain  copy 
 
  1. buildTypes {  
  2.         release {  
  3.             minifyEnabled true  
  4.             signingConfig signingConfigs.release  
  5.             proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'  
  6.             buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/release/"')  
  7.         }  
  8.   
  9.         debug {  
  10.             signingConfig signingConfigs.debug  
  11.             proguardFiles getDefaultProguardFile('proguard-project.txt'), 'proguard-rules.pro'  
  12.             buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/debug"')  
  13.         }  
  14. }  

如上所示,我们可以使用buildConfigField()方法来自定义一些 常量,进入该方法源码

[java]  view plain  copy 
 
  1. /** 
  2.  * Adds a new field to the generated BuildConfig class. 
  3.  * 
  4.  * 

    The field is generated as:   = ; 

  5.  * 
  6.  * 

    This means each of these must have valid Java content. If the type is a String, then the 

  7.  * value should include quotes. 
  8.  * 
  9.  * @param type the type of the field 
  10.  * @param name the name of the field 
  11.  * @param value the value of the field 
  12.  */  
  13. public void buildConfigField(  
  14.         @NonNull String type,  
  15.         @NonNull String name,  
  16.         @NonNull String value) {  
  17.     ClassField alreadyPresent = getBuildConfigFields().get(name);  
  18.     if (alreadyPresent != null) {  
  19.         logger.info("BuildType({}): buildConfigField '{}' value is being replaced: {} -> {}",  
  20.                 getName(), name, alreadyPresent.getValue(), value);  
  21.     }  
  22.     addBuildConfigField(AndroidBuilder.createClassField(type, name, value));  
  23. }  
该方法需要传入三个参数,第一个参数为要定义的常量的类型,第二个参数为该常量的命名,第三个参数为该常量的值,明白了这个方法使用方法后,我们就可以在buildTypes中的release和debug下来自定义某些场景下所需要的值,需要注意的是,当我们定义这些值时,release和debug下这些值的type、name必须相同,这是毋庸置疑的,value就是我们想要在release和debug下所需要的不同的值。当添加好这些值后,rebuild一下项目,然后在BuildConfig类中,这些我们刚刚定义的值就会显示出来,这些值就可以在整个module中使用了。  

你可能感兴趣的:(使用BuildConfig自定义常量)