一:为什么要对Apk进行数字签名
开发者通过开发工具编译生成的应用程序以.apk命名,借助开发工具、第三方平台或adb命令将其安装到安卓手机上运行或更新。在安装的时候系统会检测apk是否被签名,如果没有签名则无法安装;为防止其他人通过使用相同的包名混淆替换已安装的程序,在发布的时候需要进行唯一的数字签名,保证每次版本的一致性。
debug版本的apk,使用系统默认的签名文件debug.keystore,别名= androiddebugkey,密码=android,安装运行时已经过签名
二:Apk签名方式
- 使用AndroidStudio工具生成/引用签名文件
Build -- Generate Signed APK -- Create new key store
Key store path:签名文件存放的路径
Password:密钥库密码
Key - Alias :别名
key - Password :密钥密码(可以与密钥库密码一致)
.............................
创建完成后可以直接下一步进行选择版本进行签名(如果签名文件存在则忽略以上步骤直接进行下一步):
- 使用工具自动生成signingConfigs中的签名信息
按步骤操作即可自动配置,无需手写
- 命令行生成签名文件并打包带签名的apk文件
在项目根目录下生成签名文件dd.jks
-genkeypair:指定生成数字签名;
-alias:指定生成数字签名的别名;
-keyalg:指定生成数字签名的算法。使用RSA算法。
-validity:指定生成数字签名的有效期;
-keystore:指定生成数字签名的存储路径。
使用命令行对Apk包签名,在根目录下生成签名的apk文件:
-verbose:指定生成详细输出;
-keystore:指定数字证书的存储路径;
-signedjar:该选项的3个参数分别为签名后的APK包、未签名的APK包、数字证书的别名。
- build.gradle中进行配置签名信息
除了可以用工具自己生成也可以在build.gradle中直接配置,配置信息如下:
可以看到,文件信息以明文的形式显示,为了避免将签名信息提交,可以在配置文件local.properties或gradle.properties中进行配置,区别是在gradle.properties中配置签名信息后,build.gradle中可以直接引用,而local或自定义的properties文件则需要读取并获取到签名信息,properties中的配置如下:
1:local.properties:
2:gradle.properties:
- 读取环境变量中的签名信息,隐藏签名
签名文件信息配置到环境变量中,然后build.gradle中进行读取,windows10配置如下:
build.gradle中的引用,配置完成后重启下开发工具不然编译的时候找不到系统变量,通过System.getenv(变量名)获取: