所有的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

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


就细分成四种模式:

release模式需要配置签名才能运行,这时就需要一个keystore
如果没有就需要创建,已经创建过keystore请跳过此步骤

Android Studio中apk签名打包步骤
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里面写下面这段。

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的文件,里面的配置大概如下所示


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

在build.gradle里,为了不用明文显示,我们首先要获得key的相关配置,所以我们可以在app的build.gradle里

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

signingConfigs {release {keyAlias keystoreAliaskeyPassword keystoreAliasPSWstoreFile keyfilestorePassword keystorePSW}}

设置后Signing中keystore值无需关心

相应的,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 truev2SigningEnabled true}release{v1SigningEnabled truev2SigningEnabled 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安卓签名打包原理,步骤详细讲解(debug,release区别.V1,V2区别)相关推荐

  1. Android 应用开发(33)---Android程序签名打包

    Android程序签名打包 第一章的倒数第二节,本节给大家介绍的是如何将我们的程序打包成Apk文件,并且为我们的Apk签名! 上一节中已经说了,我们后续的教程使用的IDE是Android Studio ...

  2. Kali Linux 2021.2在VMware和VirtualBox安装教程 超简单 步骤详细讲解

    Kali Linux 2021.2在VMware和VirtualBox安装教程 超简单 步骤详细讲解 一. 资源下载及工作站安装 二. 使用VMware平台安装 三. 使用VirtualBox平台安装 ...

  3. android studio密钥库口令,Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码...

    本文将带你了解Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码,希望本文对大家学Android有所帮助. " 一.签名打包两种方式 1. ...

  4. 5 Android程序签名打包

    在上一章,我们创建了自己的 Android 工程,并成功的在模拟器中运行起来.同时提到,工程目录中有一个 bin 目录,运行之后我们可以在此目录下找到我们的apk.那么不难想到,我们在点"R ...

  5. android 自动打印出来,Android:签名打包后关闭Log打印

    楔子 log在发布版本中打印会出现极大的安全问题,但在debug版本中确是不可缺少的. 需求 自动判断当前版本类型,选择是否输出log 实现 查阅了stormzhang的文章,提出使用BuildCon ...

  6. Android 应用apk打包原理

    文章目录 前言 一.打包前 - app源码结构 二.打包后 - apk 文件结构 - apk结构? - 图示 (1) - 图示 (2) 三.那是怎么生成的? 1.apk 打包流程 2.详解:构建流程中 ...

  7. eclipse+ADT 进行android应用签名打包详解

    1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包: 2.选择需要打包的android项目工程: 3.如果已有私钥文件,选择私钥文件输入密码,如果没有参见第6和7步创 ...

  8. Unity3d Android安卓JDK9打包失败

    本文首发于"洪流学堂"微信公众号. 洪流学堂,让你快人几步成为Unity大牛! 目前(2018年2月26日)Unity打包Android不支持JDK9 https://forum. ...

  9. 跨平台应用开发进阶(二十九) :uni-app 实现Android原生APP-云打包集成神策详细教程

    文章目录 一.前言 二.集成 2.1 集成 uni-app 插件 2.2 云端集成原生插件 2.3 离线集成 2.3.1 获取插件包 2.3.2 在 HBuilderX 中集成原生插件 2.4 集成结 ...

最新文章

  1. 人工智能治理需用好“人工”
  2. P3225 [HNOI2012]矿场搭建
  3. JZOJ 5627. 【NOI2018模拟4.3】paint
  4. Angular - 如何在页面加载后马上做初始化
  5. android实现自动抢红包,Android手机辅助功能实现自动抢微信红包功能
  6. Binary Search
  7. C++实现链栈的基本操作
  8. 被高中生物骗了这么多年,原来人体内细胞的DNA是有不同的?
  9. 2440 linux文件写,添加yaffs2文件系统 - Linux2.6.39在S3C2440上的移植_Linux编程_Linux公社-Linux系统门户网站...
  10. HTML浅学入门---基础知识 (1)基本规则
  11. 密码加密模块 bcrypt (详细,好理解,示例源码)
  12. 哪种编程语言好?大神为你分析 Go、Java、C、C++ 等主流编程语言
  13. 1.定义ddos僵尸网络
  14. NTFS与FAT32区别
  15. HDU-6447-YJJ's Salesman(离散化+01dp,线段树维护)
  16. rust vapo_考研英语翻译技巧
  17. O2OA开源办公平台:搭建自定义工程及开发
  18. mysql中文乱码解决
  19. 聊聊Kotlin中的元编程
  20. 基于ubuntu使用ovs实现容器网络隔离

热门文章

  1. 土地利用数据与土地覆被数据的区别
  2. 平价好用的蓝牙耳机有什么推荐?适合元旦送人蓝牙耳机分享
  3. AndroidStudio搞怪进度条插件
  4. 黑帽SEO是什么?做了真的能够一直保持排名?
  5. ADAS仿真测试-基于原始数据流的雷达感知测试
  6. 新版标准日本语中级_第十七课
  7. Minecraft 官网谷歌验证码的解决方案(reCaptcha)
  8. Geoserver学习笔记-3、服务标准(WFS)
  9. SVF Saber的实现
  10. Zookeeper之Linux分布式集群搭建及客户端shell命令操作