整个应用加固方式站内有文章写的已经很详细了,如下:
(原创)Android apk应用加固、字节对齐、二次签名全流程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/Android_xiong_st/article/details/130853689
上述文章在二次签名中介绍了用后缀为 .jks 的签名文件进行二次签名,本文仅额外补充可能存在的用 .keystore 签名文件进行二次签名的情况。
加固
使用360加固助手,
360加固官网
网页截图如下:
网页或者下载客户端都可以实现加固。
上传应用 ——> 开始加固 ——> 下载应用。即可得到一个被剥夺了签名但是已经加固了的apk
字节对齐
第一步
要进行字节对齐,首先修改刚刚加固了的apk文件,把它的的后缀名为 .zip(其它压缩格式也可以,主要是为了用压缩软件打开该文件),修改完成后打开该文件,删除下图中红框选中的“META-INF”文件夹(该文件夹经过应用加固后,签名信息已经被删了,多了一些杂七杂八的文件,没什么用。如果不删除该文件夹,后续二次签名就无法成功);
删除成功后,将该文件的后缀名重新改为 .apk;
PS:笔者的项目中并未出现META-INF文件夹,所以并未操作这个步骤
第二步
将该apk文件复制到zipalign工具所在目录
该工具位于sdk\build-tools\build版本目录下
一般选择你项目中使用到的版本的目录即可
我这边用的是30.0.3
上图所示,红框中的zipalign.exe即为字节对齐工具,ziptest.apk就是需要对齐的apk文件
第三步
在当前目录的地址栏中输入cmd,回车
进入到命令提示窗口
输入zipalign.exe -v -p 4 input.apk output.apk
(命令中的input.apk为需要对齐的apk文件名,output.apk为对齐完成后输出的apk文件名)
中间省略一大段运行中输出的代码…
如上图所示,运行结束,出现红框中的代码,表示字节对齐成功,同时可以在目录中看到多了个字节对齐成功后的apk文件,如下图所示:
这样,对齐就完成了
我们也可以通过命令验证下apk是否对齐
还是把要验证是否对齐的apk放到这个目录下,执行命令:
zipalign -c -v 4 apk名字
输出结果为succesful就是代表对齐
FAILED就代表没有对齐
得到结果如下:
二次签名
方式一:.jks
完成了字节对齐,就要对apk重新进行签名了
签名工具SDK也是自带的,apksigner。该工具位于字节对齐工具同级目录lib的下一级,
如下图所示:
接下来要做的就是把我们对齐的apk和签名文件jks放入目录下
接着,在该路径下打开cmd窗口,输入命令:
java -jar apksigner.jar sign --ks key.jks --ks-key-alias releasekey output.apk
key.jks为签名文件,releasekey为签名文件的别名,output.apk为上图红框2所示的apk文件。
例如下图所示:
命令中的签名文件别名由于隐私原因,就隐藏了,大家替换成自己签名文件的别名即可。
如果命令行输入没有任何问题,会在下方显示输入Keystore密码的指令,如上图最后一行所示Keystore password for signer #1: (这里需要注意:输入密码的时候命令提示窗口是不会有任何字符显示的,估计是为了隐私安全,输入完成后直接Enter就行了)。
签名成功,在命令提示窗口不会有任何提示;反之则有错误提示。只需查看目录中的apk文件修改日期是否改变,例如下图所示:
时间较之前最初的,变成签名命令执行成功后的时间。想要确保签名成功,也可输入下述命令查看:
java -jar apksigner.jar verify -v output.apk
其中的output.apk为签名文件的文件名,签名成功结果如下图所示:
(补充)方式二:.keystore
在sdk\build-tools\lib目录下,即存在apksigner.jar的目录下执行如下cmd命令:
java -jar apksigner.jar sign \
--ks debug.keystore \ # 指定密钥库文件(debug.keystore)
--ks-key-alias androiddebugkey \ # debug.keystore 的默认别名
--ks-pass pass:android \ # 密钥库密码(默认是 "android")
--key-pass pass:android \ # 密钥别名密码(默认与密钥库密码相同)
--out signed.apk \ # 输出已签名的 APK 文件名
unsigned.apk # 待签名的 APK 文件路径
参数说明
--ks
:debug.keystore
文件路径(默认路径为~/.android/debug.keystore
,若文件在其他位置需填写完整路径)。--ks-key-alias
:必须为androiddebugkey
(这是 Android 默认调试密钥的别名)。--ks-pass
和--key-pass
:密码均为android
(默认值)。--out
:输出文件名称,需与输入文件区分。
示例:
签名文件:sign.keystore
签名文件别名:sign
密钥库密码:android
密钥别名密码:android
输出已签名的APK文件名:output.apk
待签名的APK文件路径:input.apk
上述标红内容请根据自身项目情况酌情替换
文件目录如下:
执行cmd窗口命令如下:
如成功,即可生成一个可安装且加固过的 output.apk文件
2. 验证签名
签名完成后,可通过以下命令验证签名有效性:
java -jar apksigner.jar verify --verbose signed.apk
若输出包含 Verified
和签名详情(如证书指纹),则表明签名成功
____________________________________________________________________________
由于笔者是一次成功,姑且贴出未经笔者验证过的注意事项和常见问题,仅供参考
3. 注意事项
- zipalign 对齐:
在签名前需确保 APK 已通过 zipalign
进行 4 字节对齐优化(否则可能影响安装性能)。对齐命令如下:
zipalign -p 4 unsigned.apk aligned_unsigned.apk
对齐后再对 aligned_unsigned.apk
执行签名
- 兼容性:
debug.keystore
是 Android 默认调试密钥,适用于开发和测试场景。若需发布正式包,应使用自定义的 release 密钥库
-
路径问题:
如果 apksigner.jar
不在当前目录,需填写完整路径(如 $ANDROID_SDK/build-tools/30.0.3/lib/apksigner.jar
)。
若 debug.keystore
路径非默认,需通过 --ks
参数指定完整路径
4. 常见问题
-
报错“密钥库格式无效”:
可能因debug.keystore
文件损坏导致,需删除并重新生成(执行命令keytool -genkey
重新生成密钥库) -
签名后安装失败:
检查是否未对齐或签名参数错误。可先用apksigner verify
验证签名状态
至此,从加固到二次签名整一个流程就结束了。