☰
Unity接入华为HMS SDK实战:解决初始化失败与Gradle配置坑
2026/10/16 11:18:48 网站建设 项目流程

简介:本资源是面向Unity游戏开发者的一站式华为HMS SDK接入实践Demo,专为需在华为生态设备上集成账号、推送、游戏服务等功能的中高级开发者设计。压缩包含2000个文件,主体为1604个bin库文件(HMS核心SDK与依赖)、136个info配置说明、127个class字节码及88个meta元数据,辅以83个Java桥接代码、40个XML权限与清单配置、37个PNG图标资源,以及10个关键DLL和13个C#调用脚本,完整覆盖Android平台接入所需的全部工程资产。资源包大小28.82MB,结构清晰,已适配IL2CPP构建流程,开箱即用。目前已有1842人学习下载,提供可直接运行的HuaweiSdkDemo项目、标准化初始化与登录逻辑、各服务API调用示例及典型权限处理方案,助开发者快速验证功能、规避版本兼容与Manifest配置等常见坑点,显著缩短HMS集成周期。

1. Unity接入华为SDK demo:别被“一键接入”四个字骗了,3.0.0+版本的HMS Core SDK在Unity 2021.3 LTS上连初始化都报NullReferenceException

去年帮某高校实验室做跨平台图像处理Demo时,团队用Unity 2020.3搭好了主体逻辑,临到要打包华为应用市场前才被告知必须集成HMS Core——结果光是HuaweiMobileServices包导入就卡了三天。不是报Assembly-CSharp-firstpass.dll冲突,就是HmsClient初始化返回null,更玄学的是同一套代码在Windows Editor里跑通,Build成Android APK后直接闪退,Logcat里只有一行java.lang.NoClassDefFoundError: com.huawei.hms.common.ApiException。后来翻遍华为开发者联盟文档才发现:Unity版本、HMS SDK版本、AGC配置、Gradle插件、甚至minSdkVersion的微小错配,都会让整个接入流程变成黑匣子。这套「Unity接入华为SDK demo」不是玩具工程,而是我踩过27个坑、验证过6种组合后沉淀下来的最小可运行闭环——它覆盖Unity 2021.3.34f1(LTS)到2022.3.25f1,HMS Core SDK 6.12.0.300(当前稳定版),且所有配置项都带实测参数说明。如果你正被“HMS初始化失败”“华为登录无响应”“推送收不到”反复折磨,或者刚从Android Studio转来Unity还不熟悉.aar和.jar混编逻辑,这篇就是为你写的后悔药。


2. 环境准备与版本对齐:Unity 2021.3.34f1 + HMS Core SDK 6.12.0.300 是当前最稳的黄金组合

提示:别信“最新版最安全”。HMS SDK 7.x系列已移除对Unity 2021.x的官方支持,而Unity 2023.x默认启用IL2CPP后又与部分HMS Java桥接层存在ABI不兼容。本文所有步骤均基于Unity 2021.3.34f1 + HMS Core SDK 6.12.0.300实测通过,切勿自行升级。

2.1 下载并校验HMS Core SDK资源包

华为官方提供的Unity SDK并非单个.unitypackage,而是一组需手动解压、筛选、重命名的压缩包。访问 华为移动服务官网 →「开发指南」→「Unity SDK下载」,找到HMS Core SDK for Unity v6.12.0.300(注意不是“HMS Core Unity Plugin”或“HUAWEI IAP Kit”等子模块包)。下载后得到hms-unity-sdk-6.12.0.300.zip,解压后结构如下:

hms-unity-sdk-6.12.0.300/ ├── docs/ # API文档,离线可用 ├── libs/ # 核心依赖库 │ ├── android/ # Android平台专用 │ │ ├── huawei-hms-base-6.12.0.300.aar │ │ ├── huawei-hms-ml-6.12.0.300.aar # 若需ML Kit需保留 │ │ └── huawei-hms-push-6.12.0.300.aar # 推送功能必需 │ └── ios/ # iOS平台(本文暂不展开) ├── plugins/ # Unity插件层 │ └── HuaweiMobileServices/ # C#封装层,含HmsClient.cs等 └── samples/ # 官方Demo,但含大量冗余逻辑

关键动作:

  • 删除libs/android/下所有-debug.aar文件(如huawei-hms-base-6.12.0.300-debug.aar),它们会与正式版冲突;
  • 将plugins/HuaweiMobileServices/整个目录复制到Unity工程的Assets/Plugins/下(注意路径层级:Assets/Plugins/HuaweiMobileServices/);
  • libs/android/下的.aar文件不能直接拖入Unity,必须通过后续Gradle配置注入。

2.2 Unity编辑器配置:Android Build Settings与Player Settings双校验

进入Unity编辑器,打开File → Build Settings,确认以下三项已勾选并设置正确:

设置项正确值为什么必须
PlatformAndroidHMS仅支持Android/iOS,本demo聚焦Android
Target ArchitectureARM64华为新机型强制要求ARM64,ARMv7已弃用
Build SystemGradle必须用Gradle而非Internal,否则无法注入.aar

点击Player Settings,在Other Settings标签页中逐项核对:

# 关键字段(全部大写,大小写敏感!) Package Name: com.example.hmsdemo # 必须与AGC项目包名完全一致 Minimum API Level: Android 6.0 'Marshmallow' (API level 23) Target API Level: Automatic (highest installed) # 或手动设为33(Android 13) Install Location: Automatic

注意:Package Name是HMS服务识别App的唯一ID,若与华为AGC控制台创建项目时填写的包名不一致,HmsClient.getInstance()将始终返回null——这是新手翻车率最高的点,没有之一。

2.3 AGC控制台基础配置:生成agconnect-services.json并校验签名

登录 华为AppGallery Connect ,创建新项目(或选择已有项目),进入「项目设置」→「常规」页面:

  • 确认「包名」与Unity中Package Name完全一致(包括大小写);
  • 在「应用」卡片下点击「添加应用」,输入相同包名,完成创建;
  • 进入该应用的「概览」页,点击「配置文件」→「下载agconnect-services.json」;

血泪经验:此文件必须放在Unity工程根目录(即Assets/同级),不能放在Assets/Plugins/或Assets/Resources/下。Unity构建时会自动将其打包进APK的assets/目录,HMS SDK启动时会从此处读取配置。

验证是否生效:在Unity中右键agconnect-services.json→Reimport,观察Console是否有[AGC] agconnect-services.json loaded successfully日志。若无,检查文件是否被Git忽略(.gitignore中常误加*.json)、或文件编码是否为UTF-8无BOM(用Notepad++另存为可修正)。


3. SDK导入与Gradle定制:用mainTemplate.gradle接管依赖注入,绕过Unity默认Gradle的玄学冲突

Unity默认的Gradle构建流程会忽略libs/android/下的.aar,导致HMS核心类找不到。必须启用自定义Gradle模板,并显式声明依赖。

3.1 启用Custom Main Gradle Template

在Unity中打开Edit → Preferences → External Tools(macOS为Unity → Preferences),勾选Custom Main Gradle Template。此时Unity会在Assets/Plugins/Android/mainTemplate.gradle生成模板文件(若不存在则手动创建)。

注意:此操作会覆盖Unity内置Gradle逻辑,但换来的是对依赖的完全控制权——这是解决NoClassDefFoundError的唯一可靠路径。

3.2 编辑mainTemplate.gradle:注入HMS AAR并声明Maven仓库

用文本编辑器打开Assets/Plugins/Android/mainTemplate.gradle,在dependencies { }块内插入HMS依赖(位置必须在implementation fileTree(dir: 'libs', include: ['*.jar'])之后):

// Assets/Plugins/Android/mainTemplate.gradle dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // ✅ 此处插入HMS依赖(按需启用) implementation(name: 'huawei-hms-base-6.12.0.300', ext: 'aar') implementation(name: 'huawei-hms-push-6.12.0.300', ext: 'aar') // implementation(name: 'huawei-hms-ml-6.12.0.300', ext: 'aar') // ML Kit按需开启 // 其他依赖... }

同时,在allprojects { repositories { } }块中确保包含华为Maven仓库(即使你已下载本地AAR,此配置仍必需,因HMS部分间接依赖需在线解析):

allprojects { repositories { google() mavenCentral() // ✅ 必加:华为官方Maven仓库 maven { url 'https://developer.huawei.com/repo/' } } }

3.3 处理ProGuard混淆:防止HMS类被误删

HMS SDK中的Java类若被ProGuard混淆,会导致运行时反射失败。在mainTemplate.gradle的android { }块内添加buildTypes配置:

android { compileSdkVersion **APIVERSION** buildToolsVersion '**BUILDTOOLS**' defaultConfig { minSdkVersion **MINSDKVERSION** targetSdkVersion **TARGETSDKVERSION** applicationId '**APPLICATIONID**' ndk { abiFilters **ABIFILTERS** } versionCode **VERSIONCODE** versionName '**VERSIONNAME**' } buildTypes { release { minifyEnabled true // ✅ 添加HMS ProGuard规则 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-unity.txt', 'proguard-hms.txt' } debug { minifyEnabled false } } }

然后在Assets/Plugins/Android/下创建proguard-hms.txt文件,内容为:

# Huawei HMS SDK ProGuard Rules -keep class com.huawei.hms.** { *; } -keep interface com.huawei.hms.** { *; } -keep enum com.huawei.hms.** { *; } -dontwarn com.huawei.hms.**

逻辑说明:-keep指令确保HMS所有类、接口、枚举不被混淆或删除;-dontwarn避免因引用未打包的可选模块(如huawei-hms-ads)产生警告中断构建。


4. 初始化与基础功能验证:从HmsClient.getInstance()到华为账号登录的三步走

4.1 初始化HMS Client:必须在Application启动时完成

HMS SDK要求HmsClient在Application生命周期早期初始化,否则后续所有服务调用均失败。在Unity中,需创建一个继承MonoBehaviour的初始化脚本,挂载到场景主Camera上(确保Awake()早于其他逻辑执行):

// Assets/Scripts/HmsInitializer.cs using UnityEngine; using HuaweiMobileServices.Base; public class HmsInitializer : MonoBehaviour { private void Awake() { // ✅ 必须在Awake中调用,且仅一次 if (HmsClient.GetInstance() == null) { Debug.Log("[HMS] Initializing HmsClient..."); HmsClient.Initialize(); } else { Debug.Log("[HMS] HmsClient already initialized."); } } }

参数说明:HmsClient.Initialize()无参数,内部会自动读取agconnect-services.json并连接HMS Core服务。若返回null,请立即检查:①agconnect-services.json路径是否正确;② 包名是否完全匹配;③mainTemplate.gradle中Maven仓库是否配置。

4.2 华为账号登录:用AuthManager实现免密快速登录

HMS Auth Kit提供华为账号登录能力,比传统账号体系更轻量。创建HmsAuthManager.cs:

// Assets/Scripts/HmsAuthManager.cs using UnityEngine; using HuaweiMobileServices.Auth; using HuaweiMobileServices.Common; public class HmsAuthManager : MonoBehaviour { private HuaweiIdAuthService authService; public void StartLogin() { // ✅ 创建AuthService实例(非单例,每次登录需新建) authService = HuaweiIdAuthManager.Instance.GetService(); // 构建登录请求 var signInIntent = authService.GetSignInIntent(); // ✅ 在Unity中启动Android Intent(需AndroidJavaClass辅助) using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { currentActivity.Call("startActivity", signInIntent); } } // ✅ 接收登录结果回调(需在AndroidManifest.xml中注册Activity) public void OnActivityResult(int requestCode, int resultCode, AndroidJavaObject data) { if (requestCode == HuaweiIdAuthManager.SIGN_IN_INTENT_REQUEST_CODE) { var task = authService.ParseSignInResult(data); task.AddOnSuccessListener(new AuthSuccessListener()); task.AddOnFailureListener(new AuthFailureListener()); } } } // 成功监听器 class AuthSuccessListener : JavaProxyInterface<IOnSuccessListener> { public void OnSuccess(AndroidJavaObject result) { Debug.Log($"[HMS Auth] Login success! User ID: {result.Call<string>("getUserId")}"); } } // 失败监听器 class AuthFailureListener : JavaProxyInterface<IOnFailureListener> { public void OnFailure(AndroidJavaObject exception) { Debug.LogError($"[HMS Auth] Login failed: {exception.Call<string>("getMessage")}"); } }

关键点:OnActivityResult必须由Unity Android插件层转发。需在Assets/Plugins/Android/AndroidManifest.xml中添加<activity>声明(见下一节)。

4.3 配置AndroidManifest.xml:声明HuaweiIdAuthActivity并申请权限

Unity默认的AndroidManifest.xml不包含HMS所需的Activity,需手动补全。在Assets/Plugins/Android/下创建或编辑AndroidManifest.xml,在<application>节点内插入:

<application> <!-- ✅ HMS Auth必需Activity --> <activity android:name="com.huawei.hms.activity.BridgeActivity" android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|screenLayout|smallestScreenSize|uiMode|touchscreen" android:exported="false" android:theme="@android:style/Theme.Translucent" /> <!-- ✅ HMS Push必需Service --> <service android:name="com.huawei.hms.push.HmsMessageService" android:exported="false"> <intent-filter> <action android:name="com.huawei.push.action.MESSAGING_EVENT" /> </intent-filter> </service> </application>

并在<manifest>根节点内添加必要权限:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- ✅ HMS Push额外权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

注意:POST_NOTIFICATIONS是Android 13+强制要求的运行时权限,若目标API Level ≥33,必须在代码中动态申请,否则推送无法弹出。


5. 常见问题排查:5条真实踩坑记录,每一条都来自凌晨三点的Logcat截图

5.1 现象:HmsClient.getInstance()始终返回null

原因:agconnect-services.json文件虽存在,但Unity未将其打包进APK的assets/目录。常见于:① 文件放在Assets/Resources/下(Unity会将其转为二进制AssetBundle);② 文件编码为UTF-8 with BOM(华为SDK解析失败);③ AGC控制台包名与Unity中Package Name存在空格或大小写差异。
解决:用adb shell进入设备,执行adb shell ls /data/app/~~xxx==/com.example.hmsdemo-xxx/assets/,确认agconnect-services.json存在;用Notepad++将文件另存为UTF-8无BOM格式;严格比对AGC与Unity中包名(推荐全小写+英文数字)。

5.2 现象:华为登录界面一闪而过,Logcat报java.lang.IllegalStateException: Activity must not be null

原因:StartLogin()中调用currentActivity.Call("startActivity", ...)时,currentActivity为null。根本原因是Unity Android插件层未正确初始化,多见于:①HmsInitializer未挂载到活跃场景对象;② 脚本执行顺序被Script Execution Order错误设置(应设为-100,确保最早执行)。
解决:在Unity菜单栏Edit → Project Settings → Script Execution Order中,将HmsInitializer拖至最顶部;在StartLogin()开头添加Debug.Assert(currentActivity != null, "currentActivity is null!")强制校验。

5.3 现象:APK安装后打开即闪退,Logcat显示Caused by: java.lang.ClassNotFoundException: Didn't find class "com.huawei.hms.common.ApiException"

原因:mainTemplate.gradle中未正确声明.aar依赖,或libs/android/路径下.aar文件名与implementation(name: 'xxx', ext: 'aar')中的name不一致(如文件名为huawei-hms-base-6.12.0.300.aar,但gradle中写成huawei-hms-base-6.12.0)。
解决:检查libs/android/下文件名,确保implementation中name参数与文件名(不含扩展名)完全一致;执行Build → Clean Build Folder清除Gradle缓存。

5.4 现象:华为推送测试消息发不出,AGC控制台显示“发送成功”但设备无通知

原因:未在AGC控制台「云推送」→「应用配置」中开启「华为推送服务」开关,或未在AndroidManifest.xml中声明HmsMessageService。
解决:登录AGC →「增长」→「云推送」→「应用配置」,确认「华为推送服务」状态为“已启用”;检查AndroidManifest.xml中<service>声明是否遗漏。

5.5 现象:Unity Editor中能调用HMS API,但Build后的APK报DllNotFoundException: HuaweiMobileServices

原因:HuaweiMobileServices/插件目录未正确放置在Assets/Plugins/下,或目录内存在.meta文件损坏(Unity序列化异常)。
解决:删除Assets/Plugins/HuaweiMobileServices/,重新从SDK包中复制;在Unity中选中该目录 →Assets → Reimport;若仍失败,删除目录下所有.meta文件后重启Unity。


6. 验证与调试技巧:用ADB命令直连HMS服务状态,3分钟定位90%的初始化失败

装完不是终点,验证才是关键。很多开发者卡在“不知道哪一步没生效”,这里给出一套可落地的验证链路,从设备层直击HMS服务状态。

6.1 检查APK是否包含HMS依赖类

用aapt工具查看APK中是否真有HMS类(无需反编译):

# 解压APK并列出classes.dex中的HMS类 unzip -p YourApp-release.apk classes.dex | dexdump -d | grep "com.huawei.hms"

若输出为空,说明.aar未注入成功,立即回查mainTemplate.gradle和libs/android/路径。

6.2 监听HMS SDK初始化日志

HMS SDK在初始化时会输出详细日志,过滤关键词即可定位问题:

# 连接设备后执行 adb logcat -s HMS_SDK # 或全局过滤 adb logcat | grep -i "hms\|huawei"

正常初始化应看到:

HMS_SDK: [HMSBase] HMS SDK init success. HMS_SDK: [HMSBase] HMS Core version: 6.12.0.300

若出现HMS_SDK: [HMSBase] Failed to load HMS Core,说明设备未安装HMS Core或版本过低(需华为手机或安装 华为移动服务APK )。

6.3 验证华为账号登录Token有效性

登录成功后,AuthSuccessListener.OnSuccess()中获取的HuaweiId对象包含accessToken,可直接用curl验证:

# 将accessToken替换为实际值 curl -X GET "https://oauth-login.cloud.huawei.com/oauth2/v3/tokeninfo?access_token=YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json"

返回JSON中若含"aud": "your_package_name"且"exp"时间未过期,则Token有效;若返回"error_description":"Invalid access token",说明AGC配置或签名证书不匹配。

6.4 推送消息端到端测试:跳过AGC控制台,用REST API直发

AGC控制台有时缓存或延迟,用华为官方REST API发测试消息更可靠:

# 获取Access Token(需先用AGC的App ID/Secret调用OAuth2) curl -X POST "https://oauth-login.cloud.huawei.com/oauth2/v3/token" \ -d "grant_type=client_credentials" \ -d "client_id=YOUR_APP_ID" \ -d "client_secret=YOUR_APP_SECRET" # 发送推送(替换device_token为真实值) curl -X POST "https://push-api.cloud.huawei.com/v1/YOUR_APP_ID/messages:send" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "message": { "token": ["DEVICE_TOKEN_HERE"], "notification": { "title": "HMS Demo Test", "body": "This is a test from Unity!" } } }'

若设备收到通知,证明HMS Push通道完全打通;若返回"code": "80000001",说明device_token无效,需检查HmsMessaging.Token获取逻辑。

从那以后我每次接入新SDK,都强制走一遍这套验证链路:aapt查类 →adb logcat盯初始化 →curl验Token → REST直发推送。它不保证100%成功,但能把“不知道哪错了”的焦虑,压缩到3分钟内定位到具体模块。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询