Gradle实现自动打包,签名,自定义apk文件名

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位,而且输入的时候你看不见,安全起见嘛)

回车以后按照提示一步一步设置

  1. 您的名字与姓氏是什么?  ****
  2. 您的组织单位名称是什么?  ****
  3. 您的组织名称是什么?   ****
  4. 您所在的您所在的省/市/自治区名称是什么? ****
  5. 城市或区域名称是什么?   ****
  6. 该单位的双字母国家/地区代码是什么? cn
  7. *******是否正确?  输入y/n即可 y表示正确
  8. 输入 <biemings> 的密钥口令  同样不少于6位 重复输入即可

如下图我定义的:

查看密钥证书

keytool -list -v -keystore 密钥路径

[[email protected] ~]# 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"]
    }
    Gamma {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Gamma"]
    }
    Demo {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Demo"]
    }
    Current {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Current"]
    }
}
    }
    buildTypes {
        release {
                          signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }

在jenkins上构建完之后就可以查看apk是否签名成功

[[email protected] apk]#jarsigner -verbose -certs -verify Securigy_1.3_201806281954_Alpha_1.3.apk

原文地址:https://www.cnblogs.com/Dev0ps/p/9240693.html

时间: 2024-08-29 09:24:38

Gradle实现自动打包,签名,自定义apk文件名的相关文章

android app调试没问题,但打包签名的apk,运行时出现闪退怎么办?

在用Eclipse编写Android app时,有时调试时没有问题,但一经打包签名,运行就出现闪退,还报错说找不到某某类.一开始以为是混淆导致的,后来我没有混淆竟然也还是这个问题.无奈只得网上寻找解决方案,最终还是有人解决了的,方法也很简单,只需按照下面几步来就可以了: 1.找到Project -> Build Automatically,取消它关闭自动编译2.然后Clean一下3.最后在手动Build一下 然后你再打包签名,这样就可以正常运行了.

[转]使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)

在android4.0以后的sdk里那个脚本就失效了,主要是因为 apkbuilder这个程序不见了: 人家sdk升级,我们的脚本也要跟上趟,修改一下喽. 上网一查,大家的文章还停留在我去年的脚本程度,算了,自己动手查阅了资料之后,具体实现如下: 在工程的根目录 创建2个文件,分别: 1.build.xml 2.build.properties build.xml的内容: [java] view plaincopyprint? <?xml version="1.0" encodi

windows环境下jenkins+gradle+Android 自动打包部署

第一步,搭建jenkins环境 1.安装下载jenkins jenkins运行依赖Java开发环境,安装jenkins前,先安装好JDK,并配置好环境变量 进入jenkins 的官网 https://jenkins.io/ , 根据搭建平台的不同下载,我使用的是 windows 平台 2.配置 Jenkins 安装完成后,在浏览器中访问 : http://localhost:8080/, 你将会看到如下界面 ,然后开始配置 Jenkins. 3.Jenkins 插件安装和超级管理员配置 填写完密

Android Studio第一期 - 打包签名混淆反编译

开始先说打包签名: 1.打开你的AS选中你的project->bulid,     2.跟eclipse一样搞一个key,自己填写一下改写的什么注册的信息什么的,然后就会获得key和password,此处省略一万字--!然后就是填写了, 图2, 3.等待就可以了,project的app目录下你会找到打包签名的apk包,就这样. end 下面说混淆部分: 1.把你的build.gradle,改一下true,     2.接着就是proguard-rules.pro里面的,注意:不要写jar了哈,A

Eclipse下配置Ant脚本 自动打包带签名的Android apk

虽然eclipse很少用了,但是在古老的项目上还是会用到.一个麻烦事是打带签名包的时候,非常不方便.下边纪录下配置ant,自动打包带签名apk的过程,作为备忘.(PC环境为MAC) 1,第一步得安ant,下载对应安装包,解压后配置环境变量: export ANT_HOME="/Users/yanzi/work/apache-ant-1.9.4" export PATH=${PATH}:${ANT_HOME}/bin 通过which ant检查是否安装成功. 2,在项目目录下运行:and

android自动打包方法(ant+proguard+签名)

前段时间做了一个android的网游项目,现在优化减少体积和防止别人反编译,需要把编译后.class进行混淆,开始在网上看了一些关于 ProGuard的介绍,基本上都是使用ADT自带的打包方式,那个打包方式太慢了,还要手工输密码,一个字烦. 于是开始寻找ant+proguard+签名的打包方式,遗憾的是资料不是缺手就是断脚. 好吧,看来得食自己了,!@#¥@#!@#!@##¥@#¥!@#@ 转眼一周,我++,终于把东西搞出来 ps:我们项目还有一个特殊需求,要把版本号,推广ID打到包里去,方便做

Android Gradle实用技巧——APK文件名中加上SVN版本号,日期等

有时候,我们会希望能把APK文件名上带上打包日期,打包时svn的版本号,应用版本号等.当然这些也可以手动添加,但是手动的话也未免太不优雅了,而且可能会出错. 利用Gradle,我们可以让打包出来的apk自动的带上一些列信息. 默认读者已经对gradle有一定的了解,有buildtypes,productFlavors的概念.不了解的可以看看上一篇或者去网上搜索来补充一下. Gradle是基于groovy的自动化构建工具,在build.gradle中我们可以用一些脚本,函数来控制编译的过程.本文所

Android 项目利用 Android Studio 和 Gradle 打包多版本APK

在项目开发过程中,经常会有需要打包不同版本的 APK 的需求. 比如 debug版,release版,dev版等等. 有时候不同的版本中使用到的不同的服务端api域名也不相同. 比如 debug_api.com,release_api.com,dev_api.com等等. 不同的版本对应了不同的 api 域名,还可能对应不同的 icon 等. 如果每次都在打包前修改我们都手动来修改,这样实在是不够方便. 但如果我们使用了 Android Studio 和 Gradle,这个麻烦就可以轻松省去.

Unity自动打包Apk

unity打包apk相对来说比较容易,相信出过的人都明白,出包过程,没有大的难度,一步一操作,一步一等待,繁琐耗时,不懂的人又代替不了.这时候需求就来了,如何简单的一键打包搞定,这个就稍微有点难度,当然作为程序员就是要解决这些问题,封装变化,变繁为简. 打包apk大概可以分为以下步骤(出apk需要的jdk,Android sdk这些不用多说,相信大家都会配置) 1.配置PlayerSetting 2.配置渠道等第三方SDK 3.copy外部资源和一些自己工程需要的一些配置 4.unity打包bu