前言
本文专注于Android友盟多渠道打包,具体的统计请查看友盟官网 https://www.umeng.com/。
一 、获取Appkey
集成友盟SDK之前,首先需要到友盟官网注册并且添加新应用,获取Appkey(一般公司项目不需要自己申请账号,跟项目经理要即可)。每个应用对应的Appkey是唯一的,如下:
二、导入SDK
1、在app的builde.gradle中添加依赖
implementation 'com.umeng.sdk:common:latest.integration'
implementation 'com.umeng.sdk:analytics:latest.integration'
如果无法正常集成,则需要在项目的builde.gradle中添加如下配置:
allprojects {
repositories {
mavenCentral()
}
}
2、添加权限
<!--4个必须添加的权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
3、配置Appkey , 和渠道 mata-data 最好写在Application下 后续可能会对你有用
<application
...
<!--友盟 Appkey 自己应用注册申请来的-->
<meta-data
android:name="UMENG_APPKEY"
android:value="......." />
<!--渠道号,多渠道这里使用了占位符$-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
...
</application>
4、配置app下的builde.gradle如下:
对这个我想大家应该不陌生吧,我就不对说了。不会的上网查 gradle 配置打包
//签名信息配置
signingConfigs {
net_core {
storeFile file('E:/apk/dabao.jks')
storePassword '123456'
keyAlias 'apk'
keyPassword '123456'
}
}
添加一个默认的渠道号
defaultConfig {
...
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "default_channel"]//添加一个默认渠道号
}
下面配置你要生成的渠道
productFlavors {
default_channel {}
huawei {}
oppo {}
xiaomi {}
yiyongbao {}
vivo {}
_360 {}
...
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
对应的签名信息配置
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.net_core
}
debug {
signingConfig signingConfigs.net_core
}
其实现在就可以进行打包了, 在Termainal中输入命令 gradlew assembleRelease 就会进行自动打包
中间我有踩到一个坑,很多博客上是没写明的就是一直报这个错
都配置好了却出现这个错误,怎么办?
在build.gradle中添加 flavorDimensions "versionCode"解决问题
android{
defaultConfig{
...
flavorDimensions "versionCode"
...
}
}
我这个项目是有要求的,需要修改apk文件名
大家可以查看 修改apk名
完整app的builde.gradle如下:
apply plugin: 'com.android.application'
android {
//签名信息配置
signingConfigs {
net_core {
storeFile file('E:/apk/dabao.jks')
storePassword '123456'
keyAlias 'apk'
keyPassword '123456'
}
}
compileSdkVersion 27
defaultConfig {
applicationId "com.ning.dabao"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "default_channel"]//添加一个默认渠道号
}
flavorDimensions "a"
productFlavors {
default_channel {}
huawei {}
oppo {}
xiaomi {}
yiyongbao {}
vivo {}
_360 {}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.net_core
android.applicationVariants.all { variant ->
variant.outputs.all {
//这里修改apk文件名
outputFileName = "${variant.productFlavors[0].name}.apk"
}
}
}
debug {
signingConfig signingConfigs.net_core
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
/*友盟统计需要的最新版本组件化基础库和统计SDK*/
implementation 'com.umeng.sdk:common:latest.integration'
implementation 'com.umeng.sdk:analytics:latest.integration'
}
在Termainal中输入命令 gradlew assembleRelease 就会进行自动打包
在我的项目中需要用 渠道名称
/**
* 获取渠道名
* @param context 此处习惯性的设置为activity,实际上context就可以
* @return 如果没有获取成功,那么返回值为空
*/
public String getChannelName() {
String channelName = null;
try {
PackageManager packageManager = this.getPackageManager();
if (packageManager != null) {
//注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是某activity标签中,所以用ApplicationInfo
ApplicationInfo applicationInfo = packageManager.
getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
channelName = String.valueOf(applicationInfo.metaData.get("UMENG_CHANNEL"));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return channelName;
}