SDK 检查与帮助

游戏启动、初始化 SDK 时,SDK会对接入是否正确进行检查。若检查有错,会在 ADB 日志提示;
若游戏还没有发布线上前,也会弹窗提示开发者。

本文档是所有检查错误的详细、全面的说明,主要面向 jar+res 接入方式的开发。
注意:若游戏是二次封装了 SDK 的java 接口,需要在最初封装的环节查看修复这些问题

调试开关

“SDK 调试开关未关闭”,没有关闭 SDK 的调试开关,即下面setDebugEnabled()接口参数没有设置false

perateConfig config = new OperateConfig.Builder(MainActivity.this)
    // 设置调试模式,可选,默认false, 发布前应设置为false或删除调用
    .setDebugEnabled(false)
    .build();

若不关闭,则可能会泄漏敏感信息,对游戏运行性能又一定影响

FileProvider文件访问配置

“OpeFileProvider 设置错误”,游戏 APK AndroidManifest.xml 中 cn.m4399.operate.OpeFileProvider
未注册或属性设置有错。游戏外部接口需要访问 SDK 内部资源,本设置就是注册资源的访问权限。

<!--
    4399 运营SDK:以下是FileProvider配置,以兼容7.0+文件访问权限变更
    注意其中的: android:authorities="游戏包名.operate.FileProvider"
    以及,android:resource="@xml/m4399_ope_file_paths" 是固定格式写法
 -->

<provider
    android:name="cn.m4399.operate.OpeFileProvider"
    android:authorities="${applicationId}.operate.FileProvider"
    android:exported="false"
    android:grantUriPermissions="true">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/m4399_ope_file_paths" />

</provider>

此项有错将影响游戏更新、分享等功能;特别是更新异常,将严重影响用户体验,导致用户流失。
其中的 android:authorities 极易出错,请仔细核对。

游戏Activity配置

"Activity 模式设置有误",游戏 Activity 设置有错,主要是 android:resizeableActivity 和 android:configChanges

android:resizeableActivity,多窗口相关属性,详细说明参考 多窗口模式配置
对于 SDK,最好禁用禁用多窗口模式,如果必须使用,则要设置 android:configChanges

<!-- 游戏 Activity
     若覆盖了 android:resizeableActivity="false",则必须如下设置 android:configChanges
     android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|navigation|smallestScreenSize|fontScale"
     
     不应该使用 android:launchMode="singleTask" 启动模式,可以考虑 singleTop
 -->

<activity
    android:name="cn.m4399.operate.samples.OnlineGameActivity"
    android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|navigationsmallestScreenSize|fontScale"
    android:exported="true"
    android:theme="@style/AppTheme">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 </activity>

游戏 Activity

  • Android 应用启动打开的第一个 Activity 称为“入口 Activity”
  • 游戏画面一般只在一个 Activity 中展示,称为“主 Activity”
  • 游戏一般在入口 Activity 或主 Activity 初始化 SDK、登录账号
  • 大多数游戏入口 Activity 即是主 Activity,但并非总数如此

游戏一般在主 Activity或入口 Activity中初始化 SDK,而多窗口模式中的特定操作会使初始化异常。

未正确设置android:resizeableActivity 和 android:configChanges,有可能使游戏跳过重要的初始化弹窗。
另外 android:configChanges 设置不正确,会引起其他问题,如授权登录过程异常,授权后无法正确获取用户信息。

多 Activity 的情况

若游戏有多个 Activity,则游戏需要在入口 Activity 和主 Activity 设置上述属性

必要的Activity

“必须的 Activity 不全”,SDK 必须的 Activity 组件不全,这些组件对应了不同的页面

当前 SDK v3.14.x中需要的 Activity 有

// SDK
cn.m4399.operate.component.OperateActivity,
cn.m4399.operate.recharge.RechargeActivity,
// 支付宝 H5
com.alipay.sdk.app.H5PayActivity,
// 一键登录
cn.com.chinatelecom.account.sdk.ui.AuthActivity,
cn.com.chinatelecom.account.sdk.ui.PrivacyWebviewActivity,
cn.m4399.operate.account.onekey.cu.CuLoginActivity,
cn.m4399.operate.account.onekey.cu.CuPrivacyContentActivity,
com.cmic.gen.sdk.view.GenLoginAuthActivity,
// 人脸识别
com.tencent.cloud.huiyansdkface.facelight.ui.FaceVerifyActivity,
com.tencent.cloud.huiyansdkface.facelight.ui.FaceGuideActivity,
com.tencent.cloud.huiyansdkface.facelight.ui.FaceProtocalActivity

请注意:

必要的服务

“必须的 Service 不全”,SDK 必须的服务组件没有注册

当前 SDK v3.14.x中需要的 Service 有

<!-- 录屏相关 -->
<service
    android:name="cn.m4399.operate.video.record.container.RecordService"
    android:foregroundServiceType="mediaProjection" />

上面服务与录屏功能有关(由后台配置开关),高版本系统要求注册前台服务以完成录屏功能。

注意:

必要的权限

“必须的应用权限不全”,SDK 必须的权限不全,其中大多数是第三方 SDK 需要的

  <!--
     4399 运营SDK
     以下是必须的,包括第三方SDK需要的,以jar+res 方式接入需要打开以下内容,aar则不需
  -->

  <!-- 一般性权限 -->
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  <!-- 兼容低版本系统 -->
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <!-- 录屏功能 -->
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.RECORD_VIDEO" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <!-- 一键登录 -->
  <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  <!--suppress DeprecatedClassUsageInspection -->
  <uses-permission android:name="android.permission.GET_TASKS" />
  <!-- 人脸识别 -->
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />

  <uses-sdk tools:overrideLibrary="com.tencent.cloud.huiyansdkface.wecamera" />

注意:

缺少必须的权限会引起各种异常,比如网络请求失败、实名时无法打开相册、无法启动录屏、无法启动摄像头等

必要的Assets资源

“必须的 assets 资源不全”,SDK 运行时需要的资源不全,游戏打包后解压的assets目录应包含

// SDK 悬浮窗关闭的教学图片
m4399_ope_fab_hide_animation.gif,
// models目录 是人脸识别的数据资源
models

注意:

其他

除了上述必须的、SDK 加入检查的配置/资源,还有一些也是需要的,但没有加入检查

res 资源

SDK res下为兼容不同屏幕尺寸、方向,和不同系统的资源不应丢失,否则会出现页面变形,严重的会功能异常

so 对齐

游戏打包后,应检查 so 是否完整且对齐,即必须的 so 存在,且任意两个 abi 目录里的 so 一样
SDK 的 x86 缺少部分人脸识别的 so,即模拟器上的人脸识别可能会异常

jar 包

SDK 依赖的其他jar包,主要是

android-support-v13-23.2.1.jar
volley-v1.2.1.jar

大部分 jar 包都已经打到 SDK 主 jar 包中了,除了上面两个易冲突、由接入方自己控制的除外

应用信息查询quries

<!-- 4399 运营SDKAndroid 11兼容,声明所要进行交互的应用包名,主要用于外部授权登录和支付 -->
<queries>
    <package android:name="com.m4399.gamecenter" />
    <package android:name="com.tencent.mobileqq" />
    <package android:name="com.sina.weibo" />
    <package android:name="com.tencent.mm" />
    <!-- 支付宝 SDK -->
    <package android:name="com.eg.android.AlipayGphone" /> <!-- 支付宝 app -->
    <package android:name="com.eg.android.AlipayGphoneRC" /> <!-- 沙箱支付宝 app -->
    <package android:name="hk.alipay.wallet" /> <!-- 香港版支付宝 app -->
    <!-- 好游快爆 -->
    <package android:name="com.xmcy.hykb" />
</queries>

缺少影响独代游戏的激活、授权登录、微信/支付宝/QQ 钱包的充值

quries 编译错误

若编译时出现类似于以下的错误

Missing 'package' key attribute on element package at [cn.m4399.sdk:operate:x.x.x] AndroidManifest.xml

查看 Android studio 项目根目录下的build.gradle,可能是这样的声明:

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
    }
}

此为Gradle 插件兼容问题,参考 Android Gradle 插件 4.0.0(2020 年 4 月),解决方式:

当前AGP 版本 请升级到
4.0.* 4.0.1
3.6.* 3.6.4
3.5.* 3.5.4
3.4.* 3.4.3
3.3.* 3.3.3

http 请求兼容networkSecurityConfig

<!--
    4399 运营SDK
    Android 9.0 兼容, 对少量外部 http 请求的兼容,
    参考或修改配置 android:networkSecurityConfig="@xml/m4399_network_policy"
-->

<application
    android:networkSecurityConfig="@xml/m4399_network_policy"
    android:resizeableActivity="false">

</application>

缺少无法在 Android 9+ 上进行 http 请求

注意:

apche 请求配置兼容

<!-- 4399 运营SDK:旧的http请求库的兼容,支付宝等少数外部依赖需要 -->
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

缺少导致无法打开支付宝网页