签名介绍

Android的签名相信大家经常会遇到的,当我们做好一款APP准备发布的时候我们就需要一个realese的key文件给我们这个app签名.那我们没有指定的APK是不是就没有签名呢,?并不是,所有的APK都是有签名的,如果没有指定签名文件,编译时会默认用SDK目录下的debug签名文件.

签名文件是什么:

其实签名文件就可以看作是一个容器,用来装一些摘要信息的容器而已.

签名的作用及重要性

Android签名的主要作用是为了:

  • 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
  • 应用程序模块化:Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块
  • 代码或者数据共享:Android提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。

所以一旦给Apk签名并上线后,签名文件和密码别名等一定要记住不能丢失,这样会损失用户且带来灾难性的后果.

签名文件

签名文件有很多种,这里主要是介绍Android相关的,比如最早的keystore,jks,pem/pk8等.

  • KeyStore: KeyStore是Eclipse开发Android的时候最早的签名文件了.
  • JKS(Java key store): JKS是目前Android Studio中创建签名文件的格式(Build -> Generate Signed APK)即可创建和使用签名文件为对应apk进行签名
  • pem/pk8 :这个是系统的签名文件,Android系统在编译的时候也是需要签名,所以这个是系统的签名文件,那系统签名文件可不可以签名APK呢?答案是:可以.

如何使用签名:

前面介绍了一部分,下面再介绍一下:

你可以使用命令行的方式,也可以使用Android Studio去选择或者配置Gradle.

命令行:

jarsigner -verbose -keystore abc.keystore -signedjar input.apk output_signed.apk signed.keystore

Gradle:

signingConfigs {
        dbgKey {
            storeFile file('E:\\carlife\\CSH-APP\\csh_app_latest.jks')
            storePassword "***" # password
            keyAlias "***" # alias
            keyPassword "***" # key password
        }

gradle 使用:

release {
            // 不显示Log
            buildConfigField "boolean","LogFlag","false"
            minifyEnabled true
            shrinkResources true
            zipAlignEnabled true
            pseudoLocalesEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.dbgKey # 指定使用debug key. 
        }

系统签名:

  • 其中.pem与pk8在系统源码目录: “build\target\product\security”
C:\Users\**\Desktop\SignApk>java -jar signapk.jar platform.x509.pem platform
.pk8 E:\app-release.apk apk_signed.apk