我使用apktool解码了一个APK(因为原始源代码已丢失),以便可以修复与布局xml文件相关的一些问题。然后,我使用apktool重新构建了它,并尝试在我的设备上安装它(使用adb:adb install appname.apk),但遇到如下错误:
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
原始的apk被一个密钥库(在Eclipse IDE上)签名,而这个apk没有签名,请问如何使用其原始的密钥库文件在Eclipse之外正确地签名它?
我使用apktool解码了一个APK(因为原始源代码已丢失),以便可以修复与布局xml文件相关的一些问题。然后,我使用apktool重新构建了它,并尝试在我的设备上安装它(使用adb:adb install appname.apk),但遇到如下错误:
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
原始的apk被一个密钥库(在Eclipse IDE上)签名,而这个apk没有签名,请问如何使用其原始的密钥库文件在Eclipse之外正确地签名它?
使用以下方法创建密钥:
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
有什么区别?其中一个需要签名后再进行zipalign,另一个需要先进行zipalign,然后再签名。 - Maria Ines Parnisari使用此工具(使用谷歌的新apksigner):
https://github.com/patrickfav/uber-apk-signer
免责声明:我是开发者 :)
您需要生成一个密钥库,并使用它来签名您的未签名
apk。
使用JDK提供的keytool
在%JAVA_HOME%/bin/
中找到
keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app
zipalign
是Android SDK提供的工具,可以在例如%ANDROID_HOME%/sdk/build-tools/24.0.2/
中找到。如果您想要将apk上传到Play商店,这是一个必需的优化步骤。zipalign -p 4 my.apk my-aligned.apk
zipalign -c 4 my-aligned.apk
Android 7.0引入了APK签名方案v2,这是一种新的应用程序签名方案,提供更快的应用安装时间,并且对APK文件的未经授权的更改提供更多保护(请参阅此处和此处以获取更多详细信息)。因此,Google实现了他们自己的apk签名工具apksigner
(当然!)
脚本文件可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/
中找到(.jar文件位于/lib
子文件夹中)。使用方法如下:
apksigner sign --ks-key-alias alias_name --ks my.keystore my-app.apk
apksigner verify my-app.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
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
)。使用uber-apk-signer进行验证给了我一些进一步的见解signature VERIFY FAILED
[...] `ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA使用摘要算法2.16.840.1.101.3.4.2.1和签名算法1.2.840.113549.1.1.1,这在API级别[[15, 17]]上不受支持。是的,Android 4.2.2,SHA256不在那里?有什么想法吗? - antiplex最快的方式是使用调试密钥库进行签名:
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
对于那些不想为每个项目创建批处理文件,或者不想记住与keytools和jarsigner程序相关的所有命令,只想在一个过程中完成操作的人,请使用此程序:
http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx
我建立了这个程序,因为我厌倦了每次都要输入所有文件位置的冗长过程。更新的答案
查看 https://shatter-box.com/knowledgebase/android-apk-signing-tool-apk-signer/,这是一个签署您应用程序的不错工具。
旧版答案
查看apk-signer,它是一种很好的签署应用程序的方式。
jarsigner
的答案都已过时。最近的Android版本(AFAIR Android 10+)不接受由jarsigner签名的APK。您需要使用来自Android SDK的apksigner
。 - Robert