在Release 正式版的Apk之前都需要我们对Apk进行签名,APK签名中包含了我们开发者的有效信息。一些应用市场就可以根据这些信息来判断当前的Apkd是否是个安全的Apk。在我们开发中如果没有做任何设置默认是签Debug名字,签名文件位于:$HOME/.android/debug.keystore
下面将对关于签名的一些总结与大家进行分享:

产生密钥:

keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore

#说明:
# -genkey 产生密钥
# -alias mykey 别名 mykey
# -keyalg RSA 使用RSA算法对签名加密
# -validity 40000 有效期限4000天
# -keystore demo.keystore

查看keystore的信息

keytool -list -keystore demo.keystore -alias mykey -v

查看keystore的公钥证书信息

keytool -list -keystore demo.keystore -alias mykey -rfc

查看apk的签名信息

jarsigner -verify -verbose -certs <your_apk_path.apk>

较为安全的签名方式:

下面是我自己目前使用的签名方式:
keystore文件和key密码等配置文件都存在于电脑中的非项目文件夹中,提交到github上面的只有keystore配置文件的路径。

def keystorePropertiesFile = file(keyStorePath);
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
signingConfigs {
staging.initWith(signingConfigs.debug)
release {
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']

}
}

在上面keyStorePath所指定的配置文件中存储的如下的变量:

storePassword=xxxx   
keyPassword=xxxx
keyAlias=xxxx
storeFile=xxxxxxxxxx

验证两个Apk是否签名相同

jar tf app-release-unaligned.apk|grep RSA
jar xf app-release-unaligned.apk META-INF/CERT.RSA
keytool -printcert -file META-INF/CERT.RSA
两个apk是否同签名,比较签名的MD5码或SHA1码 ,一样就是相同的,反之,不是

发布版本前的优化配置

buildTypes {
release {
//不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//开启混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//Zipalign优化
zipAlignEnabled true
//移除无用的resource文件
shrinkResources true
//签名
signingConfig signingConfigs.release
}
}

例子

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.idealist.testleakcandy"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
lintOptions {
abortOnError false
}
def keystorePropertiesFile = file('/home/jimmy/Dev/keystore.properties');
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
signingConfigs {
staging.initWith(signingConfigs.debug)
release {
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
}
}
buildTypes {
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
Contents
  1. 1. 产生密钥:
  2. 2. 查看keystore的信息
  3. 3. 查看keystore的公钥证书信息
  4. 4. 查看apk的签名信息
  5. 5. 较为安全的签名方式:
  6. 6. 验证两个Apk是否签名相同
  7. 7. 发布版本前的优化配置
  8. 8. 例子