接入 Android

更新时间:
复制 MD 格式

前置条件

添加 SDK

选择基线

H5 小游戏支持定制基线版本。请参照 选择合适的基线 指南,添加 cp_change_114400936 基线以完成配置。

image.png

安装组件

在 app 的 build.gradle 中安装 nebula 组件依赖。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.so'])
    // 基线
    implementation platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
    // nebula组件
    implementation 'com.mpaas.android:nebula'
    ...
}

配置

在项目的 assets 下添加 config 目录,并在 config 目录下添加 custom_config.json 配置文件。

image.png

文件内容如下:

[
  {
  "key": "h5_support_litegame",
  "value": "YES"
  }
]

初始化 mPaaS

在使用 mPaaS 框架前需要进行一些初始化操作对 Application 对象进行改造。由于是否使用热修复功能会采取不同的初始化内容,因此本文将根据是否使用热修复功能分别向您介绍相应的初始化操作。

不使用热修复功能

不使用 热修复 功能时,只需在 Application 中添加如下代码:

@Override
public void onCreate() {
    super.onCreate();
    
    MP.init(
      this,
      MPInitParam.obtain().setCallback(new MPInitParam.MPCallback() {
        @Override
        public void onInit() {
            Log.d("TAG", "mPaaS Init finish");
        }
      })
    );
}
说明
  • 如果您集成使用 Kotlin 的话,可以使用 mPaaS 提供的 mPaaS KTX,详情参考 mPaaS Kotlin 扩展。

  • 如果您需要继续使用 QuinoxlessFramework 初始化方式,您的调用不会受到任何影响,代码和业务不需要做任何更改。

重要

请不要在使用 MP.init 方法前过滤进程,除主进程外,在 tools 和 push 子进程中也需要执行初始化代码。

使用热修复功能

使用 热修复 功能时,需要完成以下操作。

操作步骤

  1. 使 Application 对象重新继承 QuinoxlessApplicationLike,并注意将此类防混淆。此处以 “MyApplication”为例。

     @Keep
     public class MyApplication extends QuinoxlessApplicationLike implements Application.ActivityLifecycleCallbacks {
    
      private static final String TAG = "MyApplication";
    
      @Override
      protected void attachBaseContext(Context base) {
          super.attachBaseContext(base);
    
          Log.i(TAG, "attacheBaseContext");
    
      }
    
      @Override
      public void onCreate() {
          super.onCreate();
          Log.i(TAG, "onCreate");
          registerActivityLifecycleCallbacks(this);
      }
    
      @Override
      public void onMPaaSFrameworkInitFinished() {
          LoggerFactory.getTraceLogger().info(TAG, getProcessName());
      }
    
      @Override
      public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
          Log.i(TAG, "onActivityCreated");
      }
    
      @Override
      public void onActivityStarted(Activity activity) {
    
      }
    
      @Override
      public void onActivityResumed(Activity activity) {
    
      }
    
      @Override
      public void onActivityPaused(Activity activity) {
    
      }
    
      @Override
      public void onActivityStopped(Activity activity) {
    
      }
    
      @Override
      public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    
      }
    
      @Override
      public void onActivityDestroyed(Activity activity) {
    
      }}
  2. 在 AndroidManifest.xml 文件中将 Application 对象指向 mPaaS 提供的 Application 对象。 将生成的 “MyApplication” 类添加到 key 为 mpaas.quinoxless.extern.application 的 meta-data 中。示例如下:

     <application
     android:name="com.alipay.mobile.framework.quinoxless.QuinoxlessApplication" >
     <meta-data
              android:name="mpaas.quinoxless.extern.application"
              android:value="com.mpaas.demo.MyApplication"
              />
     </application>
  3. 引入 Apache HTTP 客户端。

    在使用 RPC 或者热修复功能的时候,需要调用到 Apache HTTP 客户端相关的功能。只需在 AndroidManifest.xml 加入如下代码。更多信息,请参见 使用 Apache HTTP 客户端。

    <uses-library android:name="org.apache.http.legacy" android:required="false"/>

打开 H5 游戏

H5 游戏支持 在线链接游戏 和 离线包游戏。

在线链接游戏

MPNebula.startUrl("xxx"); // xxx为在线游戏的链接

可以通过启动参数控制游戏页面的标题栏、全屏等效果。更多内容请参考 启动参数。

离线包游戏

离线包形式主要优化游戏在线资源加载耗时,提升体验。更多内容请参考离线包简介。

打开离线包游戏

MPNebula.startApp("xxx"); // xxx为离线包id

离线包的发布管理

请参考 H5 离线包管理。

账号授权

游戏需要依赖 App 的账号,需要 App 注入用户 openId/userId。在 mPaaS 初始化完成后需设置如下内容。

H5Utils.setProvider(H5OpenUserInfoProvider.class.getName(), new H5OpenUserInfoProvider() {
                /**
                 *
                 * @param gameId 游戏h5链接或者离线id
                 * @param page   页面信息
                 * @param callback 回调
                 */
                @Override
                public void onGetOpenUserInfo(String gameId, H5Page page, OpenUserCallback callback) {
                    Map<String, String> openUserInfo = new HashMap();
                    openUserInfo.put("openId", "xxxx");  // 用户id,必须
                    openUserInfo.put("userName", "xxxx"); // 用户昵称,非必须
                    if (callback != null) {
                        callback.onCallback(openUserInfo);
                    }
                }
            });

IAA 游戏广告

方式一

穿山甲广告类型(内部唤起穿山甲,外部提供广告位即可):mPaaS 初始化完成后设置。

H5Utils.setProvider(H5AdCodeProvider.class.getName(), new H5AdCodeProvider() {
                /**
                 *
                 * @param gameId 游戏id: 游戏的在线链接或者离线id
                 * @param page   游戏页面对象
                 * @param adType   广告类型:0 激励视频广告; 1 banner广告; 2 插屏/全屏广告。 目前只有激励视频类型
                 * @param callback  广告code回调
                 */
                @Override
                public void onGetAdCode(String gameId, H5Page page, int adType, GameAdInfoCallback callback) {
                    Map<String, String> adInfo = new HashMap();
                    if (adType == 0) { // h5游戏只有激励视频的情况
                        adInfo.put("code", "xxx"); // 添加广告位信息
                    } else {
                    }
                    if (callback != null) {
                        callback.onCallback(adInfo);
                    }
                }
            });

方式二

其他广告类型(外部唤起激励视频广告,并在下发奖励时给回调): mPaaS 初始化完成之后设置。

H5Utils.setProvider(H5AdShowProvider.class.getName(), new H5AdShowProvider() {
                /**
                 *
                 * @param gameId 游戏id: 游戏的在线链接或者离线id
                 * @param page   游戏页面对象
                 * @param type   广告类型:0 激励视频广告; 1 banner广告; 2 插屏/全屏广告。 目前只有激励视频类型
                 * @param gameAdShowCallback  广告展示相关回调
                 */
                @Override
                public void showAd(String gameId, H5Page page, int type, GameAdShowCallback gameAdShowCallback) {
                    // 自行展示激励视频弹窗广告,并做相应回调
                }
            });

广告展示回调 GameAdShowCallback:

public interface GameAdShowCallback {
    /**
     * 广告展示回调
     */
    void onShow();

    /**
     * 广告关闭回调
     */
    void onClose();

    /**
     * 广告奖励下发回调
     */
    void onReward();

    /**
     * 广告出错回调
     */
    void onError(String code, String message);
}