如何通过命令行对apk进行签名

26

请注意,我们已经通过命令行使用Android SDK创建了一个apk文件。现在,由于将其上传到Google Play商店需要对apk进行签名。我们该如何做呢?

4个回答

26
  1. 首先,您需要一个密钥库来开始这个过程。您将使用此密钥库对您的apk进行签名,并且您需要使用同一密钥库进行未来的更新签名。在此处了解有关密钥库的更多信息:https://developer.android.com/studio/publish/app-signing#generate-key

  2. 生成密钥库后,您应该使用jarsigner实用工具(可在JDK文件夹中找到)。

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your-release-key.keystore android-release-unsigned.apk alias -storepass password
  1. 下一步是使用zipalign工具(位于Android SDK文件夹中)验证apk。
path-to-android-sdk/build-tools/version/zipalign -v 4 android-release-unsigned.apk android-prod-released-signed.apk
  1. 最后一步是使用apksigner工具(Android SDK文件夹中可用)进行验证。
path-to-android-sdk/build-tools/version/apksigner verify android-prod-released-signed.apk

提示:将路径、文件名和密码替换为实际值


第二步的目的是什么? - Rumit Patel

23

步骤1

首先,您需要生成一个私钥签名密钥。

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

这个命令会提示您输入密钥库和密钥的密码(以及其他一些附加信息)。请记得随时保持您的密钥库文件私有

第二步

接下来,您需要设置gradle

  1. 将在第一步中生成的my-release-key.keystore放置在android/app目录下
  2. 更新位于android/app下的~/.gradle/gradle.properties并添加以下内容

    MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
    MYAPP_RELEASE_KEY_ALIAS=my-key-alias
    MYAPP_RELEASE_STORE_PASSWORD=<The password you choose earlier with the keytool>
    MYAPP_RELEASE_KEY_PASSWORD=<The password you choose earlier with the keytool>
    

    第三步

    最后,您需要更新android/app/build.gradle

    android {
        ...
        defaultConfig { ... }
        signingConfigs {
            release {
                if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                    storeFile file(MYAPP_RELEASE_STORE_FILE)
                    storePassword MYAPP_RELEASE_STORE_PASSWORD
                    keyAlias MYAPP_RELEASE_KEY_ALIAS
                    keyPassword MYAPP_RELEASE_KEY_PASSWORD
                }
            }
        }
        buildTypes {
            release {
                ...
                signingConfig signingConfigs.release
            }
        }
    }
    

    现在您可以通过在Android目录中运行以下命令来简单生成签名的发布版

    ./gradlew assembleRelease
    
    生成的apk文件会出现在build/outputs/apk/release目录下。

另外两个步骤肯定可以完成。但是第一步,当我在命令行界面运行该命令时,它会显示未识别的内部命令。我该怎么办? - Ahamed Husain
我假设你正在使用Windows操作系统,如果是这种情况,你需要从C:\Program Files\Java\jdkx.x.x_x\bin运行密钥工具。 - jomis
并非所有的Android APK都是在Android Studio中创建的,因此这仅适用于60%的开发团队。其他答案更好。我怀疑在没有自己托管的情况下,甚至无法在管道上实现这一点。 - Nick Turner

22

请按照以下步骤使apk能够在Play商店上使用:

步骤1:创建未签名的apk:

./gradlew assembleRelease

步骤二:创建已签名的APK文件:

jarsigner -keystore YOUR_KEYSTORE_PATH -storepass YOUR_KEYSTORE_PASSWORD app/build/outputs/apk/release/app-release-unsigned.apk YOUR_KEY_ALIAS

第三步:对apk进行Zipalign操作:

your_android-sdk_path/android-sdk/build-tools/your_build_tools_version/zipalign -v 4 app/build/outputs/apk/release/app-release-unsigned.apk release.apk

2
请注意:如果您使用apksigner,zipalign必须在APK文件签名之前执行。 - Rumit Patel

4

以防将来有用。

从安卓开发者doc中记住:

如果你想要通过命令行签署一个应用程序包,你可以使用jarsigner。如果你想要签署一个APK,你需要像下面描述的那样使用zipalign和apksigner。

所以对于一个apk:

  • apk未在'C:\Users\User\Downloads\unsigned.apk'中签名
  • zipalign.exe在'C:\android\android-sdk\build-tools\$version$\zipalign.exe'
  • apksigner.bat在'C:\android\android-sdk\build-tools\$version$\apksigner.bat'
  • 密钥库在'C:\Keystores\my.keystore'
  1. 对齐:$.\zipalign.exe -v -p 4 'C:\Users\User\Downloads\unsigned.apk' 'C:\Users\User\Downloads\aligned.apk'

    • 验证:$.\zipalign.exe -v -c 4 'C:\Users\User\Downloads\aligned.apk'
  2. 签名:$.\apksigner.bat sign --ks 'C:\Keystores\my.keystore' --out 'C:\Users\User\Downloads\signed.apk' 'C:\Users\User\Downloads\aligned.apk'

    • 输入密钥库密码
    • 验证:$.\apksigner.bat verify 'C:\Users\User\Downloads\signed.apk'

对于aab文件:

  • aab 未在 'C:\Users\User\Downloads\unsigned.aab' 中签名
  • jarsigner.exe 在 'C:\Program Files\Java\jdk-18.0.2\bin\jarsigner.exe' 中
  • keystore 在 'C:\Keystores\my.keystore' 中
  1. 签名:$jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore 'C:\Keystores\my.keystore' -signedjar 'C:\Users\User\Downloads\signed.aab' 'C:\Users\User\Downloads\unsigned.aab' '<我的密钥库别名>'
    • 输入密钥库密码

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接