Android一套代码打不同的包工程配置详解_中-productFlavors
有这样一个场景:一个项目正在开发,后来领导说有另外一个项目跟当前项目很像,只要在上面改些东西就可以了,然后你一听立刻把代码复制一份在上面改,改完以后领导又说要加一些功能,两个项目都要加,累死累活做完以后领导又说,后面可能还会有第三个项目,只需要在上面改点东西就可以了, 并且后面加功能这三个项目都要,是不是很崩溃?这该怎么办?有没有一种简单的方法只需要配置一下就可以了? 答案是当然有,上节介绍了gradle的基础配置知识,如果没有看的话建议先看上面的基础知识,有个整体了解以后本章理解起来会更容易,贴上上一节的链接: https://blog.****.net/helloworld19870427/article/details/83071728
一、productFlavors
在android{}下面添加如下代码:
productFlavors {
own {
}
vores {
}
}
wangcang和vores是随便起的名字,意思是工程中目前有两种配置, 一种配置是wangcang,一种配置是vores,同时会在工程变量中生成四个变量:voresDebug、voresRelease、ownDebug、ownRelease
它们到底能做什么呢? 用处可大了,往下看。
productFlavors {
own {
buildConfigField("String", "AppName", "\"appwangcang3\"")
applicationId "com.idcs.mobilewc"
signingConfig signingConfigs.config
manifestPlaceholders = [
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "7eaed6ccd1a84f5620fbae06", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL: "developer-default", //用户渠道统计的渠道名称
APP_SCHEME: "warehouseno3"
]
}
vores {
buildConfigField("String", "AppName", "\"appvores\"")
applicationId "com.vores.mobile"
signingConfig signingConfigs.vores
manifestPlaceholders = [
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "fd4711da71114fdfa392ad2d", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL: "developer-default", //用户渠道统计的渠道名称
APP_SCHEME: "whvoresapp"
]
}
}
首先大家会说buildConfigField是什么东西, 它其实是给BuildConfig生成一些变量:
buildConfigField("String", "AppName", "\"appwangcang3\"")和buildConfigField("String", "AppName", "\"appvores\"")
String类型一定要用斜杠把字符串转义,不然在BuildConfig.java里面生成的字符串没有双引号,就会报错。
生成这些变量有什么用呢?
首先我们想到了工程中生成了四个变量:voresDebug、voresRelease、ownDebug、ownRelease, 当我选ownRelease时候AppName的值就是“appwangcang3”,如果我选择了voresRelease则值就会变成“appvores”,每次选的时候工程都会重新build,因为他会使用对应own或者vores下面的配置。own和vores下面的配置大家可以仔细看看,里面有applicationId、signingConfig,manifestPlaceholders。 applicationId改变的是应用程序的包名, signingConfig改变的是app的签名, manifestPlaceholders改变的是一些变量配置, 每次选择左下角的四个配置重新编译后其实就是另一个应用了。
因此当我们在需要动态的初始化一些变量的时候就可以用到BuildConfig里的变量,根据app来初始化极光推送的key, 就可以这样写:
// 初始化到不同app的变量
if (BuildConfig.AppName.equals("appwangcang3")) {
APP_ID = "";
bdAppId = "";
bdApiKey = "";
bdSecret = "";
} else if (BuildConfig.AppName.equals("appvores")) {
// vores 重新申请的app key
APP_ID = "";
bdAppId = "";
bdApiKey = "";
bdSecret = "";
}
看到这里大家应该明白了, 一套代码里面可以编译多个工程,在这一套代码中可以根据BuildConfig.java里面的变量来动态初始化第三方库的key和appId等,根据productFlavors生成的四个变量来配置当前是哪个应用。
二、manifestPlaceholders的使用
manifestPlaceholders可以替换我们在AndroidManifest.xml中提前设置好的变量, 例如:
-
<meta-data
-
android:name="UMENG_APPKEY"
-
android:value="${umeng_app_key}"/>
同一套代码如果根据不同的应用来设置不同的值应该怎么做呢?
productFlavors {
own {
applicationId "com.proj.config.projectconfig"
manifestPlaceholders = [
umeng_app_key: "这是own工程使用的key",
jpush_app_key:"aaaaaaaaaaaaaaa"
]
}
vores {
applicationId "com.proj.vores.projectconfig"
manifestPlaceholders = [
umeng_app_key: "这是vores工程使用的key",
jpush_app_key:"bbbbbbbbbbbbbbbb"
]
}
}
这样就可以根据上面四个变量的配置直接把值替换到AndroidManifest.xml中