IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android签名 (三) 应用签名实操 -> 正文阅读

[移动开发]Android签名 (三) 应用签名实操

你可能想知道?通过这篇博客可以解决哪些问题以及学到什么:

? 1.应用为什么要签名,应用签名有哪些好处?

? 2.如何对应用进行签名?

这篇博客介绍了为什么要对应用进行签名以及如何给应用签名。

目录

一、应用签名的作用及重要性

二、应用签名的步骤 (介绍了不同场景)

1.在Android Studio中给应用签名

2.在aosp中给应用签名

3.使用签名工具直接给应用签名

1)签名工具介绍

2)使用jarsigner给应用签名

3)使用apksigner给应用签名

4)使用signapk.jar给应用签名


一、应用签名的作用及重要性

Android签名的主要作用是为了:

应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同

应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块

代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了

所以一旦给Apk签名并上线后,签名文件和密码别名等一定要记住不能丢失,这样会损失用户且带来灾难性的后果。

二、应用签名的步骤 (介绍了不同场景)

1.在Android Studio中给应用签名

1)准备jks签名文件

参考 Android签名 (二) 制作签名文件

? ? ? ?三、制作jks格式的签名文件

2)Android studio添签名证书

然后编译生成的apk就是用指定的签名文件进行签名了,如果不放心,想看看apk是否已经签名,可以参考??Android签名 (一) 查看签名信息

2.在aosp中给应用签名

在aosp源码中使用平台签名给应用签名,Android.mk按照如下规则编辑:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := testSigned
LOCAL_SRC_FILES := $(call all-subdir-Java-files)
# 这里配置成平台签名
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)?

3.使用签名工具直接给应用签名

1)签名工具介绍

签名工具说明路径
jarsigner

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

(apk也适用,本质都是zip格式的压缩包,且仅限V1签名)

jdk/bin/jarsigner
apksigner

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

java -jar apksigner.jar sign --ks {签名文件} {待签名的apk}

Android SDK/build-tools/SDK版本/apksigner.bat
signapk.jar?Android提供的平台签名工具

aosp/prebuilts/sdk/tools

/lib/signapk.jar

2)使用jarsigner给应用签名

命令介绍:

jarsigner -verbose -keystore [XXX]?-storepass [XXX]?-signedjar [XXX]?-digestalg [XXX] -sigalg [XXX]?[XXX_unsigned.apk] [Key Alias]

-verbose? //显示签名过程

-keystore //签名库路径

-storepass //签名库密码

-signedjar //已签名文件输出路径(默认修改原文件)

-digestalg //摘要算法

-sigalg //签名算法(例如:MD5withRSA / SHA1withRSA / SHA256withRSA )

最后接着两个参数,分别是待签名的应用和秘匙别名

示例 (完整版):

# 进入JDK/bin, 输入命令:

jarsigner -verbose -keystore debug.keystore -storepass android -signedjar signed.apk -digestalg SHA1 -sigalg MD5withRSA unsigned.apk androiddebugkey

示例 (常用版):

# 进入JDK/bin, 输入命令 :

# 从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不支持该算法,所以需要修改# 算法, 添加参数 -digestalg SHA1 -sigalg SHA1withRSA

# 用JDK7及以上jarsigner签名,不支持Android 4.2 以下
jarsigner -keystore debug.keystore unsigned.apk androiddebugkey

# 用JDK7及以上jarsigner签名,兼容Android 4.2 以下 ? ? ? ? ? ?
jarsigner -keystore debug.keystore -digestalg SHA1 -sigalg SHA1withRSA unsigned.apk androiddebugkey

3)使用apksigner给应用签名

命令介绍:

apksigner sign --ks [密钥库名] --ks-key-alias [密钥别名] --v1-signing-enabled [是否开启] --v2-signing-enabled [是否开启] [xxx.apk]

--ks? //密钥库路径

--ks-key-alias //密钥别名,若密钥库有一个密钥对,则可省略,反之必选

--v1-signing-enabled //是否开启V1签名,默认开启(例如:true-开启,false-关闭)

--v2-signing-enabled //是否开启V2签名,默认开启 (例如:true-开启,false-关闭)

示例 (常用版):

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

# 在debug.keystore密钥库只有一个密钥对
apksigner sign --ks debug.keystore unsigned.apk

# 在debug.keystore密钥库中有多个密钥对,所以必须指定密钥别名
apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey unsigned.apk

#禁用V2签名
apksigner sign --v2-signing-enabled false --ks [密钥库名 ] [xxx.apk]

4)使用signapk.jar给应用签名

a.准备平台签名文件platform.pk8?和 platform.x509.pem

文件路径 aosp/build/target/product/security/platform.pk8?

文件路径 aosp/build/target/product/security/platform.x509.pem

b.准备签名工具 signapk.jar

文件路径?aosp/prebuilts/sdk/tools/lib/signapk.jar

或者

本人上传的signapk.jar(推荐,原因后面会介绍)

c.将签名文件、签名工具、要签名的apk放到同一个目录下

d.执行签名命令

java -jar signapk.jar platform.x509.pem platform.pk8 Test.apk signedTest.apk

* 以上是使用本人上传的signapk.jar进行签名的命令,如果使用aosp自带的signapk.jar进行签名,需多加一个参数?-Djava.library.path,否则APK签名提示Exception in thread “main“ java.lang.ExceptionInInitializerError错误,命令如下:

java?-Djava.library.path=aosp/prebuilts/sdk/tools/linux/lib64/
-jar signapk.jar platform.x509.pem platform.pk8 Test.apk signedTest.apk

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 16:48:38  更:2021-08-23 16:50:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:59:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码