签名
app为什么要签名?
debug包需要签名吗?
debug包的签名与release包的签名的区别?
android 的debug包需要签名吗?
所有的Android应用程序都要求开发人员用一个证书对app进行数字签名,anroid系统不会安装没有进行签名的app。
签名即用一个私钥以及证书生成一个签名。
未签名的apk是无法再android系统上安装的,安装时会报错,比如:
adb install app-release-unsigned-0.0.2.apk
Performing Streamed Install
adb: failed to install app-release-unsigned-0.0.2.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed collecting certificates for /data/app/vmdl138098000.tmp/base.apk: Package /data/app/vmdl138098000.tmp/base.apk has no certificates at entry AndroidManifest.xml]
提示没有证书。
相同包名的不同签名的app也是会安装失败的:
签名的不同工具
Android 应用的签名工具有两种:jarsigner 和 apksigner。它们的签名算法没什么区别,主要是签名使用的文件不同。它们的区别如下:
jarsigner:jdk 自带的签名工具,可以对 jar 进行签名。使用 keystore 文件进行签名。生成的签名文件默认使用 keystore 的别名命名。
apksigner:Android sdk 提供的专门用于 Android 应用的签名工具。使用 pk8、x509.pem 文件进行签名。其中 pk8 是私钥文件,x509.pem 是含有公钥的文件。生成的签名文件统一使用“CERT”命名。
既然这两个工具都是给 APK 签名的,那么 keystore 文件和 pk8,x509.pem 他们之间是不是有什么联系呢?答案是肯定的,他们之间是可以转化的,这里就不再分析它们是如何进行转化,网上的例子很多。
还有一个需要注意的知识点,如果我们查看一个keystore 文件的内容,会发现里面包含有一个 MD5 和 SHA1 摘要,这个就是 keystore 文件中私钥的数据摘要,这个信息也是我们在申请很多开发平台账号时需要填入的信息。
先生成未签名的apk,然后再执行签名的任务
未签名时,打包生成的apk的名称是带有"-unsigned"的,比如:
Coming-play-x86-release-unsigned-0.0.2.apk
签名任务会在签名完成后去掉名称里的"-unsigned"文字。
当然不用gradle的task自动签名的话,使用android studio的可视化签名工具也可以。
signingConfigs {
debug {
keyAlias keystoreAlias
keyPassword keystoreAliasPSW
storeFile keyfile
storePassword keystorePSW
}
release {
keyAlias keystoreAlias
keyPassword keystoreAliasPSW
storeFile keyfile
storePassword keystorePSW
}
}
buildTypes {
debug {
...
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
zipAlignEnabled true
signingConfig signingConfigs.release
}
}
finalizedBy
我们如果希望任务执行结束的时候自动执行某个任务,比如我们在打包结束后自动上报包体积到后台,如果用dependsOn,那么我们就需要类似打包任务.dependsOn taskUpload,后续打包就需要通过taskUpload来执行,这样就很别扭,所以这里就有来finalizedBy,用于任务执行结束后自动执行其他任务。
task taskC {
doLast{
println '我是taskC'
}
}
task taskD {
doLast{
println '我是taskD'
}
}
taskC.finalizedBy taskD
执行taskC,会得到结果:
Task :taskC
我是taskC
Task :taskD
我是taskD