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添签名证书

Android签名 (三) 应用签名实操_第1张图片

Android签名 (三) 应用签名实操_第2张图片

然后编译生成的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

你可能感兴趣的:(#,Android签名,android,sign,签名)