APK的签名
1.0、参考
1.1、为什么签名
  • 发送者的身份认证
    由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换。
  • 保证信息传输的完整性
    签名对于包中的每个文件进行处理,以此确保包中内容不被替换。
  • 防止交易中的抵赖发生
    Market对软件的要求。
1.2、如何对一个APK文件进行签名

对一个APK文件进行签名,有3种方式:

  • Android Gradle Plugin
  • keytool + jarsigner
  • openssl + SignApk
方式一:使用Android Gradle Plugin对APK文件进行签名

这种方式适用于对自己开发的APK进行签名。

Gradle Kotlin DSL:

plugins {
    id("com.android.application")
}

android {
    signingConfigs {
        create("release") {
            storeFile     = file("../keystore.jks")
            storePassword = "android"
            keyAlias      = "androiddebugkey"
            keyPassword   = "android"
        }
    }

    buildTypes {
        getByName("debug") {
            signingConfig     = signingConfigs.findByName("release")
            isMinifyEnabled   = false
            isShrinkResources = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-common.txt")
        }
        getByName("release") {
            signingConfig     = signingConfigs.findByName("release")
            isMinifyEnabled   = true
            isShrinkResources = true
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-common.txt", "proguard-nolog.txt")
        }
    }
}
方式二:使用keytool + jarsigner对APK文件进行签名

这种方式适用于由于某种原因导致APK文件的签名失效,重新签名。

step1、安装JDK

step2、使用keytool命令创建密钥库文件keystore):

keytool -genkey -keystore keystore.jks -alias myalias -keyalg RSA -validity 20000 -dname "CN=liufupin,OU=com.fpliu,O=cpm.fpliu,L=Hangzhou,ST=Zhejiang,C=CN"

-dname参数解释:

CNCommon Name名字与姓氏
OUOrganization Unit组织、单位名称
OOrganization组织名称
LLocality城市或区域名称
STState美国的州,中国的省份名称
CCountry国家名称

-validity 20000表示有效期是20000天,大约是54年。

运行效果如下:

这样在当前目录下生成了keystore.jks文件。

step3、使用jarsigner命令对.apk文件进行签名

jarsigner -verbose -keystore keystore.jks -storepass android -digestalg SHA1 -sigalg MD5withRSA -sigfile CERT -signedjar xx_signed.apk xx.apk myalias
方式三:使用openssl + SignApk对APK文件进行签名

SignApk.jar是一个已包含在Android平台源码包中的工具。如果要使用SignApk.jar,你需要创建一个带有对应证书/公钥的私钥。 而你可以使用Openssl来创建私钥/公钥对。在Unix/Linux系统中使用Openssl相对来说比较容易。

1.2.2.1、生成私钥

要产生RSA私钥(private key),需要一个openssl的工具,该工具在命令提示符下使用。先介绍openssl的用法:

1.2.2.1.1、生成privatekey.pem
1.2.2.1.2、生成privatekey.x509.pem
1.2.2.2、生成公钥
1.2.2.3、生成签名