Android通过命令行签名APK

时间:2021-04-25 15:25:35

一、前几天安装一个客户APP时,提示 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误,无法安装应用。经过查询资料才发现,这个APK文件是没有签名的。

1、如果安装APP时遇到这个问题,可以通过命令去判断APK一否已签名。进入Windows控制台,切换路径到JDK的bin目录下。


2、检验APK文件是否已签名:jarsigner.exe -verify app-release.apk(apk路径)

如果文件没有签名,我们可以通过命令生成一个签名文件

keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore test.keystore 
执行上述命令后,需要输入一连串信息,如实输入即可。

3、生成签名文件后,用该签名文件对APK进行签名。
jarsigner.exe -verbose -keystore test.keystore -signedjar app-release_mysigned.apk app-release.apk test.keystore

签名后可以再次验证APK是否已签名,或安装到设备上测试。


二、曾经还遇到过一种无法安装APP的情况,安装APP时,提示 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE 错误

。出现这个错误的原因是该应用为了具备系统权限,设置了 android:sharedUserId="android.uid.system" 。

1、这样的好处是应用不容易被系统杀掉,但是其签名文件必须与系统签名文件一致,需要这三个文件(signapk.jar platform.x509.pem platform.pk8)。再执行如下代码,对APP进行签名。


2、java -jar signapk.jar platform.x509.pem platform.pk8 apk路径(签名前) apk路径(签名后)


三、使用android studio生成的.jks 文件签名时,也遇到过提示 (命令行jarsigner签字和解决找不到证书链错误 )的错误信息。执行签名的指令如下:

1、jarsigner -digestalg SHA1 -sigalg SHA1withRSA(或SHA1withDSA) -verbose -keystore xxx.jks -signedjar xxx.apk(签名后的apk名字) xxx.apk(需要签名的apk) xxx(keystore别名)


2、特别需要注意的是最后一个参数是keystore别名,也就是签名文件的别名,如果像.keystore一样,直接使用文件名,就会提示无法找到证书链错误。别名是使用AS创建签名文件时,设置Alias的参数就是别名。