关于签名文件的知识总结
问题描述
当应用要发布release版本时,如果没有签名文件是不能安装到设备上的,所以在打包release版本的apk之前,要添加签名文件。
生成签名文件的方法
第一种生成签名文件的方法(使用Android Studio生成签名文件)
按照Build->Generate Signed APK打开生成签名文件的窗口。
- Key store path 存放路径 如果没有点击下面的Create new store按钮,如果有,则点击Choose Existing store按钮。
- key store password 密码
- Key alias 别名
- Key password 密码
点击Create new之后
点击Create New Store按钮之后,会打开一个New Key Store窗口:
- Key store path 存放位置。点击后面的…按钮选择存放的位置
- Password 密码
- Confirm 确认密码
- Alias 别名
- Password 密码
- Confirm 确认密码
- Validity 有效期
- First and Last Name 姓名
- Organizational Unit 组织单位
- Origanization 组织
- City or Locality 城市或地方
- State or Province 州或省
- Country Code 国家代号
填写完之后点击OK按钮,返回到Generate Singed Apk窗口,窗口中的内容已经全部填充
点击Generate Singed Apk窗口的Choose existing store按钮
点击Choose existing store按钮之后,在弹出的文件选择框中选择已有签名文件即可。填写完ey store password、Key alias、Key password点击Next按钮即可。
点击Generate Singed Apk窗口的Next按钮
点击Generate Singed Apk窗口的Next按钮之后,界面显示如下:
这个界面我们只需要选择Signature Version。
- V1(Jar Signature) 通过ZIP条目进行验证,APK签署后可进行修改-可以移动甚至重新压缩文件。
- V2(Full APK Signature) 验证压缩文件的所有字节,而不是单个ZIP条目,因此,在签名后无法再更改(包括 zipalign)。
勾选不同的结果:
- 只勾选V1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式。
- 只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用V2的方式验证。
- 同时勾选V1和V2则所有机型都没有问题。
最后点击Finish按钮之后,签名文件就生成了。
第二种生成签名文件的方法(keytool)
使用命令生成签名文件。
代码运行过程如图:
输入keytool -genkey -alias test.keystore -keyalg RSA -validity 10000 -keystore test.keystore
其中 test.keystore表示签名文件的文件名;10000表示App的有效期;RSA代表认证机构。
按回车之后就会让你输入各种信息,输入这些信息之后再按回车,签名文件就生成好了,你在哪个目录下运行的指令,签名文件就在哪个目录下。
安全管理签名文件和签名密码
不安全的做法
在使用Android Studio进行release版的apk签名的时候,往往都是将签名文件keystore放在项目中,密码写在build.gradle中,keystore和密码就随着代码上传到了git仓库中了,这样往往很不安全,因为这样被人获取。
修改之前的app中的build.gradle签名配置:
android {
compileSdkVersion 23
buildToolsVersion "24.0.2"
signingConfigs {
release {
keyAlias 'abc'
keyPassword '123456'
storeFile file("${projectDir}/keystore.key")
storePassword '123456'
}
}
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean", "ENV_SETTING", "true"
buildConfigField "boolean", "RELEASED_TEST", "false"
resValue "string", "app_name", "应用名称"
}
}
}
安全的做法
1.在project下新建一个”keystore.properties”文件,将keystore的绝对路径和密码、别名等信息配置好。
keystore.properties
keystore=F:\keystore.key
storePassword=123456
keyAlias=rbsoft
keyPassword=123456
2.修改build.gradle中的配置签名信息
apply plugin: 'com.android.application'
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
compileSdkVersion 23
buildToolsVersion "24.0.2"
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['keystore'])
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "boolean", "ENV_SETTING", "true"
buildConfigField "boolean", "RELEASED_TEST", "false"
resValue "string", "app_name", "应用名称"
}
}
3.忽略keystore.properties
将keystore.properties添加到忽略中,这样就不上传keystore.properties文件到git仓库,使得签名的敏感信息与上传到git仓库隔离开,这样签名信息就安全了。
.gitignore
...
/sign.properties
总结
这篇文章主要说的是关于签名文件的,应用在打包的时候就需要生成一个签名文件,也要注意对签名文件的安全管理。