Android一套代码打不同的包工程配置详解_中-productFlavors

有这样一个场景:一个项目正在开发,后来领导说有另外一个项目跟当前项目很像,只要在上面改些东西就可以了,然后你一听立刻把代码复制一份在上面改,改完以后领导又说要加一些功能,两个项目都要加,累死累活做完以后领导又说,后面可能还会有第三个项目,只需要在上面改点东西就可以了, 并且后面加功能这三个项目都要,是不是很崩溃?这该怎么办?有没有一种简单的方法只需要配置一下就可以了? 答案是当然有,上节介绍了gradle的基础配置知识,如果没有看的话建议先看上面的基础知识,有个整体了解以后本章理解起来会更容易,贴上上一节的链接: https://blog.csdn.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中提前设置好的变量, 例如:

  1. <meta-data

  2. android:name="UMENG_APPKEY"

  3. 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中

猜你喜欢

转载自blog.csdn.net/helloworld19870427/article/details/83072282
今日推荐