Android中APK签名工具之jarsigner和apksigner详解

2023-05-16

一.工具介绍

jarsigner是JDK提供的针对jar包签名的通用工具,

位于JDK/bin/jarsigner.exe

apksigner是Google官方提供的针对Android apk签名及验证的专用工具,

位于Android SDK/build-tools/SDK版本/apksigner.bat

不管是apk包,还是jar包,本质都是zip格式的压缩包,所以它们的签名过程都差不多(仅限V1签名),

以上两个工具都可以对Android apk包进行签名.

1.V1和V2签名的区别

在Android Studio中点击菜单 Build->Generate signed apk... 打包签名过程中,

可以看到两种签名选项 V1(Jar Signature)  V2(Full APK Signature),

刚开始升级AS看到这个懵了,既然是APK Signature,就放心偷懒选了V2,结果安装失败???无奈,只能查资料...

从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature);

但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)

V1签名:

  • 来自JDK(jarsigner), 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)
  • 对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA),
  • 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), 由此可知: V1签名是对压缩包中单个文件签名验证

V2签名:

  • 来自Google(apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),
  • 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 由此可知: V2签名是对整个APK签名验证

V2签名优点很明显:

  • 签名更安全(不能修改压缩包)
  • 签名验证时间更短(不需要解压验证),因而安装速度加快

注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本

2.zipalign和V2签名

位于Android SDK/build-tools/SDK版本/zipalign.exe

zipalign 是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗

1

2

zipalign -v 4 in.apk out.apk //4字节对齐优化

zipalign -c -v 4 in.apk  //检查APK是否对齐

zipalign可以在V1签名后执行

但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!

二.签名步骤

1.生成密钥对(已有密钥库,可忽略)

Eclipse或Android Studio在Debug时,对App签名都会使用一个默认的密钥库:

  •     默认在C:\Users\用户名\.android\debug.keystore
  •     密钥库名:   debug.keystore
  •     密钥别名:   androiddebugkey
  •     密钥库密码: android

1.生成密钥对

    进入JDK/bin, 输入命令 

    keytool -genkeypair -keystore 密钥库名 -alias 密钥别名 -validity 天数 -keyalg RSA

    参数:

        -genkeypair  生成一条密钥对(由私钥和公钥组成)
        -keystore    密钥库名字以及存储位置(默认当前目录)
        -alias       密钥对的别名(密钥库可以存在多个密钥对,用于区分不同密钥对)
        -validity    密钥对的有效期(单位: 天)
        -keyalg      生成密钥对的算法(常用RSA/DSA,DSA只用于签名,默认采用DSA)
        -delete      删除一条密钥

    提示: 可重复使用此条命令,在同一密钥库中创建多条密钥对

    例如:     

        在debug.keystore中新增一对密钥,别名是release

1

keytool -genkeypair -keystore debug.keystore -alias release -validity 30000

2.查看密钥库

    进入JDK/bin, 输入命令

    keytool -list -v -keystore 密钥库名

    参数:

        -list 查看密钥列表
        -v    查看密钥详情

    例如:

1

keytool -list -v -keystore debug.keystore

        现在debug.keystore密钥库中有两对密钥, 别名分别是androiddebugkey release

2.签名

1.方法一(jarsigner,只支持V1签名)

    进入JDK/bin, 输入命令

    jarsigner -keystore 密钥库名 xxx.apk 密钥别名

    从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不支持该算法,

    所以需要修改算法, 添加参数 -digestalg SHA1 -sigalg SHA1withRSA

    jarsigner -keystore 密钥库名 -digestalg SHA1 -sigalg SHA1withRSA xxx.apk 密钥别名

    参数:

        -digestalg  摘要算法
        -sigalg     签名算法

    例如:

        用JDK7及以上jarsigner签名,不支持Android 4.2 以下

1

jarsigner -keystore debug.keystore MyApp.apk androiddebugkey

        用JDK7及以上jarsigner签名,兼容Android 4.2 以下            

1

jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA MyApp.apk androiddebugkey

2.方法二(apksigner,默认同时使用V1和V2签名)

    进入Android SDK/build-tools/SDK版本, 输入命令

    apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk

    若密钥库中有多个密钥对,则必须指定密钥别名

    apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk

    禁用V2签名

1

apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk

    参数:

        --ks-key-alias       密钥别名,若密钥库有一个密钥对,则可省略,反之必选
        --v1-signing-enabled 是否开启V1签名,默认开启
        --v2-signing-enabled 是否开启V2签名,默认开启

    例如:

        在debug.keystore密钥库只有一个密钥对

1

apksigner sign --ks debug.keystore MyApp.apk

        在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名

1

apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey MyApp.apk

3.签名验证

1.方法一(keytool,只支持V1签名校验)

    进入JDK/bin, 输入命令

1

keytool -printcert -jarfile MyApp.apk (显示签名证书信息)

    参数:

        -printcert           打印证书内容
        -jarfile <filename>  已签名的jar文件 或apk文件  

2.方法二(apksigner,支持V1和V2签名校验)

    进入Android SDK/build-tools/SDK版本, 输入命令

1

apksigner verify -v --print-certs xxx.apk

    参数:

        -v, --verbose 显示详情(显示是否使用V1和V2签名)
        --print-certs 显示签名证书信息

    例如:

1

apksigner verify -v MyApp.apk

        Verifies
        Verified using v1 scheme (JAR signing): true
        Verified using v2 scheme (APK Signature Scheme v2): true
        Number of signers: 1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中APK签名工具之jarsigner和apksigner详解 的相关文章

  • Go 国内加速镜像

    Go 默认下载太慢了 xff0c 还老是timeout 有不有什么解决办法呢 xff1f linux 下面使用方法 启用 Go Modules 功能 go env w GO111MODULE 61 on 配置 GOPROXY 环境变量 xf
  • go打包成linux程序

    看到一个不错的的go开源项目 xff0c https github com antonmedv countdown 但是它只提供源码 xff0c 用起来不太方便 我在本地搭建了一下GO的运行环境 xff0c 每次运行程序都要 go run
  • Can‘t open /run/atd.pid to signal atd. No atd running?

    现象 echo 34 notify send 39 Stop it and go home now 39 39 Enough work for today 39 u critical 34 at now 13 27 33 warning c
  • 转换 nvarchar 值 ‘201201013201201013201201013‘ 时溢出了整数列

    现象 执行 select from lx stuinfo where lx stuinfo stunu 61 202202002 报错如下 xff1a 消息 248 xff0c 级别 16 xff0c 状态 1 xff0c 第 2 行 转换
  • RuoYi若依项目部署实战

    环境 OS Amazon Linux 2 x86 64Host c5 2xlargeKernel 5 10 173 154 642 amzn2 x86 64 mysql root密码为yourpasswd 64 2023 xff0c 数据库
  • linux C++ hello world

    我是Java程序员 xff0c 没怎么写过C 43 43 以前在windows下使用vs写过hello world 最近有个程序需要使用C 43 43 实现 我想在linux下写 xff0c 记录一下过程 安装gcc 查看gcc版本 gcc
  • mybatis foreach 批量删除 传两个参数

    需求 foreach中要传两个参数 xff0c 一个是id xff0c 一个是list 怎么传呢 xff1f 单list的情况 Mapper java span class token comment 批量删除 64 param teamL
  • ubuntu22.04 dlopen(): error loading libfuse.so.2

    报错如下 navicat16 premium cs AppImage dlopen error loading libfuse so 2 AppImages require FUSE to run You might still be ab
  • Android DataBinding在Activity、Fragment中的使用及数据共享

    本篇记录Activity Fragment使用DataBinding的不同方式 xff0c 以及Activity下的不同Fragment间的数据共享 开启DataBinding 首先我们要在app gradle中开启DataBinding
  • IDEA mybatis Mapper.xml报红的解决办法

    现象 在IDEA中已经配置好Database了 xff0c 但是打开mybatis的Mapper xml中的字段还是报红 如下 xff1a 随便不影响程序运行 xff0c 但是非常的不舒服 智能提示也不好用 解决办法 File gt Set
  • Windows 2008 R2 Server远程无法复制的解决办法

    结束进程rdpclip exe运行中重新运行rdpclip exe 两步完美解决 参考 https bbs huaweicloud com blogs 307039
  • WinScp密钥登录

    使用密码登录非常的方便 xff0c 但是有的客户的云服务器上是限定只能通过密钥登录 我一般使用命令行的scp命令就可以正常上传 xff0c 但是对于我一些同事来说 xff0c 就很不方便 生成密钥 这个不难 xff0c 可以参考我之前的文章
  • FileZilla密钥登录

    使用密码登录非常的方便 xff0c 但是有的客户的云服务器上是限定只能通过密钥登录 我一般使用命令行的scp命令就可以正常上传 xff0c 但是对于我一些同事来说 xff0c 就很不方便 生成密钥 这个不难 xff0c 可以参考我之前的文章
  • node js 设置淘宝源

    淘宝镜像源最新地址 span class token function npm span config span class token builtin class name set span registry https registry
  • 手推DNN,CNN池化层,卷积层反向传播

    反向传播算法是神经网络中用来学习的算法 xff0c 从网络的输出一直往输出方向计算梯度来更新网络参数 xff0c 达到学习的目的 xff0c 而因为其传播方向与网络的推理方向相反 xff0c 因此成为反向传播 神经网络有很多种 xff0c
  • 软件架构概念和面向服务的架构

    摘要 软件架构作为软件开发过程的一个重要组成部分 xff0c 有着各种各样的方法和路线图 xff0c 它们都有一些共同的原则 基于架构的方法作为控制系统构建和演化复杂性的一种手段得到了推广 引言 在计算机历史中 xff0c 软件变得越来越复
  • 初识强化学习,什么是强化学习?

    相信很多人都听过 机器学习 和 深度学习 但是听过 强化学习 的人可能没有那么多 那么 什么是强化学习呢 强化学习是机器学习的一个子领域 它可以随着时间的推移自动学习到最优的策略 在我们不断变化的纷繁复杂的世界里 从更广的角度来看 即使是单
  • 强化学习形式与关系

    在强化学习中有这么几个术语 智能体 Agent 环境 Environment 动作 Action 奖励 Reward 状态 State 有些地方称作观察 Observation 奖励 Reward 在强化学习中 奖励是一个标量 它是从环境中
  • 多层网络和反向传播笔记

    在我之前的博客中讲到了感知器 xff08 感知器 xff09 xff0c 它是用于线性可分模式分类的最简单的神经网络模型 xff0c 单个感知器只能表示线性的决策面 xff0c 而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面 对
  • 如何准备校招?

    秋招已经落尽尾声 xff0c 今天小牛想把自己的学习经验分享给大家 xff0c 避免大家多走弯路 1 首先需要确定自己想从事哪方面的工作 比如服务端开发 xff08 Java开发工程师 xff0c C 43 43 开发工程师 xff09 x

随机推荐

  • 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别

    昨天我在Kaggle上下载了一份用于手写数字识别的数据集 xff0c 想通过最近学习到的一些方法来训练一个模型进行手写数字识别 这些数据集是从28 28像素大小的手写数字灰度图像中得来 xff0c 其中训练数据第一个元素是具体的手写数字 x
  • 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别

    昨天我使用Spark MLlib的朴素贝叶斯进行手写数字识别 xff0c 准确率在0 83左右 xff0c 今天使用了RandomForest来训练模型 xff0c 并进行了参数调优 首先来说说RandomForest 训练分类器时使用到的
  • PyTorch模型保存与加载

    torch save xff1a 保存序列化的对象到磁盘 xff0c 使用了Python的pickle进行序列化 xff0c 模型 张量 所有对象的字典 torch load xff1a 使用了pickle的unpacking将pickle
  • Ubuntu18.04 上 安装微信(Deepin-Wechat)

    文章目录 一 安装Deepin Wine环境二 安装Deepin 版微信 微信什么时候支持在linux下的安装包啊 xff0c 我的天哪 xff0c 感觉受到了针对 xff0c 各位看官且看下图 xff1a 这里先作声明 xff1a 本文的
  • ROS机器人操作系统——ROS介绍

    AI is the new electricity 1 ROS发展史 本世纪开始 关于人工智能的研究进入了大发展阶段 包括全方位的具体的AI 例如斯坦福大学人工智能实验室STAIR Stanford Artificial Intellige
  • 如何快速学习一门计算机语言

    一 4步掌握一门计算机语言 1 学习语言的语法 xff0c 关键字 xff0c 以及基本的库 xff08 基础阶段 xff09 2 学习语言的第三方库和各个组件 xff08 OS xff0c 数据库 xff0c 网络 xff09 之间的连用
  • CentOs6.8离线安装svn,并设置自动更新

    CentOs6 8离线安装svn xff0c 并设置自动更新 离线安装所需依赖离线安装 GCC xff0c 如果系统已经有 GCC 了 xff0c 跳过这一步需要的 rpm 包安装顺序 离线安装 openssl需要的代码编译设置环境变量 离
  • Linux ping不通,连不上网的解决办法

    Linux ping不通 xff0c 连不上网的解决办法 可能原因是DNS没有配置好 方法一 xff1a 修改vi etc resolv conf 增加如下内容 xff1a nameserver 114 114 114 114 电信的DNS
  • Android——多进程

    之前我们了解了 Java 多线程浅析 Android Handler详解 Android HandlerThread浅析 Java ThreadPool线程池 让我们继续看看Android多进程 xff1a 1 概述 默认情况下 xff0c
  • React、Ant Desgin自定义加载动画,lottie-web 将json解析成动画

    在项目中 xff0c 遇到需要在网页首屏 xff0c 展示动画的需求 xff0c 你会想到怎么做 xff1f 思路一 xff1a 设计师导出gif图片 xff0c 用img进行展示 缺点 xff1a 图片失真 xff0c 影响效果 思路二
  • mac下安装多版本PHP及切换

    mac下安装多版本PHP及切换 工作环境一直是PHP5 6 xff0c 后来发布了PHP7 xff0c 性能提升不少 xff0c 如今打算试试PHP7 xff0c 所以就有了两个php版本的需求 本文的原理就是用一个php管理工具 xff0
  • 短视频拍摄脚本怎么写

    优质的短视频每一个镜头都经过精心设计 xff0c 镜头的设计就是利用镜头脚本 xff0c 提前设想好一切想要的镜头效果和画面 xff0c 最终作品才能一气呵成的呈现出来 xff0c 接下来就来分析一下短视频拍摄脚本怎么写 xff0c 短视频
  • 串口开发之环形缓冲区

    01 简介 串口的基本应用 xff0c 使用串口中断接收数据 xff0c 串口中断发送回包 xff08 一般可以使用非中断形式发送回包 xff0c 在数据接收不频繁的应用中 串口接收中断保证串口数据及时响应 xff0c 使用非中断方式发送回
  • fastboot 命令

    1 fastboot概念 fastboot fastboot是PC与bootloader的USB通信的命令行工具 xff0c 通过向bootloader传送刷机文件 xff08 img xff09 实现Android系统分区重烧 fastb
  • Android Studio 开启视图绑定 viewBinding

    Google 在 Android Studio 3 6 Canary 11 及更高版本中提供了一个 viewBinding 的开关 xff0c 可以开启视图绑定功能 xff0c 以此来替代 findViewById viewBinding功
  • ViewPager 装载fragment 页面显示空白

    ViewPager 装载fragment 页面显示空白 xff0c 这个时候有两种情况 xff1a 在分页面较多的情况下 使用了 FragmentPagerAdapter xff0c 可能会导致第二次加载页面显示空白或是多次滑动页面后页面空
  • The following packages have unmet dependencies: openssh-server : Depends: openssh-client (= 1:6.6p1

    在虚拟机中安装openssh server的时候报了这个错误 xff0c 不知道这台虚拟机抽了什么风 xff0c 别的虚拟机都能顺利安装 xff0c xff0c xff0c 提示说是openssh server 依赖于 openssh cl
  • Docker Desktop stopped 问题解决

    推广博客 xff1a Docker Desktop stopped 问题解决
  • windows连接远程桌面必须要有用户名和密码

    被远程连接的电脑如果有用户名但没有密码 xff0c 连接时需要输入密码时空着会导致无法连接 想想也是 xff0c 如果没有密码 xff0c 只要有人连入电脑所在局域网 xff0c 就可以通过ip地址和用户名连入电脑 xff0c 非常不安全
  • Android中APK签名工具之jarsigner和apksigner详解

    一 工具介绍 jarsigner是JDK提供的针对jar包签名的通用工具 位于JDK bin jarsigner exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具 位于Android SDK