背景
公司做好的apk,今天测出了问题。但是今天是周六,个人电脑上没代码,要自己想办法改apk的内容后重新打包了。好在这个apk没有加固,而且工程基本都是H5代码,可以直接改压缩文件后重新打包就可以了。
Android apk反编译和重新打包 看我写的这个博客
https://blog.csdn.net/weixin_36001685/article/details/100986829
若干坑
使用windows电脑将后缀.apk改成.rar后直接使用winRAR打开,不解压缩成文件夹。然后保存。然后再把后缀改回去。安装,报错这个apk没有签名证书。
下载了apktool,里面有一个工具Auto-Sign,各种百度它的用法,最终还是没有成功签名。
以下操作都是mac下进行的,windows下可能有些许区别。
有人说用Android Studio自带的apksigner和jarsigner,先声明一下,我最终用的是jarsigner。
它们目录是/Users/用户名/Library/Android/sdk/build-tools/版本号/
###我首先尝试apksigner,结果执行报错,没有这个命令,即使在它的目录下执行都不行,不知道为什么,就放弃了。
###然后尝试jarsigner,
报错jarsigner error: java.time.DateTimeException: Invalid value for MonthOfYear (valid values 1 - 12): 0
解决:参考https://stackoverflow.com/questions/46508081/jarsigner-error-java-time-datetimeexception-invalid-value-for-monthofyear-val
意思是说jarsigner版本跟电脑jdk版本不一致。于是Java -version,看到电脑是9的jdk,于是百度怎么改成1.8的jdk,最终在这里看到了答案:
https://www.cnblogs.com/maxinliang/p/4389971.html
我的做法是:
1.下载java1.8,安装。安装后的目录是/Library/Java/JavaVirtualMachines/jdk-版本号.jdk
2.在终端输入open ~/.bash_profile
3.在打开的.bash_profile里加入:
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
export JAVA_9_HOME=//Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
export JAVA_HOME=KaTeX parse error: Double subscript at position 7: JAVA_9_̲HOME alias jdk8…JAVA_8_HOME’
alias jdk9=‘export JAVA_HOME=$JAVA_9_HOME’
4.在前一个终端输入
source ~/.bash_profile
5.然后测试是否设置成功了:输入jdk8回车,输入javac回车看是不是1.8版本了。
在1.8版本jdk下执行jarsigner就不会报这个错了。
jarsigner: 无法打开 jar 文件:
命令错了,可能是打包前和打包后的名字反了。
使用jarsigner对APK重签名,提示:jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575
bytes) bytes)
解决办法是:签名之前的rar压缩文件,打开后删除里面的META-INF目录,然后重新改成apk后缀
最后写上终极命令
jarsigner -verbose -keystore keystore.keystore -storepass 123456 -signedjar testsigned.apk -digestalg SHA1 -sigalg MD5withRSA test.apk alias
keystore.keystore 是keystore文件,可以使用AndroidStudio生成或命令生成,我是放在终端窗口同级目录下,所以不需要全路径。
-storepass 123456 密码
testsigned.apk 签名后的文件名
test.apk 待签名的文件名
alias 别名