一、Android签名机制

Android签名机制可划分为ROM签名机制与第三方APK签名机制,在这里只讨论APK签名机制。

Android系统在安装APK的时候,首先会检验APK的签名,如果发现签名文件不存在或者校验签名失败,则会拒绝安装,所以应用程序在发布之前一定要进行签名。给APK签名可以带来以下好处:

应用程序升级。

如果想无缝升级一个应用,Android系统要求应用程序的新版本与老版本具有相同的签名与包名。若包名相同而签名不同,系统会拒绝安装新版应用。

应用程序模块化。

Android系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序。此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块。

代码或数据共享。

Android提供了基于签名的权限机制,一个应用程序可以为另一个以相同证书签名的应用程序公开自己的功能与数据,同时其它具有不同签名的应用程序不可访问相应的功能与数据。

应用程序的可认定性。

签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造。例如网易云加密对Android APK加壳保护中使用的“校验签名(防二次打包)”功能就是利用了这一点。

二、签名原理

对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:

其中.RSA文件还可能是.DSA文件,RSA与SF文件的文件名可以更改,但是它们的命名必须一样。

MANIFEST.MF中保存了APK里所有文件的SHA1校验值的BASE64编码,格式如下(一个文件对应一条记录):

Name: res/anim/abc_fade_in.xml

SHA1-Digest: ohPEA4mboaFUu9LZMUwk7FmjbPI=

Name: res/anim/abc_fade_out.xml

SHA1-Digest: MTJWZc22b5LNeBboqBhxcQh5xHQ=

SF文件里保存了MANIFEST.MF文件的SHA1校验值的BASE64编码,同时还保存了MANIFEST.MF中每一条记录的SHA1检验值BASE64编码,格式如下:

SHA1-Digest-Manifest: ZRhh1HuaoEKMn6o21W1as0sMlaU=

Name: res/anim/abc_fade_in.xml

SHA1-Digest: wE1QEZhFkLBWMw4TRtxPdsiMRtA=

Name: res/anim/abc_fade_out.xml

SHA1-Digest: MfCV1efdxSKtesRMF81I08Zyvvo=

RSA文件则包含了签名的公钥、签名所有者等信息,还保存了用SHA1withRSA签名算法对SF文件的签名结果信息。

Android系统就是根据这三个文件的内容对APK文件进行签名检验的。

三、Android 签名方法

1、apksign、jarsinger

一般的签名过程可以由apksign.jar或者jarsinger.jar完成。apksign.jar由Android SDK提供,使用方法如下:

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk

它接受一个PEM公钥文件,PK8私钥文件,对update.apk进行签名,签名后的文件保存到update_signed.apk。

jarsinger是由JDK提供,使用方法如下:

jarsigner -verbose -keystore d:\\debug.keystore -signedjar update_signed.apk update.apk androiddebugkey -digestalg SHA1 -sigalg MD5withRSA -keypass android -storepass android

其中:

-keystore表示keystore文件的路径

androiddebugkey 表示keystore中的一个别名

-digestalg表示摘要算法

-sigalg 表示签名算法

-keypass 表示别名密码

-storepass表示keystore密码

经过测试,我们发现以上两个传统的签名工具存在以下缺点:

1)、jarsigner在对一个已经有META-INF目录的APK进行签名的时候,有可能会报错:

jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 1368 but got 1379 bytes)

2)、如果APK中已经有签名文件且签名文件中的RSA(或DSA)、SF文件的命名不是CERT的时候,用这两个签名工具进行签名后,会出现:

META-INF目录下会有两个RSA/SF文件,会导致APK在安装的时候失败。

3)、签名花费时间长。这两个签名工具在生成签名后的APK时,是按Zip中一个entry接一个entry 依次拷贝的,效率十分低。因为游戏类型APK类文件数量一般比较多,所以这一缺陷在签名游戏类型APK时,体现得尤为明显。

2、极速签名工具(ApkSinger)

针对signapk.jar与jarsigner在签名过程的缺点,我们开发了新的签名工具ApkSinger.jar。主要是在保证签名正确的基础上:

1) 可以对已签名APK或已存在META-INF目录的APK进行签名。

2) 增加对目录处理的支持。通常在打多个渠道包时,需要对多个APK进行签名,所以增加对目录的签名支持是有必要的。

3) 提高处理效率,优化签名时间。对目录处理时,优势犹为明显!

命令行下运行:java -jar ApkSigner.jar 查看版本号与使用方法:

NetEase ApkSigner1.2

Usage:

java -jar ApkSigner.jar [-appname test] -keystore keystorePath -alias alias [-pswd password] [-aliaspswd aliasPassword] apkPath(or directory)

参数

说明

-appname

待签名的应用程序名,可选,但建议不同的APP填上对应的app名(可以为中文),

有助于【加速】

-keystore

后跟.keystore签名文件

-alias

后跟签名别名

-pswd

后跟对应签名的密码,可选,如果不填,则签名的时候需要手动输入

-aliaspswd

对应别名alias的密码,如果没有则默认使用keystore Password

最后跟待签名的APK路径或者目录路径 ,如果跟的是目录则是批量签名。

选了几个不同体积的APK包进行测试,分别是:20M,144M,343M。分别建立文件夹A、B、C, 分别放5个包(假设要打5个渠道包)。分别调用jarsigner,signapk.jar, ApkSinger.jar对各个文件夹里的APK进行签名,签名速度结果对比如下:

可以看出,极速签名工具(ApkSinger)的速度较其他的签名工具是非常快的,可以极大地优化打包流程,节省打包时间。工具下载链接:http://apk.aq.163.com/apkpack.do#download

如有什么问题,欢迎交流。

Android签名打包很慢,Android APK快速签名—优化打包时间相关推荐

  1. [Android]使用platform密钥来给apk文件签名的命令

    1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>/build/target/product/security,找到[platform.p ...

  2. Android实现客制化系统apk在线签名

    目录 一.基线代码签名key 二.如何生成自定义的签名pk8 .x509.pem 签名文件 三.如何使用签名key对apk进行重新签名 四.大厂商为了安全,使用自定义签名方式,而不采用原生的签名方式 ...

  3. android系统 效率很低,android系统效率低多少?相对于苹果肾的IOS,和WP8来说的话?

    效率?我不明白你的意思,ios和wp系列都是以图形运算为第一的,安卓却不是,如果要说对程序而言,应该是安卓比较好,程序的崩溃率有调查显示安卓是远低于ios和wp的,主窗口下的执行效率必然是使用手机剩余 ...

  4. Android APK系列3-------使用platform密钥来给apk文件签名

    Android APK系列3-------使用platform密钥来给apk文件签名 1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>\ ...

  5. Android V3 签名方案,使用密钥转轮为签名更新做准备!

    一.序 在将 App 发布到市场之前,很重要的一个步骤就是为 APK 进行签名,大部分时候,这个操作隐藏在了打包的流程中,而不被我们注意到. 签名的作用,除了证明 App 的所有权之外,还可以帮助 A ...

  6. Unity 安卓 apk 反编译 重新打包 签名修改

    拿到一个Unity 打包出来的apk,如果没有加密的话 ,你是可以通过反编译修改其中的属性的. 步骤一   apk 解压 方法1: apk 变成 .zip 并解压 然后修改 \assets\bin\D ...

  7. android 加花工具下载,Android 代码混淆并加花

    APK安全: 代码混淆且加壳防止反编译 1.用到的工具jd-gui-0.3.5.windows dex2jar-0.0.9.15 IDAProv6.8 C32Asm DexFixer Windowss ...

  8. keystore文件_如何手动给APK文件签名

    由于您的应用签名密钥用于验证您作为开发者的身份,并确保为您的用户进行无缝而安全的更新,因此,管理和保护您的密钥对于您和您的用户而言都非常重要. 您可以选择使用 Google Play 的 App Si ...

  9. HTML/网站一键打包APK工具(html网页打包安卓APP应用)

    工具简介 "HMTL一键打包APK工具"可以把网站打包为一个安卓应用APK文件,无需编写任何代码,支持在安卓设备上安装运行. 线上地址: 点击进入页面 历史更新 1.4.5 (20 ...

最新文章

  1. C# 从DataSet导出到Excel
  2. IIS FTP部分文件上传报错451的原因及解决方法
  3. DirectInput:poll轮询理解
  4. NLP:NLP领域没有最强,只有更强的模型——GPT-3的简介、安装、使用方法之详细攻略
  5. 【解题报告】Leecode 748. 最短补全词——Leecode每日一题系列
  6. Linux集群服务知识点总结及通过案例介绍如何实现高性能web服务(三)
  7. Python获取电脑硬件信息及状态的实现方法
  8. volatile关键字的作用-适用场景
  9. 【华为云技术分享】用GaussDB合理管控数据资源的几点心得
  10. Idea设置多开窗口
  11. 企业部署BI系统怎么能一直做下去,PDCA闭环是关键
  12. 【Flume】Flume简单介绍
  13. 数据挖掘项目:问答网站问题及回答数量预测(Sofa竞赛)排名:3/155
  14. HTTP 1.1 协议规范
  15. Raki的读paper小记:Soft Gazetteers for Low-Resource Named Entity Recognition
  16. 硬盘整数分区大小计算公式(硬盘分区计算)
  17. 数据分析越来越火,如何做一个靠谱的职业规划?
  18. 青龙羊毛---小龙传奇
  19. ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV
  20. 李兴平中国最牛的个人站长

热门文章

  1. Redis的简单笔记
  2. 3D美术游戏性能优化
  3. StringBoot-plus 代码生成器
  4. 你把功能堆砌起来,并不是做产品
  5. 三种代码为wordpress添加上一篇/下一篇功能
  6. java五子棋实验报告6_Java实现两人五子棋游戏(六) 行棋方变换
  7. vue router 路由跳转方法概述
  8. hive中explode函数的用法
  9. 年度直播电商抖音运营方案商业计划书模板PPT
  10. 《华林科纳-半导体工艺》晶片清洗工艺评估