Android 应用程序签名(二)

link:  http://www.eoeandroid.com/thread-73206-1-1.html

Release模式下签名


       当你的程序准备好释放给其它用户时,你必须:
       1.   获取一个合适的密钥
       2.      在Release模式下编译程序
       3.      使用密钥签名程序
       4.      对齐APK包
       如果你是使用Eclipse/ADT插件开发,你可以使用导出向导来完成编译、签名和对齐等操作。在整个过程中,导出向导甚至还可以生成一个新的keystore和密钥。因此,如果你使用Eclipse,你可以直接跳到“使用Eclipse ADT编译和签名”。

        1. 获取一个合适的密钥
       为了进行程序的签名,首先,你必须有一个合适的密钥。密钥指:
        个人持有。
        代表个人、公司或组织实体的身份。
        拥有一个有效期。有效期推荐超过25年。

       如果你在Android Market上发布你的程序,需要注意一点的是:程序的有效期需要在2033.10.22之后。你不能上传一个应用程序,而它的key的有效期是在这个日期之前。
       不是由Android SDK工具生成的Debug key。
       如果你没有一个合适的key,你一定要使用Keytool来生成一个。如“基本设定”中描述的,确保Keytool可用。
        为了用Keytool生成一个key,使用keytool命令并传入一些可选参数,如下表所示。


下面是使用Keytool 命令生成密钥的例子:
$ keytool  - genkey  - - keystore  my - release - key . keystore 
- alias  alias_name  - keyalg RSA  - validity  10000
    运行上面的例子命令, Keytool 会提示你输入 keystore key 的密码,并且会提示你输入 key 中其它的字段。然后,它会生成一个叫做 my-release-key.keystore 的文件。 keystore key 受你输入的密码保护。 keystore 中包含一个 key ,有效期为 10000 天。别名将在后面用到,在程序签名时指当前这个 keystore
了解更多关于 Keytool 的信息, 2. Release模式下编译程序
为了给用户释放程序,你必须在 Release 模式下编译程序。在 Release 模式下,编译程序不会进行默认签名,并且你需要使用密钥进行签名。
   使用Eclipse
右击 Package Explorer 中的工程,选择 Android Tools>Export Unsigned Application Package ,导出一个未签名的 apk 。然后指定未签名 apk 的存储位置。(另外,你也可以在 Eclipse 中打开 AndroidManifest.xml 文件,打开 Manifest Tab ,然后点击 Export an unsigned APK )。
注意:你也可以使用导出向导来完成编译和签名步骤,参考“使用 Eclipse/ADT 编译和签名”。
  使用 Ant
如果你正在使用 Ant ,那么你可以在 ant 命令中加入 release 选项来开启 Release 模式。例如,如果你在包含 build.xml 文件的文件夹上运行 Ant ,命令可能看起来是这样:
ant release
一般,编译脚本在编译 apk 的时候不会进行签名。输出的文件位于工程的 bin/ 文件夹中,名为 <your_project_name>-unsigned.apk 。由于 apk 文件还没有签名,所以你必须手动的使用密钥进行签名,然后使用 zipalign 进行对齐。
    然而, Ant 编译脚本也可以替你执行签名和对齐操作,前提是你在 build.properties 文件中提供了 keystore 的名字和 key 的别名。如果提供了这些信息,编译脚本在执行 ant release 命令时会提示你输入 keystore key 的密码,对包进行签名并对齐。最后输出的文件位于工程的 bin/ 文件夹中,名为 <your_project_name>-release.apk 。如果按照上述自动签名和对齐操作执行,那么,你就可以跳过下面的手动步骤(步骤 3 4 )。了解如何在 build.properties 文件中指定 keystore alias ,请参考“其它 IDE 下开发: Release 模式编译”。


      3. 使用密钥签名程序
   如果你已经准备好要签名的程序包的话,你可以使用 Jarsigner 工具进行签名。如“基本设定”中描述的,请确保 Jarsigner 工具可用。此外,确保包含密钥的 keystore 可用。
为了签名应用程序,你需要运行 Jarsigner ,并引用应用程序的 apk 及包含密钥的 keystore 。下表列出了你可能使用的选项。

      下面是一个使用Jarsigner对my_application.apk进行签名的例子,使用了上面创建的keystore。
      $ jarsigner -verbose -keystore my-release-key.keystore 
       my_application.apk alias_name
       运行上面的示例命令,Jarsigner会提示你输入keystore和key的密码。然后它会修改apk文件,意味着apk文件现在已经签上名了。注意:你可以使用不同的key对apk多次签名。
       检验apk文件是否签名,可以使用下面的命令:
       $ jarsigner -verify my_signed.apk
       如果apk签名正确,Jarsigner输出“jar verified”。如果你想了解更多的细节,你可以尝试这些命令:
       $ jarsigner -verify -verbose my_application.apk
       或者
       $ jarsigner -verify -verbose -certs my_application.apk
       上面的命令,添加-certs选项,将会显示“CN=”行,描述谁创建了密钥。
       注意: 如果你看到“CN=Android Debug”,这意味apk文件使用Android SDK生成的Debug key签的名。如果你想发布你的程序,你必须使用自己的密钥替换Debug key进行签名。

       4. 对齐APK包
       一旦你对apk文件使用密钥进行签名后,一定要运行zipalign进行对齐。这个工具能做到让那些未压缩的数据以特定的字节对齐。以4字节对齐能优化性能。当对齐后,Android系统能通过mmap()阅读文件,即使它们包含二进制数据,而不是从包中拷贝所有的数据。好处是在运行程序时减少了随机读取内存的消耗。
zipalign由Android SDK提供,包含在tools/文件夹下。想对齐签名后的apk,执行:
       zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
       -v标志表示开始日志输出(可选)。4表示对齐的字节(不要使用非4的数字)。第一个文件参数是你的签名后apk(输入),第二个文件参数是目的apk文件(输出)。如果你想覆盖已经存在的apk,添加-f标志。
       注意: 在你使用zipalign优化包之前,输入的apk必须是使用密钥签名后的。如果在zipalign操作之后再签名,那么对齐操作就白做了。
       了解更多信息,请阅读“zipalign”工具的文档。

        使用Eclipse/ADT编译和签名
       如果你在使用Eclipse/ADT插件,你可以使用导出向导导出一个签名的apk(甚至可以创建一个新的keystore,如果需要的话)。导出向导替你做了所有与Keytool和Jarsigner交互的工作,并且使用GUI来签名应用程序,替代了上面提到的手动编译、签名和对齐的操作。一旦向导完成了编译和签名,也还会使用zipalign执行包的对齐操作。由于导出向导要使用Keytoo和Jarsigner。你应该确保它们是可用的,如“签名的基本设定”中描述的那样。

        安全储存你的密钥
        维护密钥的安全是极其重要的。如果你让其他人使用了你的key,或者你把keystore和密码放在一个不安全的地方以至于第三方人员找到并使用了的话,那么,你的授权认证和用户的信任都将受到连累。
如果第三方没有经过你的允许拿走了你的key,那个人就可以签名并发布应用程序,并恶意替换或攻击你的正版程序。这个人还可以签名并发布应用程序,利用你的名义来攻击其它程序或者系统自身,或者破坏、偷取用户数据。
       开发者的名声依赖于正确的储存你的密钥,直到它过期。这里有几个安全储存密钥的提示:
       为key和keystore设置强密码。
       当你使用Keytool生成密钥的时候,不要再命令行中添加-storepass和-keypass选项。如果你这样做了,在shell记录中就可以获取你的密码。
       相似的,当使用Jarsigner来签名程序时,也不要在命令行中添加-storepass和-keypass选项。
       不要把密钥给别人或借给别人,不要让未授权的人知道你的keystore和key的密码。
总而言之,只要你在生成、使用和储存密钥时有安全意识的话,它还是很安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值