Gradle实现自动打包,签名,自定义apk文件名
什么是签名,签名有什么用
Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行时到手机上时,是AS会自动用默认的密钥和证书来进行签名;但是我们实际发布编译时,则不会自动签名,这个时候我们就需要进行手动签名了!为我们的APK签名有以下好处:
- 1.应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
- 2.应用程序模块化: Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。
- 3.代码或者数据共享: Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。 不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。 ————上述内容摘自:android 为什么需要签名
首先我们看下效果图
一、生成keystone文件
了解下加解密算法的分类
加解密算法基本上可以分为三类,它们分别是对称性解密算法、非对称性加密算法和消息摘要算法。每一类算法中又有多个不同的具体算法。对于这些算法,我们不要求完全掌握,但是对于各类算法的特点和用途是一定要了解的,对于一些常见的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它们分别属于哪类算法。
对称性加密算法使用同一个密钥对信息进行加密和解密,其信息的安全性一部分取决于加密算法和密钥的长度,另一部分取决于密钥在传递过程中是否会被截获或盗取。非对称性加密算法使用两个密钥分别对信息进行加密和解密,这两个密钥称为私钥/公钥对。使用私钥加密的信息必须使用公钥解密,反之亦然。公钥可以公开发布,私钥由加密方保存,绝对不公开,将私钥被截获或窃取的可能性降到最低,因此非对称性加密算法的安全性比对称性加密算法的安全性更高。既然非对称性加密算法比对称性加密算法安全性更高,那对称性加密算法有什么存在的必要呢?这是因为对称性加密算法的运算速度更快。现实中,往往将对称性加密算法和非对称性加密算法结合使用,对于要传输的大块数据使用对称性加密算法加密,然后对加密使用的密钥使用非对称性加密算法进行加密,这样既可以获得更高的安全性,又可以获得更高的加解密运算速度。常用的对称性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非对称性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(椭圆曲线加密算法)。
消息摘要算法的主要目的是对数据生成摘要。消息摘要算法不需要密钥,只有输入相同的数据才能得到相同的摘要,而且不可能从摘要反过来推算出数据。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的变体。它们可以用来保证数据的完整性,在网络上发布文件时,常同时提供该文件的MD5值就是利用的消息摘要算法的这个特点,一旦该文件被篡改或者在网络传输中出现数据错误,再对其进行摘要运算就得不到相同的MD5值。
对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者,他再怎么抵赖也没有用。
Keytool介绍
Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)-只包含公钥
Keytool工具位于JDK 目录下的bin 目录下keytool.exe 一般配置了环境变量path都可以直接使用
使用Keytool生成自己的密钥
keytool -genkey -alias tudou.keystore -keyalg RSA -validity 20000 -keystore tudou.keystore
参数说明:
-alias xxx 产生别名 每个keystore 都有关联的这个独一无二的alias 别名通常不区分大小写
-keyalg RSA 指定加密算法 这里指定的是 RSA
-validity 20000 指定证书的有效时间 单位:天 这里指定的是20000天
-keystore xxx 指定密钥库的名称
输入以上命令以后直接回车,会提示 输入密钥库口令:输入完成后再重复输入一遍 (输入的口令不能少于6位,而且输入的时候你看不见,安全起见嘛)
回车以后按照提示一步一步设置
- 您的名字与姓氏是什么? ****
- 您的组织单位名称是什么? ****
- 您的组织名称是什么? ****
- 您所在的您所在的省/市/自治区名称是什么? ****
- 城市或区域名称是什么? ****
- 该单位的双字母国家/地区代码是什么? cn
- *******是否正确? 输入y/n即可 y表示正确
- 输入 <biemings> 的密钥口令 同样不少于6位 重复输入即可
如下图我定义的:
查看密钥证书
keytool -list -v -keystore 密钥路径
[root@hejianlai-jenkins ~]# keytool -list -v -keystore tudou.keystore Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: tudou.keystore Creation date: Jun 26, 2018 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN Issuer: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN Serial number: fd5bed2 Valid from: Tue Jun 26 16:30:26 CST 2018 until: Wed Mar 29 16:30:26 CST 2073 Certificate fingerprints: MD5: 07:63:47:F3:96:92:E0:6B:49:D7:2F:68:3C:5D:0E:51 SHA1: DA:46:86:62:8D:22:78:0A:51:66:3F:78:5F:37:91:9F:F4:D6:63:1B SHA256: 1D:98:8E:31:01:D4:43:0A:E0:2C:A2:37:4F:83:EB:38:A2:80:45:FD:46:BC:4C:FC:59:B6:A0:4E:D3:B9:72:62 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: E0 DC CF A9 5B 0C 5D 9C A2 F8 48 52 4C 83 23 36 ....[.]...HRL.#6 0010: 8B 25 3B C3 .%;. ] ] ******************************************* ******************************************* Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore tudou.keystore -destkeystore tudou.keystore -deststoretype pkcs12".
二、配置build.gradle文件
下面是配置build.gradle文件我的路径是/app/build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.pci.securigydemotest" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //添加签名文件 signingConfigs { release { storeFile file("/root/keyless.keystore") //签名文件全路径 storePassword "123456" keyAlias "keyless.keystore" keyPassword "123456" } } //设置打包格式 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 输出apk名称为Pos_v1.0.0_201709251000_.apk def fileName = "Securigy_${defaultConfig.versionName}_201806281954_${variant.productFlavors[0].name}_1.3.apk" output.outputFile = new File(outputFile.parent, fileName) } } } //自定义apk名字 productFlavors { Develop { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Develop"] } Alpha { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Alpha"] } Beta { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Beta"] } Demo { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Demo"] } } } buildTypes { release { //注意下面这一句很重要,必须加上才会执行上面的signingConfigs函数。 signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
在jenkins上构建完之后就可以查看apk是否签名成功
[root@hejianlai-jenkins apk]#jarsigner -verbose -certs -verify Securigy_1.3_201806281954_Alpha_1.3.apk