1、签名简介
1.1、签名的作用
1)系统签名 
 我们都知道编译eng版本的时候,用的是testkey,这种key只是研发阶段,而且这种密钥谁都可以使用。当发布release版本的时候,就需要release key ,防止别人盗用。 
 2)apk 签名 
 (1) 开发者的身份验证,由于开发商可能使用的package name 相同来混淆已经安装的程序,以此保证签名的不同,来保证apk 不会被替换。 
 (2)保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中每个内容不被替换。 
 3)recovery 签名的作用 
 recovery 签名主要是验证数据的完整性
1.2、签名简介
要对Android系统进行签名,需要生成四种类型的key文件 
 1)releasekey(testkey) 
 2)media 
 3)shared 
 4)platform
以上四种,可以在代码/build/target/product/security/里看到对应的密钥。 
 其中shared.pk8代表私钥 
 shared.x509.pem代表公钥 (一定成对出现) 
 其中testkey是android编译的时候默认的签名key,
2、生成key的步骤
2.1、生成key用到的工具
我们以releasekey为例,Android使用SHA1-RSA算法进行签名。我么可以在源码下/development/tools/make_key 来实现。
2.2、制作方法
例如:./make_key releasekey ‘/C=CN/ST=ShangHai/L=XuHui View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’
其实这是有两个参数: 
 1)releasekey 就是你要制作的上述四种Key的名字 
 1)releasekey(testkey) 
 2)media 
 3)shared 
 4)platform
2)下面一个是地址,公司,厂家,制作者的信息等 
 ‘/C=CN/ST=JiangSu/L=ShangHai View/O=ThunderSoft/OU=MetorCar/CN=lumeng/emailAddress=lumeng0714@ThunderSoft@.com’ 
 C=CN–>国家名字 
 ST=JiangSu–>省城市名字 
 L=ShangHai–>城市名字 
 View/O=ThunderSoft 公司名称 
 OU=MetorCar–> 部门名称或项目名称 
 CN=lumeng–>制作者名称 
 emailAddress=lumeng0714@ThunderSoft@.com–>制作者邮箱地址
3)制作的过程当中会让输入密码,此步直接enter跳过,要不然每次签名apk,还需要手动输入签名密码。
另外四种也同样方法生成,此时会生成如下八个文件: 

其中.pk8是密钥,.x590.pem是公钥。 
 如果制作过程中出现错误,检查格式,使用sudo 权限。
3、如何签名
3.1、对apk进行签名
执行: 
 java -jar signapk.jar releasekey.x509.pem releasekey.pk8 input.apk output.apk 
 (signapk.jar:由/platform/build/tools/signapk/编译产出,可以在/out/host/linux-x86/framework/中找到。)
如果apk的android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。如果设置:LOCAL_CERTIFICATE=platform就代表使用platform来签名,这样的话apk就有了和system相同的签名,因为系统级别的签名也是使用platform来签名,此时需要添加代码: 
 android:sharedUserld=”android.uid.system”才有用。
签名后,输出文件的meta_inf目录下生长出如下文件 
 MANIFEST.MF:对分文件夹非签名文件的文件,逐个生成SHA1的数字签名信息 
 CERT.SF:对Manifest文件,使用SHA1-RSA算法,用私钥进行签名。 
 CERT.RSA:CERT.RST文件中保存了公钥、所采用的加密算法等信息。
3.2、对OTA升级release key的替换
1)首先在build/core/ 里面搜索testkey,查看testkey怎么用到的编译系统, 
 grep -nir “testkey”
我们可以看到 在Makefile 文件,以及config.mk 文件里面都会含有搜索字段 
 在/build/core/Makefile里面
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)
BUILD_KEYS := test-keys
else
BUILD_KEYS := dev-keys我们追踪DEFAULT_SYSTEM_DEV_CERTIFICATE 
 /build/core/config.mk
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/testkey
endif我们在追踪PRODUCT_DEFAULT_DEV_CERTIFICATE
要使用releasekey我们只需要修改 
 /device/平台名/项目名$项目名.mk 
 中添加或指定 
 PRODUCT_DEFAULT_DEV_CERTIFICATE的值: 
 DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey (release的路径)
同时修改,build/core/Makefile内容:
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)
BUILD_KEYS := release-keys
endif4、如何验证签名
倘若签名不同,会安装不了apk 和完成升级。
对与公钥和密钥的差别大家可以看这个博客:
文献参考: 
 1、Android OTA releasekey 替换 
2、android系统release签名
3、生成release版本的Android系统 –签名 
http://blog.163.com/yi_yixinyiyi/blog/static/136286889201132533759563/
4、Android——编译release版签名系统
                










