在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 { buildConfigField "boolean", "LOG_DEBUG", "false" minifyEnabled true zipAlignEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } }
|