AndroidStudio生成签名文件、配置签名信息、打包
开发完一款Application之后,需要对其进行打包,才可以发布工用户使用(release)。而Android Studio就具备了打包的工具。有一下两种
打包方式
- Gradle配置打包
- Build->Generate Signed APK打包
签名文件
在进行打包之前,首先需要一个签名文件。
eclipse的签名文件是以.ketstore为后缀的文件;Android Studio是以.jks为后缀的文件。
签名文件有几个要素
英文名称 | 解释 |
---|---|
keyStore | 密钥库路径 |
keyStore Password | 密钥库密码 |
keyAlias | 签名文件别名 |
keyPassword | 签名文件密码 |
默认签名文件
在开发阶段,用到第三方SDK新建应用项目时,需要签名KEY的SHA1。这里可以使用Android Studio自带的debug.keystore。
可以使用命令
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
在终端中直接获取到签名key的SHA1信息,如下图:
Android Studio默认key.png
~
代表的是账户的根目录
对应要素:
要素名称 | 值 |
---|---|
keystore | ~/.android/debug.keystore |
keyStore password | android |
keyAlias | androiddebugkey |
keyPassword | android |
默认路径下的debug.keystore不存在时,会自动创建。如果修改了debug.keystore路径,并不会在新路径下自动创建debug.keystore文件。如果在默认路径创建一个不以debug命名的key,系统还是会自动创建该签名文件。所以只有使用默认路径,才会自动创建相应的key文件
参考
Android Studio获取调试包签名的SHA1值方法
,
signing configurations(签名配置)
一、AndroidStudio生成签名文件(第一种打包方式–Build->Generate Signed APK打包)
image.png
操作步骤:
点击
Build
,在弹出的菜单中选择
Generate Signed Bundle /APK…
,接下来会弹出如下界面👇
选择APK.png
选择APK,点击Next
image.png
image.png
image.png
名称 | 描述 |
---|---|
key store path | 密钥库路径 |
password | 密钥库密码 |
confirm | 确认密码 |
alias | 别名 |
validity | 有效年限 |
first and last name | 名字 |
organization unit | 公司或组织 |
organization | 公司 |
city or locality | 省 |
state or province | 市或洲 |
country code | 国家代码 |
表:签名信息
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
如果.jks文件是在app包下,那么使用相对路径是可以的,如果是在其他的目录,那么这里应该使用绝对路径!
作者:IT王魔王
链接:https://www.jianshu.com/p/2b457af236a7
二、Android Studio中获取查看签名SHA1,MD5等信息的方法
不论在as或者在cmd命令框里 本质都是调用jdk的keytool里面的方法
第一种、在Android Studio的Terminal中输入keytool -v -list -keystore debug.keystore、keytool -v -list -keystore “E:\Key\school\keystore\school.jks”,分别查看debug和release下的sha1信息
C:\Users\Administrator\.android>keytool -v -list -keystore debug.keystore
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: androiddebugkey
创建日期: 2019-11-19
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
有效期为 Tue Nov 19 13:10:05 CST 2019 至 Thu Nov 11 13:10:05 CST 2049
证书指纹:
MD5: 9F:0E:D2:13:76:AD:22:6B:68:3E:24:6F:12:05:74:EF
SHA1: FD:33:13:4C:21:2D:4F:36:C1:24:B5:72:24:C8:8C:2B:01:3D:BF:FB
SHA256: 09:72:49:91:F4:D9:6E:79:0A:FB:24:E1:32:AA:A9:92:E2:F5:7B:ED:BB:67:85:20:EC:0A:11:1C:7A:9A:11:7D
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
*******************************************
*******************************************
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行
业标准格式 PKCS12。
C:\Users\Administrator\.android>keytool -v -list -keystore "E:\Key\school\keystore\school.jks"
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: key0
创建日期: 2020-7-6
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: CN=zg, OU=zg, O=zg, L=china, ST=china, C=china
发布者: CN=zg, OU=zg, O=zg, L=china, ST=china, C=china
序列号: 687bda9e
有效期为 Mon Jul 06 10:31:33 CST 2020 至 Fri Jun 30 10:31:33 CST 2045
证书指纹:
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 37 06 DC D7 AA B6 3D 59 B7 BF 8F 82 37 45 42 B1 7.....=Y....7EB.
0010: E2 E3 8A 74 ...t
]
]
*******************************************
*******************************************
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore E:\Key\school\keystore\school.jks -destkeystore E:\Key\school\keystore\schoo
l.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
【一定要记得加上 -v 参数,不然只能看到SHA1,没有MD5】【***.keystore,需要替换为你自己的密钥所在路径和文件名,也可以直接拷贝到.android目录】
如果keytool命令不好用,就在环境变量path里面增加D:\Java\jdk1.8.0_77\bin,然后完全退出studio,重新打开。
MD5下面的字符串就是apk签名。
第二种、也可以直接在jdk的Bin目录下,直接运行命令
keytool 是java提供的一个工具,只要你的java环境变量配置的ok,直接在命令行输入keytool就可以执行这个命令。
输入命令 keytool -list -v -keystore C:\Users\Administrator.android\debug.keystore
结果如下:
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: androiddebugkey
创建日期: 2019-11-19
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
有效期为 Tue Nov 19 13:10:05 CST 2019 至 Thu Nov 11 13:10:05 CST 2049
证书指纹:
MD5: 9F:0E:D2:13:76:AD:22:6B:68:3E:24:6F:12:05:74:EF
SHA1: FD:33:13:4C:21:2D:4F:36:C1:24:B5:72:24:C8:8C:2B:01:3D:BF:FB
SHA256: 09:72:49:91:F4:D9:6E:79:0A:FB:24:E1:32:AA:A9:92:E2:F5:7B:ED:BB:67:85:20:EC:0A:11:1C:7A:9A:11:7D
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
*******************************************
*******************************************
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore C:\Users\Administrator\.android\debug.keystore -destkeystore C:\Users\Administrator\.android\debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
.jks文件同理
输入命令即可
keytool -list -v -keystore “E:\Key\school\keystore\school.jks”
原文链接:https://blog.csdn.net/z2278734400/java/article/details/79855725
https://www.cnblogs.com/huolongluo/p/6833235.html
三、总结
常用命令
查看apk 签名
keytool -list -printcert -jarfile xxx.apk
查看keystore文件内容
keytool -list -keystore xxx.keystore
查看证书jks内容
keytool -list -v -keystore xxx.jks
查看三方应用或是系统应用签名查看的apk,对apk进行解压,将其中META-INF文件夹解压出来,得到其中的CERT.RSA文件,通过
keytool -printcert -file META-INF/CERT.RSA
keytool工具,签名
1.首先下载keytool工具
地址:https://github.com/getfatday/keytool-importkeypair
下载下来后,解压build-donut-release-target-product-security.tar.gz文件
$ tar -xvf build-donut-release-target-product-security.tar.gz
$ ls
build-donut-release-target-product-security.tar.gz media.pk8 platform.keystore README shared.x509.pem
keytool-importkeypair media.x509.pem platform.pk8 README.textile testkey.pk8
LICENSE mkkey.sh platform.x509.pem shared.pk8 testkey.x509.pe
platform.x509.pem和platform.pk8 需要厂商提供,pk8是私钥文件x509.pem是含有公钥的文件这里面已经有了,我们可以直接用。
2.生成keystore
通过keytool-importkeypair 工具和platform.x509.pem platform.pk8 生成apk的签名文件paltform.keystore
$ ./keytool-importkeypair -k ./platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
-k 表示要生成的 keystore 文件的名字,这里命名为 platform.keystore
-p 表示要生成的 keystore 的密码,这里是 android
-pk8 表示要导入的 platform.pk8 文件
-cert 表示要导入的platform.x509.pem
-alias 表示给生成的 platform.keystore 取一个别名,这是命名为 platform
运行后,platform.keystore文件就生成了
platform.keystore就是android studio需要的签名文件,将platform.keystore移动到apk的工程目录下,一般和外层build.gradle同级目录,移动完成后需要在build.gradle中进行配置。
3.使用apksigner 进行签名
apksigner是android studio 自带的,在Android/Sdk/build-tool/ 里面
使用:
签名:
apksigner sign --ks release.jks xxx.apk
验证:
apksigner verify --verbose xxx.apk
手动签名
如果你有签名文件,可以把apk和jks文件放到同一个文件夹下,
cmd: ———— 进入文件所在盘 ———— 找到文件位置,
签名,回车
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名称 -storepass 签名密码 签名apk名字
签名别名
对齐:
zipalign 4 apk名字 apk新名字
验证签名:
jarsigner -verify -verbose -certs apk.apk
原文链接:https://blog.csdn.net/qq_37237245/article/details/80229143
android studio 签名系统apk(第二种打包方式–Gradle 配置)
apk成为系统apk,需要两个条件
1.在AndroidManifest.xmle文件里面添加android:sharedUserId=”android.uid.system
2.签名必须是platfrom 生成的keytor文件
1.AndroidManifest.xml文件
在对应位置加上 android:sharedUserId=“android.uid.system”,这样就是系统级权限的apk了
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.auto.demo"
android:sharedUserId="android.uid.system"> //在这里加上 android:sharedUserId="android.uid.system"
........
</manifest>
2.app/build.gradle目录
在android中新建signingConfigs debug release
配置签名文件
在build.gradle(module:app)中加入下面的代码,这里要输入的信息都是之前创建签名文件时对应的四个要素的值。
配置Build Type
通过
signingConfig signingConfigs.release
来配置Build Type的签名信息。可以看到这里使用了Gradle配置签名文件时配置的Key。
android {
................
//配置签名文件
signingConfigs {
release {
storeFile file('E:\\Key\\school\\keystore\\school.jks')
storePassword "zg123456"
keyAlias "key0"
keyPassword "zg123456"
}
debug {
storeFile file('E:\\Key\\school\\keystore\\school.jks')
storePassword "zg123456"
keyAlias "key0"
keyPassword "zg123456"
// storeFile file('C:\\Users\\Administrator\\.android\\debug.keystore')
// storePassword 'android'
// keyPassword 'android'
// keyAlias = 'androiddebugkey'
}
}
//配置Build Type
buildTypes {
release {
minifyEnabled false
//proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
//签名
signingConfig signingConfigs.debug
}
}
}
dependencies {
..............
}
打包的时候可以进行很多优化,并且开启混淆等
buildTypes{
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true//必须在minifyEnabled true的情况下才能使用
//加载默认混淆配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名
signingConfig signingConfigs.release
}
}
查看签名,点击signingReport
输出
Executing tasks: [signingReport] in project E:\fengniaoyunproject\svncode\app
> Task :app:signingReport
Variant: release
Config: release
Store: E:\Key\school\keystore\school.jks
Alias: key0
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA-256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
Valid until: 2045年6月30日 星期五
----------
Variant: releaseUnitTest
Config: release
Store: E:\Key\school\keystore\school.jks
Alias: key0
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA-256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
Valid until: 2045年6月30日 星期五
----------
Variant: debug
Config: debug
Store: E:\Key\school\keystore\school.jks
Alias: key0
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA-256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
Valid until: 2045年6月30日 星期五
----------
Variant: debugAndroidTest
Config: debug
Store: E:\Key\school\keystore\school.jks
Alias: key0
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA-256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
Valid until: 2045年6月30日 星期五
----------
Variant: debugUnitTest
Config: debug
Store: E:\Key\school\keystore\school.jks
Alias: key0
MD5: 7C:14:AA:A5:27:F1:ED:34:58:21:2E:A2:BF:3A:06:1F
SHA1: CE:3F:2E:89:88:A9:16:9B:5F:4C:C7:C1:BD:3F:6E:49:D6:D1:AD:8D
SHA-256: 08:DF:54:D4:45:D8:85:4A:94:56:B9:78:F1:8A:D5:84:AF:74:AC:1D:83:7B:BC:1D:B8:A9:AB:57:75:CF:FD:08
Valid until: 2045年6月30日 星期五
----------
这种方式是明文的方式在build.gradle 显示,为了安全起见,一般采用另一种方式,在build.gradle同级目录下 有个gradle.properties文件,专门用来配置全局键值对数据的,来存放敏感数据
gradle.properties 按照
键值对
方式存放数据
build.gradle
signingConfigs {
debug {
storeFile file(KEY_PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
}
gradle.properties
KEY_PATH=E:\\Key\\school\\keystore\\school.jks
KEY_NAME=school.jks
KEY_PASS=zg123456
ALIAS_NAME=key0
ALIAS_PASS=zg123456
这样就配置完成了。
也可以这样
signingConfigs { //gradle assembleRelease
myConfig {
storeFile file("school.jks")
storePassword System.console().readLine("\nKeystore password: ")
keyAlias "key0"
keyPassword System.console().readLine("\nKey password: ")
}
}
这样在执行gradle 命令
$ gradle assembleRelease
时会被要求输入密码
四、补充些概念
Debug 和Release 的区别
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
本质区别
实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此不讨论)
Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D “_DEBUG” 相当于 #define _DEBUG,打开编译调试代码开关(主要针对 assert函数)
/ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过 程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或 /MT 使用发布版本的运行时刻函数库
/O1 或 /O2 优化开关,使程序最小或最快
/D “NDEBUG” 关闭条件编译调试代码开关(即不编译assert函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止 被修改
签名的作用
-
所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
-
Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
-
如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布
-
数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
-
签名后需使用zipalign优化程序
-
Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序
7)在应用程序开发期间,由于是以Debug调试模式编译的,因此IDE(ADT)根据会自动用默认的密钥和证书来进行签名,而以Release发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名。