赞
踩
我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式。
debug模式使用一个默认的debug.keystore进行签名。
这个默认签名(keystore)是不需要密码的,它的默认位置在C:\Users\<用户名>\.Android\debug.keystore,如果不存在Android studio会自动创建它。
例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。
在我们正式发布项目的时候是不能使用debug.keystore的。开发过程中我们也可以使用发布模式运行。可以通过如下设置:
BuildVariants-Build Variant-debug/release
如果项目需要细分开发dev和生产pro版本,每个版本中都包含debug和release模式,可以这么设置:
就细分成四种模式:
release模式需要配置签名才能运行,这时就需要一个keystore
如果没有就需要创建,已经创建过keystore请跳过此步骤
第一步: Build --->> Generate Signed APK
第二步:Create New···(已经创建过keystore选Choose existing···)
第三步:填写相关信息
设置keystore路径、密码,设置key:别名、密码、有效期,证书等
Key store path:存放路径
Key
Alias:别名
Validity(years):有效期(一般默认25年)
Certificate:证书
First and Last Name:姓名
Organization Unit:组织单位
Organization:组织
City or Locality:城市或地区
State or Province:州或省
Country Code(XX):国家代码(XX),中国:86
第四步:输入key、keystore密码
第五步:选择发布app的路径,默认即可 选择release方式发布
OK,发布成功,可以到 刚才设置的目标文件夹下面找到发布的apk
那对一些人来说,这样也太麻烦了,每次都得输入相关信息,还得进行选择,那么有更简单快捷的方法吗?答案是有的。
我们可以在项目的app目录下的build.gradle中进行签名的配置。
2.release模式配置keystore
Project structure-signing,输入已创建的keystore信息
使得签名生效需配置Build Types
点击OK即可,然后查看对应build.gradle的配置文件应该是这样的。当然了,你也可以通过直接在build.gradle里面写下面这段。
,回到app下的build.gradle,在里面增加这段代码
- signingConfigs {
- debug {
- storeFile file('../test.jks')//签名文件路径
- storePassword "123456"
- keyAlias "test"
- keyPassword "123456" //签名密码
- println("====== signingConfigs.debug ======")
- }
- release {
- storeFile file('../test.jks')//签名文件路径
- storePassword "123456"
- keyAlias "test"
- keyPassword "123456" //签名密码
- println("====== signingConfigs.release ======")
- }
- }
我来解释一下,storeFile file对应的就是签名文件key的路径,我们的签名放在项目的直接子路径下,而build.gradle在test/app下,所以我们要用 .. 找到项目的根路径,再通过 / 找到对应的签名文件所在路径。当然,你也可以自己配置签名文件的地址,只要能找到即可。
此时,我们在项目路径下的app/build/outputs可以看到我们打包的apk,从名字可以看出,该APK是已经签名的。那么就是说,用代码配置,可以达到和使用图形界面一样的效果。
对了,这里有一点需要注意,就是signingConfigs代码块一定要写在buildTypes前面,否则会报下面这种错: Could not find property ‘debugConfig’ on SigningConfig container.
至此,我们的buildTypes的配置可以这样:
- buildTypes {
- debug {
- println("====== buildTypes.debug ======")
- signingConfig signingConfigs.debug
- }
- release {
- //是否混淆
- minifyEnabled false
- //是否移除无用资源
- zipAlignEnabled true
- println("====== buildTypes.release ======")
- signingConfig signingConfigs.release
- //混淆的配置文件
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
大家现在便可以通过命令行进行任意操纵,或者进行多渠道打包。
不过,上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在build.gradle里面,那是不是很不安全呢?
所以,我们可以这么做。在项目路径下新建一个.properties的文件,或者直接local.properties下直接添加相关信息即可。
我们可以直接在该文件下添加:(填写相关信息)
- keystore.path=../test.jks //替换成自己的签名路径
- keystore.password=123456
- keystore.alias=test
- keystore.alias_password=123456
那么,在build.gradle下面,为了不用明文显示,我们首先要获得key的相关配置,所以我们可以在app的build.gradle下面新增该代码
- def keystoreFilepath = ''
- def keystorePSW = ''
- def keystoreAlias = ''
- def keystoreAliasPSW = ''
- // default keystore file, PLZ config file path in local.properties
- def keyfile = file('s.keystore.temp')
-
- Properties properties = new Properties()
- // local.properties file in the root director
- properties.load(project.rootProject.file('local.properties').newDataInputStream())
- keystoreFilepath = properties.getProperty("keystore.path")
-
- if (keystoreFilepath) {
- keystorePSW = properties.getProperty("keystore.password")
- keystoreAlias = properties.getProperty("keystore.alias")
- keystoreAliasPSW = properties.getProperty("keystore.alias_password")
- keyfile = file(keystoreFilepath)
- }
首先,便是给key赋默认值,然后根据Properties的配置文件,然后根据我们在local.properties下的配置参数keystore.password等获取签名文件的配置信息。
这里有一点需要强调,在git版本控制的项目中,我们可以看到我们项目下有一个.gitignore的文件,里面的配置大概如下所示
我们可以看到/local.properties,意思就是说local.properties默认是不添加到版本控制里面的,因为local.properties存储的是我们环境资源的一些相关信息,如sdk的路径。故我们可以在local.properties下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。
那么,此时此刻,我们app/build.gradle下的signingConfigs可以改为:
- signingConfigs {
- debug {
- storeFile keyfile
- storePassword keystorePSW
- keyAlias keystoreAlias
- keyPassword keystoreAliasPSW
- println("====== signingConfigs.debug ======")
- }
- myConfig {
- storeFile keyfile
- storePassword keystorePSW
- keyAlias keystoreAlias
- keyPassword keystoreAliasPSW
- println("====== signingConfigs.release ======")
- }
- }
相应的,buildTypes也可以配置成这样
- buildTypes {
- debug {
- println("====== buildTypes.debug ======")
- signingConfig signingConfigs.debug
- }
- release {
- //是否混淆
- minifyEnabled false
- //是否移除无用资源
- zipAlignEnabled true
- //混淆配置
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- //签名文件存在,则签名
- if (keyfile.exists()) {
- println("WITH -> buildTypes -> release: using jks key")
- signingConfig signingConfigs.myConfig
- }else {
- println("WITH -> buildTypes -> release: using default key")
- }
- applicationVariants.all { variant ->
- variant.outputs.each { output ->
- def outputFile = output.outputFile
- if (outputFile != null && outputFile.name.endsWith('.apk')) {
- // 输出apk名称为ruijie_v1.0_wandoujia.apk
- def fileName = "ruijie_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
- output.outputFile = new File(outputFile.parent, fileName)
- }
- }
- }
- }
这样的话,当我们的项目是开源的,那么我们不会上传签名文件,我们通过上述代码keyfile.exists()进行判断是否有签名,那么其他人打包出来的apk是未签名的。所以能够保证apk签名的安全性。
原文地址https://www.cnblogs.com/details-666/p/keystore.html
http://blog.csdn.net/caben_/article/details/52708169
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。