app/build.gradle 文件
第一步:
1.主要是通過gradle語言中的alllicationVarient變量all方法獲取所有值丘薛,繼而對all遍歷varient->varient.outputs.each,通過output變量中的processManifest中的doLast業(yè)務:
第二步:
2:處理doLast的業(yè)務時:拼接對應的位置的AndroidManifest.xml,繼而進行替換文件中的指定的字符串的值umeng_channel_value指定字符的值!
第三步:
3:通過判斷varient.productFlavors[0].name名稱是否為指定一個固定的"devloper"名稱,如果是:將AndroidManifest文件中的第三方的key替換成 gradle.properties文件中一些常量值!反之空凸,替換成一些另外的一些值!
第四步:
4:將mainfest文件路徑,通過java文件對象將替換后字符串內(nèi)容迷殿,寫入到文件中谈火!
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的信息動態(tài)地配置進來:
UMENG_APPKEY_VALUE_DEBUG=58a26f4275ca3506ff00014a: 友盟測試環(huán)境下的key
UMENG_APPKEY_VALUE_PRODUCT=58a26e70734be46f2b000243:友盟正式環(huán)境下的key
JPUSH_APPKEY_VALUE_DEBUG=c43681960f7292c56b41280a: 極光測試環(huán)境下的key
JPUSH_APPKEY_VALUE_PRODUCT=2d361c168b81de1a6d1a73d1 極光正式環(huán)境下的key
NETEASE_APPKEY_VALUE_DEBUG=0ae09ff2cf01cf43d6e66d23ed87b0bf :云信測試環(huán)境下的key
NETEASE_APPKEY_VALUE_PRODUCT=27b526714268b831ae835958fa0c40cf 云信正式環(huán)境下的key
第六步:
6:一般分構建類型和產(chǎn)品多配置打包類型:
*構建類型中分為release 和debug 版笛求,主要分別相關的簽名相關的信息*
具體代碼如下
signingConfigs {
/**
* 設置你的keystore相關
* demo中只是一個示例廊移,使用時請根據(jù)實際情況進行配置
*/
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'
}
}
.而多個產(chǎn)品配置打包狡孔,可能涉及到不同產(chǎn)品發(fā)布平臺中的一些的配置信息,注意平臺中一般 不在manifest文件 中 不配置第三方開發(fā)的appkey!
productFlavors {
devlop {
applicationIdSuffix ".dev" 將包名動態(tài)改變!
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]
}
}
注意開發(fā)項目時蜂嗽,一定要做好項目多個平臺下的release和debug兩種構建類型動態(tài)參數(shù)的設置
buildTypes {
debug {
applicationIdSuffix ".dev" //測試環(huán)境下的包名
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}"]//對應第三方開發(fā)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)
}
}
}
}