什么是渠道:
渠道是国内Android平台特有的名词
由于google play无法使用,因此出现了众多的市场
一个渠道代表一个应用市场应用场景:
如果只针对某个平台,则不需要多渠道(几乎不存在)
只要应用有多种下载途径,就需要多渠道多渠道的意义:
通过多渠道,我们可以详细统计app被下载的途径
通过多渠道,我们可以查看app在每个渠道中的表现
通过多渠道,可以更利于app的推广多渠道打包的原理:
就是为我们每个平台或市场的apk指定一个唯一的标识符
在Android中我们通常在Manifest.xml为其指定
在代码中指定,但是一般不用使用友盟步骤:
1、去友盟官网注册并创建应用,获取appkey
2、下载sdk并集成
3、在AndroidManifest.xml配置渠道号和appkey
</application>
<!-- 友盟统计相关meta-data -->
<meta-data
android:name="UMENG_APPKEY"
android:value="5a433eb3b27b0a188000000f"/>
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
</application>
${UMENG_CHANNEL_VALUE} 使用这个占位符是为了方便在gradle中动态配置。
4、在module中的builde.gradle中编写多渠道脚本
defaultConfig {
applicationId "com.example.administrator.mymulti_channel_package"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true //突破应用方法数65535的一个限制
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] //默认的渠道名,可以不设置此项
}
假设我们需要以下渠道:
productFlavors {
huawei{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
wandoujia{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
xiaomi{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
或者统一编写:
//真正的多渠道脚本支持
productFlavors {
huawei{
}
wandoujia{
}
xiaomi{
}
}
//批量修改
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
我的builde.gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.example.administrator.mymulti_channel_package"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true //突破应用方法数65535的一个限制
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] //默认的渠道名,可以不设置此项
}
//添加我们的签名文件配置
signingConfigs {
debug {
storeFile file("common.jks")
storePassword "123456"
keyAlias "libing"
keyPassword "123456"
}
//为我们的release添加签名文件配置
release {
storeFile file("common.jks")
storePassword "123456"
keyAlias "libing"
keyPassword "123456"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release //指定签名文件,如下signingConfigs
//指定我们release包的输出文件名就是我们的渠道名字
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith(".apk")) {
def fileName = "${variant.productFlavors[0].name}" + ".apk"
output.outputFile = new File(outputFile.parent, fileName);
}
}
}
}
debug {
signingConfig signingConfigs.debug //在debug模式下,使用正式的签名文件
}
}
productFlavors {
huawei {
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
wandoujia {
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
xiaomi {
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
}
//批量修改
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile files('libs/umeng-analytics-7.4.1.jar')
compile files('libs/umeng-common-1.4.1.jar')
}
5、执行打包命令 ./gradlew assembleRelease
除了使用AndroidStudio图形打包操作以外,我们也可以使用命令行进行打包操作,具体步骤如下:
在AndroidStudio窗口左下角打开Terminal面板,输入gradlew assembleRelease命令
如果系统中没有安装Gradle,则会自动下载完成安装及初始化, 初始化完成后,再次执行 gradlew assembleRelease:
注意:使用Gradle进行安卓编译时,出现如下错误:
Could not get unknown property ‘release’ for SigningConfig container.
原因:
在主module下的buildTypes{}中使用使用了signingConfig signingConfigs.release,但是由于粗心,将signingConfigs{}放到了buildType{}的后面,导致编译的时候无法找到,当然还有一种可能,那就是signingConfigs{}中真的没有声明release这个属性.