Android:打包、加固、签名踩坑记录

正常的出包流程:

  • 在Build中找到Grenerate Signed Bundle/apk ,勾选 v1、v2生成签名apk
  • 第三方加固平台加固(360、爱加密、梆梆…)
  • 重新签名

加固后为什么要重新签名

加固后apk的签名信息会丢失,需要重新签名,没有签名的apk是不能直接在真机上运行的

重新签名的几种方式

1. 360加固宝

注册360开发者账号后下载工具即可,window电脑完美运行,Mac因系统升级原因一直打不开,不信邪的哥们可以试试低版本的系统。360加固宝属于傻瓜式操作,加固可选v1、v2类型

下图是Windows电脑上的,真香
在这里插入图片描述

2. jarsigner(只支持V1签名)
$ jarsigner -keystore 密钥库名 xxx.apk 密钥别名

从JDK7开始, jarsigner默认算法是SHA256, 但Android 4.2以下不支持该算法,所以需要修改算法
添加参数 -digestalg SHA1 -sigalg SHA1withRSA

$ jarsigner -keystore 密钥库名 -digestalg SHA1 -sigalg SHA1withRSA xxx.apk 密钥别名

参数:
-digestalg 摘要算法
-sigalg 签名算法

3. apksigner(默认同时使用V1、v2签名)

cd 进入路径

$ cd /Users/linmu/Library/Android/sdk/build-tools/28.0.0

输入命令

$ apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 xxx.apk

提示输入密码后输入签名文件的密码即可

禁用v2签名

$ apksigner sign --v2-signing-enabled false --ks 密钥库名 xxx.apk

参数:
–ks-key-alias 密钥别名,若密钥库有一个密钥对,则可省略,反之必选
–v1-signing-enabled 是否开启V1签名,默认开启
–v2-signing-enabled 是否开启V2签名,默认开启

4. apksigner另一种签名方式(默认同时使用V1、v2签名)

java -jar apksigner.jar sign --ks /Users/xxxx/Desktop/key.jks --ks-key-alias test --ks-pass pass:123456 --key-pass pass:123456 --out /Users/xxxx/Desktop/签名后的安装包.apk /Users/xxxx/Desktop/需要进行签名的安装包.apk

注意仔细看上的命令行:进了黑色加粗的文字需要替换成实际的信息

  • 第一个加粗的是秘钥的路径
  • 第二个是秘钥的别名
  • 第三个是秘钥的密码
  • 第四个是秘钥的密码
  • 第五个是进行了签名的安装包保存的路径
  • 第六个是需要进行签名的安装包路径
此前一直用的这个打包方式,但不知道为啥突然报下面这个错,jdk的路径没问题,JAVA_HOME环境重新配置了,执行权限(chmod a+x apksigner)也有,但还是不行,极其神奇!在此记录下踩过的坑。这种非技术问题没必要深究,实现方式很多没必要非在一棵树上吊死!
Error: Unable to access jarfile apksigner.jar

签名验证

cd 进入路径

$ cd /Users/linmu/Library/Android/sdk/build-tools/28.0.0

输入命令

$ apksigner verify -v --print-certs xxx.apk

运行效果如下:

pacteradeMBP:28.0.0 linmu$ apksigner verify -v --print-certs /Users/linmu/Downloads/app.apk 
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1
...
...

apksigner 与 jarsigner 区别

jarsigner:
  • jarsigner是JDK提供的针对jar包签名的通用工具,位于JDK/bin/jarsigner.exe
  • 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)对V1签名的apk/jar解压,在META-INF存放签名文件(MANIFEST.MF, CERT.SF, CERT.RSA), 其中MANIFEST.MF文件保存所有文件的SHA1指纹(除了META-INF文件),对压缩包中单个文件签名验证
apksigner:
  • apksigner是Google官方提供的针对Android apk签名及验证的专用工具,位于Android SDK/build-tools/SDK版本/apksigner.bat
  • apksigner对zip压缩包的整个文件验证, 签名后不能修改压缩包(包括zipalign),对V2签名的apk解压,没有发现签名文件,重新压缩后V2签名就失效, 对整个APK签名验证
总结:不管是apk包,还是jar包,本质都是zip格式的压缩包。对比之下apksigner签名更安全,不能修改压缩包;签名验证时间更短;安装速度加快

参考文档:

大神总结1
大神总结2


补充:Mac升级会导致jdk环境变量配置失效,apksigner找不到等一系列不能运行问题,在此补写解决方案

下面这个是jdk环境变量配好的样子,执行 echo $JAVA_HOME 会给出路径

pacteradeMBP:29.0.3 linmu$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

配置步骤:

  1. 找到自己的jdk路径,一般是/Library/Java/JavaVirtualMachines/jdk*****.jdk/Contents/Home
    在这里插入图片描述
  2. 打开命令行工具,如果你是第一次配置环境变量,可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用"open -e .bash_profile"命令)
pacteradeMBP:29.0.3 linmu$ touch .bash_profile
  1. 输入“open -e .bash_profile”命令,打开文件,写入环境变量
pacteradeMBP:29.0.3 linmu$ open -e .bash_profile

输入如下配置,把JAVA_HOME配成自己的

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
  1. 使用"source .bash_profile"使配置生效
pacteradeMBP:29.0.3 linmu$ source .bash_profile
  1. 输入 echo $JAVA_HOME 显示刚才配置的路径
pacteradeMBP:29.0.3 linmu$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home

配置完成后,cd 到 /Users/linmu/Library/Android/sdk/build-tools/28.0.0
输入 apksigner

pacteradeMBP:28.0.0 linmu$ apksigner
USAGE: apksigner <command> [options]
       apksigner --version
       apksigner --help

EXAMPLE:
       apksigner sign --ks release.jks app.apk
       apksigner verify --verbose app.apk
。。。
。。。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于已经进行了 Android V2 签名加固APK,如果需要手动进行 V2 签名,需要先将 APK 中的 V2 签名部分移除,然后再进行签名。具体步骤如下: 1. 使用 apksigner 工具查看 APK签名信息,可以通过以下命令查看: ``` apksigner verify --verbose --print-certs myapp.apk ``` 如果 APK 包含 V2 签名,会输出类似以下信息: ``` Verifies Verified using v1 scheme (JAR signing): true Verified using v2 scheme (APK Signature Scheme v2): true Number of signers: 1 ``` 2. 使用 zipalign 工具将 APK 对齐,可以通过以下命令对 APK 进行对齐: ``` zipalign -v 4 myapp.apk myapp-aligned.apk ``` 3. 使用 apksigner 工具移除 APK 的 V2 签名部分,可以通过以下命令进行: ``` apksigner remove-signing-cert myapp-aligned.apk ``` 4. 使用 jarsigner 工具对 APK 进行 V2 签名,可以通过以下命令进行: ``` jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore my-release-key.keystore myapp-aligned.apk alias_name ``` 其中,my-release-key.keystore 是你的密钥库文件,alias_name 是你的密钥库别名。 5. 使用 apksigner 工具再次验证 APK签名信息,可以通过以下命令进行: ``` apksigner verify --verbose --print-certs myapp-aligned.apk ``` 如果 APK 包含 V2 签名,会输出类似以下信息: ``` Verifies Verified using v1 scheme (JAR signing): true Verified using v2 scheme (APK Signature Scheme v2): false Number of signers: 1 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值