我已经使用apktool解码了APK(因为原始源代码丢失了),所以我可以解决布局xml文件的一些问题。然后,我用apktool重建了它,当我尝试在设备上安装它(使用adb:adb install appname.apk)时,出现了以下错误:
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
但是原始apk是由密钥库(在eclipse IDE上)签名的,但不是,我该如何在Eclipse之外使用原始密钥石文件正确签名呢?
我已经使用apktool解码了APK(因为原始源代码丢失了),所以我可以解决布局xml文件的一些问题。然后,我用apktool重建了它,当我尝试在设备上安装它(使用adb:adb install appname.apk)时,出现了以下错误:
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
但是原始apk是由密钥库(在eclipse IDE上)签名的,但不是,我该如何在Eclipse之外使用原始密钥石文件正确签名呢?
Answers:
使用创建密钥
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
然后使用以下命令对apk进行签名:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
jarsigner
和apksigner
?一个需要签名然后再进行zipaligning,而另一个需要进行zipaligning然后再进行签名
使用此工具(使用来自Google的新apksigner):
https://github.com/patrickfav/uber-apk-signer
免责声明:我是开发商:)
您需要一次生成一个密钥库,并用它来签名您的unsigned
apk。使用JDK提供的在keytool
%JAVA_HOME%/bin/
keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app
zipalign
%ANDROID_HOME%/sdk/build-tools/24.0.2/
如果您要将apk上传到Play商店,则该工具是Android SDK提供的工具,例如,该工具是强制性的优化步骤。
zipalign -p 4 my.apk my-aligned.apk
注意:使用旧版本时jarsigner
,需要在签名后使用zipalign 。使用新apksigner
方法时,您需要在签名之前进行操作(我知道这很混乱)。在apksigner正常工作之前调用zipalign因为apksigner保留APK对齐和压缩(与jarsigner不同)。
您可以验证与定位
zipalign -c 4 my-aligned.apk
使用jarsigner
与keytool一样的工具,该工具随附于JDK发行版, %JAVA_HOME%/bin/
并按以下方式使用它:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name
并可以通过
jarsigner -verify -verbose my_application.apk
Android 7.0引入了APK签名方案v2,这是一种新的应用程序签名方案,可提供更快的应用程序安装时间,并提供更多保护,防止未经授权对APK文件进行更改(请参见此处和此处了解更多详细信息)。因此,Google实现了自己的apk签名者,称为apksigner
(duh!)。可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/
(/lib
子文件夹中的.jar)中找到脚本文件。这样使用
apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name
并可以通过
apksigner verify my-app.apk
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
)。与尤伯杯APK-签名验证给了我一些进一步的深入了解signature VERIFY FAILED
[...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]
。是的,android 4.2.2,SHA256不存在吗?想法?
最快的方法是使用调试密钥库签名:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android
或在Windows上:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
您使用jarsigner对APK进行签名。您不必使用原始密钥库进行签名,只需生成一个新的密钥库即可。阅读详细信息:http : //developer.android.com/guide/publishing/app-signing.html
对于那些不想为每个项目创建bat文件进行编辑,或者不想记住与keytools和jarsigner程序相关联的所有命令,而只想在一个过程中完成的人,请使用此程序:
http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx
之所以创建它,是因为我厌倦了每次都要键入所有文件位置的漫长过程。
该程序可以保存您的配置,因此,下次启动它时,只需单击Generate(生成)即可为您处理。而已。
无需安装,它是完全可移植的,并将其配置保存在CSV的同一文件夹中。