Android命令行工具--apksigner
使用 Android SDK Build Tools 修订版 24.0.3 及更高版本中提供的 apksigner
工具为 APK 签名,并确保 APK 的签名将在该 APK 支持的所有版本 Android 平台上成功通过验证。
注意:如果在使用
apksigner
为 APK 签名后又对 APK 做了更改,则 APK 的签名将会失效。如果使用 zipalign 对齐 APK,请在为 APK 签名之前使用它。
用法
为 APK 签名
使用 apksigner
工具为 APK 签名的语法如下:
apksigner sign --ks keystore.jks |--key key.pk8 --cert cert.x509.pem[signer_options] app-name.apk
在您使用 apksigner
工具为 APK 签名时,必须提供 signer 的私钥和证书。您可以通过两种方式添加此信息:
- 使用
--ks
选项指定密钥库文件。 - 使用
--key
和--cert
选项分别指定私钥文件和证书文件。私钥文件必须使用 PKCS #8 格式,证书文件必须使用 X.509 格式。
通常情况下,您只会使用一个 signer 为 APK 签名。如果您需要使用多个 signer 为 APK 签名,请使用 --next-signer
选项将要应用于每个 signer 的常规选项集分隔开:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
验证 APK 签名
在受支持的平台上确认 APK 签名是否成功通过验证的语法如下:
apksigner verify [options] app-name.apk
轮替签名密钥
轮替签名证书世系或新签名序列的语法如下:
$ apksigner rotate --in /path/to/existing/lineage \--out /path/to/new/file \--old-signer --ks old-signer-jks \--new-signer --ks new-signer-jks
选项
以下列表包含 apksigner
工具支持的每个命令的选项集。
签名命令
apksigner
签名命令具有以下选项。
常规选项
以下选项指定要应用于 signer 的基本设置:
注意:如果您的应用已在搭载 Android 12L(API 级别 32)或更低版本的设备上由轮替签名密钥签名,您必须使用 --rotation-min-sdk-version 28
通过适用于 Android 9(API 级别 28)的轮替签名密钥继续为您的应用签名。
--out <apk-filename>
您将要保存已签名 APK 的位置。如果未明确提供此选项,则 APK 软件包将就地签名,并替换输入的 APK 文件。
--min-sdk-version <integer>
apksigner
用来确认 APK 签名将通过验证的最低 Android 框架 API 级别。该级别值越高,表示该工具在为应用签名时可使用的安全参数越强,但这会限制 APK 只能用于搭载更新版本 Android 的设备。默认情况下,apksigner
会使用应用清单文件中的 minSdkVersion
属性的值。
--max-sdk-version <integer>
apksigner
用来确认 APK 签名将通过验证的最高 Android 框架 API 级别。默认情况下,该工具会使用尽可能高的 API 级别。
--rotation-min-sdk-version <integer>
生成 APK 签名时 APK 的轮替签名密钥应使用的最低 API 级别。该 APK 的原始(未轮替)签名密钥将用于所有先前的平台版本。默认情况下,搭载 Android 13(API 级别 33)或更高版本的设备上支持的轮替签名密钥与 v3.1 签名分块搭配使用。
--v1-signing-enabled <true | false>
确定 apksigner
是否会使用基于 JAR 的传统签名方案为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version
和 --max-sdk-version
的值来决定何时采用此签名方案。
--v2-signing-enabled <true | false>
确定 apksigner
是否会使用 APK 签名方案 v2 为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version
和 --max-sdk-version
的值来决定何时采用此签名方案。
--v3-signing-enabled <true | false>
确定 apksigner
是否会使用 APK 签名方案 v3 为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version
和 --max-sdk-version
的值来决定何时采用此签名方案。
--v4-signing-enabled <true | false | only>
确定 apksigner
是否会使用 APK 签名方案 v4 为给定的 APK 软件包签名。此方案会在单独的文件 (apk-name.apk.idsig
) 中生成签名。如果为 true
并且 APK 未签名,则系统会根据 --min-sdk-version
和 --max-sdk-version
的值生成 v2 或 v3 签名。然后,该命令会根据已签名的 APK 的内容生成 .idsig
文件。
使用 only
仅生成 v4 签名,而不会修改 APK 及其在调用前具有的任何签名。如果 APK 没有 v2 或 v3 签名,或者签名使用的密钥不同于为当前调用提供的密钥,则 only
会失败。
默认情况下,该工具会使用 --min-sdk-version
和 --max-sdk-version
的值来决定何时采用此签名方案。
-v、--verbose
使用详细输出模式。
每个 signer 的选项
以下选项用于指定特定 signer 的配置。如果您仅使用一个 signer 为应用签名,就不需要使用这些选项。
--next-signer <signer-options>
用于为每个 signer 指定不同的常规选项。
--v1-signer-name <basename>
相关文件的基名,此类文件构成当前 signer 的 JAR 签名。默认情况下,对于该 signer,apksigner
会使用密钥库的密钥别名或密钥文件的基名。
密钥和证书选项
以下选项用于指定 signer 的私钥和证书:
--ks <filename>
signer 的私钥和证书链包含在给定的基于 Java 的密钥库文件中。如果文件名设为 "NONE"
,则包含密钥和证书的密钥库不需要指定文件,某些 PKCS#11 密钥库就是这种情况。
--ks-key-alias <alias>
表示 signer 在密钥库中的私钥和证书数据的别名的名称。如果与 signer 关联的密钥库包含多个密钥,则必须指定此选项。
--ks-pass <input-format>
包含 signer 私钥和证书的密钥库的密码。您必须提供密码才能打开密钥库。apksigner
工具支持以下格式:
pass:<password>
- 密码与apksigner sign
命令的其余部分一起提供(内嵌在其中)。env:<name>
- 密码存储在给定的环境变量中。file:<filename>
- 密码存储在给定文件中的某一行。stdin
- 密码作为标准输入流中的某一行提供。这是--ks-pass
的默认行为。
注意:如果一个文件中包含多个密码,请分别在不同的行中指定这些密码。apksigner
工具会根据您指定 APK signer 的顺序将密码与 signer 相关联。如果您为 signer 提供了两个密码,apksigner
会将第一个密码视为密钥库密码,将第二个密码视为密钥密码。
--pass-encoding <charset>
在尝试处理包含非 ASCII 字符的密码时,请添加指定的字符编码(例如,ibm437
或 utf-8
)。
密钥工具通常使用控制台的默认字符集转换密码,以加密密钥库。默认情况下,apksigner
会尝试使用多种形式的密码进行解密:
- Unicode 形式
- 使用 JVM 默认字符集编码的形式
- 在 Java 8 及更早版本上,使用控制台的默认字符集编码的形式
在 Java 9 上,apksigner
无法检测控制台的字符集。当使用非 ASCII 密码时,您可能需要指定 --pass-encoding
。对于密钥工具在不同操作系统或不同语言区域中创建的密钥库,您可能也需要指定此选项。
--key-pass <input-format>
signer 私钥的密码。如果私钥受密码保护,则需要该密码。apksigner
工具支持以下格式:
pass:<password>
- 密码与apksigner sign
命令的其余部分一起提供(内嵌在其中)。env:<name>
- 密码存储在给定的环境变量中。file:<filename>
- 密码存储在给定文件中的某一行。stdin
- 密码作为标准输入流中的某一行提供。这是--key-pass
的默认行为。
--ks-type <algorithm>
与包含 signer 的私钥和证书的密钥库关联的类型或算法。默认情况下,apksigner
会使用在安全属性文件中定义为 keystore.type
常量的类型。
--ks-provider-name <name>
请求 signer 的密钥库实现时使用的 JCA 提供程序的名称。默认情况下,apksigner
会使用优先级最高的提供程序。
--ks-provider-class <class-name>
请求 signer 的密钥库实现时使用的 JCA 提供程序的完全限定类名。此选项可作为 --ks-provider-name
的替代选项。默认情况下,apksigner
会使用由 --ks-provider-name
选项指定的提供程序。
--ks-provider-arg <value>
要作为 JCA 提供程序类的构造函数的参数传入的字符串值;该类本身由 --ks-provider-class
选项定义。默认情况下,apksigner
会使用该类的零参数构造函数。
--key <filename>
包含 signer 私钥的文件的名称。该文件必须使用 PKCS #8 DER 格式。如果密钥受密码保护,则除非您使用 --key-pass
选项指定其他类型的输入格式,否则 apksigner
会提示您使用标准输入格式输入密码。
--cert <filename>
包含 signer 证书链的文件的名称。此文件必须使用 X.509 PEM 或 DER 格式。
验证命令
apksigner
验证命令具有以下选项。
--print-certs
显示有关 APK 签名证书的信息。
--min-sdk-version <integer>
apksigner
用来确认 APK 签名将通过验证的最低 Android 框架 API 级别。该级别值越高,表示该工具在为应用签名时可使用的安全参数越强,但这会限制 APK 只能用于搭载更新版本 Android 的设备。默认情况下,apksigner
会使用应用清单文件中的 minSdkVersion
属性的值。
--max-sdk-version <integer>
apksigner
用来确认 APK 签名将通过验证的最高 Android 框架 API 级别。默认情况下,该工具会使用尽可能高的 API 级别。
-v、--verbose
使用详细输出模式。
-Werr
将警告视为错误。
示例
以下是使用 apksigner
的示例。
为 APK 签名
使用 release.jks
(密钥库中唯一的密钥)为 APK 签名:
$ apksigner sign --ks release.jks app.apk
使用私钥和证书(存储为不同的文件)为 APK 签名:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
使用两个密钥为 APK 签名:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
使用轮替签名密钥为 APK 签名,且轮替的目标版本为 SDK 版本 28 及更高版本:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \--lineage /path/to/signing/history/lineage app.apk \--rotation-min-sdk-version 28
使用轮替签名密钥为 APK 签名,且轮替的目标版本为 SDK 版本 33 及更高版本:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \--lineage /path/to/signing/history/lineage app.apk
验证 APK 签名
检查 APK 的签名是否可在 APK 支持的所有 Android 平台上被确认为有效:
$ apksigner verify app.apk
检查 APK 的签名是否可在 Android 4.0.3(API 级别 15)及更高版本上被确认为有效:
$ apksigner verify --min-sdk-version 15 app.apk
轮替签名密钥
启用支持密钥轮替的签名证书沿袭:
$ apksigner rotate --out /path/to/new/file --old-signer \--ks release.jks --new-signer --ks release2.jks
再次轮替您的签名密钥:
$ apksigner rotate --in /path/to/existing/lineage \--out /path/to/new/file --old-signer --ks release2.jks \--new-signer --ks release3.jks
相关文章:
Android命令行工具--apksigner
使用 Android SDK Build Tools 修订版 24.0.3 及更高版本中提供的 apksigner 工具为 APK 签名,并确保 APK 的签名将在该 APK 支持的所有版本 Android 平台上成功通过验证。 注意:如果在使用 apksigner 为 APK 签名后又对 APK 做了更改,则 APK…...
Linux高性能服务器编程 | 读书笔记 |9.定时器
9. 定时器 网络程序需要处理定时事件,如定期检测一个客户连接的活动状态。服务器程序通常管理着众多定时事件,有效地组织这些定时事件,使其在预期的时间被触发且不影响服务器的主要逻辑,对于服务器的性能有至关重要的影响。为此&…...
UE5制作伤害浮动数字
效果演示: 首先创建一个控件UI 添加画布和文本 文本设置样式 添加伤害浮动动画,根据自己喜好调整,我设置了缩放和不透明度 添加绑定 转到事件图表,事件构造设置动画 创建actor蓝图类 添加widget 获取位置 设置位移 创建一个被击中…...
双亲委派机制是Java类加载器的一种工作模式
双亲委派机制是Java类加载器的一种工作模式,确保了类加载的一致性和安全性。以下是对双亲委派机制的详细解析: 一、定义与工作原理 双亲委派机制(Parent Delegation Model)要求除了顶层的启动类加载器外,其余的类加载…...
AI智算-k8s部署大语言模型管理工具Ollama
文章目录 简介k8s部署OllamaOpen WebUI访问Open-WebUI 简介 Github:https://github.com/ollama/ollama 官网:https://ollama.com/ API:https://github.com/ollama/ollama/blob/main/docs/api.md Ollama 是一个基于 Go 语言开发的可以本地运…...
百度23届秋招研发岗A卷
百度23届秋招研发岗A卷 2024/12/16 1.下面关于 SparkSQL 中 Catalyst 优化器的说法正确的是(ABC) A.Catalyst 优化器利用高级编程语言功能(例如 Scala 的模式匹配)来构建可扩展的查询优化器 B.Catalyst 包含树和操作树的规则集…...
米哈游大数据面试题及参考答案
怎么判断两个链表是否相交?怎么优化? 判断两个链表是否相交可以采用多种方法。 一种方法是使用双指针。首先分别遍历两个链表,得到两个链表的长度。然后让长链表的指针先走两个链表长度差的步数。之后,同时移动两个链表的指针,每次比较两个指针是否指向相同的节点。如果指…...
Android14 AOSP 允许system分区和vendor分区应用进行AIDL通信
在Android14上,出于种种原因,system分区的应用无法和vendor分区的应用直接通过AIDL的方法进行通信,但是项目的某个功能又需要如此。 好在Binder底层其实是支持的,只是在上层进行了屏蔽。 修改 frameworks/native/libs/binder/Bp…...
llm chat场景下的数据同步
背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…...
视频去重原理及 Demo 示例
视频去重是一个常见的需求,主要用于视频库或平台管理中,通过判断视频是否相同(或相似)来移除冗余内容。实现视频去重可以通过多种方法,具体选择取决于业务场景和性能要求。 1. 视频去重的原理 1.1 基本原理 视频去重…...
【GIS教程】使用GDAL-Python将tif转为COG并在ArcGIS Js前端加载-附完整代码
目录 一、数据格式 二、COG特点 三、使用GDAL生成COG格式的数据 四、使用ArcGIS Maps SDK for JavaScript加载COG格式数据 一、数据格式 COG(Cloud optimized GeoTIFF)是一种GeoTiff格式的数据。托管在 HTTP 文件服务器上,可以代替geose…...
【ETCD】【源码阅读】深入解析 EtcdServer.applySnapshot方法
今天我们来一步步分析ETCD中applySnapshot函数 一、函数完整代码 函数的完整代码如下: func (s *EtcdServer) applySnapshot(ep *etcdProgress, apply *apply) {if raft.IsEmptySnap(apply.snapshot) {return}applySnapshotInProgress.Inc()lg : s.Logger()lg.In…...
C# 实现 10 位纯数字随机数
本文将介绍如何用 C# 实现一个生成 10 位纯数字随机数的功能。以下是完整的代码示例: using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace RandomTset {class Program{// 使用GUID作为种子来创建随机数生成器static…...
【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
黑盒白盒测试
任务1 黑盒测试之等价类划分法 【任务需求】 【问题】例:某报表处理系统要求用户输入处理报表的日期,日期限制在2003年1月至2008年12月,即系统只能对该段期间内的报表进行处理,如日期不在此范围内,则显示输入错误信息…...
D99【python 接口自动化学习】- pytest进阶之fixture用法
day99 pytest使用conftest管理fixture 学习日期:20241216 学习目标:pytest基础用法 -- pytest使用conftest管理fixture 学习笔记: fixture(scope"function") conftest.py为固定写法,不可修改名字,使用c…...
RFDiffusion 计算二面角函数解读
th_dih函数来自util.py包,get_dih函数来自kinematics.py包。th_dih函数计算输入向量定义的二面角的余弦值和正弦值,返回一个包含 (cos(ϕ),sin(ϕ)) 的张量。get_dih 函数计算的是传统意义上的二面角。 源代码: def th_dih_v(ab, bc, cd):def th_cross(a, b):a, b = t…...
卓易通:鸿蒙Next系统的蜜糖还是毒药?
哈喽,我是老刘 最近很多人都在问鸿蒙next系统新上线的卓易通和出境易两款应用。 老刘分析了一下这个软件的一些细节,觉得还是蛮有意思的,我觉得可以从使用体验、底层原理和对鸿蒙生态的影响这三个角度来分析一下。 使用体验 性能 看到了一些测…...
Android:展锐T760平台camera PDAF调试
一、平台PDAF流程 目前展锐平台主要支持Shield PD Sensor、Dual PD Sensor 1、Shield PD Sensor Type1相位差和信心度结果直接从Sensor输出,不经过平台算法库。 Type2Sensor端抽取PD信息, 放在一块buffer输出, PDAF算法库算出相位差和信心度。 Type3Sensor端直接输出将带有…...
泷羽Sec学习笔记-zmap搭建炮台
zmap搭建炮台 zmap扫描环境:kali-linux 先更新软件库 sudo apt update 下载zmap sudo apt install zmap 开始扫描(需要root权限) sudo zmap -p 80 -o raw_ips.txt 代码解析: sudo:以超级用户(管理员)权限运行…...
web遇到的安全漏洞
最近项目又在做安全漏扫,记录下遇到的常见的web安全问题 越权 漏洞介绍 攻击者可以在授权状态下,通过修改数据包的参数,操作超出现有权限操作的功能点。举例 修改密码时,可以通过修改名称参数,修改任意用户密码。 任…...
Starfish 因子开发管理平台快速上手:如何完成策略编写与回测
DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计,为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。 因子平台的回测引擎提供了多个关键的事件函数,涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和…...
Oracle 数据库中,UNION ALL创建视图的使用详解
目录 UNION ALL 的特点 UNION ALL 的作用 1. 合并结果集 2. 保留重复行 3. 提高性能 UNION ALL 的使用场景 1. 日志或数据拼接 2. 区分数据来源 3. 解决分区表查询 注意事项 在创建视图中的作用 场景 1:合并多个表的数据到视图 表结构 目标 SQL 实现…...
无名信号量和条件变量
1.使用无名信号量实现春夏秋冬的输出 #include <myhead.h> sem_t sem1,sem2,sem3,sem4; void *fun1() {while(1){sem_wait(&sem1);sleep(1);printf("春\n");sem_post(&sem2);} } void *fun2() {while(1){sem_wait(&sem2);sleep(1);printf("夏…...
之前使用vue-element-admin框架开发的项目无法启动,可能是这个原因
最近运行之前的项目,发现无法正常启动,可能有以下几种情况: 一、版本问题 报错: this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital 因为在 node V17 版本发布了 OpenSSL3.0 对算法…...
JDK的配置
目录 第一步,配置JAVA_HOME. 第二步,进入JDK的bin目录,然后复制路径。 第三步,配置CLASSPATH. 第四步,检验是否配置成功 安装好JDK后,配置三个环境变量 第一步,配置JAVA_HOME. 先找到JDK…...
【Linux系列】Linux 系统中查看目录权限
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
开启数字化时代心理服务新篇章:专属线上心理咨询服务小程序
在当今快节奏的社会中,心理健康问题日益受到人们的关注。然而,传统的心理咨询模式往往受限于时间和地点,使得许多人在寻求心理帮助时感到不便。与此同时,心理课程的传播也面临着诸多挑战,如何高效地触达目标客户群体&a…...
[Unity] Text文本首行缩进两个字符
Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如: 效果: 代码: TMPtext1.text "\u3000\u3000" "选择动作类型:";...
探索 OpenTofu:开源基础设施即代码工具
引言 在现代云计算和 DevOps 实践中,基础设施即代码(IaC)已经成为不可或缺的一部分。它使得基础设施的管理更加自动化、可重复和可维护。HashiCorp 的 Terraform 是这一领域的领先工具,但随着时间的推移,开源社区也开始关注其许可证的变更。OpenTofu 作为 Terraform 的一…...
2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章
2024首届世界酒中国菜国际地理标志产品美食文化节成功举办,开启美食文化交流新篇章 近日,首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办,这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…...
宽字节注入
尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk…...
H5 scss 移动端的样式适配
在移动端样式的scss文件中,出现了这些变量 env() 与 constant() 设置安全区域,是css里IOS11新增的属性,webkit的css函数,用于设定安全区域与边界的距离,有4个预定义变量: safe-area-inset-left: 安全区域距…...
240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现
基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…...
Word2Vec 模型 PyTorch 实现并复现论文中的数据集
详细注解链接:https://www.orzzz.net/directory/codes/Word2Vec/index.html 欢迎咨询!...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Lin…...
使用matlab对矩阵进行分块
1. 前言 由于matlab内存限制,导致无法处理较大尺寸的矩阵; 2. 解决思路 读取原始大尺寸矩阵,分块后处理,及时删除中间过程文件,只保留分块处理后的最终结果,最后合并结果文件,减少内存占用。 …...
MongoDB(上)
MongoDB 基础 MongoDB 是什么? MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂…...
超详细的pycharm+anaconda搭建python虚拟环境
(一)pycharm安装 1. 下载 (1)从官网下载 ,一般来说选择社区版就够用了。我这里选择2024.1.6的windows版本Other Versions - PyCharmGet past releases and previous versions of PyCharm.https://www.jetbrains.com/…...
yarn修改缓存位置
查看缓存位置 以下三个命令分别为:bin是yarn存储命令的二进制文件,global存储全局node_modules ,cache存储用下下载缓存,查看本机目前的目录: 查看bin目录命令:yarn global bin 查看global目录命令&…...
单元测试知识总结
我们希望每段代码都是自测试的,每次改动之后,都能自动发现对现有功能的影响。 1 测试要求 在对软件单元进行动态测试之前,应对软件单元的源代码进行静态测试; 应建立测试软件单元的环境,如数据准备、桩模块、模拟器…...
光谱相机
光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上,在探测器前设置分光元件,如光栅、棱镜或滤光片等,将光按不同波长分解成多个光谱通道,…...
账号下的用户列表表格分析
好的,这是您提供的 el-table 组件中所有列的字段信息,以表格形式展示: 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…...
软件开发中 Bug 为什么不能彻底消除
在软件开发中,Bug无法彻底消除的原因主要包括:软件复杂度高、人员认知与沟通受限、需求和环境不断变化、工具与测试覆盖不足、经济与时间成本制约。其中“需求和环境不断变化”尤为关键,因为在实际开发中,业务逻辑随着市场与用户反…...
Flutter 中的 Flexible 与 Expanded 的介绍、区别与使用
在 Flutter 中,布局是构建用户界面的重要部分。Flexible 和 Expanded 是两个常用的布局小部件,它们都用于控制子小部件在父容器中的空间分配。虽然它们有相似之处,但在使用上有一些关键的区别。本文将介绍这两个小部件的基本概念、区别、参数…...
从零开始学习 sg200x 多核开发之 sophpi 编译生成 fip.bin 流程梳理
本文主要介绍 sophpi 编译生成 fip.bin 流程。 1、编译前准备 sophpi 的基本编译流程如下: $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注: 需要在 bash 下运行clean_all 非必要可以不…...
通过一个例子学习回溯算法:从方法论到实际应用
回溯算法:从方法论到实际应用 回溯算法(Backtracking)是一种通过穷举法寻找问题所有解的算法,它的核心思想是逐步构建解空间树,在每个步骤中判断当前解是否合法。如果不合法,就“回溯”到上一步࿰…...
google 的guava 学习 基本工具类
Guava 是 Google 开发的一个 Java 核心库,它提供了一系列工具类,用于简化 Java 编程中的常见任务。以下是 Preconditions 和 Verify 两个工具类的使用示例: Preconditions 类 Preconditions 类提供了一组静态方法,用于在代码中插…...
【Linux金典面试题(上)】41道Linux金典面试问题+详细解答,包含基本操作、系统维护、网络配置、脚本编程等问题。
大家好,我是摇光~,用大白话讲解所有你难懂的知识点 之前写了一篇关于 python 的面试题,感觉大家都很需要,所以打算出一个面试专栏。 【数据分析岗】Python金典面试题 这个专栏主要针对面试大数据岗位、数据分析岗位、数据运维等…...
SpringBoot【九】mybatis-plus之自定义sql零基础教学!
一、前言🔥 环境说明:Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用,前两期基本讲的差不多,够日常使用,但是有的小伙伴可能就会抱怨了,若是遇到业务逻辑比较复杂的sq…...