前言:有时候我们需要在手机上能同时安装测试版和正式版app,这就要求我们app的包名不同,包名不同的话,就要求我们的测试版用的第三方SDK的app key就不同,比如项目中用了极光推送,我们就要申请两个app key。
如果不借助gradle话每次手动修改包名、app key、极光server的category显然很容易弄混淆。
在android studio中是通过applicationId来判断是否为同一个app,并且server中的category节点的包名其实也是applicationId,在android studio中如果没有写applicationId那么默认与packageName是一样的。
核心代码:
productFlavors {
//发布正式环境
prod{ //如果是多渠道打包就把这个花括号中的内容写到 productFlavors.all 中
applicationId = "com.xxx.xxxx"
//可以在manifet.xml引用manifestPlaceholders的键值对
manifestPlaceholders = [APP_NAME:"云MAS",
PGYER_APPID : "85fb81911exxxxxxxxxxxxx773d7de34",//设置app_key
JPUSH_APPKEY:"1910xxxxxxxxxxxxxb10d0e8",//设置app_key
APPLICATION_ID : applicationId]//设置程序包名,区别packageName
//可以在java代码中来获取url,第一个参数表示类型,第二个参数表示引用名,第三个参数表示引用的值,注意字符串类型需要在爽引号的基础上再打上单引号。
buildConfigField("String","HOST_URL",'"1xx.xx.xx.xx:xx00/xxxxx/app"')
//可以在java代码中来获取这个图片
buildConfigField("int","ICON_CLOUD","R.drawable.xxxxx")
}
//发布测试环境
dev{
applicationId = "com.xxx.xxx.beta"
manifestPlaceholders = [APP_NAME:"云MAS(测试)",
PGYER_APPID : "85fb81911exxxxxxxxxxxxx73d7de34",
JPUSH_APPKEY:"1910xxxxxxxxxxxxxxxxx0e8",
APPLICATION_ID : applicationId]
buildConfigField("String","HOST_URL",'"1xx.3x.xx.7x:9000/messaxxxxxxice/app"')
buildConfigField("int","ICON_CLOUD","R.drawable.xxxxx_test")
}
}
在manifest.xml中引用:
//极光推送的权限需要包名
<uses-permission android:name="${APPLICATION_ID}.permission.JPUSH_MESSAGE" />
//动态改变app名
tools:replace="android:label"
android:label="${APP_NAME}"
//服务中引用包名
<service
android:name="cn.jpush.android.service.DaemonService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="cn.jpush.android.intent.DaemonService" />
<category android:name="${APPLICATION_ID}" />
</intent-filter>
</service>
java代码中动态设置
//动态设置RUL,测试版使用测试版的url,正式版使用正式版的url,使用前需要同步gradle,否则就会找不到HOST_URL
private static String serverAddress= BuildConfig.HOST_URL;
//动态设置图片,测试版使用测试版的图片,正式版使用正式版的图片,使用前需要同步gradle,否则就会找不到ICON_CLOUD
iamgeView.setImageResource(BuildConfig.ICON_CLOUD);