gradlew构建工具和apk签名打包

Gradlew

介绍

使用命令行构建应用就可以使用gradlew命令来实现。可作为 Windows 的批处理文件 (gradlew.bat) 和 Linux 与 Mac 的 shell 脚本 (gradlew.sh) 使用,可以从使用 Android Studio 创建的每个项目的根目录启动该工具。

如需使用封装容器运行任务,请在终端窗口中(在 Android Studio 中,依次选择 View > Tool Windows > Terminal)使用下列命令之一:

gradlew task-name(任务名称)

如需查看项目的所有可用构建任务列表,执行tasks:

gradlew tasks

构建调试版 APK

如需立即测试和调试应用,可以构建调试版 APK。调试版 APK 使用 SDK 工具提供的调试密钥进行签名,并允许通过 adb 进行调试。

如需构建调试版 APK,请打开命令行,然后转到项目的根目录。如需启动调试 build,请调用 assembleDebug 任务:

gradlew assembleDebug

将在 project_name/module_name/build/outputs/apk/ 中创建一个名为 module_name-debug.apk 的 APK。该文件已使用调试密钥进行签名并使用 zipalign对齐,因此您可以立即将其安装到设备上。

或者,如需构建 APK 并立即在运行的模拟器或连接的设备上安装,请改为调用 installDebug

gradlew installDebug

上述任务名称中的“Debug”部分只是构建变体名称的驼峰式大小写版本,因此可以替换为您想组装或安装的任何构建类型或变体。例如,如果您有“demo”这个产品变种,则可以使用 assembleDemoDebug 任务来构建调试版本。

如需查看每个变体可用的所有构建和安装任务(包括卸载任务),请运行 tasks 任务。

构建发布版 APK

可以调用assembleRelease任务:

gradlew assembleRelease
gradlew installRelease
从命令行为应用签名
生成私钥

不使用 Android Studio 也可以为应用签名。可以从命令行为应用签名(对于 APK,使用 apksigner;对于 App Bundle,使用 jarsigner),或在构建期间配置 Gradle 来为您的应用签名。无论使用哪种方式,都需要先使用 keytool 生成一个私钥,如下所示:

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

命令参数详解:

  • -genkey 生成秘钥对
  • -v 输出详细信息
  • -keystore 秘钥库名称 ,具体的位置
  • -keyalg 秘钥算法名称(RSA)
  • -keysize 秘钥位的大小
  • -validity 有效天数(单位:天)
  • -alias 秘钥库的别名
  • -storepass 秘钥库的口令 如果没有通过此参数指定,后面会通过交互方式输入
为应用签名

如果要从命令行为 App Bundle 签名,您可以使用 jarsigner。如果要为 APK 签名,则需要使用 zipalignapksigner(如下所述)。

使用以上命令生成的apk是未签名的,可以通过jarsigner命令进行签名:

jarsigner.exe -verbose -keystore C:\Users\Administrator\Desktop\myfile\key\sdk.jks -storepass 123456 -keypass 123456 -signedjar D:\AndroidStudioProjects\FYSDK3.1\sdktest\build\outputs\apk\release\sdktest-release-signed.apk D:\AndroidStudioProjects\FYSDK3.1\sdktest\build\outputs\apk\release\sdktest-release-unsigned.apk sdk(alis)

options参数说明:

  • [ -verbose[:suboptions ]] 签名/验证时输出详细信息。子选项可以是 all, grouped 或 summary
  • [ -keystore ] 签名使用的秘钥库位置
  • [ -storepass <口令> ] 用于秘钥库完整型的口令,也就是秘钥库的密码
  • [ -keypass <口令> ] 证书口令密码 大多与秘钥库口令一样
  • [ -signedjar <文件> ] 生成签名文件的位置
  • sdk(alis) 证书别名

使用apksignerzipalign 为apk签名,步骤如下:

  • 打开命令行(在 Android Studio 中,依次选择 View > Tool Windows > Terminal),然后转到未签名的 APK 所在的目录。(apksignerzipalign都在android_sdk/build-tools/version/目录下)

  • 使用 zipalign 对齐未签名的 APK:

    zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
    

    zipalign 可以确保所有未压缩数据的开头均相对于文件开头执行特定的字节对齐,从而减少应用占用的 RAM 量。

  • 通过 apksigner使用您的私钥为 APK 签名:

    apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
    
    apksigner sign --ks my-release-key.jks --ks-key-alias test --ks-pass pass:123456  --out my-app-release.apk my-app-unsigned-aligned.apk
    
  • 验证您的 APK 是否已签名:

    apksigner verify --verbose my-app-release.apk
    
扩展zipalign

zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,即可使用 mmap() 直接访问所有部分,即使其中包含具有对齐限制的二进制数据也没关系。这样做的好处是可以减少运行应用时消耗的 RAM 容量(内存容量)。

在将 APK 文件分发给最终用户之前,必须先使用此工具对齐文件。

注意:必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于您所使用的应用签名工具:

如果您使用的是 apksigner,只能在为 APK 文件签名之前执行 zipalign。如果您在使用 apksigner 为 APK 签名之后对 APK 做出了进一步更改,签名便会失效。
如果您使用的是 jarsigner,只能在为 APK 文件签名之后执行 zipalign。
  • 使用apksigner 顺序是:zipalign —> apksigner
  • 使用jarsigner 顺序是:jarsigner —> zipalign

用法

要对齐 infile.apk 并将其保存为 outfile.apk,请运行以下命令:

zipalign [-f] [-v] <alignment> infile.apk outfile.apk

命令参数详解:

  • 以字节为单位进行对齐,例如:'4’提供32位对齐 是一个整数,用于定义字节对齐边界。此值必须始终为 4(可提供 32 位对齐),否则实际将不会执行任何操作。
  • -c 确认给定文件的对齐方式 不修改文件
  • -f 覆盖现有的输出文件 outfile.zip(outfile.apk)
  • -p outfile.zip 应对 infile.zip 中的所有共享对象文件使用相同的页面对齐方式
  • -v 详细输出
  • -z 用Zopfli重新进行压缩
扩展apksigner

可以使用 Android SDK 构建工具的修订版 24.0.3 及更高版本中提供的 apksigner 工具为 APK 签名,并确保 APK 的签名能够在 APK 支持的所有版本的 Android 平台上成功通过验证

注意:如果您在使用 apksigner 为 APK 签名后又对 APK 做了更改,则 APK 的签名将会失效。因此,必须在为 APK 签名之前使用zipalign 等工具进行对齐操作。

用法

使用 apksigner 工具为 APK 签名的语法如下:

apksigner sign --ks keystore.jks |--key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk

在使用 apksigner 工具为 APK 签名时,必须提供签名者的私钥和证书。可以通过两种不同的方式添加此信息:

  • 使用 --ks 选项指定密钥库文件。

  • 使用 --key--cert 选项分别指定私钥文件和证书文件。私钥文件必须使用 PKCS #8 格式,证书文件必须使用 X.509 格式。

    --ks --ks keystore.jks--key key.pk8 --cert cert.x509.pem是两者选其一

通常情况下,您只会使用一个签名者为 APK 签名。如果您需要使用多个签名者为 APK 签名,请使用 --next-signer 选项将要应用于每个签名者的常规选项集分隔开

apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk

验证apk签名

apksigner verify -v signed.apk

参数详细说明:

  • sign 对提供的apk进行签名 必须参数

  • verify 对签名后文件进行验证 确认在 APK 支持的所有 Android 平台上是否有效

  • –ks 指定密钥库文件

  • –in 输入待签名的文件 如果--out没有指定,这个文件将是最终签名的文件,一般不指定

  • –out 签名后文件存放位置,默认情况下,用签名文件进行替换 也就是可以不指定该选项 如果未明确提供此选项,则 APK 软件包将就地签名,并替换输入的 APK 文件。

  • -v --verbose 详细输出

  • –v1-signing-enabled <true | false> 确定 apksigner 是否会使用基于 JAR 的传统签名方案为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。是否采用v1方式签名

  • –v2-signing-enabled <true | false> 确定 apksigner 是否会使用 APK 签名方案 v2为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。是否采用v2方式签名

  • –v3-signing-enabled <true | false> 确定 apksigner 是否会使用 APK 签名方案 v3 为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。v3签名从Android9开始支持。

  • –next-signer 用于为每个签名者指定不同的常规选项。就是可以使用多个签名文件对apk进行签名

  • –ks-key-alias 表示签名者在密钥库中的私钥和证书数据的别名的名称。如果与签名者关联的密钥库包含多个密钥,则必须指定此选项。

  • –key-pass 签名者私钥的密码。如果私钥受密码保护,则需要该密码。apksigner 工具支持以下格式:

    • pass:<password>- 密码与 apksigner sign 命令的其余部分一起提供(内嵌在其中)。
    • env:<name> - 密码存储在给定的环境变量中。
  • file:<filename> - 密码存储在给定文件中的某一行。

    • stdin - 密码作为标准输入流中的某一行提供。这是 --key-pass 的默认行为。
    **注意**:如果一个文件中包含多个密码,请分别在不同的行中指定这些密码。`apksigner` 工具会根据您指定 APK 签名者的顺序将密码与签名者相关联。如果您为签名者提供了两个密码,`apksigner` 会将第一个密码视为密钥库密码,将第二个密码视为密钥密码。
    
实例

使用 release.jks(密钥库中唯一的密钥)为 APK 签名:

apksigner sign --ks release.jks input.apk 

使用私钥和证书(存储为不同的文件)为 APK 签名:

apksigner sign --key release.pk8 --cert release.x509.pem app.apk

使用两个密钥为 APK 签名:

apksigner sign --ks release.jks --next-signer --ks next.jks app.apk

检查 APK 的签名是否可在 APK 支持的所有 Android 平台上被确认为有效:

apksigner verify -v app.apk 

检查 APK 的签名是否可在 Android 4.0.3(API 级别 15)及更高版本上被确认为有效:

apksigner verify --min-sdk-version 15 app.apk

参考文档:

Google官方文档之gradlew

Google官方文档之zipalign

Google官方文档之apksigner

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值