注意:为了保证通用性和准确性,本次解包、打包和签名等工具均使用鸿蒙官方提供的工具。
hap解包
介绍
app_unpacking_tool.jar是鸿蒙提供的解包工具,通常位于 SDK 的 toolchains\lib
目录下;
命令
基本命令格式:
java -jar app_unpacking_tool.jar --mode hap --hap-path ./myapp.hap --out-path ./myapp_unpacked --force true
示例参考:
"F:\Program Files\Huawei\DevEco Studio\jbr\bin\java.exe" -jar "D:\Desktop\apks_sign\hongmeng-jinyue\app_unpacking_tool.jar" --mode hap --hap-path entry-default-signed.hap --out-path entry-default-signed --force true
参数说明:
参数 | 是否必选 | 描述 |
---|---|---|
--mode | 是 | 解包类型,此处固定为 hap 。 |
--hap-path | 是 | 指定要解包的原始 HAP 文件的路径。 |
--out-path | 是 | 指定解包后内容存放的目录路径。 |
--force | 否 | 如果为 true ,当目标输出目录已存在时,会强制覆盖。默认值为 false 。 |
上述列出的只是常用参数,如果需要更详细的参数请参考鸿蒙官网文档。
hap打包
介绍
app_packing_tool.jar是鸿蒙提供的打包工具,通常位于 SDK 的 toolchains\lib
目录下;
使用 app_packing_tool.jar
来打包 HAP 包时,命令参数会根据 HAP 包所使用的Stage模型还是 FA模型有所不同。
一般来说通过核心配置文件可以判断当前hap包是FA模型还是Stage模型,比如FA模型的核心配置文件一般命名为config.json
;
Stage模型的核心配置文件一般命名为module.json5
。
模型
stage模型
基本命令格式:
java -jar app_packing_tool.jar --mode hap --json-path <module.json路径> --resources-path <资源路径> --ets-path <ets代码路径> --out-path <输出HAP路径> [其他参数] --force true
示例参考:
"F:\Program Files\Huawei\DevEco Studio\jbr\bin\java.exe" -jar "D:\Desktop\apks_sign\hongmeng-jinyue\app_packing_tool.jar" --mode hap --json-path "D:\Desktop\Android_so\entry-default-signed\module.json" --resources-path "D:\Desktop\Android_so\entry-default-signed\resources" --ets-path "D:\Desktop\Android_so\entry-default-signed\ets" --lib-path "D:\Desktop\Android_so\entry-default-signed\libs" --index-path "D:\Desktop\Android_so\entry-default-signed\resources.index" --pack-info-path "D:\Desktop\Android_so\entry-default-signed\pack.info" --out-path repacked.hap --force true
FA模型
基本命令格式:
java -jar app_packing_tool.jar --mode hap --json-path <config.json路径> --dex-path <dex路径> --lib-path <native库路径> --resources-path <资源路径> --out-path <输出HAP路径> [其他参数] --force true
命令参数说明
参数 | 是否必选 | 描述 | 备注 |
---|---|---|---|
--mode | 是 | 打包类型,此处固定为 hap 。 | |
--json-path | 是 | 配置文件路径。Stage 模型为 module.json ,FA 模型为 config.json 。 | |
--resources-path | 否 | 资源文件(如图片、字符串等)的目录路径。 | |
--ets-path | 否 | ArkTS(.ets)源代码的目录路径。 | 仅Stage模型生效 |
--dex-path | 否 | .dex 文件路径或包含 dex 文件的目录路径。 | FA模型常用 |
--lib-path | 否 | native库(.so)文件路径。 | |
--out-path | 是 | 打包完成后输出的 HAP 文件路径,必须以 .hap 结尾。 | |
--force | 否 | 如果为 true ,当输出 HAP 文件已存在时,会强制覆盖。默认值为 false 。 |
上述列出的只是常用参数,打包工具还支持更多参数,例如 --profile-path
、--index-path
、--pack-info-path
、--rpcid-path
、--js-path
等,实际使用时,请务必根据你解包后的具体文件结构和内容,参考官方文档或工具帮助信息来选择和调整参数。
例如:下列文件夹的内容为hap解包后的结构,那么打包的时候需要用到--ets-path、--lib-path、--resources-path、--json-path、--pack-info-path、--index-path
参数,所以具体指定什么参数需要根据解包后的文件才能确定。

hap签名
获取签名信息:
参考华为鸿蒙官方文档去申请创建证书等,链接为:https://developer.huawei.com/consumer/cn/doc/app/agc-help-add-releasecert-0000001946273961
基本命令格式:
java -jar hap-sign-tool.jar sign-app -keyAlias <别名> -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile <cer证书路径> -profileFile <p7b文件路径> -inFile <hap包路径> -keystoreFile <p12文件路径> -outFile <重签名后的hap包路径> -keyPwd <别名密码> -keystorePwd <p12密码>
示例参考:
"F:\Program Files\Huawei\DevEco Studio\jbr\bin\java.exe" -jar "D:\Desktop\apks_sign\hongmeng-jinyue\hap-sign-tool.jar" sign-app -keyAlias "sensetest" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "D:\Desktop\apks_sign\hongmeng-jinyue\Debug.cer" -profileFile "D:\Desktop\apks_sign\hongmeng-jinyue\jinyueDebug.p7b" -inFile "D:\Desktop\Android_so\entry-default-signed.hap" -keystoreFile "D:\Desktop\apks_sign\hongmeng-jinyue\debug.p12" -outFile "new-hap-signed.hap" -keyPwd "Sense1!123" -keystorePwd "Sense1!123"
参数说明:
参数 | 值 | 含义与作用 |
---|---|---|
-keyAlias | "sensetest" | 密钥别名 |
-signAlg | "SHA256withECDSA" | 签名算法,指定了生成数字签名时使用的哈希算法和加密算法。 |
-mode | "localSign" | 签名模式,localSign 模式表示使用本地的密钥库文件(.p12)进行签名操作 |
-appCertFile | "Debug.cer" | cer应用证书文件路径,包含了公钥等信息,用于验证签名的有效性。 |
-profileFile | "jinyueDebug.p7b" | Provision Profile文件路径,包含了应用的包名、证书、允许安装的设备列表(对于调试证书)等信息。没有这个文件,即使签名了也无法安装到真机上。 |
-inFile | "entry-default-signed.hap" | 输入文件路径,指定需要被签名的原始HAP包的文件位置。 |
-keystoreFile | "debug.p12" | 密钥库文件路径,包含私钥的密钥库文件(.p12格式),是生成数字签名的核心文件 |
-outFile | "new-hap-signed.hap" | 输出文件路径,指定签名完成后生成的新HAP包的保存路径和文件名。 |
-keyPwd | "Sense1!123" | 密钥密码,这是访问-keyAlias 指定的那个特定密钥对的密码。 |
-keystorePwd | "Sense1!123" | 密钥库密码,这是用于打开整个.p12 密钥库文件的密码 |
上述列出的只是常用参数,如果需要更详细的参数请参考鸿蒙官网文档。
hap安装
参考命令:
hdc install new-hap-signed.hap
so库加固
上述流程是hap的完整操作流程,如果需要对so库进行加固,需要在hap解包的流程后加上so库加固流程。
流程变为:hap解包-》对so库进行加固-》hap打包-》hap签名-》hap安装。
命令介绍:
选项 | 命令行 | 功能介绍 |
---|---|---|
导入表保护 | --imp-protect= | 去除程序中的导入函数和变量等敏感信息,防止反编译工具交叉引用分析模块边界 |
内存校验 | --mem-check= | 可以在程序加载时校验自身完整性,如果发现程序被篡改,则会退出进程 |
调试器检测 | --detect-dbg= | 可以检测当前模块的进程是否被工具调试,被调试则退出阻止运行 |
移除调试信息 | --strip-dbginfo= | 将ELF程序中的 .debug 节,静态符号表移除。 |
压缩 | --pack=0 | 是将程序中的代码、数据等信息进行打包、压缩和加密。目前压缩和鸿蒙系统不兼容,命令行加壳时必须设置为0。 |
代码混淆 | -m “函数名1;函数名2” | 将函数中原始的指令,通过等价变换、立即数加密、间接跳转等手段转换为难以阅读的随机的指令片段 |
代码虚拟化 | -v “函数名1;函数名2” | 保护过程中将函数中原始的汇编指令,转换为自定义的虚拟指令,运行时在自定义的虚拟机中执行 |
输出文件 | -o | 指保护后的输出文件路径 |
加固命令,参考如下:
"C:\Program Files\senseshield\Virbox Protector 3\bin\virboxprotector_con.exe" "libc++_shared.so" -m "_ZSt14get_unexpected;_ZSt15get_new_handler" --imp-protect=1 --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 --pack=0 -o protected\libc++_shared.so
注意:
打包hap时,需提前将将加固后的so库替换到原so文件位置处。