本文主要介绍Android应用程序签名的相关理论知识以及如何发布Android应用程序。
为大家所熟知的日常生活中的签名,它是代表某个人的特殊标记,用于唯一标识某个人。而Android 应用程序的签名的本质与日常生活中的签名是一样的,应用程序中的签名也开发者在应用程序中打上的一种特殊标记,别人在看到这个标记时,他会知道是这个应用程序与你有关或者是你开发的,而不是别人。
是的,Google发布的Android系统要求每个发布的应用程序都必须签名。Android应用程序的签名是用来建立程序的开发者与程序包之间的信任关系,当更新应用程序时,Android系统要求新/旧两个应用程序的签名必须一致。
与windows上签名的意义不同的是,Android的签名不需要权威的数字证书机构认证,不会用于决定终端用户可以安装哪些应用程序,它是程序的作者自己完成的,是Android系统中程序包的一种自我认证的机制。
如果你是一个刚入门的开发者,你会发现你开发的应用程序没有经过自己的签名也可以安装在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签名的应用程序是不能发布到应用商店的。
App的签名可以通过两种方式来完成,使用ADT提供的图形化界面来完成,或者使用命令行(DOS)命令进行签名。
选择项目->右键->export -> export Android Application(这里我使用ZHGL这个Android App项目进行演示)
第一次使用选择 create new keystore,指定密钥库(.keystore)存放的位置:C:\Users\chen.jian\Desktop\AndroidSignature,并设置密钥库的密码。
PS:密钥可以为多个应用程序签名哦,建议开发者拥有一个密钥库就行了。
签名证书的概念:现实环境中,证书会携带作者/证书内容等相关信息,然后会有颁发证书机构的签名或者印章,而与这里的签名证书在本质上相同,你设定的密码相当于签名,签名工具会使用此密码对apk进行加密。
——Alias:密钥库的别名(作者自行设定,不区分大小写,密钥库可以存放多个签名证书(数字证书),不同的app 建议创建不同的签名证书)
——Password:密钥密码
——Validity:签名证书的有效期限
DOS环境下对apk进行签名需要用到三个工具:keytool、jarsigner、zipalign
可以看出对apk进行签名并非是Android的专利,而是Java时代初就已经存在了。
PS:如果要在DOS环境下使用这几个工具就需要将其添加到windows的环境变量中。
keytool -genkey -v -keystore ChenJian.keystore -alias androidkeystore_v1 -keyalg RSA -validity 20000
说明:
在执行上面的命令生成数字证书文件时,会提示你输入一些信息,包括证书的密码。
密匙库会被放在当前目录C:\Users\chen.jian\ ChenJian.keystore,你也可以自己指定目录。
jarsigner -verbose -keystore ChenJian.keystore -signedjar Signed_ZHGL.apk Unsigned_ZHGL.apk androidkeystore_v1
说明:
最后面的androidkeystore_v1 表示证书的别名,对应于生成数字证书时-alias参数后面的名称。
zipalign -v 4 Signed_ZHGL.apk Signed_aligned_ZHGL.apk
说明:
debug.keystore在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能覆盖安装的问题。不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大问题了,就相当于软件不具备升级功能!
网络上都提供了在Google Play上发布应用程序的流程,我这里只简单介绍国内的应用商店(360)如何发布应用程序。
第一步:首先你必须要有一个360的账号,360的账号是通用的(可以在安全卫士、手机助手、发布应用程序···),与普通的账号不同的是,如果要在360应用商店发布软件,就必须进行实名认证,手持身份证的照片。
第二步:登陆http://dev.360.cn/ 选择发布应用程序 -> 进入新的页面后选择创建软件
第三步:按照提示填写软件的相关信息,值得注意的是360对上传的图片尺寸有特殊的要求,最好看清楚之后再截屏、编辑,不然会浪费不少时间。
第四步:等待审核通过
PS:注册过开发者账号过后,可以选择首发、云端测试、软件加固、广告接入等功能。
在AndroidManifest.xml 文件中通常会申明该app的权限,有的权限只有系统级应用程序才能使用,此时需要做到以下几点app才能正常运行。
1) permission
在AndroidMainifest.xml申明permission:
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"
如果想通过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: 此过程中需要输入密码:android)
第四步:生成keystore文件
keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey
方法一:直接按照本文描述Eclips导出带签名的apk文档方法,输入密钥库和密钥入口密码(都为android)后,就能正常导出带签名的apk。
方法二:在Eclipse的Windows/Preferences/Android/Build中设置“Custom debug keystore“为刚才生成的keystore即可,如下图。