OpenHarmony 应用通用签名

一.背景

        由于hap包需要经过签名才能安装到设备上,在DevEco Studio可以进行自动签名,但是自动签名只能安装在当前的设备上,在其他设备上不能安装,所以我们需要进行通用的手动签名,手动签名HarmonyOS和OpenHarmony流程是不一样的,HarmonyOS签名见:https://gonglipeng.blog.csdn.net/article/details/131870054

本次内容主要是OpenHarmony的手动签名

二.准备工作

签名流程中需要gradle生成的签名工具进行签名,所以需要下载安装并配置gradle环境,如下:

1.如果是开发安卓项目都应该是安装过gradle的,我的路径如下,一般默认路径也如下:

注意gradle版本需要高于或等于7.1,我用的是8.0版本

2.将其配置到环境变量中

3.然后检查是否配置成功

通过gradle -v

三.下载签名工具仓库代码

将如下地址的代码clone到本地

developtools_hapsigner: hapsigner | 应用签名工具

四.通过gradle生成签名工具

在如下目录输入指令:

gradle build

然后如上图会显示构建成功,然后编译后得到二进制文件,目录为: ./hap_sign_tool/build/libs/hap-sign-tool.jar。

五.文件拷贝修改

1.文件拷贝

找到如下文件

然后找到未签名的包

然后将如上文件都拷贝到libs目录下,注意此处其他文件是我中间生成结果,忽略:

然后注意要修改UnsgnedReleasedProfileTemplate.json文件内容,注意包名,系统权限等等,具体参考:

OpenAtom OpenHarmony 

 

六.进行签名

1.生成应用签名证书密钥对

调用密钥对生成接口,生成签名密钥并保存到密钥库。

命令实例:

java -jar hap-sign-tool.jar generate-keypair -keyAlias "oh-app1-key-v1" -keyAlg "ECC"  -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "123456" -keystorePwd "123456"

 这一步主要是keyAlias 是别名,修改成自己的,然后记住,后面有用

2.生成应用签名证书

调用应用签名证书生成接口,使用本地中间CA证书签发应用签名证书。

命令实例:

java -jar hap-sign-tool.jar generate-app-cert -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA"  -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "app1.pem" -keyPwd "123456" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365"

如上命令拷贝并运行,注意别名用第一步自定义的

3.对Hap包进行签名

调用Hap包签名接口,使用应用签名密钥为Hap包签名。

命令实例:

java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "app1.pem" -profileFile "app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "OpenHarmony.p12" -outFile "app1-signed.hap" -keyPwd "123456" -keystorePwd "123456"

此处需要注意别名用上面的,然后-inFile是输入的文件,就是未签名的hap文件名,-outFile是签名后输出的文件,可以自己自定义名字

最终结果应该如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

文章目录 一、搜索 API1. 搜索 API 端点地址2. URI Search3. 查询结果说明5. 特殊的查询参数用法6. Request body Search6.1 query 元素定义查询6.2 指定返回哪些内容6.2.1 source filter 对_source 字段进行选择6.2.2 stored_fields 来指定返回哪些 stored 字段6.2.3 docValue…

scanf函数返回值占位符详解,%*,%[]的应用

前言 scanf函数可以说是我们一开始就会接触的函数了,但在最近复习时我又找到而来一些之前不甚了解或是块要遗忘的知识,特作此篇。 一.返回值 我们之前提到了scanf返回值被忽略的问题: scanf函数返回值被忽略-CSDN博客 那么scanf的返回值…

分布式系统架构设计之分布式系统实践案例和未来展望

分布式系统在过去的几十年里经历了长足的发展,从最初的简单分布式架构到今天的微服务、云原生等先进架构,取得了丰硕的成果。本文将通过实际案例分享分布式系统的架构实践,并展望未来可能的发展方向。 一、实践案例 1、微服务化实践 背景 …

tcp/ip实现两个手机之间连接同步显示

app主界面 选择一:TCP客户端 选择二:TCP服务端 点击下图item时进入曲线绘制页面 如果是服务器端它不需要连任何设备就可以直接进入绘制界面如果是TCP的话就不能直接进入,否则就会提示未连接网络连接不能放在主线程,页面去调方法&…

IP地址的四大类型:动态IP、固定IP、实体IP、虚拟IP的区别与应用

在网络通信中,IP地址是设备在互联网上唯一标识的关键元素。动态IP、固定IP、实体IP和虚拟IP是四种不同类型的IP地址,它们各自具有独特的特点和应用场景。 1. 动态IP地址: 动态IP地址是由Internet Service Provider(ISP&#xff…

Python跨年烟花秀

写在前面 今年跨年怎么过呢~博主用python的pygame实现了一场炫酷的烟花秀,一起来看看吧! 环境需求 python3.11.4及以上PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境…

STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习(二) USB CDC 双向通信 简介CubeMX新建工程(串口LED)测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板,测试基于USB CDC的双向数据通信。 CubeMX新建工程(串口LE…

Prometheus通过consul实现自动服务发现

环境,软件准备 本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本: System: CentOS Linux release 7.6Docker: 24.0.5Prometheus: v2.37.6Consul: 1.6.1 注意:这里为了方便启动 Prometheus、Consul服…

Vue Tinymce富文本组件自定义带下拉框的操作按钮

想实现如下效果 首先在init方法中的props,toolbar属性增加一个自定义按钮 增加一个setup方法 代码 setup: function(editor) { editor.ui.registry.addSplitButton(myDateButton, {text: 日期时间,onAction: (_) > editor.insertContent(getJsMonthDay(getNowDat…

Spring 是如何解决循环依赖的

1.什么是循环依赖? 所谓的循环依赖是指,A 依赖 B,B 又依赖 A,它们之间形成了循环依赖。或者是 A 依赖 B,B 依赖 C,C 又依赖 A。它们之间的依赖关系如下: 2.通过手写代码演示理解Spring循环依赖 DEMO: pu…

【机器学习】深度学习概论(二)

五、受限玻尔兹曼机(Restricted Boltzmann Machine,RBM) 5.1 RBM介绍 示例代码: Python 编写了一个简单的 RBM 实现,并用一些假数据训练了它。然后,他展示了如何用 RBM 来解释用户的电影偏好,以…

使用rust读取usb设备ACR122U的nfc卡片id

rust及其高效和安全著称,而且支持跨平台,所以就想使用这个rust开发一个桌面端程序,来读取nfc设备的nfc卡片的id信息,下面就做一个最简单的入门教程吧,也是我写的第三个rust应用。 当你电脑上安装好了rust环境之后&…

MySql篇——MySql使用常见问题及解决办法

这里汇总MySql使用常见问题及解决办法,会持续更新。 问题1.ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。 含义:你设置的密码不符合当前的密码等级。 可使用 SHOW VARIABLES LIKE validate_password%; 查看…

Spring-4-代理

前面提到过,在Spring中有两种类型的代理:使用JDK Proxy类创建的JDK代理以及使用CGLIB Enhancer类创建的基于CGLIB的代理。 你可能想知道这两种代理之间有什么区别,以及为什么 Spring需要两种代理类型。 在本节中,将详细研究代理…

count distinct在spark中的运行机制

文章目录 预备 数据和执行语句Expand第一次HashAggregateShuffle and Second HashAggregate最后结果性能原文 预备 数据和执行语句 SELECT COUNT(*), SUM(items), COUNT(DISTINCT product), COUNT(DISTINCT category) FROM orders;假设源数据分布在两个1核的结点上&#xff0…

ElasticSearch 聚合统计

聚合统计 度量聚合:求字段的平均值,最小值,最大值,总和等 桶聚合:将文档分成不同的桶,桶的划分可以根据字段的值,范围,日期间隔 管道聚合:在桶聚合的结果上执行进一步计…

【Java 进阶篇】Redis 缓存优化:提升应用性能的不二选择

在现代的软件开发中,性能一直是开发者们追求的目标之一。对于数据库访问频繁、数据读取较慢的场景,使用缓存是提升性能的有效手段之一。而 Redis 作为一款高性能的内存数据库,被广泛用作缓存工具。本文将围绕 Redis 缓存优化进行详解&#xf…

swing快速入门(三十二)消息对话框

注释很详细,直接上代码 上一篇 新增内容 1.自定义对话框前列图标 2.消息对话框的若干种形式 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent;public class swing_test_30 {// 定义一个JFrameJFrame jFrame n…

Modbus,DNP3的理解

Modbus,DNP3的理解 目录概述需求: 设计思路实现思路分析1.概念理解3.区别 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for…

【远程开发】穿越跳板机和CLion远程开发——全面配置流程

文章目录 穿越跳板机配置 ProxyJump 方案Cygwin上的配置 建立 SSH Tunneling 方案 代码映射目录映射方案配置Rsync加速 远程服务器方案(todo) 远程Debug tips:本文讲了两种穿越跳板机的方案(推荐ProxyJump方案),和两种代码映射的方案。实际任选一对搭配即…