目录
前言
1. 准备阶段
1.1 创建华为应用
1.2 查看应用 AppID,SecretKey
1.3 开通权限和应用配置
2. 添加辅助 SDK 及相关配置
2.1 Maven 自动导入
2.1.1 添加 Maven 库地址
2.1.2 配置依赖
2.2 手动导入
2.2.1 导入辅助 SDK
2.2.2 配置辅助 SDK 相关参数
3. Proguard 混淆配置
本文档介绍 Android Studio 开发环境下手动方式导入 SDK 资源进行多厂商推送 SDK 集成的步骤,配置相对复杂,需要仔细阅读文档和 Demo 工程。
辅助推送:个推推送针对华为设备管控较严的情况特意接入华为推送作为辅助通道以提高在华为设备上的到达率。个推推送优先选择个推通道进行消息下发,只有在个推通道断连时选择辅助通道下发消息。华为推送在下发透传消息时并不保证会拉起被杀死进程,所以辅助通道在进程被杀死情况下无法保证透传消息一定到达。
辅助推送启用条件:华为 rom 且华为 rom 版本大于等于 emui4.1,华为移动服务(可在应用列表或华为应用市场中查看)版本大于等于 2.5.2
功能接口对辅助 SDK 的差异处理
| API 接口 | 华为辅助 SDK |
| ------| ------ |
| stopService(Context context) | 不会停止华为辅助 SDK |
| setSilentTime(Context context,int beginHour,int duration) | 不会静默华为辅助 SDK|
| turnOffPush(Context context) | 部分 emui 版本无法关闭华为辅助 SDK,如 emui 5.0 以下|
请参考 Getui_SDK_Demo_AS_manufacture
Demo 工程
本文默认您已经完成了个推推送 SDK 的集成以及掌握了基本的 Android 基础知识
Getui_SDK_Demo_AS_manufacture/
|- app/ (项目主模块)
| |- libs/ (第三方库)
| |- src/ (代码目录)
| |- build.gradle (模块级 gradle 文件)
|- gradle/
|- build.gradle (顶层 gradle 文件)
|- settings.gradle
| ......
注:其中 “......
” 表示省略其他与本教程无关的配置内容,以下 “......
” 表示相同意义,不再重复说明。说明:该阶段主要介绍了如何创建华为应用及开通相关的应用权限配置,如果您已经完成该阶段,可以直接进入下一阶段。
参见华为官方文档 创建应用 章节。
登录 AppGallery Connect 网站,选择“我的应用”。打开刚才创建的应用,查看应用信息中相应的华为 AppID、华为 SecretKey。该信息在之后步骤中将会使用,如下图:
打开个推开发者中心,选择对应的推送应用,找到配置管理,点击,如下图:
注:该步骤有俩种实现方式,可以使用 maven 库自动导入方式(推荐)或者手动导入方式,俩者选一即可。
在以项目名为命名的顶层 build.gradle
文件的 allprojects.repositories 中,添加个推 maven 库地址 http://mvn.gt.igexin.com/nexus/content/repositories/releases/
如下所示:
buildscript {
repositories {
jcenter()
}
......
}
allprojects {
repositories {
jcenter()
//添加 Maven URL 地址
maven {
url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
}
}
说明:该步骤需要在模块级别 app/build.gradle
中配置对应的 SDK 依赖库以及华为辅助应用参数,如下:
配置 sdk 依赖
在 app/build.gradle
文件中的 dependencies
块中引用个推辅助 SDK 依赖库 com.getui:hwp:${version}
,此处的 ${version}
对应您当前获取到相应的 SDK 版本号,如下所示:
......
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.getui:hwp:${version}' //请将此处的 ${version} 替换成您当前相应的 SDK 版本号,例如 1.0.6
......
}
配置应用参数
在 app/build.gradle
文件中的 android.defaultConfig
块中添加 manifestPlaceholders
块,配置相关的应用参数(参见【步骤 1】准备阶段),如下 manifestPlaceholders
中的内容所示:
......
android {
defaultConfig {
......
manifestPlaceholders = [
//华为相关应用参数,请填写您获取到的 HUAWEI_APP_ID 值
HUAWEI_APP_ID : ""
......
]
......
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.getui:hwp:${version}' //请将此处的 ${version} 替换成您当前相应的 SDK 版本号,例如 1.0.6
......
}
请根据【步骤 1】准备阶段
中获取到的应用参数填写 HUAWEI_APP_ID
的值,最终的 app/build.gradle
的大致结构如下所示:
......
android {
defaultConfig {
......
manifestPlaceholders = [
//个推应用参数,请填写您获取到的应用参数值
GETUI_APP_ID : "",
GETUI_APP_KEY : "",
GETUI_APP_SECRET : "",
//华为相关应用参数,请填写您获取到的 HUAWEI_APP_ID 值
HUAWEI_APP_ID : ""
......
]
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.getui:hwp:${version}' //请将此处的 ${version} 替换成您当前相应的 SDK 版本号,例如 1.0.6
......
}
手动导入主要分为导入辅助 SDK 和配置辅助 SDK 参数俩步骤,详细步骤见下文(以下集成步骤假设项目主模块名为 app。):
下载辅助 SDK 资料包,若集成过老版本,务必使用最新资源文件进行替换,辅助 SDK 资料包结构如下:
GETUI_ANDROID_HW_SUPPORT/
|- readme.txt (SDK 资料包说明)
|- 接入文档/ (Android SDK 相关集成文档 PDF 版本)
|- 资源文件/
| |- GetuiSDK-support-HWP-<version>.jar
| |- assets/
| | |- hmsrootcas.bks
| |- res/
| | |- layout/
| | |- hms_download_progress.xml
| | |- hwpush_layout2.xml
| | |- upsdk_app_dl_progress_dialog.xml
| | |- upsdk_ota_update_view.xml
| | |- drawable/
| | |- upsdk_cancel_bg.xml
| | |- upsdk_third_download_bg.xml
| | |- upsdk_update_all_button.xml
| | |- drawable-xhdpi-v4/
| | |- upsdk_btn_emphasis_normal_layer.9.png
| | |- upsdk_cancel_normal.png
| | |- upsdk_cancel_pressed.png
| | |- values/
| | |- values.xml
| | |- values-zh-rCN/
| | |- values.xml
| - Demo 工程/
| |- Getui_SDK_Demo_AS_manufacture/ (Android Studio 多厂商推送集成 Demo 工程)
将 SDK 资料包GETUI_ANDROID_HW_SUPPORT/资源文件
目录下的 GetuiSDK-support-HWP-<version>.jar
复制到 app
模块目录下的 libs
文件夹中,此处的 <version>
为 SDK 对应的版本号如下图所示:
Getui_SDK_Demo_AS_manufacture/
|- app/
| |- libs/
| |- GetuiSDK-support-HWP-<version>.jar
| ......
打开 app/build.gradle
,在 dependencies
块中添加 implementation fileTree(dir: 'libs', include: ['*.jar'])
引用相应的 jar 包:
......
android {
......
}
dependencies {
// 该行配置将会编译 libs 目录下的所有 jar 文件
implementation fileTree(dir: 'libs', include: ['*.jar'])
......
}
将 SDK 资料包资源文件/res/
下的各种资源文件复制到 app
模块目录下的对应位置。
应华为应用市场审核要求,需要将 SDK 资料包资源文件/assets/
下的 hmsrootcas.bks
复制到app/src/main/assets
目录下。若不考虑上架华为应用市场,此文件可以不加,不影响推送。
说明:配置辅助 SDK 参数主要分为配置 app/build.gradle
文件中应用参数,配置 Manifest 中组件,配置 Manifest 中权限三步骤,具体如下:
配置应用参数
在 app/build.gradle
文件中的 android.defaultConfig
块中添加 manifestPlaceholders
块,配置华为推送辅助 SDK 相关的应用参数 HUAWEI_APP_ID
(参见【步骤 1】),如下图所示:
android {
defaultConfig {
......
manifestPlaceholders = [
......
//华为相关应用参数,请填写您获取到的 HUAWEI_APP_ID 值
HUAWEI_APP_ID : ""
......
]
......
}
......
}
......
请根据【步骤 1】获取到的应用参数填写 HUAWEI_APP_ID
的值,最终的 app/build.gradle
文件的大致结构如下:
android {
defaultConfig {
......
manifestPlaceholders = [
//个推应用参数,请填写您获取到的应用参数值
GETUI_APP_ID : "",
GETUI_APP_KEY : "",
GETUI_APP_SECRET : "",
//华为相关应用参数,请填写您获取到的 HUAWEI_APP_ID 值
HUAWEI_APP_ID : ""
......
]
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
......
}
在 Manifest中 配置辅助 SDK 组件:
在 AndroidManifest.xml
中需要正确配置辅助SDK所需的 Service、Activity、以及 BroadcastReceiver 等组件。请在 <application>
标签内增加以下组件配置(由于使用了 manifestPlaceholders
来做参数替换,因此以下配置无需手工修改,直接复制粘贴即可):
`
xml
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="appid=${HUAWEI_APP_ID}" />
<activity
android:name="com.huawei.android.hms.agent.common.HMSAgentActivity"
android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
android:excludeFromRecents="true"
android:exported="false"
android:hardwareAccelerated="true"
android:process=":pushservice"
android:theme="@android:style/Theme.Translucent">
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<activity
android:name="com.huawei.hms.activity.BridgeActivity"
android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale"
android:excludeFromRecents="true"
android:exported="false"
android:hardwareAccelerated="true"
android:process=":pushservice"
android:theme="@android:style/Theme.Translucent">
<meta-data
android:name="hwc-theme"
android:value="androidhwext:style/Theme.Emui.Translucent" />
</activity>
<receiver
android:name="com.igexin.sdk.HmsPushReceiver"
android:permission="${applicationId}.permission.PROCESS_PUSH_MSG"
android:process=":pushservice">
<intent-filter>
<!-- 必须,用于接收token -->
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<!-- 必须,用于接收消息 -->
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<!-- 必须, 用于接收通知栏消息点击事件 此事件不需要开发者处理,只需注册就可以-->
<action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY" />
</intent-filter>
</receiver>
<receiver
android:name="com.igexin.sdk.HmsPushSubReceiver"
android:process=":pushservice">
<intent-filter>
<!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调 -->
<action android:name="com.huawei.android.push.intent.CLICK" />
<!-- 可选,查看push通道是否连接,不查看则不需要 -->
<action android:name="com.huawei.intent.action.PUSH_STATE" />
</intent-filter>
</receiver>
<!--接入HMSSDK PUSH模块需要注册该service,不需要开发者处理-->
<service
android:name="com.huawei.hms.support.api.push.service.HmsMsgService"
android:enabled="true"
android:exported="true"
android:process=":pushservice">
<intent-filter>
<action android:name="com.huawei.push.msg.NOTIFY_MSG" />
<action android:name="com.huawei.push.msg.PASSBY_MSG" />
</intent-filter>
</service>
```
配置 manifest 中的权限值:
请在 <manifest>
根标签下加入辅助SDK所必需的权限,配置如下:
<!-- 华为辅助 SDK -->
<!--HMS-SDK引导升级HMS功能,访问OTA服务器需要网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--HMS-SDK引导升级HMS功能,保存下载的升级包需要SD卡写权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--检测网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--检测wifi状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--为了获取用户手机的IMEI,用来唯一的标识用户。-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--如果是安卓8.0,应用编译配置的targetSdkVersion>=26,请务必添加以下权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- 接收PUSH TOKEN的广播以及PUSH消息需要定义该权限-->
<permission
android:name="${applicationId}.permission.PROCESS_PUSH_MSG"
android:protectionLevel="signatureOrSystem" />
<!--接收PUSH TOKEN的广播以及PUSH消息需要定义该权限-->
<uses-permission android:name="${applicationId}.permission.PROCESS_PUSH_MSG" />
<!--开关厂商推送需要以下权限-->
<permission
android:name="${applicationId}.permission.PUSH_PROVIDER"
android:protectionLevel="signatureOrSystem" />
<permission
android:name="${applicationId}.permission.PUSH_WRITE_PROVIDER"
android:protectionLevel="signatureOrSystem" />
如果您的工程启用了 Proguard 混淆,即如果在 app/build.gradle
的 android.buildTypes.release
下配置了 minifyEnabled true
,为了避免辅助 SDK 被错误混淆导致功能异常,需要在 app/proguard-rules.pro
混淆配置文件中添加如下配置:
-dontwarn com.huawei.**
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.hianalytics.android.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
-keep class com.huawei.android.hms.agent.**{*;}
以上文档对您是否有帮助?