记录手动签名APK的过程

前两天更新了华为平台上的APK,被驳回,原因是新APK签名和老的APK不一致,老用户安装会失败,用命令行安装会报如下的错误:

harlanc@harlancdeMacBook-Pro ~/g/p/bin> adb install -r test.apk
adb: failed to install test.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.companyname.appname signatures do not match previously installed version; ignoring!]

因此需要更新签名。

先介绍两个相关的开源工具:

APK解压打包工具

apktool下载链接

为什么需要这个工具下面会说明。

签名显示工具

开源打印APK签名工具

显示新Apk的签名

查看Unity配置之后使用的是默认keystore:

出包之后用签名显示工具打印签名如下:

harlanc@harlancdeMacBook-Pro ~/g/G/keystore> /Users/harlanc/github/print-apk-signature/bin/print-apk-signature raw.apk
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Number of signers: 1
Signer #1 certificate DN: C=US, O=Android, CN=Android Debug
Signer #1 certificate SHA-256 digest: 31245f06c6efef970c1023a6ae1f445282d8beef634ed0ae312a83c933b18f47
Signer #1 certificate SHA-1 digest: 10f9c83b94b647da723d4ba19bf7fb621d284166
Signer #1 certificate MD5 digest: 855d771051e9078e47dacc1404eb4b30
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024
Signer #1 public key SHA-256 digest: f8b9f8c7c121292f9e339ba6e68a8ba40ab363fd0a2c5b810dec2c4e02c5fdb0
Signer #1 public key SHA-1 digest: 11a91b3d390de784445746367d9e238667f03254
Signer #1 public key MD5 digest: 2f06d158c84e63277357d8e6d0270d0d

确实和上线的APK签名是不一致的。

使用免费的签名工具

找到了之前的keystore文件,记起原来的签名替换是使用的腾讯的一个工具叫做乐固:

不知道是这个工具的原因,还是Android SDK更新的原因,签名虽然成功,但是签名打印时会报错:

harlanc@harlancdeMacBook-Pro ~/g/G/keystore> /Users/harlanc/github/print-apk-signature/bin/print-apk-signature raw_signed_zipalign.apk
DOES NOT VERIFY
ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.SF indicates the APK is signed using APK Signature Scheme v2 but no such signature was found. Signature stripped?

手动签名

下面打算使用手动签名工具jarsigner,这个工具在JDK下面,具体安装使用参考下面的帖子:

jarsigner

执行签名之后会报下面的错误:

bash-3.2$ jarsigner -verbose -keystore gvr.keystore -signedjar raw_sign.apk raw.apk android
输入密钥库的密码短语:
jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 21990 but got 22189 bytes)

经查询是因为raw.apk里面已经有签名所致,因此我们要把apk里面的签名删掉,我们用apktool先把apk,解压,删掉签名文件夹: META-INF,再打包成新的APK。(比较麻烦,不知道有没有更好的方法)

解压APK

apktool d -f raw.apk 

删除签名

find   . -name META-INF

cd 到这个文件夹,然后删除:

rm -rf META-INF/

打包

apktool b raw new_raw.apk

注意最后生成的APK在解压APK后的文件夹下面。

最后执行签名命令

harlanc@harlancdeMacBook-Pro ~/g/G/keystore> jarsigner -verbose -keystore gvr.keystore -signedjar new_raw_sign.apk new_raw.apk android

大功告成。

最新文章

  1. EventRay UI Kit – Web & Mobile 的素材
  2. gem5 运行x86全系统仿真
  3. C++ 11 之推导关键词
  4. 用QtWebKit开发简单的浏览器
  5. java猜数字小游戏
  6. 【Hibernate步步为营】--复合主键映射具体解释
  7. Nyoj Fire Station
  8. 批量去BOM头 遍历目录及子文件,文件夹 PHP源码
  9. Alpha冲刺No.8
  10. Asp.Net WebAPI中Filter过滤器的使用以及执行顺序
  11. #3 Python面向对象(二)
  12. RDay2-Problem 2 B
  13. Wed Sep 19 20:48:46 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection mus
  14. ROM、RAM、CPU、CACHE、FLASH
  15. XML文档的生成和解析操作方法
  16. navicat连接mysql出现2059错误
  17. Python-Django-Ajax进阶
  18. 线程同步-使用CountDownEvent类
  19. JS 8-4 OOP instanceof
  20. WijmoJS 使用Web Workers技术,让前端 PDF 导出效率更高效

热门文章

  1. List之ConcurrentModificationException异常
  2. 云服务器 ECS Linux 系统 MySQL 备份的导入导出
  3. Java基础之final、static关键字
  4. Spring 梳理-MVC-配置DispatcherServet和ContextLoaderListener
  5. SpringBoot -> @Import使用
  6. springboot启动后自动退出
  7. yii中缓存(cache)详解 - 彼岸あ年華ツ
  8. 面试题:Python大小写转换
  9. Java 学习笔记之 Sleep停止线程
  10. JavaScript设计模式——原型模式