什么是签名?
如果这个问题不是放在 Android 开发中来问,如果是问一个普通的人,我想大家都知道签名的含义。可往往就是将一些生活中常用的术语放在计算机这种专业领域,大家就开始迷惑了。计算机所做的事情,或者说编程语言所做的事情,不正是在尽可能地模拟现实吗?所以,计算机中所说的签名和生活中所说的签名在本质上是一样的!
为什么要给Android应用程序签名?
如果只能用一句简单的话语来回答这个问题的话,只能说:“ 这是Android系统所要求的 ”。Android 系统要求每一个 Android 应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个 Android 应用程序没有经过数字签名,是没有办法安装到系统中的!Android 通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
为什么我开发的 Android 应用程序没有做什么签名也能在模拟器和手机上运行?
你没有给 Android 应用程序签名并不代表 Android 应用程序没有被签名。为了方便我们开发调试程序,ADB 会自动的使用 debug 密钥为应用程序签名。debug 密钥在哪?debug 密钥是一个名为 debug.keystore 的文件,是 android studio 自动生成的,具体路径还是建议自己去 Google
先看一下这些工具默认所在的路径,zipalign 的话只是 APK 优化工具:
keytool:该工具位于 jdk 安装路径的bin目录下;
jarsigner:该工具位于 jdk 安装路径的bin目录下;
zipalign:该工具位于 Android-sdk-windows/tools/ 目录下;
使用 keytool 工具生成数字证书
keytool -genkey -alias test.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
keytool 是工具名称,-genkey 意味着执行的是生成数字证书操作,-v表示将生成证书的详细信息打印出来,显示在dos窗口中;
-alias test.keystore 表示证书的别名为 “ test.keystore ”,当然可以不和上面的文件名一样;
-keyalg RSA 表示生成密钥文件所采用的算法为 RSA ;
-validity 40000 表示该数字证书的有效期为 40000 天,意味着 20000 天之后该证书将失效
-keystore demo.keystore 表示生成的数字证书的文件名为 “ test.keystore ” ;
使用 jarsigner 工具为 Android 应用程序签名
jarsigner -verbose -keystore test.keystore -signedjar demo_signed.apk demo.apk testkey
jarsigner是工具名称,-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中;
-keystore demo.keystore 表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;
-signedjar demo_signed.apk demo.apk 表示给 demo.apk 文件签名,签名后的文件名称为 demo_signed.apk;
最后面的 test.keystore 表示证书的别名,对应于生成数字证书时 -alias 参数后面的名称
使用 zipalign 工具优化 apk(使用 zipalign 优化 apk 需要在签名之前)
zipalign -v 4 demo_signed.apk demo_signed_aligned.apk
zipalign 是工具名称,-v 表示在 DOS 窗口打印出详细的优化信息;
demo_signed.apk demo_signed_aligned.apk 表示对已签名文件demo_signed.apk 进行优化,优化后的文件名为 demo_signed_aligned.apk
说明:如果你以前的程序是采用默认签名的方式( 即 debug 签名 ),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。
目前 apk 主流的签名方案都采用 jar signer + apk v2 signer
了,我最近更新了一篇 Android APK v2 签名相关博客小伙伴们可以看看,玩转 Android APK 签名,是时候该用上 apksigner 工具给你的 APK 签名了:https://bin.zmide.com/?p=879
全部评论:1条