多渠道打包配置,动态设置包名和对于不同渠道所需数据。

对于我需要解决的问题是:

(测试包的APPID和包名与正式包的APPID和包名不同)

1,对变化的数据进行定义

分两种,对于APPID这种常规参数,可以直接进行定义:

(1)在Module的build.gradle文件中进行定义变量:
        //  开发环境
        def DEV_APPID = "\"880ff13a339749dda54efa40*********\""
        //  正式环境
        def RELEASE_APPID = "\"6ab7248da757452db9feb1b2*********\""
(2)对于gradle构建项目会生成BuildConfig.java文件
    我们只需要在

defaultConfig {
    applicationId "com.**********************"
    minSdkVersion 20
    targetSdkVersion 25
    versionCode 10000
    versionName "1.0.0"
    buildConfigField("String", "APPID", "${DEV_APPID}")//加上这句
    flavorDimensions "versionCode"
}

 对于  buildConfigField("String", "APPID", "${DEV_APPID}")  就是在  BuildConfig.java  文件中加入一个静态常量:
 加过后如下:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.********************";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "debug_config";
  public static final int VERSION_CODE = 10000;
  public static final String VERSION_NAME = "1.0.0_debug";
  // Fields from product flavor: debug_config
  public static final String APPID = "880ff13a339749dda54efa40c*********";
  // Fields from default config.
}

这里面有很多常量,其他是创建项目创建时IDE帮我们生成的。

    对于buildConfigField("String", "APPID", "${DEV_APPID}"),第一个参数是数据类型,第二个是常量名称,第三个为我们之前定义的边变量。

    这句赋值语句会直接将双引号里的值原封不动的直接进行赋值,这就是上面"\"880ff13a339749dda54efa40*******\""这样定义的原因。

这样我们的配置文件与java代码就有了关联,当我们想要使用APPID时候,就可以直接用BuildConfig.APPID。

2,接下来就是动态的变化这个APPID:

(1)需要productFlavors标签,它的结构一般都是这样的
android{
    productFlavors{
        XXXA{
            #这里定义产品A的特性
        }

        XXXB{
            #这里定义产品B的特性
        }

        #更多产品 ...
    }
}

对于子标签的名字可以根据自己的需求进行定义

这样当我们使用AS进行打包就会出现:


(2)对于我的项目就是在我打测试包和正式包需要不同的包名和APPID:

productFlavors {
    release_config{
        versionNameSuffix "_release"
        applicationId "com.****************"
        buildConfigField("String", "APPID", "${RELEASE_APPID}")
    }
    debug_config{
        versionNameSuffix "_debug"
        applicationId "com.*****************"
        buildConfigField("String", "APPID", "${DEV_APPID}")
    }
}

(3)设置一下buildTypes就OK了
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
    }
    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'
    }
}

============================================================================

3,上文中并没有涉及到真正的多渠道打包,但是原理都是一样,我们只是需要修改productFlavors标签中需要打包的渠道,配置不同的数据即可。如:

// 多渠道 的不同配置
productFlavors {
    baidu{
        // 每个环境包名不同
        applicationId "com.shi.androidstudio.multichannel.baidu"
        // 动态添加 string.xml 字段;
        // 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
        resValue "string", "app_name", "百度"
        resValue "bool", "auto_updates", 'false'
        // 动态修改 常量 字段
        buildConfigField "String", "ENVIRONMENT", '"我是百度首页"'
        // 修改 AndroidManifest.xml 里渠道变量
        manifestPlaceholders = [CHANNEL_VALUE: "baidu"
                                ,app_icon   : "@mipmap/logo_baidu"]
    }
    qq{
        applicationId "com.shi.androidstudio.multichannel.qq"

        resValue "string", "app_name", "腾讯"
        resValue "bool", "auto_updates", 'true'

        buildConfigField "String", "ENVIRONMENT", '"我是腾讯首页"'

        manifestPlaceholders = [CHANNEL_VALUE: "qq"
                                ,app_icon   : "@mipmap/icon_qq"]
    }
    xiaomi{
        applicationId "com.shi.androidstudio.multichannel.xiaomi"

        resValue "string", "app_name", "小米"
        resValue "bool", "auto_updates", 'true'
        resValue "drawable", "isrRank", 'true'

        buildConfigField "String", "ENVIRONMENT", '"我是小米首页"'

        manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"
                                ,app_icon   : "@mipmap/icon_xiaomi"]
    }
}

   

个人理解,如有错误请发我邮箱,万分感谢。

个人邮箱 :   jingkang554@163.com

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页