Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)

所有的Android应用程序都要求开发人员用一个证书进行数字签名,Android系统不会安装没有进行签名的应用程序。
在应用程序开发期间,由于是以Debug调试模式编译的,因此IDE(ADT)根据会自动用默认的密钥和证书来进行签名,而以Release发布模式编译时,apk文件就不会得到自动签名,这样就需要进行手工签名。

我们使用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
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第1张图片
如果项目需要细分开发dev和生产pro版本,每个版本中都包含debug和release模式,可以这么设置:
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第2张图片
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第3张图片
就细分成四种模式:
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第4张图片
release模式需要配置签名才能运行,这时就需要一个keystore
如果没有就需要创建,已经创建过keystore请跳过此步骤

Android Studio中apk签名打包步骤
1.创建keystore,并生成我们的apk(打包)
第一步: Build —>> Generate Signed APK
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第5张图片
第二步:Create New···(已经创建过keystore选Choose existing···)
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第6张图片
第三步:填写相关信息
设置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
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第7张图片

第四步:输入key、keystore密码
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第8张图片
第五步:选择发布app的路径,默认即可 选择release方式发布
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第9张图片
OK,发布成功,可以到 刚才设置的目标文件夹下面找到发布的apk

那对一些人来说,这样也太麻烦了,每次都得输入相关信息,还得进行选择,那么有更简单快捷的方法吗?答案是有的。
我们可以在项目的app目录下的build.gradle中进行签名的配置。

2.release模式配置keystore
Project structure-signing,输入已创建的keystore信息
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第10张图片
使得签名生效需配置Build Types
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第11张图片
点击OK即可,然后查看对应build.gradle的配置文件应该是这样的。当然了,你也可以通过直接在build.gradle里面写下面这段。

1 signingConfigs {
2         release {
3             keyAlias 'androiddebugkey'
4             keyPassword 'android'
5             storeFile file('C:/Users/ssc/.android/debug.keystore')
6             storePassword 'android'
7         }
8     }
9 
10     ·········
11 
12 buildTypes {
13         release {
             //是否混淆
14             minifyEnabled false
             //是否移除无用资源
15             zipAlignEnabled true
             //混淆的配置文件
16             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17             signingConfig signingConfigs.release
18         }
19 }

上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在build.gradle里面,那是不是很不安全呢?
可以将签名文件的配置密码之类的信息直接写在local.properties下,因为在Git版本控制的项目中,我们可以看到我们项目project模式根目录下有一个.gitignore的文件,里面的配置大概如下所示
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第12张图片
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第13张图片
我们可以看到/local.properties,意思就是说local.properties默认是不添加到版本控制里面的,因为local.properties存储的是我们环境资源的一些相关信息,如sdk的路径。故我们可以在local.properties下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。
在local.properties下直接添加相关信息
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第14张图片
在build.gradle里,为了不用明文显示,我们首先要获得key的相关配置,所以我们可以在app的build.gradle里

android {}之上新增代码
app/build.gradle下的signingConfigs可以改为:

signingConfigs {
       release {
           keyAlias keystoreAlias
           keyPassword keystoreAliasPSW
           storeFile keyfile
           storePassword keystorePSW
       }
   }

设置后Signing中keystore值无需关心
Android安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)_第15张图片
相应的,buildTypes也可以配置成这样

1 buildTypes {
2         release {
3             minifyEnabled false
4             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5 //            signingConfig signingConfigs.release
6             //签名文件存在,则签名
7             if (keyfile.exists()) {
8                 println("WITH -> buildTypes -> release: using jks key")
9                 signingConfig signingConfigs.release
10             } else {
11                 println("WITH -> buildTypes -> release: using default key")
12             }
13             23       }
24     }

到此,前面配置完成。

签名包V1和V2详细介绍:
使用Android Studio打包签名时,打包选项会有V1 和 V2 两个选项
老版本的AS,只有V1选择。但是新版本的AS,默认勾选的是V2版本。如果只勾选V2版本,打出来的签名包,很多机型会直接提示安装失败。解决办法下面会说。
概述:
在Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature来自JDK。
V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。
解决方案一:
V1和V2的签名使用
1)只勾选V1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
2)只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
3)同时勾选V1和V2则所有机型都没问题。
解决办法二:
在app的build.gradle的android标签下加入如下

android {

        signingConfigs {
            config {
                keyAlias 'a'
                keyPassword '123456'
                storeFile file('a.jks')
                storePassword '123456'
            }

            debug{
                v1SigningEnabled true
                v2SigningEnabled true
            }
            release{
                v1SigningEnabled true
                v2SigningEnabled true
            }
        }
   }

V2签名包是从Android7.0系统出现的新的签名机制,这个新机制使得apk的签名方式更加安全。首先我们应该尝试把V1和V2两个选项全部勾选,并尽可能的去使用他们,但是如果全部勾选完毕出现了问题,那么我们可以忽略这种新的签名机制,只勾选第一个选项(V1),依旧使用我们之前老的签名机制,也就是说,V1版本更加快速方便。
为什么这里会提到V1、V2的区别。因为这里的美团多渠道打包只能适用于V1版本的签名包!!!但是apk上架到应用宝时(在打包同时勾选V1、V2且没有使用多渠道打包)还是会提示:
在这里插入图片描述
所以,个人还是推荐使用V1打包方式。因为稳定,所以放心。
在提一嘴,前不久美图技术点评也实现了V2版本包的功能,想了解的请移步:新一代美团快速打包。集成起来会相对复杂一些,在一些讲解效率和快速开发的团队,正常使用V1签名包和上面的美团打包方式,依旧可以快速高效满足开发需求保证产出以及安全。

本文参考来源:
[1]https://www.cnblogs.com/details-666/p/keystore.html

你可能感兴趣的:(Android开发知识)