Android 应用程序签名
本文主要介绍Android应用程序签名的相关理论知识以及怎样公布Android应用程序。
1.签名的概念
为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人。而Android 应用程序的签名的本质与日常生活中的签名是一样的,应用程序中的签名也开发人员在应用程序中打上的一种特殊标记。别人在看到这个标记时,他会知道是这个应用程序与你有关或者是你开发的,而不是别人。
2.Android应用程序一定要签名吗
是的,Google公布的Android系统要求每一个公布的应用程序都必须签名。Android应用程序的签名是用来建立程序的开发人员与程序包之间的信任关系,当更新应用程序时,Android系统要求新/旧两个应用程序的签名必须一致。
与windows上签名的意义不同的是,Android的签名不须要权威的数字证书机构认证。不会用于决定终端用户能够安装哪些应用程序。它是程序的作者自己完毕的,是Android系统中程序包的一种自我认证的机制。
3.Debug签名
假设你是一个刚入门的开发人员,你会发现你开发的应用程序没有经过自己的签名也能够安装在Android系统的机器上,这是由于ADT工具使用debug数字证书(存在于debug.keystore)自己主动为每一个处于开发阶段的应用程序打上了debug签名。
debug.keystore 也被称为debug 密钥库,为app签名时必备的文件,使用Eclips时会安装ADT(Android Development Tools)插件,ADT自带debug 密钥库(也可称作证书库,由于*.keystore是用来存放数字证书的),文件放在:
系统盘:\Users\zhangsan\.android\ debug.keystore。
不同的系统密匙库的位置可能存在细微的差异。
通常情况下,在开发阶段的应用程序是不须要作者创建一个自己的密钥库文件(*.keystore),可是假设你要公布已经开发好的应用程序就必须使用自己的签名,debug签名的应用程序是不能公布到应用商店的。
4.怎样给应用程序签名
App的签名能够通过两种方式来完毕,使用ADT提供的图形化界面来完毕。或者使用命令行(DOS)命令进行签名。
1)图形化工具进行签名
第一步:导出
选择项目->右键->export -> export Android Application(这里我使用ZHGL这个Android App项目进行演示)
第二步:选择要导出的appproject
第三步:创建密钥库(*.keystore)
第一次使用选择 create new keystore。指定密钥库(.keystore)存放的位置:C:\Users\chen.jian\Desktop\AndroidSignature,并设置密钥库的password。
PS:密钥能够为多个应用程序签名哦。建议开发人员拥有一个密钥库即可了。
第四步:创建签名证书
签名证书的概念:现实环境中。证书会携带作者/证书内容等相关信息。然后会有颁发证书机构的签名或者印章。而与这里的签名证书在本质上同样。你设定的password相当于签名,签名工具会使用此password对apk进行加密。
——Alias:密钥库的别名(作者自行设定,不区分大写和小写,密钥库能够存放多个签名证书(数字证书)。不同的app 建议创建不同的签名证书)
——Password:密钥password
——Validity:签名证书的有效期限
第五步:生成带签名的apk文件
第六步:使用创建好的证书对apk进行签名。
2)DOS命令进行签名
DOS环境下对apk进行签名须要用到三个工具:keytool、jarsigner、zipalign
- Keytool:创建密匙库、创建数字证书,在JDK的bin安装文件夹下(如:C:\Program Files\Java\jdk1.6.0_10\bin)
- Jarsigner:对apk进行签名,也在JDK的bin安装文件夹下
- Zipalign:对签名后的apk文件进行优化,提高虚拟机的运行效率,存在于SDK的tools文件夹下(如:D:\android-sdk-windows\tools\)
能够看出对apk进行签名并不是是Android的专利。而是Java时代初就已经存在了。
PS:假设要在DOS环境下使用这几个工具就须要将其加入到windows的环境变量中。
第一步:导出未签名的apk文件
第二步:使用keytool创建数字证书
keytool -genkey -v -keystore ChenJian.keystore -alias androidkeystore_v1 -keyalg RSA -validity 20000
说明:
- keytool是工具名称,-genkey意味着运行的是生成数字证书操作。-v表示将生成证书的具体打印信息出来,显示在dos窗体中;
- -keystore ChenJian.keystore 表示生成的数字证书的文件名称为" ChenJian.keystore ";
- -alias androidkeystore_v1 表示证书的别名为" androidkeystore_v1"。
- -keyalg RSA 表示生成密钥文件所採用的算法为RSA;
- -validity 20000 表示该数字证书的有效期为20000天,意味着20000天之后该证书将失效
在运行上面的命令生成数字证书文件时,会提示你输入一些信息,包含证书的password。
密匙库会被放在当前文件夹C:\Users\chen.jian\ ChenJian.keystore。你也能够自己指定文件夹。
第三步 使用jarsigner给app签名:
jarsigner -verbose -keystore ChenJian.keystore -signedjar Signed_ZHGL.apk Unsigned_ZHGL.apk androidkeystore_v1
说明:
- jarsigner是工具名称。-verbose表示将签名过程中的具体打印信息出来,显示在dos窗体中;
- -keystore ChenJian.keystore 表示签名所使用的数字证书所在位置。这里没有写路径,表示在当前文件夹下;
- -signedjar Signed_ZHGL.apk Unsigned_ZHGL.apk表示给Unsigned_ZHGL.apk文件签名,签名后的文件名为Signed_ZHGL.apk;
最后面的androidkeystore_v1 表示证书的别名,相应于生成数字证书时-alias參数后面的名称。
第四步 优化app:
zipalign -v 4 Signed_ZHGL.apk Signed_aligned_ZHGL.apk
说明:
- zipalign是工具名称,-v表示在DOS窗体打印出具体的优化信息。
- Signed_ZHGL.apk Signed_aligned_ZHGL.apk 表示对已签名文件Signed_ZHGL.apk进行优化。优化后的文件名称为Signed_aligned_ZHGL.apk
- 说明:假设你曾经的程序是採用默认签名的方式(即debug签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才干安装上。由于程序覆盖安装主要检查两点:
- 两个程序的入口Activity是否同样。
两个程序假设包名不一样。即使其他全部代码全然一样。也不会被视为同一个程序的不同版本号;
- 两个程序所採用的签名是否同样。假设两个程序所採用的签名不同,即使包名同样。也不会被视为同一个程序的不同版本号。不能覆盖安装。
- 另外。可能有人可能会觉得反正debug签名的应用程序也能安装使用,那也没有必要自己签名了嘛。千万不要这样想。debug签名的应用程序有这样两个限制,或者说风险:
- debug签名的应用程序不能在Android Market上架销售。它会强制你使用自己的签名;
debug.keystore在不同的机器上所生成的可能都不一样,就意味着假设你换了机器进行apk版本号升级,那么将会出现上面那种程序不能覆盖安装的问题。不要小视这个问题,假设你开发的程序仅仅有你自己使用,当然无所谓,卸载再安装就能够了。
但要是你的软件有非常多使用客户,这就是大问题了,就相当于软件不具备升级功能。
5.数字证书使用方法
1)共享数字证书的优势
- 有利于程序升级,当新版程序和旧版程序的数字证书同样时,Android系统才会觉得这两个程序是同一个程序的不同版本号。假设新版程序和旧版程序的数字证书不同样。则Android系统觉得他们是不同的程序。并产生冲突,会要求新程序更改包名。
- 有利于程序的模块化设计和开发。Android系统同意拥有同一个数字签名的程序执行在一个进程中。Android程序会将他们视为同一个程序。
所以开发人员能够将自己的程序分模块开发。而用户仅仅须要在须要的时候下载适当的模块。
- 能够通过权限(permission)的方式在多个程序间共享数据和代码。Android提供了基于数字证书的权限赋予机制,应用程序能够和其它的程序共 享概功能或者数据给那那些与自己拥有同样数字证书的程序。假设某个权限(permission)的protectionLevel是signature, 则这个权限就仅仅能授予那些跟该权限所在的包拥有同一个数字证书的程序。
2)数字证书的有效期
- 数字证书的有效期要包括程序的估计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
- 假设多个程序使用同一个数字证书,则该数字证书的有效期要包括全部程序的估计生命周期。
- Android Market强制要求全部应用程序数字证书的有效期要持续到2033年10月22日以后。
3)数字证书的要点
- Android程序包使用的数字证书能够是自签名的,不须要一个权威的数字证书机构签名认证
- 假设要正式公布 一个Android。必须使用一个合适的私钥生成的数字证书来给程序签名 ,而不能使用adt插件 或者ant工具生成的调试证书来公布。
- 数字证书都是有有效期的,Android仅仅是在应用程序安装的时候才会检查证书的有效期。
假设程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
- Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书。并给应用程序包签名。
6.公布应用程序
网络上都提供了在Google Play上公布应用程序的流程。我这里仅仅简介国内的应用商店(360)怎样公布应用程序。
第一步:首先你必需要有一个360的账号,360的账号是通用的(能够在安全卫士、手机助手、公布应用程序···),与普通的账号不同的是,假设要在360应用商店公布软件,就必须进行实名认证。手持身份证的照片。
第二步:登陆http://dev.360.cn/ 选择公布应用程序 -> 进入新的页面后选择创建软件
第三步:依照提示填写软件的相关信息,值得注意的是360对上传的图片尺寸有特殊的要求。最好看清楚之后再截屏、编辑。不然会浪费不少时间。
第四步:等待审核通过
PS:注冊过开发人员账号过后,能够选择首发、云端測试、软件加固、广告接入等功能。
7.系统应用程序的签名
在AndroidManifest.xml 文件里一般会申明该app的权限,有的权限仅仅有系统级应用程序才干使用,此时须要做到下面几点app才干正常执行。
1) permission
在AndroidMainifest.xml申明permission:
<uses-permissionandroid:name="android.permission.WRITE_SECURE_SETTINGS" />
2) 共享系统系统进程
android:sharedUserId="android.uid.system"
Android系统中,出于对安全的考虑。不同的apk默认是在不同的进程中执行,所以不能互相訪问,只是Android也提供了一种机制将一个或者多个apk配置在同一个进程中执行。以满足相互訪问的需求,不同除了使用sharedUserId以外,还必须採用相同的签名才行。
3) 系统签名
想要使用系统权限还必须使用系统的密钥对apk签名才行。
4) Android.mk
改动Android.mk文件,增加LOCAL_CERTIFICATE := platform这一行,在命令行模式下使用mm编译就默认会使用系统密匙对该apk进行签名。
当然。你也能够找到密钥后手动对该应用程序进行签名,首先找到密钥文件。在我的Android源代码文件夹中的位置是"build/target/product/security",以下的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,signapk.jar能够直接在“android\out\host\linux-x86\framework”或者“android\prebuilts\sdk\tools\lib”文件夹下找到,能够使用绝对路径。也能够直接放在当前文件夹下(C:\Users\chen.jian)。使用方法为
"java -jarsignapk.jar platform.x509.pem platform.pk8 input.apk output.apk"
5)将系统密钥转换成keystore格式
假设想通过Eclips编译、调试系统应用程序,那么将系统密钥转换成keystore就变得非常有必要,以下主要介绍转换的方法。
第一步:搭建Linux环境
在Linux环境下新建文件夹signature,将platform.x509.pem platform.pk8复制到该文件夹下。
第二步:把pkcs8格式的私钥转换为pkcs12格式
openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt
第三步:生成pkcs12格式的密钥文件
openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name androiddebugkey
(PS: 此过程中须要输入password:android)
第四步:生成keystore文件
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey
6)Eclips 编译生成拥有系统签名的apk
方法一:直接依照本文描写叙述Eclips导出带签名的apk文档方法,输入密钥库和密钥入口password(都为android)后,就能正常导出带签名的apk。
方法二:在Eclipse的Windows/Preferences/Android/Build中设置“Custom debug keystore“为刚才生成的keystore就可以,例如以下图。