为什么Android应用需要签名
这里我在网上找了一些资料总结了一下,这个理解一下就可以了。
- 应用程序升级——当你对应用程序进行升级时,如果你想用户平稳的升级,那么,你就需要签上相同的证书。当系统安装一个升级应用程序时,如果新版本的证书与老版本的证书有匹配的话,那么,系统才会允许进行升级。如果你没有为版本签上合适的证书,当你安装时,你需要给应用程序指定一个新的包名——在这种情况下,用户安装的新版本,被当作是一个全新的应用程序。
- 应用程序模块化——如果应用程序请求的话,Android系统允许签有相同证书的应用程序运行在相同的进程里,这样,系统就会把它们看作是一个单一的应用程序。用这种方法配置应用程序,用户可以选择更新每个独立的模块。
- 代码/数据权限共享——Android系统提供了基于签名的权限检查,因此,如果应用程序间签有特定的证书,那么,它们之间可以共享功能。通过多个程序签有相同的证书并且使用基于签名的权限检查,你的程序可以以一种安全的方式共享代码和数据。还有一个决定签名策略的重要因素是:如何设定key的有效期。
- 发送者的身份认证,由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换
- 保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中内容不被替换。
- 防止交易中的抵赖发生, 市场对软件的要求
签名的方法
1、
第一步: 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 }
3、
上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在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可以改为:
1 2 3 4 5 6 7 8 |
|
设置后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 }
最后 有时候Android已安装了存在签名冲突的同名数据包!!!
应为:手机上安装的是从AndroidStudio直接运行的apk,测试版;而提示有新版本下载的安装包是已发布过得,正式版;所以两个版本的签名不相同,所以会报错。
若想继续测试自动更新,手工删除该软 件的旧版(),然后安装新版。
或者直接在你的debug版本也设置相同的签名就好 第二种 或者第三种 看需求,是否需要保密选择设置