ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

团结引擎1.6.12鸿蒙打包实战:证书、HAP与避坑指南

团结引擎1.6.12鸿蒙打包实战:证书、HAP与避坑指南 1. 为什么鸿蒙打包这件事值得单独拎出来聊团结引擎1.6.12这个版本号做Unity鸿蒙适配的兄弟应该都不陌生。它算是国内Unity生态里比较早把HarmonyOS NEXT打包链路跑通的一个分支版本底层还是Unity那套渲染和脚本机制但构建目标从Android APK换成了鸿蒙的HAP包。听起来只是换个后缀名的事实际动手你会发现从证书签名到模块依赖从SDK路径到打包脚本坑是一个接一个。我最近刚用这个版本完整走了一遍鸿蒙打包流程中间踩的坑足够写一篇避雷指南。这篇文章主要面向两类人一类是已经用团结引擎做过Android或小游戏打包现在要转鸿蒙的开发者另一类是刚接触鸿蒙原生开发想搞清楚HAP包到底怎么从引擎里出来的新手。核心关键词就几个团结引擎、鸿蒙、打包、证书、hap。我会把整个流程拆成设计思路、核心细节、实操步骤、问题排查四块来讲尽量做到你看完就能照着复现。先说结论团结引擎打鸿蒙包难点不在引擎本身而在鸿蒙侧的签名体系和模块配置。引擎负责把资源编译成鸿蒙能识别的格式但最终能不能装到设备上取决于证书、Profile文件、模块依赖这三样东西是否对齐。很多人卡在最后一步安装失败回头查半天代码其实问题出在证书链上。2. 整体打包链路的设计思路拆解2.1 团结引擎在鸿蒙生态里的定位团结引擎本质上是一个Unity的分支版本它保留了Unity的编辑器工作流、C#脚本系统、资源管线但针对国内平台做了大量适配鸿蒙就是其中之一。1.6.12这个版本对鸿蒙的支持已经比较完整了支持构建HAP包、支持鸿蒙原生插件、支持在DevEco Studio里做二次开发。它的打包逻辑是这样的引擎先把Unity场景和资源导出成鸿蒙能识别的格式生成一个中间工程然后调用鸿蒙的构建工具链把这个工程编译成HAP。这个中间工程本质上是一个标准的鸿蒙应用工程里面包含了Ability、页面路由、原生桥接代码。理解这一点很关键因为后面很多问题都要回到这个中间工程里去排查。为什么选择这种“导出中间工程再编译”的方式而不是引擎直接产出HAP因为鸿蒙的构建工具链更新频率很高签名规则、模块配置格式都在变。如果引擎直接封装成HAP每次鸿蒙侧更新都要跟着改引擎代码维护成本太高。导出中间工程的好处是鸿蒙侧的任何变化都可以在DevEco Studio里手动调整引擎只需要保证导出的工程结构符合规范就行。2.2 证书体系为什么是最大的拦路虎鸿蒙的签名体系和Android完全不同。Android用keystore加别名密码就能签名鸿蒙用的是证书文件加Profile文件的组合。证书文件负责证明开发者身份Profile文件负责描述应用的权限和能力。这两个文件必须匹配而且都要在鸿蒙的开发者后台提前申请。具体来说你需要准备这些东西一个p12格式的密钥库文件、一个cer格式的证书文件、一个p7b格式的Profile文件。这三个文件的关系是密钥库生成证书请求证书请求提交到后台换取证书证书和应用的Bundle Name绑定后生成Profile。任何一个环节对不上打包就会失败。我见过最常见的错误是Bundle Name不一致。在团结引擎里设置的包名必须和后台申请证书时填的包名完全一致包括大小写。有个朋友因为引擎里写的是com.Company.Game后台申请时写的是com.company.game折腾了一下午才发现问题。这种坑不踩一次根本记不住。2.3 模块依赖的配置逻辑鸿蒙的HAP包和Android的APK在模块化设计上思路类似但实现方式不同。鸿蒙把应用拆成Entry模块和Feature模块Entry是主入口Feature是动态特性模块。团结引擎导出的工程默认只有一个Entry模块但如果你用了某些原生插件或者第三方SDK可能需要额外配置Feature模块。模块配置的核心文件是module.json5里面定义了模块名称、类型、设备类型、Ability列表、权限列表。这个文件在导出工程后是可以手动修改的但要注意修改后要同步更新签名配置否则签名会失效。我建议的做法是先在引擎里把所有需要的能力勾选好导出工程后尽量少改module.json5如果非要改改完重新走一遍签名流程。3. 核心细节解析与实操要点3.1 环境准备版本匹配比什么都重要团结引擎1.6.12对鸿蒙SDK的版本有明确要求。我实测下来DevEco Studio用4.0 Release版本比较稳鸿蒙SDK用API 10或API 11都可以但不要混用。如果你电脑上装了多个版本的DevEco Studio一定要在团结引擎的偏好设置里指定正确的SDK路径。具体操作路径是打开团结引擎进入Preferences找到External Tools在HarmonyOS SDK Location里填入DevEco Studio的SDK目录。这个目录通常长这样C:\Program Files\Huawei\DevEco Studio\sdk。填完之后点Verify如果提示成功就说明路径对了。注意不要用DevEco Studio自带的模拟器来测试打包结果模拟器的签名校验逻辑和真机不一样很多在模拟器上能装的包真机上装不了。一定要用真机测试。另外JDK版本也要注意。团结引擎1.6.12要求JDK 11或以上但不要用JDK 17我试过会有兼容性问题。如果你电脑上默认JDK版本不对可以在引擎的构建设置里单独指定JDK路径。3.2 证书申请一步步来别跳步证书申请是整个流程里最繁琐的一步但也是最不能偷懒的一步。我把它拆成几个关键动作第一步生成密钥库文件。用DevEco Studio自带的命令行工具执行keytool -genkeypair -alias your_alias -keyalg EC -sigalg SHA256withECDSA -dname CCN,OYourCompany,OUYourDept,CNYourName -keystore your_keystore.p12 -storetype pkcs12 -validity 9125 -storepass your_password -keypass your_password这里用的是EC算法而不是RSA因为鸿蒙推荐用EC。validity设9125天差不多25年省得以后过期了还要重新申请。第二步生成证书请求文件。用上一步的密钥库生成CSRkeytool -certreq -alias your_alias -keystore your_keystore.p12 -storetype pkcs12 -file your_csr.csr -storepass your_password第三步把CSR提交到鸿蒙开发者后台换取cer证书文件。这一步在后台操作填好应用信息后上传CSR系统会生成cer文件供下载。第四步用cer证书和密钥库生成Profile文件。Profile文件里包含了应用的Bundle Name、证书指纹、权限列表。这一步也在后台完成下载下来是p7b格式。提示所有文件下载后统一放在一个文件夹里命名要规范比如release_keystore.p12、release_cert.cer、release_profile.p7b。后面在引擎里配置的时候不容易搞混。3.3 引擎侧配置这些参数一个都不能错打开团结引擎的Build Settings切换到HarmonyOS平台点击Player Settings。这里有几个关键参数Bundle Name必须和后台申请证书时填的完全一致包括大小写。Version Code整数每次提审都要递增。Version Name字符串给用户看的版本号。Signing Config这里要填三个文件路径分别是密钥库文件、证书文件、Profile文件。密钥库别名和密码也要填对。我建议在Player Settings里把“Custom Keystore”勾上然后手动指定文件路径。不要用引擎默认的调试签名那个只能用于本地测试上不了架。还有一个容易被忽略的参数是“Target API Level”。团结引擎1.6.12默认用的是API 10如果你的设备是API 11的系统可能会提示兼容性问题。可以在Player Settings里手动改成API 11但改完之后要重新导出工程让DevEco Studio重新编译。3.4 导出工程后的必要检查点击Build之后引擎会生成一个鸿蒙工程目录。这个目录里最重要的几个文件是entry/src/main/module.json5模块配置定义了Ability和权限。entry/src/main/ets/ArkTS代码目录引擎生成的桥接代码在这里。build-profile.json5构建配置定义了签名信息和产品规格。oh-package.json5依赖配置列出了三方库。导出后第一件事是打开build-profile.json5检查signingConfigs里的配置是否和你在引擎里填的一致。有时候引擎导出的配置会有遗漏比如证书路径写成了相对路径导致DevEco Studio找不到文件。这时候手动改成绝对路径就行。第二件事是检查module.json5里的requestPermissions字段。如果你在引擎里用了网络、存储、设备信息等能力这里应该有对应的权限声明。如果没有需要手动加上。比如网络权限requestPermissions: [ { name: ohos.permission.INTERNET } ]注意鸿蒙的权限分为system_grant和user_grant两种。system_grant是安装时就授予的user_grant是需要用户弹窗确认的。网络权限属于system_grant加上就行。但如果你用了相机或麦克风属于user_grant还需要在代码里动态申请。4. 完整实操流程与关键环节实现4.1 从零开始打一个可安装的HAP包我以一个新项目为例完整走一遍流程。假设你已经装好了团结引擎1.6.12和DevEco Studio 4.0并且已经在鸿蒙开发者后台申请好了证书和Profile。第一步在团结引擎里新建一个3D项目随便放一个Cube和Camera保存场景。这一步是为了确保有内容可以打包空场景打包出来也能装但不好验证渲染是否正常。第二步打开Build Settings切换到HarmonyOS平台点击Switch Platform。切换过程可能需要几分钟取决于项目大小。第三步点击Player Settings填写Bundle Name、Version Code、Version Name然后在Publishing Settings里填入密钥库路径、证书路径、Profile路径、别名、密码。填完后点一下“Validate”按钮如果提示成功就说明配置没问题。第四步点击Build选择一个输出目录。引擎会开始编译资源、生成中间工程。这个过程大概需要5到10分钟取决于项目复杂度。编译完成后输出目录里会有一个完整的鸿蒙工程文件夹。第五步用DevEco Studio打开这个工程文件夹。首次打开会触发依赖下载和索引构建可能需要几分钟。等右下角的进度条走完点击Build菜单里的“Build Hap(s)/APP(s)”选择“Build Hap(s)”。第六步编译完成后在entry/build/default/outputs/default/目录下会生成一个.hap文件。这个文件就是最终的可安装包。第七步用HDC命令安装到真机hdc install entry/build/default/outputs/default/entry-default-signed.hap如果提示“install success”恭喜你包打成功了。如果提示“signature verification failed”说明签名有问题回到第三步检查证书配置。4.2 参数计算Version Code和Version Name怎么定Version Code是整数用来给系统判断版本新旧。我建议用一个简单的规则主版本号乘以10000加上次版本号乘以100再加上修订号。比如1.2.3版本Version Code就是10203。这样每次发版递增不会乱。Version Name是给用户看的直接用“1.2.3”这种格式就行。但要注意鸿蒙的应用市场对Version Name有格式要求不能有特殊字符只能用数字和点。4.3 实操现场一次真实的打包记录我拿一个实际项目跑了一遍记录下关键时间点和输出信息。项目是一个简单的3D展示应用包含两个场景、若干贴图和音频资源。切换平台耗时约2分钟。首次Build耗时约8分钟其中资源编译占了大头。DevEco Studio打开工程耗时约3分钟主要是下载依赖。编译HAP耗时约4分钟。HAP文件大小约28MB。安装到真机耗时约30秒。安装成功后应用能正常启动3D场景渲染正常音频播放正常。但发现一个问题首次启动时会有约2秒的黑屏之后才显示场景。排查后发现是引擎初始化耗时较长可以在Ability的onCreate里加一个启动页来掩盖。5. 常见问题与排查技巧实录5.1 签名失败最常见的三类原因签名失败是打包过程中最高频的问题我整理了一个速查表错误提示可能原因解决方法signature verification failedBundle Name不一致检查引擎和后台的包名是否完全一致certificate not found证书路径错误在build-profile.json5里改用绝对路径profile expiredProfile文件过期重新在后台生成Profile并下载keystore password error密钥库密码错误确认密码大小写和特殊字符alias not found别名错误用keytool -list命令查看密钥库里的别名我遇到过一次特别隐蔽的问题证书文件本身没问题但Profile文件里的证书指纹和实际证书不匹配。原因是后台申请Profile时选错了证书。这种情况只能重新生成Profile没有别的办法。5.2 安装失败设备侧的排查思路HAP包编译成功但安装失败问题通常出在设备侧。首先确认设备是否开启了开发者模式和USB调试。鸿蒙的开发者模式入口在“设置-关于手机-版本号”连续点击七次。USB调试在“设置-系统和更新-开发人员选项”里。如果设备没问题检查HAP包的签名类型。鸿蒙要求安装到真机的包必须是release签名debug签名只能用于模拟器。如果你用的是引擎默认的debug签名需要换成自己申请的release证书。还有一个坑是设备API版本和HAP包的Target API Level不匹配。比如设备是API 11但HAP包编译时用的是API 10安装时会提示“incompatible device”。解决方法是在Player Settings里把Target API Level改成和Device API Level一致。5.3 运行时崩溃日志抓取与分析应用装上了但一启动就闪退这时候需要抓日志。用HDC命令hdc shell hilog | grep your_bundle_name这条命令会过滤出你的应用的日志。重点看FATAL级别的日志通常会提示崩溃原因。我遇到过几次崩溃原因分别是引擎初始化时找不到资源文件、原生插件没有正确注册、权限没有动态申请。资源文件找不到的问题通常是因为引擎导出的资源路径和鸿蒙工程里的路径不一致。可以在DevEco Studio里打开entry/src/main/resources目录检查rawfile和resfile文件夹里是否有引擎导出的资源。如果没有需要手动从引擎的输出目录里拷贝过来。原生插件没注册的问题需要在entry/src/main/ets/目录下找到引擎生成的桥接代码检查插件是否在onCreate里注册了。如果没有需要手动加上注册代码。5.4 独家避坑技巧这些经验文档里不会写第一个技巧在引擎里打包前先把项目里的中文路径全部改成英文。鸿蒙的构建工具链对中文路径支持不好有时候会报“file not found”但实际文件是存在的。改成英文路径就能解决。第二个技巧如果打包过程中卡在“Compiling resources”超过15分钟大概率是某个资源文件有问题。可以打开引擎的Console窗口看最后一条日志是哪个文件然后去检查那个文件。常见的问题是贴图格式不对或者音频采样率过高。第三个技巧DevEco Studio的缓存有时候会抽风导致编译失败但错误信息莫名其妙。这时候可以点File菜单里的“Invalidate Caches and Restart”清一下缓存再试。我遇到过三次类似情况清缓存后都解决了。第四个技巧如果你在引擎里用了IL2CPP脚本后端打包时间会明显变长但运行效率更高。如果只是测试可以先用Mono后端打包快很多。但正式发版一定要用IL2CPP因为鸿蒙对Mono的支持不完整某些反射功能会失效。第五个技巧HAP包安装到真机后如果发现某些功能不正常可以先卸载再重装。鸿蒙的增量安装有时候会残留旧版本的文件导致行为异常。用hdc uninstall your_bundle_name卸载再重新install。6. 打包之后的验证与优化建议6.1 功能验证清单包打出来只是第一步还要验证功能是否完整。我整理了一个验证清单每次发版前过一遍应用能否正常启动启动时间是否在可接受范围内。3D场景渲染是否正常有没有黑屏或花屏。音频能否正常播放音量是否正常。网络请求是否正常能否连接到服务器。本地存储是否正常能否读写文件。权限弹窗是否正常用户拒绝后是否有降级处理。应用切到后台再切回来状态是否保持。应用退出后重新启动数据是否持久化。这个清单看起来简单但每次都能查出一些问题。特别是权限和存储这两块鸿蒙和Android的行为差异比较大容易出问题。6.2 包体优化从28MB压到18MB我那个项目初始HAP包是28MB经过一轮优化压到了18MB。主要做了三件事第一压缩贴图。把不需要透明通道的贴图从RGBA32改成RGB16体积直接减半。在引擎的Texture Import Settings里改Format就行。第二剔除无用资源。用引擎的Resource Checker工具扫描一遍把没有被引用的资源删掉。我扫出来一堆测试用的音频和贴图删掉后省了3MB。第三开启代码混淆和裁剪。在Player Settings里把Managed Stripping Level设成HighIL2CPP Code Generation设成Faster (smaller) builds。这两个选项能显著减小代码体积但要注意测试反射功能是否正常。6.3 后续扩展多模块和动态加载如果项目比较大可以考虑拆成多个Feature模块按需下载。鸿蒙支持动态特性模块用户安装主包后可以在运行时下载额外的模块。这对降低首次安装包体积很有帮助。具体做法是在DevEco Studio里新建一个Feature模块把部分资源和代码挪过去然后在主模块里通过动态路由跳转过去。不过这个方案对引擎导出的工程改动比较大需要手动调整模块依赖关系。我目前还在试验阶段等跑通了再单独写一篇。我个人在实际操作中的体会是团结引擎打鸿蒙包这件事技术门槛不算高但细节特别多。证书、Profile、模块配置、权限声明每一个环节都有坑。最好的办法是第一次走流程的时候把每一步都记录下来形成自己的检查清单。下次再打包照着清单过一遍基本不会出问题。另外鸿蒙的开发者后台和DevEco Studio更新比较频繁建议每隔一段时间重新走一遍完整流程确保配置没有因为版本更新而失效。
返回列表