Android studio多渠道打包,同时附上debug运行正式签名的apkAnd自定义渠道apk文件名

接手项目后发现公司的渠道信息统计使用的友盟,但是仔细查看代码后发现打包的方式特别麻烦,换渠道都得手动更改渠道值,于是才有了更改打包方式的

想法,就以友盟多渠道打包为例,下面附上代码.

渠道信息一般在AndroidManifest.xml中的meta-data中更改ChannelID:

但是以上方式每次换渠道都需要手动更改.所以改用偷懒的方式:

其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定义配置的值。

在build.gradle中加入渠道列表:
 productFlavors {
        meizu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
        }

        baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }

        c360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
        }

        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        huawei {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
        }
        yingyongbao {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
        }
        leshi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "leshi"]
        }

    }
当然,还有另外一种更简洁的方式:

productFlavors {
 
wandoujia {}
baidu {}
c360 {}
uc {}
 
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
 
}
其他的配置按照开发文档配置就ok了.再附上获取渠道的代码:

public static String getChannelName(Context context) {
		if (context == null) {
			return null;
		}
		String channelName = null;
		try {
			PackageManager packageManager = context.getPackageManager();
			if (packageManager != null) {
				//注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
				ApplicationInfo applicationInfo = packageManager.
						getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
				if (applicationInfo != null) {
					if (applicationInfo.metaData != null) {
						channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
					}
				}

			}
		} catch (PackageManager.NameNotFoundException e) {
			e.printStackTrace();
		}
		return channelName;
	}


再来说debug运行正式签名apk,为什么要debug运行正式签名的apk呢?由于第三方登录分享和支付需要与正式签名一致,所以需要debug运行正式

签名的apk,只是方便测试回调.多的不说直接附上代码:

在build.gradle中加入signingConfigs:

signingConfigs {
        release {
            storeFile file("签名key的路径")
            storePassword "*****"
            keyAlias "****"
            keyPassword "****"
        }
    }
在BuildTypes中加入代码:

debug {
//            // 显示Log buildConfigField "boolean", "LOG_DEBUG", "true"
//          versionNameSuffix "-debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.release
        }
ok了,测试debug运行的就是正式签名的apk了.

剩下的就是自定义打包的apk名称了.

 release {
            // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false"
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为xxx_v1.0_2016-08-26_wandoujia.apk  xxx可以进行自定义
                        def fileName = "我的apk_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
    }
其中releaseTime的方法:

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
OK了.that's all!!!










你可能感兴趣的:(Android)