文档章节

Android APK快速签名—优化打包时间

网易云捕
 网易云捕
发布于 2016/06/02 09:30
字数 1630
阅读 3.8K
收藏 101

一、Android签名机制

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

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

  1. 应用程序升级。

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

  1. 应用程序模块化。

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

  1. 代码或数据共享。

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

  1. 应用程序的可认定性。

签名信息中包含有开发者信息,在一定程度上可以防止应用被伪造。例如网易云加密对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

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

© 著作权归作者所有

网易云捕
粉丝 9
博文 9
码字总数 12305
作品 0
杭州
私信 提问
加载中

评论(3)

t
tester007

引用来自“Fover”的评论

还有更简单的,就是往mata文件夹写入文件,然后再读取文件名来区分渠道,一个渠道包1秒不到就可以出了。
可以参考美团的文章
http://tech.meituan.com/mt-apk-packaging.html
这个文章是说快速签名的吧,不是说快速打渠道包的,完全不同的东西。
九离天
九离天
代码或数据共享。
Android提供了基于签名的权限机制,一个应用程序可以为另一个以相同证书签名的应用程序公开自己的功能与数据,同时其它具有不同签名的应用程序不可访问相应的功能与数据。

请问这个怎么实现的?
Fover
Fover
还有更简单的,就是往mata文件夹写入文件,然后再读取文件名来区分渠道,一个渠道包1秒不到就可以出了。
可以参考美团的文章
http://tech.meituan.com/mt-apk-packaging.html
C#-Xamarin的Android项目开发(三)——发布、部署、打包

前言 部署,通常的情况下,它其实也是项目开发的一个难点。 为什么这么说呢?因为,它不是代码开发,所以很多开发者本能的拒绝学习它。 并且一个项目配置好一次以后,部署的步骤和部署的人通...

kiba518
2019/03/04
0
0
Android多渠道打包相关介绍

一、多渠道打包概述 由于国内存在着有众多的应用市场,在不同的应用市场可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在...

Ruheng
2018/06/23
0
0
SimpleNews 项目的重构之旅(5) - Android Gradle 打包&混淆应用

应用场景 之前一直没有做 Android APK 发包管理,所以这次重构把这打包这部分考虑进去,之后可能会发布到一些应用市场。 要实现的功能 混淆代码 实现签名 过滤无用资源 生成 release 版本 AP...

無名小子的杂货铺
2017/06/12
0
0
校验数字签名防止apk二次打包

Android系统的开放性和免费性等特征让开发者和用户趋之若鹜,用户也渐渐习惯了Android应用的这种免费午餐,但在免费的背后却有着巨大的安全阴影。 “Android APP二次打包”则是盗版正规Andro...

科技创造
2015/03/23
2.9K
2
Android Gradle 常用使用场景实现方式的总结

Gradle 作为一款灵活多变的构建插件,与 Android Studio 的结合,能够解决过去使用 Eclipse 开发 App 时所遇到的诸多问题。同时,基于 Groove 这样一款 DSL 语言的脚本特性,记住各种语法显然...

亦枫
2018/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

16、SpringBoot之AOP创建代理

1.1、简介 // 要使用SpringBoot的AOP功能,需要在pom中新增aop依赖<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid......

神锋
34分钟前
58
0
如何传递prepareForSegue:一个对象

我在地图rightCalloutAccessory有很多注释(带有rightCalloutAccessory按钮)。 该按钮将从此mapview到tableview 。 我想根据单击哪个标注按钮将不同的对象(包含数据)传递给tableview 。 ...

技术盛宴
43分钟前
86
0
REST API服务为验证失败返回的适当HTTP状态代码是什么?

每当我在基于Django / Piston的REST API应用程序中遇到验证失败时,我目前正在返回401 Unauthorized。 看过HTTP状态代码注册表后我不相信这是验证失败的合适代码,你们都推荐什么? 400错误请...

javail
59分钟前
94
0
《计算机程序的构造和解释》分享下载

书籍信息 书名:《计算机程序的构造和解释》 原作名:Structure and Interpretation of Computer Programs 作者: Harold Abelson / Gerald Jay Sussman / Julie Sussman 豆瓣评分:9.5分(22...

开始以后_
今天
91
0
《Linux就该这么学》第六节课while循环语句,case测试语句,计划任务及用户文件的相关命令

《Linux就该这么学》 本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Lin...

溪风之殇
今天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部