对于我需要解决的问题是:
(测试包的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