如何签署一个android apk文件

Posted

技术标签:

【中文标题】如何签署一个android apk文件【英文标题】:How to sign an android apk file 【发布时间】:2011-06-18 16:32:44 【问题描述】:

我正在尝试签署我的 apk 文件。我不知道该怎么做。我找不到好的深入方向。我的编程经验很少,因此将不胜感激。

【问题讨论】:

检查这个:How to sign android project apk 你可以在androidcookers.co.cc/2012/06/…找到一个很棒的教程 我使用了这个完整的教程,从创建自己的密钥库到在 Eclipse 中导出签名的 APK。 mahadera.com/export-signed-android-apk-in-eclipse-ide 【参考方案1】:

APK 签名流程

要手动签署 Android APK 文件,请运行以下三个命令:

    生成密钥库文件

    keytool -genkey -v -keystore YOUR_KEYSTORE_NAME.keystore -alias ALIAS_NAME -keyalg RSA -keysize 2048 -validity 10000
    

    使用jarsigner签署您的APK文件

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore KEYSTORE_FILE_PATH UNSIGNED_APK_PATH ALIAS_NAME
    

    使用 zipalign 工具对齐签名的 APK

    zipalign -v 4 JARSIGNED_APK_FILE_PATH ZIPALIGNED_SIGNED_APK_FILE_PATH
    

第 1 步


Generate Keystore file

keytool -genkey -v -keystore YOUR_KEYSTORE_NAME.keystore -alias ALIAS_NAME -keyalg RSA -keysize 2048 -validity 10000

示例:

keytool -genkey -v -keystore id.keystore -alias MySignedApp -keyalg RSA -keysize 2048 -validity 10000

密钥库密码:yourApp@123 密钥密码:yourApp@123

CMD O/P

D:\ru\SignedBuilds\MySignedApp>keytool -genkey -v -keystore id.keystore
 -alias MySignedApp -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  MySignedApp Sample
What is the name of your organizational unit?
  [Unknown]:  Information Technology
What is the name of your organization?
  [Unknown]:  MySignedApp Demo
What is the name of your City or Locality?
  [Unknown]:  Mumbai
What is the name of your State or Province?
  [Unknown]:  Maharashtra
What is the two-letter country code for this unit?
  [Unknown]:  IN
Is CN=MySignedApp Demo, OU=Information Technology, O=MySignedApp Demo, L=Mumbai, ST=Maharashtra, C=IN corr
ect?
  [no]:  y

Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,
000 days
        for: CN=MySignedApp Demo, OU=Information Technology, O=MySignedApp Demo, L=Mumbai, ST=Maharashtra,
 C=IN
Enter key password for <MySignedApp>
        (RETURN if same as keystore password):
Re-enter new password:
[Storing id.keystore]

D:\ru\SignedBuilds\MySignedApp>

第 2 步


Sign your app with your private keystore using jarsigner

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore KEYSTORE_FILE_PATH UNSIGNED_APK_PATH ALIAS_NAME

示例

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore D:\ru\SignedBuilds\MySignedApp\id.keystore D:\ru\SignedBuilds\MySignedApp\MySignedAppS1-release-unsigned.apk id

CMD O/P

D:\ru\SignedBuilds\MySignedApp>jarsigner -verbose -sigalg SHA1withRSA -
digestalg SHA1 -keystore D:\ru\SignedBuilds\MySignedApp\id.keystore D:\ru\SignedBuilds\MySignedApp\MySignedAppS1-release-unsigned.apk id ---
ect
Enter Passphrase for keystore:
   adding: META-INF/MANIFEST.MF
   adding: META-INF/---.SF
   adding: META-INF/---.RSA
  signing: AndroidManifest.xml
  ..... 
    signing: classes.dex
  signing: lib/commons-codec-1.6.jar
  signing: lib/armeabi/libkonyjsvm.so
jar signed.

Warning:
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not
be able to validate this jar after the signer certificate's expiration date (2044-02-07) or after an
y future revocation date.

D:\ru\SignedBuilds\MySignedApp>

Verify that your APK is signed

jarsigner -verify -verbose -certs JARSIGNED_APK_FILE_PATH

示例

jarsigner -verify -verbose -certs MySignedAppS1-release-unsigned.apk

CMD O/P

D:\ru\SignedBuilds\MySignedApp>jarsigner -verify -verbose -certs MySignedAppS1-release-unsigned.apk
 s = signature was verified
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning:
This jar contains entries whose certificate chain is not validated.
This jar contains signatures that does not include a timestamp. Without a timestamp, users may not b
e able to validate this jar after the signer certificate's expiration date (2044-02-09) or after any
 future revocation date.

D:\ru\SignedBuilds\MySignedApp>

第 3 步


使用 zipalign 对齐最终的 APK 包

zipalign -v 4 JARSIGNED_APK_FILE_PATH ZIPALIGNED_SIGNED_APK_FILE_PATH_WITH_NAME_ofSignedAPK

示例

zipalign -v 4 D:\ru\SignedBuilds\MySignedApp\MySignedAppS1-release-unsigned.apk D:\ru\SignedBuilds\MySignedApp\MySignedApp.apk

CMD O/P

D:\Android\android-sdk\build-tools\19.1.0>zipalign -v 4 D:\ru\ru_doc\Signed_apk\MySignedApp\28.09.16
_prod_playstore\MySignedAppS1-release-unsigned.apk D:\ru\ru_doc\Signed_apk\MySignedApp\28.09.16_prod
_playstore\MySignedApp.apk
Verifying alignment of D:\ru\SignedBuilds\MySignedApp\MySignedApp.apk (
4)...

  4528613 classes.dex (OK - compressed)
 5656594 lib/commons-codec-1.6.jar (OK - compressed)
 5841869 lib/armeabi/libkonyjsvm.so (OK - compressed)
Verification succesful

D:\Android\android-sdk\build-tools\19.1.0>

Verify that your APK is Aligned successfully

zipalign -c -v 4 YOUR_APK_PATH

示例

zipalign -c -v 4 D:\ru\SignedBuilds\MySignedApp\MySignedApp.apk

CMD O/P

D:\Android\android-sdk\build-tools\19.1.0>zipalign -c -v 4 D:\ru\SignedBuilds\MySignedApp\MySignedApp.apk
Verifying alignment of D:\ru\SignedBuilds\MySignedApp\MySignedApp.apk (
4)...

 4453984 res/drawable/zoomout.png (OK)
 4454772 res/layout/tabview.xml (OK - compressed)
 4455243 res/layout/wheel_item.xml (OK - compressed)
 4455608 resources.arsc (OK)
 4470161 classes.dex (OK - compressed)
 5597923 lib/commons-codec-1.6.jar (OK - compressed)
 5783198 lib/armeabi/libkonyjsvm.so (OK - compressed)
Verification succesful

D:\Android\android-sdk\build-tools\19.1.0>

注意:

verify 命令只是为了检查 APK 是否构建和签名正确!

参考文献

signing-manually androidapk-code-signing-process

我希望这对所有人都有帮助:)

【讨论】:

【参考方案2】:

这里是关于如何手动签署 APK 的指南。它包含有关build-tools 24.0.3 中引入的新apk-signer 的信息(10/2016)

自动化流程:

使用此工具(使用 Google 的新 apksigner):

https://github.com/patrickfav/uber-apk-signer

免责声明:我是开发者:)

手动流程:

第 1 步:生成密钥库(仅一次)

您需要生成一次密钥库并使用它来签署您的unsigned apk。 使用%JAVA_HOME%/bin/中的keytoolprovided by the JDK

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

第 2 步或第 4 步:压缩对齐

zipalign which is a tool provided by the Android SDK 在例如如果您想将 apk 上传到 Play 商店,%ANDROID_HOME%/sdk/build-tools/24.0.2/ 是一个强制优化步骤。

zipalign -p 4 my.apk my-aligned.apk

注意:当使用旧的jarsigner 时,您需要在AFTER 签名后压缩对齐。使用新的apksigner 方法时,您会在之前 签名(我知道这很混乱)。 Invoking zipalign before apksigner works fine 因为 apksigner 保留 APK 对齐和压缩(与 jarsigner 不同)。

您可以验证对齐方式

zipalign -c 4 my-aligned.apk

第 3 步:签名和验证

使用 24.0.2 及更早版本的构建工具

使用jarsigner,就像在%JAVA_HOME%/bin/ 中找到的keytool comes with the JDK distribution 并像这样使用它:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

并且可以通过验证

jarsigner -verify -verbose my_application.apk

使用构建工具 24.0.3 和更新版本

Android 7.0 引入了 APK 签名方案 v2,这是一种新的应用程序签名方案,可提供更快的应用程序安装时间和更多保护,防止未经授权的 APK 文件更改(有关详细信息,请参阅here 和 here)。此后谷歌实现了他们的own apk signer called apksigner (duh!) 可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/ 中找到脚本文件(.jar 位于/lib 子文件夹中)。像这样使用它

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

并且可以通过验证

apksigner verify my-app.apk

The official documentation can be found here.

【讨论】:

【参考方案3】:

手册很清楚。请说明您在完成后遇到的困难部分,我建议:

https://developer.android.com/studio/publish/app-signing.html

好的,一个没有参考或eclipse的小概述,所以为错误留出一些空间,但它是这样工作的

在 Eclipse 中打开您的项目 按鼠标右键->工具(android工具?)->导出签名的应用程序(apk?) 完成向导: 创建一个新的密钥库。记住密码 为您的应用签名 保存等

另外,来自链接:

使用 Eclipse ADT 编译和签名

如果您使用带有 ADT 的 Eclipse 插件,您可以使用导出向导 导出已签名的 .apk(甚至 如有必要,创建一个新的密钥库)。 导出向导执行所有 与 Keytool 的交互和 Jarsigner for you,它允许你 改为使用 GUI 对包进行签名 执行手动程序以 如讨论的那样编译、签名和对齐 更多。向导编译完成后 并签署您的包裹,它也会 执行包对齐 拉链对齐。因为导出向导 同时使用 Keytool 和 Jarsigner,你 应确保它们是可访问的 在您的计算机上,如上所述 在签名的基本设置中。

创建一个签名并对齐的 .apk 在 日食:

    在 Package Explorer 中选择项目并选择 File > 导出。

    打开Android文件夹,选择Export Android Application,然后点击 接下来。

    导出 Android 应用程序向导现在启动,它将引导 你通过签署的过程 您的申请,包括以下步骤 选择私钥 签署.apk(或创建一个新的 密钥库和私钥)。

    完成导出向导,您的应用程序将被编译, 签名、对齐并准备就绪 分布。

【讨论】:

我不明白如何开始。我正在使用 eclipse 版本:Helios Service Release 1 但请阅读全文。最后也有一些关于eclipse的提示 在创建密钥时我需要为别名输入什么? 您阅读手册了吗? -alias &lt;alias_name&gt; An alias for the key. Only the first 8 characters of the alias are used. 这只是一个别名。一个名字,如果你愿意的话。我建议“firstkey”:-) 对不起,我还是不明白。我将如何使用这个别名。它的目的是什么?【参考方案4】:

别担心...!按照以下步骤操作,您将获得签名的 .apk 文件。我也很担心,但这些步骤让我摆脱了挫败感。 签署申请的步骤:

    导出未签名的包:

在 Eclipse 中右键单击项目 -> Android 工具 -> 导出未签名的应用程序包(就像这里我们将 GoogleDriveApp.apk 导出到桌面)

使用您的密钥库和 jarsigner 工具对应用程序进行签名(按照以下步骤操作):

打开 cmd-->更改您的“jarsigner.exe”所在的目录(就像在我的系统中它存在于“C:\Program Files\Java\jdk1.6.0_17\bin”中)

现在在cmd中输入belwo命令:

jarsigner -verbose -keystore c:\users\android\debug.keystore c:\users\pir fahim\Desktops\GoogleDriveApp.apk my_keystore_alias

它会要求您提供密码: 输入密钥库的密码: 它将签署您的 apk。要验证签名是否成功,您可以运行:

jarsigner -verify c:\users\pir fahim\Desktops\GoogleDriveApp.apk

它应该返回: jar 已验证。

方法二

如果您将 eclipse 与 ADT 一起使用,那么编译、签名、对齐和准备分发文件都很简单。您只需按照以下步骤操作即可。

文件 > 导出。 导出安卓应用 浏览-->选择你的项目 下一个-->下一个

这些步骤将对您的项目进行编译、签名和压缩对齐,现在您可以分发您的项目或上传到 Google Play 商店。

【讨论】:

这正是我所需要的,正在使用新的在线构建工具,并且必须使用我以前的密钥库,而不是他们新生成的密钥库。我唯一缺少的是 ZIP ALIGNing apk,所以如果有人有同样的问题,请到这里***.com/a/22682132/826194【参考方案5】:

对于 IntelliJ IDEA 或 Android Studio 的用户,请执行以下步骤: * 来自菜单Build/Generate signed APK * 您需要创建一个密钥库路径。在对话框中单击Create new。您将创建一个包含您的密钥的 jks 文件。选择文件夹,定义密码。所以你的密钥库没问题。 * 使用别名、密钥密码、您的姓名等为您的应用程序创建新密钥。 * 点击下一步。 * 从对话框中选择Proguard 或不选择。

您已签名的 APK 文件已准备就绪。

帮助文件:https://www.jetbrains.com/idea/webhelp/generate-signed-apk-wizard.html

【讨论】:

【参考方案6】:

我遇到了这个问题,并通过检查清单中的 min sdk 版本来解决。 它设置为 15(ICS),但我的手机运行的是 10(姜饼)

【讨论】:

以上是关于如何签署一个android apk文件的主要内容,如果未能解决你的问题,请参考以下文章

您必须使用与您要验证的应用程序相同的签名签署一个 apk - blockchainds.com:如何通过 Android Studio 签署 apk 文件?

如何签署我已经制作的 android app/.apk 文件

如何在没有 android studio 的情况下签署 android apk

对签署 android APK 感到困惑?

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.6——签署发布apk

即使使用未翻译的字符串,如何在 Android Studio 上签署 APK?