转:http://www.eoeandroid.com/thread-73181-1-1.html
签名策略
应用程序签名的某些方面可能会影响应用程序的开发,特别是你打算一起发布多个应用程序的时候。
一般来说,推荐的策略是在整个应用程序寿命内,所有的程序签上相同的证书。以下有几个应该这么做的原因:
应用程序升级——当你对应用程序进行升级时,如果你想用户平稳的升级,那么,你就需要签上相同的证书。当系统安装一个升级应用程序时,如果新版本的证书与老版本的证书有匹配的话,那么,系统才会允许进行升级。如果你没有为版本签上合适的证书,当你安装时,你需要给应用程序指定一个新的包名——在这种情况下,用户安装的新版本,被当作是一个全新的应用程序。
应用程序模块化——如果应用程序请求的话,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实现。)
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。
下面是使用Keytool命令生成密钥的例子: $ keytool -genkey -v -keystore my-release-key.keystore 使用Eclipse 右击Package Explorer中的工程,选择Android Tools>Export Unsigned Application Package,导出一个未签名的apk。然后指定未签名apk的存储位置。(另外,你也可以在Eclipse中打开AndroidManifest.xml文件,打开Manifest Tab,然后点击Export an unsigned APK)。 使用 Ant 如果你正在使用Ant,那么你可以在ant命令中加入release选项来开启Release模式。例如,如果你在包含build.xml文件的文件夹上运行Ant,命令可能看起来是这样: 3. 使用密钥签名程序 如果你已经准备好要签名的程序包的话,你可以使用Jarsigner工具进行签名。如“基本设定”中描述的,请确保Jarsigner工具可用。此外,确保包含密钥的keystore可用。 下面是一个使用Jarsigner对my_application.apk进行签名的例子,使用了上面创建的keystore。 $ jarsigner -verbose -keystore my-release-key.keystore 运行上面的示例命令,Jarsigner会提示你输入keystore和key的密码。然后它会修改apk文件,意味着apk文件现在已经签上名了。注意:你可以使用不同的key对apk多次签名。 检验apk文件是否签名,可以使用下面的命令: $ jarsigner -verify my_signed.apk $ jarsigner -verify -verbose my_application.apk $ jarsigner -verify -verbose -certs my_application.apk 注意: 如果你看到“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 注意: 在你使用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的密码。 总而言之,只要你在生成、使用和储存密钥时有安全意识的话,它还是很安全的。
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命令并传入一些可选参数,如下表所示。
-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/ADT编译和签名”。
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模式编译”。
为了签名应用程序,你需要运行Jarsigner,并引用应用程序的apk及包含密钥的keystore。下表列出了你可能使用的选项。
my_application.apk alias_name
如果apk签名正确,Jarsigner输出“jar verified”。如果你想了解更多的细节,你可以尝试这些命令:
或者
上面的命令,添加-certs选项,将会显示“CN=”行,描述谁创建了密钥。
-v标志表示开始日志输出(可选)。4表示对齐的字节(不要使用非4的数字)。第一个文件参数是你的签名后apk(输入),第二个文件参数是目的apk文件(输出)。如果你想覆盖已经存在的apk,添加-f标志。
发表评论
-
资料上传备份
2012-07-02 07:28 0对付对付对付对付 -
Android-sharedUserId数据权限
2012-05-02 10:16 1445Android-sharedUserId数据权限 An ... -
Android Service学习之本地服务
2012-04-18 10:28 863转: Android Service学习之本地服务 htt ... -
match_parent和fill_parent的区别 .
2012-02-18 11:49 1840match_parent和fill_parent的区别 有 ... -
Android中SQLiteOpenHelper类的onUpgrade方法的作用
2012-02-09 11:50 4601Android中SQLiteOpenHelper类的onUpg ... -
Android启动各种系统服务线程
2012-02-09 10:59 1936Android启动各种系统服务 ... -
android
2012-02-08 09:22 0Android数据库内容变化的监听 首先介绍内容监 ... -
在线升级Android应用程序的思路
2012-02-07 11:34 880在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 6033Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1451android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2283SQLiteOpenHelper类与自动升级数据库 S ... -
SQLite外键的实现
2012-02-07 10:30 1717SQLite外键的实现 SQLite现在的版本还不支持 ... -
Android到处都在使用的回调分析
2011-12-21 15:53 3547Android到处都在使用的回调分析 ... -
android中LayoutInflater的使用
2011-12-21 11:35 1932android中LayoutInflater的使用 ... -
SIM卡满处理流程分析
2011-12-19 15:15 1882SIM卡满处理流程分析 //框架层分析 // SMSD ... -
短信发送状态报告流程分析
2011-12-19 15:07 2392短信发送状态报告流程分析 //应用层分析: //Sms ... -
Android平台 短信接送流程剖析(含编码)
2011-12-16 15:29 3228Android平台 短信接送流程剖析(含编码) ... -
修改语言环境方法
2011-12-16 15:20 1039修改语言环境方法 private void se ... -
Android平台 短信发送流程剖析(含编码)
2011-12-12 17:12 4334Android平台 短信发送流程剖析(含编码) 本文对A ... -
理解Android 上的安全性
2011-11-27 11:18 1473理解 Android 上的安全性 ...
相关推荐
本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名、为什么要给应用程序签名、如何给应用程序签名等。 1、什么是签名? 如果这个问题不是放在Android开发中来问,如果是放在一个普通的版块,我想...
### Android应用程序开发知识点详解 #### 一、Android概述 Android是一种基于Linux内核的开源移动设备操作系统,由Google公司和开放手机联盟领导及开发。它主要用于触摸操作的手持设备上,如智能手机和平板电脑等...
在Android平台上,应用程序的签名是安全性和权限管理的重要组成部分。每个Android应用在打包时都需要一个数字签名,这个签名用于验证...通过查看源代码和运行结果,你将更深入地掌握Android应用程序签名的获取方法。
本文将详细介绍Android应用程序签名的意义、签名过程以及如何使用不同的工具进行签名打包。 首先,理解签名的意义至关重要。Android App的签名主要目的是为了确保应用程序的开发者身份合法性,避免恶意开发者通过...
这篇文章将逐步揭示Android应用程序背后的设计思想,从基本的 APK 文件结构到更复杂的系统组件和编程模型。 首先,让我们深入了解 APK 文件。APK 是 Android 应用程序的基本打包格式,实质上是一个被压缩的 ZIP ...
3. Android应用程序签名机制:在Android系统中,开发者需要使用私钥对应用进行签名,以便在应用商店发布。用户通过公钥对签名进行验证,以确保应用来源可靠。签名机制可以确保应用程序的信息摘要具有完整性,用户端...
在Android应用程序设计中,开发者需要掌握一系列技术和工具来创建功能丰富的移动应用。本主题主要聚焦于Android系统的架构、开发环境的搭建以及应用的基本组件。以下是对这个主题的详细阐述: 一、Android系统架构 ...
在Android应用程序开发中,我们经常会遇到各种各样的小例子,这些例子可以帮助开发者更好地理解和掌握Android SDK中的各种功能和API。本篇文章将详细探讨"android应用程序小例子"这一主题,涵盖从基础概念到实际应用...
在Android开发中,应用签名是确保应用程序完整性和安全性的关键要素。每个APK在发布时都需要一个签名,以便系统能够验证其来源并确保其未经篡改。本文将深入探讨如何获取Android应用的32位签名,以及这个过程的重要...
它允许开发者对应用程序进行数字签名,以证明应用的来源并确保其未被篡改。本文将详细讲解如何在Ubuntu 11.10(64位)虚拟Linux系统中进行Android应用的签名过程,以及如何使用“应用签名工具”。 首先,我们需要...
《Android应用程序安全》这本书深入探讨了Android应用开发中的安全问题,涵盖了从代码层面到系统级别的各种防护措施。作为一本专业的IT资源,它旨在帮助开发者、安全工程师和移动应用研究人员理解并解决Android应用...
下面将详细介绍Android应用程序的数字签名流程。 首先,我们要了解数字签名的概念。数字签名是一种密码学技术,它通过使用私钥对数据进行加密来创建一个独特的电子"签名"。这个签名可以被任何拥有对应公钥的人验证...
Android Studio作为Google官方推荐的Android应用程序开发集成开发环境(IDE),其功能强大且不断更新,是每一个Android开发者必备的工具。 本书涵盖了从Android Studio的基础操作到高级特性的全面内容,包括但不...
Delphi XE5 图解为Android应用制作签名 Delphi XE5 是一个功能强大且流行的开发环境,用于构建跨平台应用程序。在 Android 平台上,Delphi XE5 提供了详细的签名机制,以确保应用程序的安全和可靠性。在本文中,...
Android应用程序概述 Android操作系统是目前全球最流行的移动设备操作系统之一,尤其在智能手机和平板电脑市场占据了主导地位。Android系统以其开放源代码、丰富的定制性和强大的开发者社区为特点,吸引了无数用户...
首先,让我们理解Android应用程序签名的概念。Android应用在安装到设备上之前必须进行签名,这主要是为了验证应用的身份,确保其未被篡改,并允许系统进行权限控制。签名过程使用私钥对APK文件进行加密,然后用相应...
在Android平台上,应用签名是一个至关重要的安全机制,它确保了应用程序的完整性和开发者身份的验证。在本主题中,我们将深入探讨"Android微信应用签名"的相关知识点,这涉及到微信平台对于第三方应用接入的要求以及...
Android应用程序数字签名机制研究.pdf
《Android应用程序设计--Android Studio版》是一门针对高等教育领域的课件,旨在教授学生如何使用最新的Android Studio工具进行Android应用开发。这门课程涵盖了Android开发的基础到高级知识,为学生提供了全面的...