参考了:http://blog.csdn.net/nwsuafer/article/details/42006157
场景:
开发时需要用到测试环境URL,而打包时需要改回正式环境URL,来回的注释总有会弄错的时候,但是如果在gradle构建时定义则不需要每次都去检查自己定义的URL是否是测试或正式,而且代码也整洁好多
1.在gradle文件中定义变量:
buildTypes { debug { minifyEnabled false //混淆关闭 signingConfig signingConfigs.release buildConfigField "String", "HTTP_API", "\"http://test.xxxx.com/\"" manifestPlaceholders = [ app_name: "@string/app_name_debug", ] } release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'prguard-rules.pro'//指定混淆规则文件 signingConfig signingConfigs.release //设置签名信息 buildConfigField "String", "HTTP_API", "\"http://xxxx.com/\"" } }
定义后要SYNC重新刷新gradle文件,要不然会调用不到
P:上面的buildConfigField就是定义变量的关键字,buildConfigField "String", "HTTP_API", "\"http://xxxx.com/\""的意思是定义一个String类型的变量名为HTTP_API的且值为"http://xxxx.com\"的变量。manifestPlaceholder=[app_name: "@string/app_name_debug"]意思是把manifest文件中${app_name}占位符替换为@string/app_name_debug的值
2.在java.class文件中的调用
public final class HttpApi { public final static String HTTP_API = BuildConfig.HTTP_API; // public final static String HTTP_API = "http://test.xxxx.com/";//测试环境地址 // public final static String HTTP_API = "http://xxxx.com";//正式环境地址
}
直接使用BuildConfig.HTTP_API就可以调用到gradle中定义的buildConfigField变量了
---------------------------------------------------------------------------------------------------------------------------------------------------------------
gradle中使用manifestPlaceholders替换app_name、app_id,app_icon
1.先在manifest.xml中定义占位符
<application android:allowBackup="true" android:exported="true" android:icon="${icon}" android:label="${app_name}" android:theme="@style/Theme.sty" tools:replace="icon, label,theme">
</application>
2.在各个渠道配置中使用这个manifestPlaceholders进行区别不同渠道APP,如:
productFlavors { 360{ applicationId "com.xxx.xxx" manifestPlaceholders = [app_name:"xxxx" ,icon: "@drawable/icon"] //在java代码中具体的使用方式为:context.getResources().getString(R.string.strKey); resValue("string" , "strKey","xx") } }
也可以在buildTypes的debug或release中定义,但是会覆盖productFlavors中360中定义的变量