当前位置:   article > 正文

android 签名打包_android 打包默认使用的签名信息

android 打包默认使用的签名信息

我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式。

debug模式

debug模式使用一个默认的debug.keystore进行签名。

这个默认签名(keystore)是不需要密码的,它的默认位置在C:\Users\<用户名>\.Android\debug.keystore,如果不存在Android studio会自动创建它。

例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。

 

release模式

在我们正式发布项目的时候是不能使用debug.keystore的。开发过程中我们也可以使用发布模式运行。可以通过如下设置:

BuildVariants-Build Variant-debug/release

如果项目需要细分开发dev和生产pro版本,每个版本中都包含debug和release模式,可以这么设置:

就细分成四种模式:

release模式需要配置签名才能运行,这时就需要一个keystore

如果没有就需要创建,已经创建过keystore请跳过此步骤

 

1.创建keystore,并生成我们的apk(打包)

 第一步: 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,在里面增加这段代码

  1. signingConfigs {
  2. debug {
  3. storeFile file('../test.jks')//签名文件路径
  4. storePassword "123456"
  5. keyAlias "test"
  6. keyPassword "123456" //签名密码
  7. println("====== signingConfigs.debug ======")
  8. }
  9. release {
  10. storeFile file('../test.jks')//签名文件路径
  11. storePassword "123456"
  12. keyAlias "test"
  13. keyPassword "123456" //签名密码
  14. println("====== signingConfigs.release ======")
  15. }
  16. }

我来解释一下,storeFile file对应的就是签名文件key的路径,我们的签名放在项目的直接子路径下,而build.gradle在test/app下,所以我们要用 .. 找到项目的根路径,再通过 / 找到对应的签名文件所在路径。当然,你也可以自己配置签名文件的地址,只要能找到即可。

这里写图片描述

此时,我们在项目路径下的app/build/outputs可以看到我们打包的apk,从名字可以看出,该APK是已经签名的。那么就是说,用代码配置,可以达到和使用图形界面一样的效果。

对了,这里有一点需要注意,就是signingConfigs代码块一定要写在buildTypes前面,否则会报下面这种错: Could not find property ‘debugConfig’ on SigningConfig container.

至此,我们的buildTypes的配置可以这样:

  1. buildTypes {
  2. debug {
  3. println("====== buildTypes.debug ======")
  4. signingConfig signingConfigs.debug
  5. }
  6. release {
  7. //是否混淆
  8. minifyEnabled false
  9. //是否移除无用资源
  10. zipAlignEnabled true
  11. println("====== buildTypes.release ======")
  12. signingConfig signingConfigs.release
  13. //混淆的配置文件
  14. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  15. }
  16. }

大家现在便可以通过命令行进行任意操纵,或者进行多渠道打包。 
不过,上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在build.gradle里面,那是不是很不安全呢?

所以,我们可以这么做。在项目路径下新建一个.properties的文件,或者直接local.properties下直接添加相关信息即可。

我们可以直接在该文件下添加:(填写相关信息)

  1. keystore.path=../test.jks //替换成自己的签名路径
  2. keystore.password=123456
  3. keystore.alias=test
  4. keystore.alias_password=123456

那么,在build.gradle下面,为了不用明文显示,我们首先要获得key的相关配置,所以我们可以在app的build.gradle下面新增该代码

  1. def keystoreFilepath = ''
  2. def keystorePSW = ''
  3. def keystoreAlias = ''
  4. def keystoreAliasPSW = ''
  5. // default keystore file, PLZ config file path in local.properties
  6. def keyfile = file('s.keystore.temp')
  7. Properties properties = new Properties()
  8. // local.properties file in the root director
  9. properties.load(project.rootProject.file('local.properties').newDataInputStream())
  10. keystoreFilepath = properties.getProperty("keystore.path")
  11. if (keystoreFilepath) {
  12. keystorePSW = properties.getProperty("keystore.password")
  13. keystoreAlias = properties.getProperty("keystore.alias")
  14. keystoreAliasPSW = properties.getProperty("keystore.alias_password")
  15. keyfile = file(keystoreFilepath)
  16. }

首先,便是给key赋默认值,然后根据Properties的配置文件,然后根据我们在local.properties下的配置参数keystore.password等获取签名文件的配置信息。

这里有一点需要强调,在git版本控制的项目中,我们可以看到我们项目下有一个.gitignore的文件,里面的配置大概如下所示

这里写图片描述

我们可以看到/local.properties,意思就是说local.properties默认是不添加到版本控制里面的,因为local.properties存储的是我们环境资源的一些相关信息,如sdk的路径。故我们可以在local.properties下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。

那么,此时此刻,我们app/build.gradle下的signingConfigs可以改为:

  1. signingConfigs {
  2. debug {
  3. storeFile keyfile
  4. storePassword keystorePSW
  5. keyAlias keystoreAlias
  6. keyPassword keystoreAliasPSW
  7. println("====== signingConfigs.debug ======")
  8. }
  9. myConfig {
  10. storeFile keyfile
  11. storePassword keystorePSW
  12. keyAlias keystoreAlias
  13. keyPassword keystoreAliasPSW
  14. println("====== signingConfigs.release ======")
  15. }
  16. }

相应的,buildTypes也可以配置成这样

  1. buildTypes {
  2. debug {
  3. println("====== buildTypes.debug ======")
  4. signingConfig signingConfigs.debug
  5. }
  6. release {
  7. //是否混淆
  8. minifyEnabled false
  9. //是否移除无用资源
  10. zipAlignEnabled true
  11. //混淆配置
  12. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  13. //签名文件存在,则签名
  14. if (keyfile.exists()) {
  15. println("WITH -> buildTypes -> release: using jks key")
  16. signingConfig signingConfigs.myConfig
  17. }else {
  18. println("WITH -> buildTypes -> release: using default key")
  19. }
  20. applicationVariants.all { variant ->
  21. variant.outputs.each { output ->
  22. def outputFile = output.outputFile
  23. if (outputFile != null && outputFile.name.endsWith('.apk')) {
  24. // 输出apk名称为ruijie_v1.0_wandoujia.apk
  25. def fileName = "ruijie_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
  26. output.outputFile = new File(outputFile.parent, fileName)
  27. }
  28. }
  29. }
  30. }

这样的话,当我们的项目是开源的,那么我们不会上传签名文件,我们通过上述代码keyfile.exists()进行判断是否有签名,那么其他人打包出来的apk是未签名的。所以能够保证apk签名的安全性。



原文地址https://www.cnblogs.com/details-666/p/keystore.html

http://blog.csdn.net/caben_/article/details/52708169

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/250744
推荐阅读
相关标签
  

闽ICP备14008679号