- 浏览: 720601 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
cuqing:
laogao598599 写道匿名内部类不一定是局部内部类,还 ...
匿名内部类访问外部类中的局部变量必须是final属性 -
laogao598599:
匿名内部类不一定是局部内部类,还可以作为成员变量
匿名内部类访问外部类中的局部变量必须是final属性 -
stand_star:
非常给力!
struts2验证规则配置文件命名方式 -
wenlongsust:
嗯, 将返回值修改为html的确就可以了
EasyUI form ajax submit后,在IE下提示下载内容的解决办法 -
勇往直前wwt:
这样是自动增长,但每次id还得插入,如何只插入其他字段而让id ...
把主键定义为自动增长标识符类型
概述
Android系统要求,所有的程序经过数字签名后才能安装。Android系统使用这个证书来识别应用程序的作者,并且建立程序间的信任关系。证书不是用于用户控制哪些程序可以安装。证书不需要授权中心来签名:Android应用程序上使用自己签名的证书是完全允许且普遍的。
理解Android应用程序签名有以下几个重要点:
所有的应用程序都必须签名。系统不会安装任何一个不签名的程序。
· 你可以使用自己的证书来签名。不需要任何授权中心。
· 当你要为最终用户发布你的应用程序的时候,你必须签入一个合适的密钥。你不可以发布程序的时候还使用SDK工具签入的Debug Key。
· 系统只在安装应用程序的时候检测证书的有效期。如果应用程序在安装之后证书失效了,那么,应用程序还是可以正常工作。
· 你可以使用标准工具——Keytool和Jarsigner——生成Key并签名apk文件。
· 一旦你为应用程序签名了,一定要使用zipalign工具来优化最终的APK包。
Android系统不会安装和运行没有正确签名的应用程序。这条规则适用于任何运行Android系统的地方,不管是真机还是模拟器。正是由于这个原因,你必须在模拟器或真机上运行/调试程序之前对程序进行签名。
当你调试应用程序时,Android SDK工具替你对应用程序进行了签名。Eclipse的ADT插件和Ant编译工具都提供了两种签名模式——Debug模式和Release模式。
· 当开发和测试时,你可以使用Debug模式。在Debug模式下,编译工具使用内嵌在JDK中的Keytool工具来创建一个keystore和一个 key(包含公认的名字和密码)。在每次编译的时候,使用这个Debug Key来为apk文件签名。由于密码是公认的,在每次编译的时候,也不需要提示你输入keystore和key密码。
· 当你的程序准备发布时,你必须在Release模式下,使用密钥来为apk文件签名。有以下两种方式可以做到:
o 命令行中使用Keytool和Jarsigner。在这个方法中,首先需要编译出一个未签名的apk。然后使用Jarsigner(或相似的工具),用你的密钥为apk手动签名。如果你没有合适的密钥,你可以运行Keytool来手动生成自己的keystore/key。
o 使用ADT导出向导。如果你使用Eclipse/ADT插件进行开发,你可以使用导出向导来编译程序,生成密钥(如果需要),并为apk签名,所有这些操作都在导出向导中。一旦你的程序签名了,别忘了运行zipalign来为apk进行额外的优化。
签名策略
应用程序签名的某些方面可能会影响应用程序的开发,特别是你打算一起发布多个应用程序的时候。
一般来说,推荐的策略是在整个应用程序寿命内,所有的程序签上相同的证书。以下有几个应该这么做的原因:
· 应用程序升级——当你对应用程序进行升级时,如果你想用户平稳的升级,那么,你就需要签上相同的证书。当系统安装一个升级应用程序时,如果新版本的证书与老版本的证书有匹配的话,那么,系统才会允许进行升级。如果你没有为版本签上合适的证书,当你安装时,你需要给应用程序指定一个新的包名——在这种情况下,用户安装的新版本,被当作是一个全新的应用程序。
· 应用程序模块化——如果应用程序请求的话,Android系统允许签有相同证书的应用程序运行在相同的进程里,这样,系统就会把它们看作是一个单一的应用程序。用这种方法配置应用程序,用户可以选择更新每个独立的模块。
· 代码/数据权限共享——Android系统提供了基于签名的权限检查,因此,如果应用程序间签有特定的证书,那么,它们之间可以共享功能。通过多个程序签有相同的证书并且使用基于签名的权限检查,你的程序可以以一种安全的方式共享代码和数据。
还有一个决定签名策略的重要因素是:如何设定key的有效期。
· 如果你计划支持单个应用程序的升级,你需要确保你的key拥有一个超过期望的应用程序生命周期的有效期。推荐使用25年或更多的有效期。当你的key过期了,用户也就不能平稳的更新到新版本了。
· 如果你想给多个无关的应用程序签上相同的key,那么,你必须确保key的有效期超过所有应用程序所有版本的生命周期,包括将来有可能添加到这一阵营的程序。
· 如果你想在Android Market上发布你的程序,key的有效期必须在2033.10.22以后。Market服务器强制这一要求,目前是保证用户可以平稳的更新他们的程序。
当你设计应用程序时,一定要把这些点记在脑子里,并且使用一个合适的证书来为应用程序签名。
签名的基本设定
在你开始之前,你必须保证Keytool对SDK编译工具来说是可利用的。多数情况下,你可以通过设置JAVA_HOME环境变量来告诉SDK编译工具如何找到Keytool。另外,你还可以添加JDK中Keytool的路径到PATH的变量里。
如果你在Linux上开发,并且使用GNU编译器来编译Java,那么,请确保系统是使用JDK中的Keytool,而不是gcj。如果Keytool已经在你的PATH中,它有可能是对/usr/bin/keytool的符号链接。在这种情况下,检查符号链接的目标,确保它是指向JDK中的 Keytool。
如果你打算对公众释放你的应用程序,你还需要Jarsigner工具。Jarsigner和Keytool都包含在JDK中。
Debug模式下签名
Android编译工具提供了Debug签名模式,使得开发和调试应用程序更加容易,而且还满足Android系统的签名要求。当使用Debug模式编译你的app时,SDK工具会调用Keytool工具自动创建一个Debug的keystore和key。然后,这个Debug key会自动用于apk的签名,这样,你不需要使用你自己的key来为应用程序包签名。
SDK工具使用预先定义好的名字/密码来创建Debug keystore/key:
· Keystore名字:“debug.keysotre”
· Keystore密码:“android”
· Key别名:“androiddebugkey”
· Key密码:“android”
· CN:“CN=Android Debug,O=Android,C=US”
如果需要的话,你可以改变Debug keystore/key的位置和名字,或者提供一个自定义的Debug keysotre/key。然而,任何自定义的Debug keystore/key必须使用和默认Debug key(上面描述的)相同的名字和密码。(在Eclipse/ADT中,操作 Windows>Preferences>Android>Build实现。)
注意: 你不能将签有Debug证书的应用程序发布给公众。
Eclipse 用户
如果你在Eclipse/ADT下开发(并且已经按照上面描述的“签名的基本设定”配置了Keytool),Debug模式下签名默认是开启的。当你运行或是调试应用程序时,ADT会使用Debug证书进行签名,并运行zipalign,然后安装到选择的模拟器或是连接上的设备。整个过程不需要你参与,前提是ADT能访问Keytool。
Ant 用户
如果你使用Ant来编译你的apk文件,需要在ant命令中添加debug选项来开启Debug签名模式(假设你正在使用由android工具生成 build.xml文件)。当你运行ant debug来编译你的程序时,编译脚本会生成一个keystore/key,并为apk进行签名。然后脚本会使用zipalign工具对apk进行对齐处理。整个过程不需要你参与。阅读“其它IDE下开发:Debug模式编译”来了解更多的信息。
Debug证书过期
Debug模式下签名用的证书(默认是Eclipse/ADT和Ant编译)自从它创建之日起,1年后就会失效。
当证书失效时,你会得到一个编译错误,在Ant编译上,错误如下:
debug:
[echo] Packaging bin/samples-debug.apk, and signing it with a debug key...
[exec] Debug Certificate expired on 8/4/08 3:43 PM
在Eclipse/ADT中,Android控制台上你将会看到一个相似的错误。
为了解决这个问题,只需要删掉debug.keystore文件即可。AVD默认存储的位置在:~/.android/avd(OS X和Linux),C:\Documents and Settings\\.android\(Windows XP),C:\Users\\.android\(Windows Vista)。
当下一次编译的时候,编译工具会重新生成一个新的keystore和Debug key。
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命令并传入一些可选参数,如下表所示。
警告: 确保密钥的安全。一定要阅读“安全储存你的密钥”中讨论如何确保你的密钥的安全以及这对你和用户为何如此重要。尤其是,当你生成你的密钥时,一定要为keystore和key使用强密码。
Keytool选项 描述
-genkey 生成一个键对(公钥和密钥)
-v 日志输出
-keystore .keystore 命名包含密钥的keystore
-storepass 设定keystore的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。
-alias 设定key的别名
-keyalg 指定生成key时使用的加密算法。支持DSA和RSA。
-dname 指定一个描述谁创建key的名字。该值将填入证书发行人的字段。
注意:你不需要在命令行中指明这些选项。如果不提供,Jarsigner会提示你输入每个字段(CN,OU等)。
-validity Key的有效期,天数。
注意:推荐使用10000或更大的数。
-keypass Key的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。
下面是使用Keytool命令生成密钥的例子:
$ keytool -genkey -v -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的信息,请参考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。
2. 在Release模式下编译程序
为了给用户释放程序,你必须在Release模式下编译程序。在Release模式下,编译程序不会进行默认签名,并且你需要使用密钥进行签名。
注意: 你不能释放未签名的程序,或签有Debug key的程序。
使用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/文件夹中,名为-unsigned.apk。由于apk文件还没有签名,所以你必须手动的使用密钥进行签名,然后使用zipalign进行对齐。
然而,Ant编译脚本也可以替你执行签名和对齐操作,前提是你在build.properties文件中提供了keystore的名字和key的别名。如果提供了这些信息,编译脚本在执行ant release命令时会提示你输入keystore和key的密码,对包进行签名并对齐。最后输出的文件位于工程的bin/文件夹中,名为-release.apk。如果按照上述自动签名和对齐操作执行,那么,你就可以跳过下面的手动步骤(步骤3和4)。了解如何在build.properties文件中指定keystore和alias,请参考“其它IDE下开发:Release模式编译”。
3. 使用密钥签名程序
如果你已经准备好要签名的程序包的话,你可以使用Jarsigner工具进行签名。如“基本设定”中描述的,请确保Jarsigner工具可用。此外,确保包含密钥的keystore可用。
为了签名应用程序,你需要运行Jarsigner,并引用应用程序的apk及包含密钥的keystore。下表列出了你可能使用的选项。
Jarsigner选项 描述
-keystore .keystore 指定包含密钥的keystore的名字
-verbose 日志输出
-storepass 指定keystore的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Jarsigner会提示你输入。这样,你的密码就不会储存在shell记录中了
-keypass 指定密钥的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Jarsigner会提示你输入。这样,你的密码就不会储存在shell记录中了
下面是一个使用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进行签名。
了解更多Jarsigner的信息,请参考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。
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的密码。
总而言之,只要你在生成、使用和储存密钥时有安全意识的话,它还是很安全的。
Android系统要求,所有的程序经过数字签名后才能安装。Android系统使用这个证书来识别应用程序的作者,并且建立程序间的信任关系。证书不是用于用户控制哪些程序可以安装。证书不需要授权中心来签名:Android应用程序上使用自己签名的证书是完全允许且普遍的。
理解Android应用程序签名有以下几个重要点:
所有的应用程序都必须签名。系统不会安装任何一个不签名的程序。
· 你可以使用自己的证书来签名。不需要任何授权中心。
· 当你要为最终用户发布你的应用程序的时候,你必须签入一个合适的密钥。你不可以发布程序的时候还使用SDK工具签入的Debug Key。
· 系统只在安装应用程序的时候检测证书的有效期。如果应用程序在安装之后证书失效了,那么,应用程序还是可以正常工作。
· 你可以使用标准工具——Keytool和Jarsigner——生成Key并签名apk文件。
· 一旦你为应用程序签名了,一定要使用zipalign工具来优化最终的APK包。
Android系统不会安装和运行没有正确签名的应用程序。这条规则适用于任何运行Android系统的地方,不管是真机还是模拟器。正是由于这个原因,你必须在模拟器或真机上运行/调试程序之前对程序进行签名。
当你调试应用程序时,Android SDK工具替你对应用程序进行了签名。Eclipse的ADT插件和Ant编译工具都提供了两种签名模式——Debug模式和Release模式。
· 当开发和测试时,你可以使用Debug模式。在Debug模式下,编译工具使用内嵌在JDK中的Keytool工具来创建一个keystore和一个 key(包含公认的名字和密码)。在每次编译的时候,使用这个Debug Key来为apk文件签名。由于密码是公认的,在每次编译的时候,也不需要提示你输入keystore和key密码。
· 当你的程序准备发布时,你必须在Release模式下,使用密钥来为apk文件签名。有以下两种方式可以做到:
o 命令行中使用Keytool和Jarsigner。在这个方法中,首先需要编译出一个未签名的apk。然后使用Jarsigner(或相似的工具),用你的密钥为apk手动签名。如果你没有合适的密钥,你可以运行Keytool来手动生成自己的keystore/key。
o 使用ADT导出向导。如果你使用Eclipse/ADT插件进行开发,你可以使用导出向导来编译程序,生成密钥(如果需要),并为apk签名,所有这些操作都在导出向导中。一旦你的程序签名了,别忘了运行zipalign来为apk进行额外的优化。
签名策略
应用程序签名的某些方面可能会影响应用程序的开发,特别是你打算一起发布多个应用程序的时候。
一般来说,推荐的策略是在整个应用程序寿命内,所有的程序签上相同的证书。以下有几个应该这么做的原因:
· 应用程序升级——当你对应用程序进行升级时,如果你想用户平稳的升级,那么,你就需要签上相同的证书。当系统安装一个升级应用程序时,如果新版本的证书与老版本的证书有匹配的话,那么,系统才会允许进行升级。如果你没有为版本签上合适的证书,当你安装时,你需要给应用程序指定一个新的包名——在这种情况下,用户安装的新版本,被当作是一个全新的应用程序。
· 应用程序模块化——如果应用程序请求的话,Android系统允许签有相同证书的应用程序运行在相同的进程里,这样,系统就会把它们看作是一个单一的应用程序。用这种方法配置应用程序,用户可以选择更新每个独立的模块。
· 代码/数据权限共享——Android系统提供了基于签名的权限检查,因此,如果应用程序间签有特定的证书,那么,它们之间可以共享功能。通过多个程序签有相同的证书并且使用基于签名的权限检查,你的程序可以以一种安全的方式共享代码和数据。
还有一个决定签名策略的重要因素是:如何设定key的有效期。
· 如果你计划支持单个应用程序的升级,你需要确保你的key拥有一个超过期望的应用程序生命周期的有效期。推荐使用25年或更多的有效期。当你的key过期了,用户也就不能平稳的更新到新版本了。
· 如果你想给多个无关的应用程序签上相同的key,那么,你必须确保key的有效期超过所有应用程序所有版本的生命周期,包括将来有可能添加到这一阵营的程序。
· 如果你想在Android Market上发布你的程序,key的有效期必须在2033.10.22以后。Market服务器强制这一要求,目前是保证用户可以平稳的更新他们的程序。
当你设计应用程序时,一定要把这些点记在脑子里,并且使用一个合适的证书来为应用程序签名。
签名的基本设定
在你开始之前,你必须保证Keytool对SDK编译工具来说是可利用的。多数情况下,你可以通过设置JAVA_HOME环境变量来告诉SDK编译工具如何找到Keytool。另外,你还可以添加JDK中Keytool的路径到PATH的变量里。
如果你在Linux上开发,并且使用GNU编译器来编译Java,那么,请确保系统是使用JDK中的Keytool,而不是gcj。如果Keytool已经在你的PATH中,它有可能是对/usr/bin/keytool的符号链接。在这种情况下,检查符号链接的目标,确保它是指向JDK中的 Keytool。
如果你打算对公众释放你的应用程序,你还需要Jarsigner工具。Jarsigner和Keytool都包含在JDK中。
Debug模式下签名
Android编译工具提供了Debug签名模式,使得开发和调试应用程序更加容易,而且还满足Android系统的签名要求。当使用Debug模式编译你的app时,SDK工具会调用Keytool工具自动创建一个Debug的keystore和key。然后,这个Debug key会自动用于apk的签名,这样,你不需要使用你自己的key来为应用程序包签名。
SDK工具使用预先定义好的名字/密码来创建Debug keystore/key:
· Keystore名字:“debug.keysotre”
· Keystore密码:“android”
· Key别名:“androiddebugkey”
· Key密码:“android”
· CN:“CN=Android Debug,O=Android,C=US”
如果需要的话,你可以改变Debug keystore/key的位置和名字,或者提供一个自定义的Debug keysotre/key。然而,任何自定义的Debug keystore/key必须使用和默认Debug key(上面描述的)相同的名字和密码。(在Eclipse/ADT中,操作 Windows>Preferences>Android>Build实现。)
注意: 你不能将签有Debug证书的应用程序发布给公众。
Eclipse 用户
如果你在Eclipse/ADT下开发(并且已经按照上面描述的“签名的基本设定”配置了Keytool),Debug模式下签名默认是开启的。当你运行或是调试应用程序时,ADT会使用Debug证书进行签名,并运行zipalign,然后安装到选择的模拟器或是连接上的设备。整个过程不需要你参与,前提是ADT能访问Keytool。
Ant 用户
如果你使用Ant来编译你的apk文件,需要在ant命令中添加debug选项来开启Debug签名模式(假设你正在使用由android工具生成 build.xml文件)。当你运行ant debug来编译你的程序时,编译脚本会生成一个keystore/key,并为apk进行签名。然后脚本会使用zipalign工具对apk进行对齐处理。整个过程不需要你参与。阅读“其它IDE下开发:Debug模式编译”来了解更多的信息。
Debug证书过期
Debug模式下签名用的证书(默认是Eclipse/ADT和Ant编译)自从它创建之日起,1年后就会失效。
当证书失效时,你会得到一个编译错误,在Ant编译上,错误如下:
debug:
[echo] Packaging bin/samples-debug.apk, and signing it with a debug key...
[exec] Debug Certificate expired on 8/4/08 3:43 PM
在Eclipse/ADT中,Android控制台上你将会看到一个相似的错误。
为了解决这个问题,只需要删掉debug.keystore文件即可。AVD默认存储的位置在:~/.android/avd(OS X和Linux),C:\Documents and Settings\\.android\(Windows XP),C:\Users\\.android\(Windows Vista)。
当下一次编译的时候,编译工具会重新生成一个新的keystore和Debug key。
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命令并传入一些可选参数,如下表所示。
警告: 确保密钥的安全。一定要阅读“安全储存你的密钥”中讨论如何确保你的密钥的安全以及这对你和用户为何如此重要。尤其是,当你生成你的密钥时,一定要为keystore和key使用强密码。
Keytool选项 描述
-genkey 生成一个键对(公钥和密钥)
-v 日志输出
-keystore .keystore 命名包含密钥的keystore
-storepass 设定keystore的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。
-alias 设定key的别名
-keyalg 指定生成key时使用的加密算法。支持DSA和RSA。
-dname 指定一个描述谁创建key的名字。该值将填入证书发行人的字段。
注意:你不需要在命令行中指明这些选项。如果不提供,Jarsigner会提示你输入每个字段(CN,OU等)。
-validity Key的有效期,天数。
注意:推荐使用10000或更大的数。
-keypass Key的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Keytool会提示你输入。这样,你的密码就不会储存在shell记录中了。
下面是使用Keytool命令生成密钥的例子:
$ keytool -genkey -v -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的信息,请参考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。
2. 在Release模式下编译程序
为了给用户释放程序,你必须在Release模式下编译程序。在Release模式下,编译程序不会进行默认签名,并且你需要使用密钥进行签名。
注意: 你不能释放未签名的程序,或签有Debug key的程序。
使用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/文件夹中,名为-unsigned.apk。由于apk文件还没有签名,所以你必须手动的使用密钥进行签名,然后使用zipalign进行对齐。
然而,Ant编译脚本也可以替你执行签名和对齐操作,前提是你在build.properties文件中提供了keystore的名字和key的别名。如果提供了这些信息,编译脚本在执行ant release命令时会提示你输入keystore和key的密码,对包进行签名并对齐。最后输出的文件位于工程的bin/文件夹中,名为-release.apk。如果按照上述自动签名和对齐操作执行,那么,你就可以跳过下面的手动步骤(步骤3和4)。了解如何在build.properties文件中指定keystore和alias,请参考“其它IDE下开发:Release模式编译”。
3. 使用密钥签名程序
如果你已经准备好要签名的程序包的话,你可以使用Jarsigner工具进行签名。如“基本设定”中描述的,请确保Jarsigner工具可用。此外,确保包含密钥的keystore可用。
为了签名应用程序,你需要运行Jarsigner,并引用应用程序的apk及包含密钥的keystore。下表列出了你可能使用的选项。
Jarsigner选项 描述
-keystore .keystore 指定包含密钥的keystore的名字
-verbose 日志输出
-storepass 指定keystore的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Jarsigner会提示你输入。这样,你的密码就不会储存在shell记录中了
-keypass 指定密钥的密码。
基于安全考虑,不要在命令行中包含这一选项,除非你在一个安全的计算机上。如果你不提供,Jarsigner会提示你输入。这样,你的密码就不会储存在shell记录中了
下面是一个使用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进行签名。
了解更多Jarsigner的信息,请参考http://java.sun.com/j2se/1.5.0/docs/tooldocs/#security。
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的密码。
总而言之,只要你在生成、使用和储存密钥时有安全意识的话,它还是很安全的。
发表评论
-
java.lang.ClassCircularityError
2015-07-27 00:39 1360类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出 ... -
随记内容
2015-06-09 00:10 0public static CloseableHttpClie ... -
httpclient3.1使用小结
2017-08-18 00:08 691Jakarta的httpclient3.1是 ... -
POI
2014-05-21 16:08 576Apache POI是一个开源的Java读写Excel、WOR ... -
servlet与js 跳转
2014-05-15 17:19 851servlet跳转 1.request.getRequestD ... -
jdk各个版本下载地址
2014-05-12 17:40 989http://www.oracle.com/technetwo ... -
Jackson库
2014-04-20 13:17 982概述 Jackson库(http://jac ... -
生成Webservice客户端的4种方法
2014-04-09 15:39 11071.使用Axis生产客户端代码(另存为bat文件) 之前很多次 ... -
map遍历
2013-12-14 23:41 521Map<String, String> map = ... -
POI处理Excel
2013-12-14 22:44 8981.读取2003 InputStream stream ... -
常用数据库 JDBC URL 格式
2013-12-04 18:35 1140Microsoft SQL Server Microsoft ... -
公共查询接口
2013-12-04 15:19 1220http://www.webmasterhome.cn/ ht ... -
天气预报接口
2013-12-04 11:18 1405天气预报接口(中国天气网) 中国天气weather.com ... -
Java 判断文件夹、文件是否存在
2013-12-04 10:00 51371、判断文件是否存在,不存在创建文件 File file=ne ... -
Jakarta Commons Pool
2013-12-03 14:55 881使用Jakarta Commons Pool可以根据需要快速的 ... -
多线程读写资料利器-ReentrantReadWriteLock
2013-12-03 14:49 1314多线程读写文件利器-ReentrantReadWriteLoc ... -
保持顺序的 Java Properties 类
2013-12-02 16:21 907public class OrderedProperties ... -
java中用poi处理Excel表格之读取
2013-11-18 16:24 2034http://tool.oschina.net/apidocs ... -
科大讯飞语音识别服务
2013-09-03 17:06 14241.官方地址:http://open.voicecloud.c ... -
ibatis数据库字段带下划线(_)映射与java类不一致
2013-08-24 17:00 5349ibatis数据库字段带下划线(_)与java pojo对象映 ...
相关推荐
在Android平台上,应用程序的发布和安装需要经过一个关键的安全步骤,即签名。"Android自签名程序"是指开发者使用自己的密钥对APK文件进行签名,以确保应用的完整性和来源可靠性。这一过程对于那些需要在非Google ...
下面我们将详细讲解Android程序签名打包的过程及相关知识点。 首先,Android程序的数字证书可以是自签名的,无需权威的数字证书机构认证。这意味着开发者可以使用自己的私钥来生成证书。不过,如果要将应用正式发布...
这个工具包主要用于对APK进行二次签名打包,以确保应用程序能够正确地在Android设备上运行,并且可以上传到Google Play商店或其他第三方应用市场。 首先,我们需要理解什么是Android应用签名。在Android系统中,每...
在Android应用开发中,发布应用到Google Play或其他第三方市场前,必须对其进行签名。签名过程确保了应用程序的来源可追溯,并且在安装时提供了一定的安全性。本篇将详细讲解Windows版本的Android Apk签名工具及其...
### Android程序如何生成签名文件 在开发Android应用的过程中,对应用程序进行签名是非常重要的一步,它不仅确保了应用的完整性和来源可信度,还为应用更新提供了便利。本篇文章将详细介绍如何为Android应用程序...
在Android操作系统中,签名文件扮演着至关重要的角色,它们确保了系统的安全性和完整性。本文将深入探讨"android原生系统签名文件"的相关知识点,以及压缩包中提供的各个文件的用途。 首先,Android系统使用签名来...
Android应用程序在发布之前必须经过签名,以便系统可以验证其来源并允许安装。本篇文章将详细解析“Android系统签名工具”的使用,以及如何通过CMD(命令行)进行签名操作。 一、Android签名机制 Android系统的...
2) **证书可以自签名**:Android程序可以使用开发者自签的证书,不需要权威的证书颁发机构(CA)的认证。 3) **正式发布需用正式证书**:发布应用时,需要用非调试证书签名,通常是一个长期有效的私钥生成的证书,而...
在Android应用开发中, APK(Android Package)是用于分发和安装Android应用程序的文件格式。在将APK发布到Google Play商店或者在设备上安装之前,必须对其进行签名。签名过程是为了确保应用程序的完整性和开发者...
在Android应用开发中,签名是确保应用程序安全性和完整性的关键环节。Android系统要求所有安装到设备上的APK文件都必须经过签名,以便验证其来源和完整性。本文将深入探讨Android签名的概念、签名生成过程以及签名...
在Android系统中,签名工具是开发和发布应用过程中的关键环节。它确保了应用程序的完整性和安全性,同时允许系统对应用进行权限管理。本文将详细阐述Android系统的签名机制,包括其重要性、工作原理以及如何使用签名...
Android系统签名是为了验证应用程序或系统更新是否来源于可信的源,并且未经篡改。这个过程涉及到一系列的安全机制,包括公钥加密、数字签名以及证书验证。 首先,我们需要理解Android的签名过程。每个Android应用...
在Android操作系统中,系统签名是一项至关重要的安全机制,它确保了系统的完整性以及应用程序的权限管理。这个名为"Android 系统签名.zip"的压缩包包含了用于Android系统签名的关键文件,让我们逐一了解它们的作用。...
Android客户端签名漏洞是指在Android应用程序的签名机制中存在的一种安全缺陷,允许攻击者在不修改原有应用签名的情况下,向合法应用中添加恶意代码,从而绕过Android系统的签名验证机制。这种漏洞的存在,使得原本...
1.1 APK签名定义:APK是Android应用程序的打包文件,包含了应用的所有代码、资源和元数据。签名是对APK进行数字签名的过程,目的是确保APK未被篡改,并且能证明应用的来源。 1.2 作用: - 验证完整性:通过对比...
为了确保应用程序的完整性和安全性,每个发布的Android应用程序都需要进行签名。本篇文章将详细解释如何生成Android签名文件(通常为*.keystore文件),并深入探讨其背后的技术原理。 #### 一、什么是Android签名...
在Android上,每个应用程序在发布之前都需要经过签名。签名的主要目的是验证应用的开发者身份,确保应用在安装和运行时未被篡改,同时允许应用获取特定的权限。Android系统使用公钥加密算法来实现这一目标,其中私钥...
在 Android 平台上,Delphi XE5 提供了详细的签名机制,以确保应用程序的安全和可靠性。在本文中,我们将详细介绍 Delphi XE5 中的签名机制,包括签名文件的创建、选择和使用。 签名文件是 Delphi XE5 中一个重要的...
在Android系统中,APK(Android Package)是应用程序的基本打包格式,它包含了应用的所有代码、资源和元数据。为了确保安全性和防止恶意篡改,Android系统对APK进行了签名机制。"Android系统签名APK"是指使用特定的...
在Android操作系统中,系统签名是确保应用程序和系统组件安全性的关键环节。对于Android 8.1 Oreo(API级别27)来说,开发者如果想要创建一个系统应用或者修改系统组件,必须遵循特定的签名流程。这里我们将深入探讨...