Skip to content

Cocos gameloader — Maven 集成

面向 宿主 App(应用商店 / 大厅)接入已发布的 gameloader AAR,下载并运行 Cocos Creator 2.4.15 jsb-link 游戏包。

只需依赖一个坐标,libcocos2dxapk-expansion-zipfileokhttp 由 POM 传递依赖自动拉齐。

快速体验成品底座见 快速演示


1. 坐标与产物

坐标版本示例说明
com.qcode.cocosstroe:gameloader1.0.7.20260810主库:下载缓存 + 引擎启动 + libcocos2djs.so
com.qcode.cocosstroe:libcocos2dx2.4.15Cocos Java 桥(传递)
com.qcode.cocosstroe:apk-expansion-zipfile1.0Play Expansion 辅助(传递)
com.squareup.okhttp3:okhttp3.12.13下载用(传递)

版本号以 Nexus maven-releases 实际发布为准。


2. 仓库配置

正式产物:

text
http://nexus.cluster.qcast.cn/repository/maven-releases/

根工程 build.gradle

groovy
allprojects {
    repositories {
        maven {
            url "http://nexus.cluster.qcast.cn/repository/maven-releases/"
            allowInsecureProtocol = true
        }
        google()
        mavenCentral()
    }
}

3. 添加依赖

application 模块:

groovy
dependencies {
    implementation "com.qcode.cocosstroe:gameloader:1.0.7.20260810"
}

一般 不要再手写 libcocos2dx / apk-expansion-zipfile

宿主环境要求

建议
minSdkVersion19
compileSdk≥ 34
ABIAAR 含 armeabi-v7aarm64-v8a;可用 ndk.abiFilters 裁剪
JDK与宿主 AGP 一致即可(编宿主不需要编 so)

Activity / 权限随 AAR Manifest 合并。权限:INTERNETACCESS_NETWORK_STATEACCESS_WIFI_STATE

组件:

  • org.cocos2dx.gameloader.GameLoaderActivityexported=true,进程 :cocosgame
  • org.cocos2dx.gameloader.CocosGameActivityexported=false,同进程)

退出游戏会结束 :cocosgame,尽量不影响宿主主进程。


4. 启动游戏

Intent 参数

Key / Action必填说明
Action com.qcode.cocosstroe.action.LOAD_GAME推荐启动 Loader
zip_url游戏 zip 下载地址
game_id缓存目录名;缺省用 zip 文件名。路径不安全字符会改成 MD5
max_cached_gamesInt,最多保留几个已装游戏(默认 4
max_cache_bytesLong/Int,解压后总大小软上限(默认 512MB

常量:org.cocos2dx.gameloader.GamePathHolder
ACTION_LOAD_GAMEEXTRA_ZIP_URLEXTRA_GAME_IDEXTRA_MAX_CACHED_GAMESEXTRA_MAX_CACHE_BYTES

也可用代码设置缓存上限:

java
GameCacheConfig.setMaxCachedGames(4);                 // ≥ 1
GameCacheConfig.setMaxTotalBytes(512L * 1024 * 1024); // ≥ 1MB

Java / Kotlin

java
import android.content.Intent;
import org.cocos2dx.gameloader.GamePathHolder;

Intent intent = new Intent(GamePathHolder.ACTION_LOAD_GAME);
intent.setPackage(getPackageName()); // 避免隐式 Intent 歧义
intent.putExtra(GamePathHolder.EXTRA_ZIP_URL,
    "http://cdn.release.qcast.cn/JsViewTestCase/cocos2d/测试用游戏包/eatme.zip");
intent.putExtra(GamePathHolder.EXTRA_GAME_ID, "eatme");
startActivity(intent);

或显式组件:

java
Intent intent = new Intent(this, org.cocos2dx.gameloader.GameLoaderActivity.class);
intent.putExtra(GamePathHolder.EXTRA_ZIP_URL, zipUrl);
intent.putExtra(GamePathHolder.EXTRA_GAME_ID, gameId);
startActivity(intent);

adb

YOUR_PACKAGE 换成宿主 applicationId

bash
adb shell am start -a com.qcode.cocosstroe.action.LOAD_GAME \
  -n YOUR_PACKAGE/org.cocos2dx.gameloader.GameLoaderActivity \
  --es zip_url "http://cdn.release.qcast.cn/JsViewTestCase/cocos2d/测试用游戏包/eatme.zip" \
  --es game_id "eatme"

行为简述

  1. game_id 缓存到 files/games/<id>/
  2. 已有可用包(含 main.js)则跳过下载
  3. 否则下载 → 原子解压 → 打开 CocosGameActivity
  4. 失败有错误提示与重试;返回/关闭可取消进行中的任务

默认 LRU:最多 4 个游戏、总缓存约 512MB、尽量保留 ≥64MB 可用空间。


5. 远程游戏包格式

必须是 Creator 2.4.15 Android(jsb-link) 产物,不要frameworks/

bash
cd YourGame/build/jsb-link
zip -r game.zip main.js project.json assets src jsb-adapter \
  -x "*.DS_Store" -x "*__MACOSX*"

要求:

  • zip 根目录main.js
  • 不支持 Web 构建(index.html
  • 若脚本加密,XXTEA 密钥须与底包一致;否则构建时关掉 encryptJs

6. 与宿主共存注意点

  1. 进程:游戏在 :cocosgame,不要假设与主进程共享静态内存
  2. 横屏sensorLandscape
  3. 无桌面图标入口:只能由宿主 Intent / adb 拉起
  4. so 体积:按需 abiFilters
  5. okhttp:传递 3.12.13,注意与宿主对齐
  6. ProGuard:保留 Cocos / JNI / 反射相关类

7. JS → Java 反射桥

游戏脚本可通过 jsb.reflection.callStaticMethod 调用 Java public static 方法。
底座还会注入 window.AppBridge,兼容小米渠道 AppBridge.call(json)

7.1 jsb.reflection.callStaticMethod

javascript
jsb.reflection.callStaticMethod(
  "org/cocos2dx/gameloader/AppBridge",  // 类名用 /,不要用 .
  "call",
  "(Ljava/lang/String;)V",
  jsonStr
);
Java 类型JNI
voidV
booleanZ
intI
floatF
StringLjava/lang/String;

只能调 public static;混淆时需 keep。

7.2 window.AppBridge(底座已注入)

javascript
window.AppBridge.call(JSON.stringify({
  action: "exitGame",
  data: {},
  callbackId: "cb_1"
}));
action行为
exitGamefinish 当前游戏 Activity(:cocosgame
其它仅 Log

扩展:在 Java AppBridge.call 里按 action 分支即可。

7.3 直接反射示例

javascript
var ret = jsb.reflection.callStaticMethod(
  "org/cocos2dx/gameloader/GameLoaderActivity",
  "pingFromJs",
  "(Ljava/lang/String;)Ljava/lang/String;",
  "hello"
);
// ret === "pong:hello"

反射进入的是 游戏进程,与大厅通信请用跨进程方案。


8. 自检清单