Android 生成和使用签名文件
1 为什么要签名
1.1 Android 签名机制其实是对 APK 包完整性和发布机构唯一性的一种校验机制。Android 签名机制不能阻止 APK 包被修改,但修改后的再签名无法与原先的签名保持一致(除非拥有发布者的私钥)。
1.2 APK 包加密的公钥就打包在 APK 包内,且不同的私钥对应不同的公钥。也就是说,不同私钥签名 APK 的公钥也必不相同。所以可以根据公钥的对比,来判断私钥是否一致。
1.3 应用程序升级:如果希望用户无缝升级到新的版本,那么必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果采用了不同的证书,那么安装 APP 时系统会要求应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
1.4 应用程序模块化:Android 系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
1.5 代码或者数据共享:Android 提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,就可以在应用程序间以安全的方式共享代码和数据了。不同的应用程序之间,想共享数据,或者共享代码,那么要让它们运行在同一个进程中,而且要让它们用相同的证书签名。
2 Android 生成签名文件
android 生成签名文件有两种:命令行方式 和 AndroidStudio 界面方式,下面分别来介绍。
2.1 使用 keytool 命令
2.1.1 keytool 命令位于 <JDK安装目录>/bin 文件夹下。所以需要先安装 JDK 。
2.1.2 安装 JDK 后一般会在系统环境变量中配置 jdk,这样使用起来会比较方便。如果安装 jdk 后没有配置在系统环境变量中配置也是可以的:
- 如在没有在系统变量中配置 jdk,则在 cmd 中先进入到
<JDK安装目录>/bin
文件夹下,然后再输入命令keytool
- 如果在系统环境变量中配置了 jdk,则在 cmd 中直接输入命令
keytool
输入命令keytool
后,如下图所示:
keytool 命令
2.1.3 keytool.exe 命令用于生成密钥,并且把密钥信息存放到 keystore 文件中。运行命令行 keytool -v -genkey -keystore e:\AndroidKey\mykeystore.keystore –alias mykey -validity 20000
其中,参数的意义如下:
-v 为显示详细输出信息。
-genkey 为产生密钥。
-keystore<keystorefilename>.keystore 指定生成 keystore 文件的文件名。
-alias<keyfilename> 指定密钥的别名。
-validity<days> 指定该密钥的有效期限,单位是天。
该命令运行后出现密钥生成向导,开发者根据要求填写相应信息,即可生成密钥,如下图所示:
7.2.png
至此,已生成开发者签名证书,存储在 E:\AndroidKey\mykeystore.keystore 文件中。开发者可以使用该密钥对应用程序进行签名。
2.2 AndroidStudio 界面方式生成签名证书
使用 AndroidStudio 界面方式生成签名证书其实比命令行更加方便快捷还使用,下面是具体的步骤
2.2.3 点击后会弹出如下界面: 7.4.png
2.2.4 对于打包程序来说,要选择对应的选项进行打包;对于生成签名文件来说,图中的两个选项都是可以,因为都需要用到签名文件。比如选择 APK 后点击 next,如图所示: 7.5.png
2.2.5 上图中有两个作用:
如果已经有了签名文件,则直接点击 Choose existing... 找到签名文件的路径,然后在下面输入对应的 Key store password、Key alias 和 Key password 后就会进行打包 release 版本的流程
如果没有签名文件,或者是想要重新生成签名文件,则点击 Create new...,进入到生成签名文件的界面,如果所示: 7.6.png
其中要填写的内容和 #2.1.3 中相同,这里不再重复。点击 ok 后,签名文件就会创建好了。
3 使用签名文件
使用签名文件也有两种方式:在界面中使用和在 gradle 中配置,下面分别来学习。
3.1 界面中使用签名文件
如何在 AndroidStudio 的界面中使用签名文件,在 #2.2.4 和 #2.2.5 已经介绍了,不再重复。
3.2 在 build.gralde 中配置
在 AndroidStudio 工程的项目中(比如 app 工程)的 build.gradle 中进行如下配置即可:
android {
compileSdk 31
signingConfigs {
release {
storeFile file(appStoreFile)
storePassword 'appStorePassword'
keyAlias 'appKeyAlias'
keyPassword 'appKeyPassword'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}