GroMore Android 接入指南
本文档指导开发者在 Android 端将优聚智汇 SDK 以**自定义广告网络(自定义 ADN)**形式接入穿山甲 GroMore 聚合平台(穿山甲融合 SDK com.pangle_beta.cn:mediation-sdk,含 GroMore 聚合能力),由 GroMore 调度优聚广告参与瀑布流 / Client Bidding。
阅读前置
请先阅读 自定义广告平台概述,了解反向集成模式与核心概念。本文仅介绍 Android 端的依赖引入、平台配置与注意事项。
GroMore 自定义 ADN 官方接入规范:https://www.csjplatform.com/supportcenter/28709(信息流交付路径另见官方文档 28689)
版本号说明
| 组件 | 当前版本 | 说明 |
|---|---|---|
| uju-custom-gromore-adapter | 3.4.5 | 优聚 GroMore 反向聚合适配器,版本号与 uju-ad-core 对齐 |
| uju-ad-core | 3.4.5 | 优聚核心 SDK,由适配器运行时调用(宿主必须引入) |
| uju-ad-ext | 1.3.3 | 优聚智汇预算扩展包,可选(推荐,扩展广告填充来源) |
| 穿山甲 mediation-sdk | 7.5.1.0 | 穿山甲融合 SDK(含 GroMore 聚合能力),由宿主自行引入(适配器以 compileOnly 方式依赖) |
开发环境要求
| 项目 | 要求 |
|---|---|
| 最低系统版本 | Android 8.0(API 26,优聚核心 SDK 要求);适配器模块自身 minSdk 21 |
| Java | Java 11 或更高版本 |
| Kotlin | Kotlin 1.8 或更高版本 |
| Gradle | 8.0+ |
| AndroidX | 需启用(android.useAndroidX=true) |
| 依赖工具 | Android Studio / Gradle |
SDK 组件关系
┌──────────────────────────────────────────────┐
│ 集成方 App │
├──────────────────────────────────────────────┤
│ 穿山甲融合 SDK(mediation-sdk,宿主引入) │
│ └── GroMore 聚合 │
│ ↓ 运行时通过反射实例化适配器 │
│ uju-custom-gromore-adapter(必选) │
│ └── com.ujusdk.revcsj.UjuCustomer* │
│ ↓ 运行时调用(编译期 compileOnly) │
│ uju-ad-core(必选,宿主引入) │
│ ├── 优聚 Adx 竞价引擎 / 埋点上报 │
│ └── 广告加载 / 渲染 / 展示 │
│ uju-ad-ext(可选,推荐) │
│ └── 内部 DSP 适配器(已内嵌打包) │
└──────────────────────────────────────────────┘支持广告类型:开屏 / 插屏(全屏视频通道)/ 激励视频 / Banner / 信息流(模板渲染);支持 Client Bidding(适配器内部完成 ECPM 元 → 分的换算上报)。
集成方式
方式一:Maven Central 集成(推荐)
在 app 模块的 build.gradle.kts 中添加:
dependencies {
// 优聚核心 SDK(必选)
implementation("com.ujusdk:uju-ad-core:3.4.5")
// 优聚 GroMore 反向适配器(必选)
implementation("com.ujusdk:uju-custom-gromore-adapter:3.4.5")
// 穿山甲 GroMore 融合 SDK(必选,宿主自行引入)
implementation("com.pangle_beta.cn:mediation-sdk:7.5.1.0")
// 可选:预算扩展包(扩展广告填充来源)
// implementation("com.ujusdk:uju-ad-ext:1.3.3")
}并在工程根目录 settings.gradle.kts 中确保配置了以下仓库:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral() // 必须配置(优聚组件发布于 Maven Central)
// 穿山甲广告仓库
maven { url = uri("https://artifact.bytedance.com/repository/pangle") }
}
}方式二:本地 AAR 集成
- 获取产物:
uju-ad-core-3.4.5.aar、uju-custom-gromore-adapter-3.4.5.aar,放入 app 模块libs/目录 - 穿山甲融合 SDK 仍建议通过 Maven 引入(依赖链较复杂),或按穿山甲官方文档手动集成
- 声明依赖:
dependencies {
implementation(files("libs/uju-ad-core-3.4.5.aar"))
implementation(files("libs/uju-custom-gromore-adapter-3.4.5.aar"))
implementation("com.pangle_beta.cn:mediation-sdk:7.5.1.0")
}核心依赖不可省略
适配器对 uju-ad-core 与穿山甲 SDK 均为 compileOnly 依赖(由宿主 APP 提供),宿主必须显式引入两者,否则运行时类找不到直接崩溃。
混淆规则已内置
适配器类由 GroMore 运行时反射实例化,uju-custom-gromore-adapter 已通过 consumer-rules.pro 内置 keep 规则(保留 com.ujusdk.revcsj 包下全部类),宿主 release 混淆无需额外配置。
GroMore 平台配置
1. 新建自定义广告网络(穿山甲媒体平台 → GroMore → 广告网络 → + 自定义广告网络)
| 配置项 | 填写值 |
|---|---|
| 初始化 Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerInit |
| 开屏 Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerSplash |
| 插屏 Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerFullVideo(见下方「插屏与全屏视频说明」) |
| 激励视频 Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerReward |
| Banner Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerBanner |
| 信息流 Adapter 类全路径 | com.ujusdk.revcsj.UjuCustomerNative |
2. 应用管理 → 为应用添加自定义 ADN
| 字段 | 填写值 |
|---|---|
| App ID | 优聚智汇后台分配的 appId |
| App Key | 优聚智汇后台分配的 appKey |
3. 瀑布流管理 → 为广告位添加自定义 ADN 代码位
| 字段 | 填写值 |
|---|---|
| 代码位 ID | 优聚智汇后台分配的 placementId(直接映射) |
| 竞价类型 | 普通 / Client Bidding 均支持(Client Bidding 时适配器传回ecpm,单位分) |
| 渲染类型(信息流) | ADN 提供渲染(模板渲染)(优聚信息流由 SDK 内部模板渲染) |
| 自定义 json(可选) | {"bidFloor":1.5} — bidFloor 为底价(元,CPM),透传优聚 ADX 参与竞价 |
SDK 初始化
宿主初始化穿山甲
宿主只需按穿山甲官方流程初始化 GroMore(useMediation(true) 必开),不要自行调用 UjuAdSdk.init——优聚 SDK 由 GroMore 首次请求时反射调用 UjuCustomerInit.initializeADN() 完成初始化,参数取自 GroMore 后台「自定义广告网络账户信息」。建议采用 init + start(callback) 两段式,在回调确认初始化成功后再发起广告加载:
val config = TTAdConfig.Builder()
.appId("穿山甲媒体 AppID")
.appName("宿主应用名称")
.useMediation(true) // 必须开启,启用 GroMore 聚合,否则自定义 ADN 适配器不会被调用
.build()
TTAdSdk.init(this, config)
TTAdSdk.start(object : TTAdSdk.Callback {
override fun success() {
// GroMore 就绪(含自定义 ADN 初始化链路),可发起广告加载
}
override fun fail(code: Int, msg: String?) {
// 初始化失败:检查穿山甲后台包名绑定、网络等
}
})若宿主已自行初始化优聚 SDK 成功,GroMore 调用 initializeADN() 时优聚 SDK 的 start() 会检测到已完成状态并直接回调成功(幂等短路),不会重复初始化内部组件;适配器另内置防重入逻辑,应对 GroMore 本地配置 + 服务端配置更新触发的两次调用。
插屏与全屏视频说明(Android 特有)
穿山甲融合 SDK 7.x 已将传统插屏并入全屏视频通道:宿主通过 loadFullScreenVideoAd 加载插屏代码位是触发优聚链路的唯一方式。因此后台「插屏」对应的 Adapter 类必须为 UjuCustomerFullVideo;若后台无独立「插屏」字段,填在「全屏视频」字段。插屏的全屏/半屏样式由优聚后台代码位配置决定,适配器无需感知。
宿主加载与展示要点
- 信息流:聚合模式下统一经
loadFeedAd加载,优聚广告(模板渲染)与穿山甲自营自动参与竞价,价高者得,统一经TTFeedAd.getAdView()交付视图;宿主广告容器需layout_width=match_parent+layout_height=wrap_content,且容器须已挂载并有真实宽度,否则模板内容空白 - Client Bidding:加载时需设置
MediationAdSlot.Builder().setBidNotify(true)才能收到receiveBidResult比价回调;竞败的优聚广告对象已由适配器在回调内自动销毁,无需宿主处理 - 线程规范:适配器内部已遵循 GroMore 线程要求(
initializeADN/load在子线程执行、showAd前经线程切换断掉调用栈),宿主无感知
常见问题
| 现象 | 排查 |
|---|---|
| GroMore 日志提示自定义 ADN 类不存在 / 初始化无优聚日志 | 平台配置的类全路径是否与 com.ujusdk.revcsj.UjuCustomer* 完全一致;release 包确认适配器未被混淆(consumer-rules 已内置 keep) |
| 插屏无优聚日志、由穿山甲兜底填充 | 「插屏」是否误配 UjuCustomerInterstitial;7.x 下须配置 UjuCustomerFullVideo 并经 loadFullScreenVideoAd 加载 |
| 信息流加载不到优聚广告 | 是否经 loadFeedAd 加载(loadNativeExpressAd 为旧版封闭通道,候选池仅含穿山甲自营模板,平台设计如此);后台渲染类型须为「ADN 提供渲染(模板渲染)」;代码位 ID 须为优聚 placementId |
| 信息流模板内容空白 | 宿主容器是否已挂载且有真实宽度(width=0 时模板不渲染);容器宽度建议满屏宽(360dp) |
| 加载失败提示 SDK 未初始化 | 平台未配置初始化类全路径,或 App ID / App Key 为空、错误;适配器初始化在子线程异步进行,首个请求会挂起等待初始化完成后继续 |
| Client Bidding 比价价格异常 | 适配器内部按「元 × 100 = 分」换算上报,请确认使用 3.4.5 及以上版本;加载时是否设置 setBidNotify(true) |
| 无填充 | 确认宿主 applicationId 与穿山甲后台注册包名一致、GroMore 代码位已开启、优聚后台对应 placementId 已配置可用广告源 |
相关链接
- 自定义广告平台概述 — 反向集成模式与核心概念
- GroMore 自定义接入(iOS) — iOS 端反向接入指南
- ToBid 自定义接入 — Sigmob ToBid 反向接入指南
- Android 准备工作 — 优聚 Android SDK 标准集成(uju-ad-core 集成参考)
- 穿山甲对接指南(Android) — 优聚 SDK 正向调度穿山甲广告
