公开发布版的签名.
当应用准备好对外发布, 必须:
- 获取一个合适的私钥.
- 在release模式下编译应用程序.
- 使用你的私钥对应用程序进行签名.
- 使用zipalign来调整和优化APK包
如果使用Eclipse+ADT插件进行开发, 可以使用Export Wizard来处理整个的编译, 签名, 和优化过程. 在处理过程中, Export Wizard甚至允许生成一个新的keystore和私钥.
1. 获取一个合适的私钥
在给应用程序签名的准备阶段, 必须首先确保有一个用于签名的合适的私钥. 合适的私钥有如下要求:
- 是你所拥有的.
- 代表个人, 公司, 或者组织实体, 在应用里可以被识别的.
- 拥有比应用程序或者应用程序套件生命周期更长的有效期. 推荐大于25年的有效期. 如果计划在Android Market上发布应用, 注意需要有效期截止时间为 2033-10-22 以后.
- 不能上传一个有效期在此之前的应用.
- 不是由Android SDK工具生成的debug key
密钥可以是自签名的. 如果没有一个合适的密钥, 必须使用Keytool生成一个.
2. 在release模式编译应用程序.
为了向用户发布应用程序, 必须在release模式编译. 在release模式下, 编译好的应用程序默认是没签名的, 需要用私钥为它签名.
警告: 不能发布一个没有签名或者用debug key签名的应用程序.
使用Eclipse
要从Eclipse导出一个未签名的 .apk, 在Package Explorer中的project上点击鼠标右键, 选择Android Tools > Export Unsigned Application Package. 然后给未签名的.apk指定一个文件路径. (或者在Eclipse中打开AndroidManifest.xml文件, 点开Overview标签, 然后点击Export an unsigned .apk.)
注意, 完全可以在Export Wizard中执行整个的编译和签名步骤. 参见: 使用Eclipse ADT编译和签名.
使用Ant
如果使用Ant, 可以通过ant命令行的release选项开启release模式.
使用Eclipse ADT编译和签名
如果使用Eclipse和ADT插件, 可以用Export Wizard来导出一个签名的.apk(如果必要,甚至可以创建一个新的keystore.) Export Wizard为你处理所有Keytool和Jarsigner的交互操作, 这允许使用一个GUI界面来操作签名包的过程, 而不必人工处理各种编译, 签名, 以及优化对齐工作. 一旦向导编译并签名完.apk包, 它将也使用zipalign对包进行优化对齐处理. 因为Export Wizard使用到Keytool和Jarsigner, 应当确保在电脑上可以访问到这2样工具.
若要在Eclipse中创建一个签名并优化对齐后的.apk:
- 在Package Explorer中选中project, 然后选择File > Export.
- 打开Android文件夹, 选择Export Android Application, 然后点击 Next.
- Export Android Application 向导开始, 它将引导你进行签名的整个过程, 包括选择用于签名.apk的私钥(或者创建一个新的keystore和私钥)
- 完成Export Wizard后, 应用程序将被编译, 签名, 对齐, 做好了发布前的所有准备.
保证私钥安全.
对于你和你的用户来说, 维护你的私钥的安全相当关键和重要. 如果你允许别人使用你的key, 或者如果你将keystore和密码放在一个不安全的地方, 以至于第三方可以找到并使用它们, 那么你的作者身份和用户信任度将受到连累.
如果第三方在你不知情或没得到你的允许的情况下控制和使用你的key, 那么随便一个人就都可以签名和发布恶意的应用程序来替换你发布的应用, 或者干脆取代你的应用. 然后这个人可以用你的身份签名和发布应用程序, 攻击其他应用甚至直接攻击系统, 以及损坏或偷取用户数据.
开发者(或团体)的名声取决于你对你的私钥的适当保密, 任何时候, 直到key过期. 下面是一些保证key的安全性的小提示.
- 对keystore和key采用强密码.
- 当用Keytool生成key时, 不要在命令行提供-storepass 和 -keypass 选项参数. 如果非这么做, 你的密码将能够在shell历史中查到, 这样将导致任何用户都能访问.
- 类似地, 当使用Jarsigner签名应用时, 不要在命令行提供-storepass 和 -keypass参数选项.
- 不要给任何人你的私钥, 不要让未经授权的人知道你的keystore和key密码.
通常情况下, 当生成,使用和保存你的key时, 如果根据常识做了提前的预防, 那么它将会保证安全.