Cocos Game Android SDK

客户端接入、配置、运行与下载 · v0.1.5

目录:下载快速开始本地 AARGradle初始化打开游戏回调API我的记录热更新Demo验收

下载

compileSdk 35minSdk 26targetSdk 34JDK 17arm64-v8a

v0.1.5 问题修复:本人座位身份以后台座位数据为准;修复已入座仍提示「立即加入」、下注提示观战下注,以及入座成功后界面仍显示失败的问题。公共 API 无变更,宿主只需升级依赖版本,imUserId 仍需传正确值。

v0.1.4 兼容更新:「我的记录」接入后台注单查询,支持当前本桌 / 历史场次、筛选、周期切换与滑到底部自动分页;修复小屏下顶部手牌遮挡昵称。公共 API 无变更,宿主只需升级依赖版本。

v0.1.3 不兼容变更:GameSessionConfig 在 liveUserId 后新增必填参数 imUserId(登录响应 userinfo.imUserId),用于识别本人座位;每局结算后自动刷新余额。宿主升级后需补传该参数。

接入前准备

5 分钟快速接入

  1. 在 settings.gradle.kts 添加 GitHub Maven 仓库。
  2. 在 App 模块添加 game-sdk:0.1.5。
  3. 在主进程 Application 初始化 SDK。
  4. 客户端登录后创建 GameSessionConfig。
  5. 调用 openGame(activity, "niuniu", session)。
maven {
    url = uri("https://raw.githubusercontent.com/eathwinster-jk/cocos-game-android-sdk/main/repository")
}

implementation("com.eath.cocosgamesdk:game-sdk:0.1.5")
CocosGameSDK.getInstance().initialize(applicationContext)

val session = GameSessionConfig(
    websocketUrl, apiBaseUrl, liveUserId, imUserId, liveToken,
    sceneType, sceneId, 0, BuildConfig.VERSION_NAME, "Android"
)
CocosGameSDK.getInstance().openGame(activity, "niuniu", session)

SDK 不提供生产登录。UID、Token、Scene Type、Scene ID 必须由宿主客户端传入。

模式一:本地 AAR 接入

1. 复制文件

app/libs/game-sdk-0.1.5.aar

2. Gradle Groovy

android {
    compileSdkVersion 35
    defaultConfig {
        minSdkVersion 26
        targetSdkVersion 34
        ndk { abiFilters "arm64-v8a" }
    }
    packagingOptions { jniLibs { useLegacyPackaging true } }
}
dependencies {
    implementation files("libs/game-sdk-0.1.5.aar")
}

3. Kotlin DSL

android {
    compileSdk = 35
    defaultConfig {
        minSdk = 26
        targetSdk = 34
        ndk { abiFilters += "arm64-v8a" }
    }
    packaging { jniLibs { useLegacyPackaging = true } }
}
dependencies {
    implementation(files("libs/game-sdk-0.1.5.aar"))
}

模式二:Gradle 远程接入(推荐)

1. Kotlin DSL:settings.gradle.kts

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/eathwinster-jk/cocos-game-android-sdk/main/repository")
        }
    }
}

2. Kotlin DSL:app/build.gradle.kts

dependencies {
    implementation("com.eath.cocosgamesdk:game-sdk:0.1.5")
}

3. Groovy:settings.gradle

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/eathwinster-jk/cocos-game-android-sdk/main/repository")
        }
    }
}

4. Groovy:app/build.gradle

dependencies {
    implementation "com.eath.cocosgamesdk:game-sdk:0.1.5"
}

请固定版本号,不使用 + 或 latest 动态依赖。升级前应完成回归测试。

权限与混淆

AAR 已合并 INTERNET、ACCESS_NETWORK_STATE、VIBRATE 权限和游戏 Activity。

-keep class com.eath.cocosgamesdk.** { *; }
-keep class com.cocos.lib.** { *; }
-dontwarn com.cocos.lib.**

初始化 SDK

在主进程 Application 中只初始化一次,且早于其他 SDK 调用。

Java

public final class App extends Application {
    @Override public void onCreate() {
        super.onCreate();
        CocosGameSDK.getInstance().initialize(this);
    }
}

Kotlin

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        CocosGameSDK.getInstance().initialize(this)
    }
}

创建会话并打开游戏

Java

GameSessionConfig session = new GameSessionConfig(
    websocketUrl,
    apiBaseUrl,
    liveUserId,
    imUserId,
    liveToken,
    sceneType,
    sceneId,
    0,
    BuildConfig.VERSION_NAME,
    "Android"
);
CocosGameSDK.getInstance().openGame(this, "niuniu", session);

Kotlin

val session = GameSessionConfig(
    websocketUrl,
    apiBaseUrl,
    liveUserId,
    imUserId,
    liveToken,
    sceneType,
    sceneId,
    0,
    BuildConfig.VERSION_NAME,
    "Android",
)
CocosGameSDK.getInstance().openGame(this, "niuniu", session)

UID、Token、Scene Type、Scene ID 必须由宿主客户端传入,不能固定写在 SDK 中。

会话失效与公共事件

会话失效

if (requestCode == CocosGameSDK.GAME_REQUEST_CODE
        && resultCode == Activity.RESULT_CANCELED
        && data != null
        && data.hasExtra(CocosGameActivity.EXTRA_SESSION_ERROR)) {
    clearLoginSession();
    openLoginPage();
}

Java 公共事件

CocosGameSDK.getInstance().setHostListener(
    (gameId, event, payloadJson) -> {
        if ("wallet.open".equals(event)) openWalletPage();
    }
);
CocosGameSDK.getInstance().sendGameEvent(
    "wallet.closed",
    "{\"isBalanceChanged\":true}"
);

Kotlin 公共事件

CocosGameSDK.getInstance().setHostListener { gameId, event, payloadJson ->
    if (event == "wallet.open") openWalletPage()
}
CocosGameSDK.getInstance().sendGameEvent(
    "wallet.closed",
    """{"isBalanceChanged":true}""",
)

公共 API

API用途调用方
initialize(context)初始化基础 SDKApplication
initialize(context, config)初始化并配置模块更新Application
openGame(activity, gameId, session)使用宿主会话打开游戏Activity
setHostListener(listener)接收 Cocos 通用事件宿主
sendGameEvent(event, payloadJson)向 Cocos 发送通用事件宿主
setUpdateListener(listener)接收下载、验签、安装状态宿主

GameSessionConfig 参数

参数规则
websocketUrl必须为 wss://
apiBaseUrl必须为 https://
liveUserId客户端登录后的直播 UID(登录响应 uid),用于大厅鉴权,大于 0
imUserId客户端登录后的 IM UID(登录响应 userinfo.imUserId),用于识别本人座位,大于 0
liveToken客户端登录后的有效 Token
sceneType1 直播间,2 IM 群
sceneId客户端当前场景 ID,不允许为空
tableId0 自动选择,正整数指定桌台
clientVersion宿主客户端版本
deviceTypeAndroid

客户端与 SDK 职责

客户端负责

  • 账号登录、Token 刷新和退出。
  • UID、Token、Scene Type、Scene ID。
  • 游戏入口、权限和风控判断。
  • 会话失效后返回登录流程。
  • 决定是否执行横竖屏切换。
  • 自定义钱包、充值或其他业务页面。

SDK 负责

  • Cocos Activity 和游戏模块加载。
  • 大厅 HTTP、WebSocket、重连和快照恢复。
  • 游戏资源、音频和生命周期。
  • 入座、下注、结算与界面状态。
  • 容器尺寸回传和游戏等比适配。
  • 固定退出、下注与通用事件桥。

Demo 登录模式

账号密码

Demo 调用测试登录接口,将服务端返回的 UID、Token 注入 GameSessionConfig。账号密码不写入 SDK,也不持久化。

UID Token

直接输入已有 UID、Token。两种模式都需要客户端输入或确认 Scene Type、Scene ID。

账号密码登录仅用于 Demo。正式客户端必须复用自身登录体系。

热更新接入

当前 AAR 内置首装游戏模块。启用远程模块更新时,客户端传入 SDK 发布方提供的目录地址、宿主版本、SDK API 版本、公钥和缓存上限。

GameSDKConfig updateConfig = new GameSDKConfig(
    catalogUrl,
    BuildConfig.VERSION_NAME,
    sdkApiVersion,
    ed25519PublicKey,
    200L * 1024L * 1024L
);
CocosGameSDK.getInstance().initialize(applicationContext, updateConfig);
CocosGameSDK.getInstance().setUpdateListener(updateListener);
状态说明
checking检查目录与兼容版本
downloading下载独立游戏模块
verifying校验签名与 SHA-256
installing安装并原子切换版本
ready模块可启动
rollback启动失败,回滚稳定版本
failed更新失败

不启用远程更新时只调用 initialize(context)。

生命周期、旋转与弹窗

我的记录接入

「我的记录」由 SDK 内置实现,客户端无需调用任何新 API、无需注册回调,升级到 v0.1.4 及以上即可使用。用户在游戏内点击「规则」按钮,切换到「我的记录」页签即可查看本人注单,页面以原生弹窗展示。

工作方式

页面功能

页签功能
当前本桌本桌完成局数、本人赢/输、本人净输赢;全部 / 在座下注 / 观战跟注筛选
历史场次最近 30 天 / 最近 7 天 / 今天;来源筛选与桌号、局号搜索;按桌台和日期分组并展示区间汇总

客户端需确认

运行测试 Demo

源码:cocos-game-android-demo

  1. 下载上方 Demo APK,安装到 API 26 以上的 ARM64 设备;或克隆源码构建。
  2. 输入 Scene Type:1 直播间,2 IM 群。
  3. 输入当前 Scene ID。
  4. 选择账号密码登录,或输入 Live User ID、IM User ID、Live Token。
  5. 点击对应按钮打开游戏。
adb install -r game-sdk-demo-0.1.5.apk

常见问题

Gradle 无法下载

确认可访问 raw.githubusercontent.com,然后执行 ./gradlew --refresh-dependencies。

x86 模拟器不能运行

当前 SDK 仅包含 arm64-v8a,请使用 ARM 模拟器或 ARM64 真机。

提示 sessionConfig 不能为空

SDK 不允许无会话启动。客户端必须先传入 UID、Token、Scene Type、Scene ID。

会话认证失败

确认 UID 与 Token 匹配、未过期,HTTP 与 WebSocket 属于同一环境。

我的记录加载失败或为空

确认大厅网关已开放 /api/lobby/bet/table/mine 与 /api/lobby/bet/history,Token 未过期;当前本桌需先成功进入桌台,历史场次可切换为最近 30 天查看。

找不到桌台

确认 Scene Type、Scene ID 以及后台开桌场景完全一致。

AAR 冲突或找不到 native 库

确认仅保留一个 SDK 版本、启用 arm64-v8a,并检查 APK 中存在 lib/arm64-v8a/libcocos.so。

上线验收清单

SDK v0.1.5 · 页面仅包含客户端接入信息,不包含业务源码。