Android APK手动签名

v1与v2区别

  • Android7.0开始,google添加新签名方案v2 Scheme(APK Signatur), 而Android7.0以下,则使用旧方案v1 Scheme(JAR Signing)

  • v1签名: jarsigner, 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件), V1签名是对压缩包中单个文件签名验证。

  • v2签名:apksigner, 对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign), 对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, V2签名是对整个APK签名验证。

  • apksigner工具默认同时使用v1和v2签名,兼容android7.0以前版本。

签名工具

  • jarsigner:JAR 签名和校验工具,位于位于jdk/bin/jarsigner.exe
  • apksigne : 对Android apk签名及验证的专用工具, 位于Android\sdk\build-tools\28.0.3\apksigner.bat

ZipAlign优化

zipalign是一个归档对齐工具,确保所有未压缩的数据都以相对于文件开始的特定对齐方式开始, 减少了运行应用程序时消耗的RAM数量

  • 如果使用apksigner对APK文件签名,则在签名前使用zipalign进行归档对齐优化,否则签名无效。
  • 如果使用jarsigner对APK文件签名,则只能在APK签名之后进行归档优化。

zipalign用法:

  • 归档对齐优化:zipalign [-f] [-v] 4 infile.apk outfile.apk
  • 确认对齐:zipalign -c -v 4 existing.apk
  • 参数:
    • -f : overwrite existing outfile.zip
    • -v : verbose output
    • -p : outfile.zip should use the same page alignment for all shared object files within infile.zip
    • -c : confirm the alignment of the given file

对APK进行手动签名

  • 创建密钥:

    $ keytool -genkeypair -v -keystore .keystore -alias  -keyalg RSA -keysize 2048 -validity 30000
    
  • 若要列出密钥存储中存储的密钥:

    $ keytool -list -keystore .keystore
    
  • 使用Zipalign优化APK

    $ zipalign -f -v 4 sample_unsigned.apk sample_zipalign.apk
    
  • 对APK进行签名(apksigner)

    $ apksigner sgin -ks .keystore --ks-key-alias  --ks-pass pass: --key-pass pass: --out sample_signed.apk sample_zipalign.apk
    
  • 查看签名信息

    $ apksigner verify -v --print-certs sample_signed.apk
    
  • 使用美团Walle多渠道打包

    $ java -jar walle-cli-all.jar batch -c yingyongbao,baidu,qh360 sample_signed.apk
    
  • 查看apk信息

    $ aapt dump badging sample_signed.apk
    

脚本打包(undo)

你可能感兴趣的:(Android APK手动签名)