Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

@[TOC](Android 运用渠道加固之后操作(apk重签名)「zipalign」「apksigner」「jarsigner」)

前语

说一个恐怖的工作:==现在的Android签名计划现已有v1,v2,v3,v4了== ,v3支撑多个证书,v4为增量签名。具体概况请看 官方文档 。咱们现在仍是以v1,v2为主。

当然,这是题外话,当前这篇文章的主题是:Android 渠道加固之后的重签名姿态。咱们在(腾讯加固/360加固/爱加密)等等渠道上面加固之后的apk,下载下来的时分,都需求咱们进行重签名的操作。而重签名呢,又有两种办法:

  • Java:==jarsigner== java自带的jar签名,也便是咱们Android打包的v1签名,签名计划只能v1
  • Android:==apksigner== Android特有的签名,也便是打包的v2签名,支撑多种签名计划(v1~v4)。

本文章将介绍从各大加固渠道下载下来的apk包,进行「对齐(zipalign)」、「重签名(jarsigner与apksigner)」的操作详解。

运转环境

运转环境 版别
操作系统 macOS 13.0.1 (Ventura)
AndroidStudio 2021.3.1 Patch 1 (Dolphin)
JDK 1.8.0_322
Android SDK 27.0.3

本文介绍的三种办法,都需求装备环境变量。不然需求翻开终端,定位到相对应的方位:

  • zipalign工具方位:SDK途径/tools/zipalign

    例如:/Users/leomark/Library/Android/sdk/tools/zipalign

  • jarsigner工具方位:JDK途径/Contents/Home/bin/jarsigner

    例如:/Users/leomark/Library/Java/JavaVirtualMachines/corretto-1.8.0_322/Contents/Home/bin/jarsigner

  • apksigner工具方位:SDK途径/build-tools/「版别号」/apksigner 「版别号需 >= ==24.0.3==」

    例如:/Users/leomark/Library/Android/sdk/build-tools/27.0.3/apksigner

装备环境变量请查看之前写的文章 Flutter 开发-安装与环境装备-装备环境变量失效问题 在里面新增三个个环境变量(现已新增过的可疏忽,少了哪个添加哪个即可):

export PATH="「SDK途径」/tools"
export PATH="「JDK途径」/Contents/Home/bin"
export PATH="「SDK途径」/build-tools/「版别号」" 「版别号需 >= 24.0.3」
例如:
export PATH="/Users/leomark/Library/Android/sdk/tools"
export PATH="/Users/leomark/Library/Java/JavaVirtualMachines/corretto-1.8.0_322/Contents/Home/bin"
export PATH="/Users/leomark/Library/Android/sdk/build-tools/27.0.3"

需求留意的是,由于 ==apksigner== 是Google在 Android 7.0 Nougat 推出的,所以咱们的版别号的挑选需求 >= ==24.0.3== ,不然只能挑选 ==jarsigner== 办法打v1包。

对齐(zipalign)

咱们从渠道下载下来的加固apk包,官方文档有具体介绍说,具体看这里 《官方文档 – zipalign》咱们只是看起来有一点陌生,但是这个其实便是咱们项目在打包时分的 ==zipAlignEnabled true== 的这个选项,只不过咱们在加固完之后,这个 ==对齐「zipalign」== 就被弄没了,咱们需求从头 ==对齐「zipalign」==。项目app目录下build.gradle文件:

    buildTypes {
        release {
            minifyEnabled true//混杂
            buildConfigField "boolean", "LOG_DEBUG", "false" //不显现log
            zipAlignEnabled true     //Zipalign优化
            shrinkResources true    // 移除无用的resource文件
            signingConfig signingConfigs.release
            multiDexKeepFile file ('multidex-config.txt')
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true//混杂
            buildConfigField "boolean", "LOG_DEBUG", "false" //不显现log
            zipAlignEnabled true     //Zipalign优化
            shrinkResources true    // 移除无用的resource文件
            signingConfig signingConfigs.debug
            multiDexKeepFile file ('multidex-config.txt')
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

需求留意的是,==zipalign的运用关于jarsigner和apksigner有一个时间前后规则:==

  • 假如您运用的是 apksigner,则有必要在为 APK 文件签名之前运用 zipalign。假如您在运用 apksigner 为APK 签名之后对 APK 做出了进一步更改,签名便会失效。
  • 假如您运用的是 jarsigner,则有必要在为 APK 文件签名之后运用 zipalign。

当装备好环境变量之后,就能够运用终端运用相对应的对齐句子了,下面是查看apk是否对齐的办法,翻开终端输入:

zipalign -c -v 4 apk途径
例如:
zipalign -c -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk

成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

接下来便是运用终端,实现apk对齐操作,在翻开的终端输入:

zipalign  -v 4 「需求对齐操作的apk地址」 「对齐之后生成的地址」
例如:
zipalign  -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk

成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

呈现 “Verification succcessful” 为对齐成功。咱们能够重复上诉查看对齐操作看看,成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

留意:这里的检测句子结尾的apk姓名得修改为 ==zipaligned.apk==,原因是咱们对齐的时分,生成了新的命名为 ==zipaligned.apk== 的新文件。当然这里的姓名能够自己随意界说。

重签名 apksigner (引荐办法)

重签名 「apksigner」 和 「zipalign」对齐办法相同,咱们需求用到的事查看句子和生成句子。 需求留意的是:

  • 咱们选用「apksigner」的办法重签名,需求先对齐「zipalign」 apk包。==不能重签名之后再对齐「zipalign」apk包。== 虽然重签名之后能够运转对齐「zipalign」终端句子,但是对齐之后,该apk包的签名将失效。

所以咱们假如选用 「apksigner」的办法进行重签名,有必要先对齐「zipalign」apk包,再进行重签名操作。 下面是查看是否签名的终端句子,在翻开的终端输入:

apksigner verify -v 查看的apk途径
例如:
apksigner verify -v /Volumes/Data/Android_jiagu/teacher/zipaligned.apk

成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
接下来持续在终端输入「apksigner」重签名句子(当然,也能够不履行查看句子,对齐「zipalign」之后直接履行重签名句子):

apksigner sign -verbose --ks 「jks文件途径」 --v1-signing-enabled (「true/false」v1打包敞开/封闭) --v2-signing-enabled (「true/false」v2打包敞开/封闭) -ks-key-alias (jks别号 key-alias) --ks-pass pass: (jks暗码,key store password) --key-pass pass:(key 暗码,key password) --out 「生成的apk途径,重签名后的」 「对齐之后的apk途径」
例如:
apksigner sign -verbose --ks /Volumes/Data/Android_jiagu/teacher/zhty.jks --v1-signing-enabled true --v2-signing-enabled true --ks-key-alias key --ks-pass pass:123456 --key-pass pass:123456 --out /Volumes/Data/Android_jiagu/teacher/signed.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk

终端运转成果如下:呈现 Signed 则为重签名成功。

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
咱们再来查看一下,终端输入查看句子,成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
呈现框起来的那两行,就阐明,咱们现已重签名「apksigner」成功了,咱们能够拿apk包去各大运用市场上架操作了。

重签名 jarsigner (v1打包)

重签名「jarsigner」和 「adksigner」相同,也是只需求查看和重签名两个办法。 需求留意的是:

  • 重签名「jarsigner」是签名之后才干对齐「zipalign」apk包。==假如对齐「zipalign」之后再进行重签名「jarsigner」,那么对齐「zipalign」将会失效。==

所以咱们需求先重签名「jarsigner」,再进行对齐「zipalign」操作,下面咱们翻开终端输入:

jarsigner -verify 「查看的apk途径」
例如:
jarsigner -verify /Volumes/Data/Android_jiagu/teacher/jiagu.apk

成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
接下来持续在终端输入「jarsigner」重签名句子(当然,也能够不履行查看句子,直接履行重签名句子):

jarsigner -verbose -keystore 「apk签名文件途径」 -storepass 「签名暗码」 -signedjar 「需求重签名apk途径」  「加固的apk途径」 「签名别号 key-alias」
例如:
jarsigner -verbose -keystore /Volumes/Data/Android_jiagu/teacher/zhty.jks -storepass 123456 -signedjar /Volumes/Data/Android_jiagu/teacher/signed.apk /Volumes/Data/Android_jiagu/teacher/jiagu.apk key

成果如下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

签名之后咱们再查看一下:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
查看完之后,咱们就能够重复上面讲的对齐「zipalign」操作了,再对齐之后,咱们就能够拿到对齐「zipalign」的apk包去各大运用市场上架了。

具体运用

重签名「jarsigner」与「apksigner」的操作次序为:

  • jarsigner: ==查看apk是否签名== ===> ==「jarsigner」重签名== ===> ==是否重签名成功== ===> ==对齐「zipalign」== ===> ==查看是否对齐==
  • apksigner: ==查看是否对齐== ===> ==对齐「zipalign」== ===> ==查看是否对齐== ===> ==查看apk是否签名== ===> ==「apksigner」重签名== ===> ==是否重签名成功==

具体操作句子请参考前面每一个办法的具体介绍。引荐运用 ==「apksigner」== 进行重签名,直接打v1、v2 的签名apk包。

对齐「zipalign」呈现 “Output file ‘……apk’ exists”

当咱们多次履行对齐句子之后,假如每一次都是用同一个姓名,输入对齐句子,终端就会爆这个过错,如下图所示:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
终端在提示咱们,文件现已存在了。咱们输入的这句子不支撑覆盖。查阅Android官网 对齐 ==「zipalign」== 的界说,文章结尾找到了解决计划:

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS

官网列表能够看出,咱们在终端输入的时分, 加一个 ==「 -f 」== 就能够覆盖输出文件。所以,咱们现在有两种解决计划:

  • 咱们在每一次加固的时分,清空当前操作文件夹的一切apk文件,然后再履行句子。
  • 在原来的句子基础上,添加一个 ==「 -f 」== 终端句子:
    •  zipalign -f -v 4 「需求对齐操作的apk地址」 「对齐之后生成的地址」
       例如:
       zipalign -f -v 4 /Volumes/Data/Android_jiagu/teacher/jiagu.apk /Volumes/Data/Android_jiagu/teacher/zipaligned.apk
      

总结

以上便是本文所介绍的从加固渠道下载下来之后,重签名的教程。仍是那句话,引荐运用 ==「apksigner」== 进行重签名,直接打v1、v2 的签名apk包。

有不对或者过错的当地,欢迎指出!

Android 应用平台加固之后操作(apk重签名「zipalign」「apksigner」「jarsigner」) 操作环境:MacOS
相关学习资料:

  • Android官方文档 – 运用程序签名
  • Android官方文档 – zipalign
  • Android官方文档 – apksigner
  • Android之通过 apksigner 对 apk 进行 手动签名
  • Android APK 加固从头签名
  • Flutter 开发-安装与环境装备-装备环境变量失效问题