app/build.gradle 文件
第一步:
1.主要是通过gradle语言中的alllicationVarient变量all方法获取所有值,继而对all遍历varient->varient.outputs.each,通过output变量中的processManifest中的doLast业务:
第二步:
2:处理doLast的业务时:拼接对应的位置的AndroidManifest.xml,继而进行替换文件中的指定的字符串的值umeng_channel_value指定字符的值!
第三步:
3:通过判断varient.productFlavors[0].name名称是否为指定一个固定的"devloper"名称,如果是:将AndroidManifest文件中的第三方的key替换成 gradle.properties文件中一些常量值!反之,替换成一些另外的一些值!
第四步:
4:将mainfest文件路径,通过java文件对象将替换后字符串内容,写入到文件中!
output.processResources.manifestFile =
file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
具体的代码逻辑:
android.applicationVariants.all { variant ->
variant.outputs.each
{
output ->
output.processManifest.doLast {
//之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
//${buildDir}是指./build文件夹
//${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
//下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
// System.out.println("develop output.dirName:"+${output.dirName}+"..variant.productFlavors[0].name:"+variant.productFlavors[0].name+"..
output.productFlavors[0].name:"+output.productFlavors[0].name);
// System.out.println("develop output.dirName:"+${output.dirName});
def manifestFile =
"${buildDir}/intermediates/manifests/full/${output.dirName}/AndroidManifest.xml"
// System.out.println("develop variant.productFlavors[0].name:" + output.productFlavors[0].name);
//将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
//替换包名、appkey
if ("devlop".equalsIgnoreCase("${variant.productFlavors[0].name}")) {
System.out.println("develop");
updatedContent = updatedContent.replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_DEBUG}").
replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_DEBUG}").
replaceAll("NETEASE_APPKEY_VALUE", "${project.NETEASE_APPKEY_VALUE_DEBUG}");
} else {
System.out.println("develop else");
updatedContent = updatedContent.replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_PRODUCT}").
replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_PRODUCT}").
replaceAll("NETEASE_APPKEY_VALUE", "${project.NETEASE_APPKEY_VALUE_PRODUCT}");
}
new File(manifestFile).write(updatedContent, 'UTF-8')
// def testFile="D://${variant.productFlavors[0].name}.txt";
// new File(testFile).write(updatedContent, 'UTF-8')
//将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
output.processResources.manifestFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
}
}
}
第五步:
5.需要将gradle.properties中的配置文件中的第三方平台的键appkey的信息动态地配置进来:
UMENG_APPKEY_VALUE_DEBUG=58a26f4275ca3506ff00014a: 友盟测试环境下的key
UMENG_APPKEY_VALUE_PRODUCT=58a26e70734be46f2b000243:友盟正式环境下的key
JPUSH_APPKEY_VALUE_DEBUG=c43681960f7292c56b41280a: 极光测试环境下的key
JPUSH_APPKEY_VALUE_PRODUCT=2d361c168b81de1a6d1a73d1 极光正式环境下的key
NETEASE_APPKEY_VALUE_DEBUG=0ae09ff2cf01cf43d6e66d23ed87b0bf :云信测试环境下的key
NETEASE_APPKEY_VALUE_PRODUCT=27b526714268b831ae835958fa0c40cf 云信正式环境下的key
第六步:
6:一般分构建类型和产品多配置打包类型:
*构建类型中分为release 和debug 版,主要分别相关的签名相关的信息*
具体代码如下
signingConfigs {
/**
* 设置你的keystore相关
* demo中只是一个示例,使用时请根据实际情况进行配置
*/
debug {
//keystore中key的别名
keyAlias 'unipus'
//keystore中key的密码
keyPassword 'unipus'
//keystore的文件路径,可以使绝对路径也可以是相对
storeFile file('unipus.jks') 放入到当前路径下的jks的文件!
//keystore的密码
storePassword 'unipus'
}
release {
//keystore中key的别名
keyAlias 'unipus'
//keystore中key的密码
keyPassword 'unipus'
//keystore的文件路径,可以使绝对路径也可以是相对
storeFile file('unipus.jks') 放入到当前路径下的jks的文件!
//keystore的密码
storePassword 'unipus'
}
}
.而多个产品配置打包,可能涉及到不同产品发布平台中的一些的配置信息,注意平台中一般 不在manifest文件 中 不配置第三方开发的appkey!
productFlavors {
devlop {
applicationIdSuffix ".dev" 将包名动态改变!
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet.dev",UMENG_CHANNEL_VALUE:
name]
}
unipus {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
yingyongbao {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
zhushou360 {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
xiaomi {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
baidu {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
huawei {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
wandoujia {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
}
}
注意开发项目时,一定要做好项目多个平台下的release和debug两种构建类型动态参数的设置
buildTypes {
debug {
applicationIdSuffix ".dev" //测试环境下的包名
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet.dev",UMENG_CHANNEL_VALUE: name,NIM_PACKAGE:"cn.unipus.ispeak.cet.dev",UMENG_APPKEY_VALUE:"${project.UMENG_APPKEY_VALUE_DEBUG}",JPUSH_APPKEY_VALUE:"${project.JPUSH_APPKEY_VALUE_DEBUG}",NETEASE_APPKEY_VALUE:"${project.NETEASE_APPKEY_VALUE_PRODUCT}"]//对应第三方开发appKey配置
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
release {
manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name,NIM_PACKAGE:"cn.unipus.ispeak.cet",UMENG_APPKEY_VALUE:"${project.UMENG_APPKEY_VALUE_PRODUCT}",JPUSH_APPKEY_VALUE:"${project.JPUSH_APPKEY_VALUE_PRODUCT}",NETEASE_APPKEY_VALUE:"${project.NETEASE_APPKEY_VALUE_PRODUCT}"]
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
// 自定义输出配置
}
applicationVariants.all { variant -> //为最后生成apk文件命名!
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk') && outputFile.name.contains("debug")) {
// 输出apk名称为iSpeak_v1.0_wandoujia.apk
def fileName = "iSpeak_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_debug.apk"
output.outputFile = new File(outputFile.parent, fileName)
}else if(outputFile != null && outputFile.name.endsWith('.apk') && outputFile.name.contains("release")){
// 输出apk名称为iSpeak_v1.0_wandoujia.apk
def fileName = "iSpeak_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_release.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
网友评论