混淆移步混淆
每个发布的应用都有自己的一个唯一合法的ID,这个就是应用自身的签名,签名可以保证你软件升级的一致性,使用相同签名的应用可以实现覆盖安装,而不一致的签名将无法共享使用数据,也即是无法覆盖安装,这样可以防止别人篡改,盗用开发者的应用,造成对开发者利益的损害。那么如何为自己的应用进行签名呢?1
2 apk签名
APK签名之两步走:
- 创建一个key
- 使用步骤1中产生的key对apk签名
2.1 签名文件生成
2.1.1 命令行生成签名文件
创建key,需要用到java的keytool.exe工具(该工具位于java环境的安装目录下jdk1.6.0_24jrebin,不同jdk版本可能略有差异),使用产生的key对apk签名用到的是jarsigner.exe (位于安装目录下的jdk1.6.0_24bin),如果你正确安装了java环境,并配置了正解的环境变量,那么你可以直接打开运行命令窗口输入
C:\Users\Sogrey>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
说明: -genkey
产生密钥-alias demo.keystore
key的别名 demo.keystore-keyalg RSA
使用RSA算法对签名加密-validity 40000
证书有效期限4000天-keystore demo.keystore
生成key的存放路径,你可以生成到指定路径(例如:D:\demo.keystore 在D盘根目录生成key文件,文件名为demo.keystor,如果不指定绝对路径将在当前cmd所在目录生成key文件),当前我的签名文件就保存在 C:\Users\Sogrey
目录下。
2.1.2 Eclipse生成签名文件
参见我早期的另一篇。
2.1.3 Android studio生成签名文件
Android studio 生成签名文件与Eclipse类似,菜单Build->Generate Signed APK ,
弹出下面对话框:
点击Create new...
,弹出下面对话框:
其中:
Key store path:密钥库文件的地址
Password/Confirm:密钥库的密码
Key:
Alias:密钥名称
Password/Confirm:密钥密码
Validity(years):密钥有效时间
First and Last Name:密钥颁发者姓名
Organizational Unit:密钥颁发组织
City or Locality:城市
Country Code(XX):国家
点击ok
,便可生成签名文件,文件路径为上面填写的Key store path
。
2.2 签名apk
2.2.1 命令行签名apk文件
C:\Users\Sogrey> jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore
说明: -verbose
输出签名的详细信息-keystore demo.keystore
使用key的绝对路径,就是在第一步中生成的key-signedjar demor_signed.apk demo.apk demo.keystore
正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore
2.2.2 Eclipse签名apk文件
参见早期文章
2.2.3 Android studio签名apk文件
菜单Build->Generate Signed APK,弹出框中选择Choose existing...
,选择以创建好的签名文件。
输入Key store password
,点击Key alias
后面的...
选择别名,再次输入别名密码,点击next
,选择签名为debug还是release.点击finish
即可签名完成。
3 查看签名
3.1 查看签名文件信息
$ keytool -list -keystore debug.keystore
结果:
C:\Users\Sogrey\Desktop>keytool -list -keystore demo.jks
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN
您的密钥库包含 1 个条目
demo, 2017-1-13, PrivateKeyEntry,
证书指纹 (SHA1): 5D:2B:A2:05:8F:36:74:9C:F7:B4:A7:48:32:54:9B:6D:6C:9C:D7:9C
3.2 查看apk签名信息
用winrar打开待查看的apk,将其中META-INF
文件夹解压出来,得到其中的CERT.RSA
文件
$ keytool -printcert -file META-INF/CERT.RSA
结果:
4 签名apk压缩
签名之后,用zipalign(压缩对齐)优化你的APK文件。未签名的apk不能使用,也不能优化。签名之后的apk谷歌推荐使用zipalign.exe(位于android-sdk-windowstools目录下)工具对其优化:
C:\Users\Sogrey> zipalign -v 4 demo_signed.apk final.apk
这样,zipalign能够使apk文件中未压缩的数据在4个字节边界上对齐(一般4个字节是一个性能很好的值),这样android系统就可以使用mmap()(请自行查阅这个函数的用途)函数读取文件,可以在读取资源上获得较高的性能,
PS:
- 在4个字节边界上对齐的意思就是指编译器把4个字节作为一个单位来进行读取的数据资源,因此,CPU能够对变量进行较之前不对齐更高效、快速的访问。
- 对齐的根源:android系统中的Davlik虚拟机使用自己专有的格式DEX,DEX的结构是紧凑的,为了让运行时的性能更好,可以进一步用”对齐”进一步优化,但是大小一般会有所增加。