为什么要签名打包
签名是为了标识唯一程序,因为每个App
间的包名是可能重复的。
什么是多渠道
渠道是国内Android
的特有名词,因为google play
不能在国内使用,因此出现了众多市场 ,例如华为,小米,乐视应用商店,华为应用商店,就是一个渠道。小米应用商店又是一个渠道。一个渠道就代表一个市场。
使用场景
如果应用只针对某个平台,则无需多渠道(几乎不存在),只要应用提供多种下载途径,就会用到多渠道,例如:官网下载,应用宝下载,360下载。
标识渠道名的作用
打包会生成各渠道对应的App
,通过该渠道的表现(下载量,和日活),而相应的决定在这个渠道上是否要加大力度推广等。
友盟统计
a)添加友盟统计依赖
build.gradle
implementation 'com.umeng.analytics:analytics:latest.integration'
b)在AndroidManifest
配置相关信息
AndroidManifest.xml
<!--友盟统计meta-->
<!--app key-->
<meta-data
android:name="UMENG_APPKEY"
android:value="588c5ab6ae1bf87552001aee"/>
<!--渠道号-->
<!--这里写占位符-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENC_CHANNEL_VALUE}"/>
c)build.gradle动态替换占位符
在build.gradle
中配置默认的渠道号信息,如果没有添加其他渠道,那么就是默认的渠道。
build.gradle
defaultConfig {
applicationId "rc.loveq.umengdemo"
minSdkVersion 21
targetSdkVersion 22
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [UMENC_CHANNEL_VALUE: "umeng"]
flavorDimensions "versionCode"
}
一般我们是在release
中打多渠道包
signingConfigs {
debug {}
//为release添加签名文件配置
release {
storeFile file("umeng.jks")
storePassword "umeng123"
keyAlias "key0"
keyPassword "umeng123"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
添加渠道信息
productFlavors {
xiaomi{
manifestPlaceholders = [UMENC_CHANNEL_VALUE: "xiaomi"]
}
wandoujia{
manifestPlaceholders = [UMENC_CHANNEL_VALUE: "wandoujia"]
}
}
当然了如果觉得上面多渠道的配置麻烦,还可以通过这样配置
productFlavors {
xiaomi {
}
wandoujia {
}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENC_CHANNEL_VALUE: name]
}
通过上面三步,就完成了多渠道的配置了,下面我们开始打包,在控制台输入
gradlew assembleRelease
这将打出所有的release
包,此时outputs
目录是这样的
可以看到,wandoujia
包和xiaomi
包已经打出来了。在友盟控制平台可以看到
证实我们多渠道打包已经成功。
gradlew assembleDebug
打出所有的debug
包
gradlew assemblexiaomiRelease
打出小米Release
包
根据不同渠道打的app_name
有时候根据渠道的不同,打对应的app_name,我们可以这样做
productFlavors {
xiaomi {
resValue "string" ,"app_name","xiaomi_app"
}
wandoujia {
resValue "string","app_name","wandoujia_app"
}
}
注意:如果这样做必须把在strings.xml
中原有的app_name
去掉,不然编译不通过。
根据功能不同同时安装两个App
有时候会有两个不同功能的app,但是因为包名相同不能同时安装到手机,这样会给测试带来不便,在打包的时候我们可以这样做
productFlavors {
okhttp {
applicationIdSuffix "okhttp"
resValue "string", "app_name", "okhttp_app"
}
volley {
applicationIdSuffix "volley"
resValue "string", "app_name", "volley_app"
}
}
可以看到,同时两个app都安装上了。