签名

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预装应用可以不签名吗 安卓安装未签名应用_Android预装应用可以不签名吗

签名的不同工具

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的可视化签名工具也可以。

Android预装应用可以不签名吗 安卓安装未签名应用_android_02

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