Android 签名类型

来源:互联网 发布:java实现ftp客户端 编辑:程序博客网 时间:2024/05/22 10:56

在我的第一篇博客里面Android——TV真机调试apk(android:sharedUserId="android.uid.system") ,有提到AndroidManifest.xml中的android:sharedUserId="android.uid.system",代表的意思是和系统相同的uid,可以拥有修改系统时间,文件操作等权限。

也有提到怎么单独给一个apk签名,这里补充一下android的签名权限控制机制。


一:签名类型

android的标准签名key有:

testkey

media

platform

shared

以上的四种,可以在源码的/build/target/product/security里面看到对应的密钥,其中shared.pk8代表私钥,shared.x509.pem公钥,一定是成对出现的。

其中testkey是作为android编译的时候默认的签名key,如果系统中的apk的android.mk中没有设置LOCAL_CERTIFICATE的值,就默认使用testkey。

而如果设置成:

LOCAL_CERTIFICATE := platform

就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!



二:自定义签名Key

在/build/target/product/security目录下有个README,里面有说怎么制作这些key以及使用问题(android4.2):

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. The following commands were used to generate the test key pairs:  
  2.   
  3.   development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
  4.   development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
  5.   development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
  6.   development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
  7.   
  8. The following standard test keys are currently included:  
  9.   
  10. testkey -- a generic key for packages that do not otherwise specify a key.  
  11. platform -- a test key for packages that are part of the core platform.  
  12. shared -- a test key for things that are shared in the home/contacts process.  
  13. media -- a test key for packages that are part of the media/download system.  
  14.   
  15. These test keys are used strictly in development, and should never be assumed  
  16. to convey any sort of validity.  When $BUILD_SECURE=true, the code should not  
  17. honor these keys in any context.  

从上面可以看出来在源码下的/development/tools目录下有个make_key的脚本,通过传入两个参数就可以生成一对签名用的key。

其中第一个为key的名字,一般都默认成android本身有的,因为很多地方都默认使用了这些名字,我们自定义的话只需要对第二个参数动手脚,定义如下:

C ---> Country Name (2 letter code)
ST ---> State or Province Name (full name)
L ---> Locality Name (eg, city)
O ---> Organization Name (eg, company)
OU ---> Organizational Unit Name (eg, section)
CN ---> Common Name (eg, your name or your server’s hostname)
emailAddress ---> Contact email address

另外在使用上面的make_key脚本生成key的过程中会提示输入password,我的处理是不输入,直接enter,不要密码!后面解释,用自定义的key替换/security下面的。

可以看到android源码里面的key使用的第二个参数就是上面README里面的,是公开的,所以要release版本的系统的话,肯定要有自己的签名key才能起到一个安全控制作用。



三:修改系统默认签名key

在上面提到如果apk中的编译选项LOCAL_CERTIFICATE没有设置的话,就会使用默认的testkey作为签名key,我们可以修改成自己想要的key,按照上面的步骤制作一个releasekey,修改android配置在/build/core/config.mk中定义变量:


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. DEFAULT_SYSTEM_DEV_CERTIFICATE :build/target/product/security/releasekey  

在主makefile文件里面:

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)  
  2. BUILD_VERSION_TAGS += release-keys  

这样的话默认的所有签名将会使用releasekey。


修改完之后就要编译了,如果上面的这些key在制作的时候输入了password就会出现如下错误:


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
  2.     at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
  3.     at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
  4.     at com.android.signapk.SignApk.main(SignApk.java:531)  
  5. Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): make: *** [out/target/product/gotechcn/obj/APPS/CalendarProvider_intermediates/package.apk] 错误 1  
  6. make: *** 正在等待未完成的任务....  
  7. Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
  8.     at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
  9.     at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
  10.     at com.android.signapk.SignApk.main(SignApk.java:531)  
  11. make: *** [out/target/product/gotechcn/obj/APPS/Calculator_intermediates/package.apk] 错误 1  
  12. Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.  
  13. Warning: AndroidManifest.xml already defines targetSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.  
  14.  'out/target/common/obj/APPS/Calendar_intermediates/classes.dex' as 'classes.dex'...  
  15. Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
  16.     at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
  17.     at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
  18.     at com.android.signapk.SignApk.main(SignApk.java:531)  
  19. make: *** [out/target/product/gotechcn/obj/APPS/Calendar_intermediates/package.apk] 错误 1  
  20. ^Cmake: *** [out/target/product/gotechcn/obj/APPS/BasicDreams_intermediates/package.apk] 错误 130  

我在网上找到了合理的解释:

其实会出现这个错误的最根本的原因是多线程的问题。在编译的时候为了加速一般都会执行make -jxxx,这样本来需要手动输入密码的时候,由于其它线程的运行,就会导致影响当前的输入终端,所以就会导致密码无法输入的情况!

再编译完成之后也可以在build.prop中查看到变量:

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ro.build.tags=release-keys  

这样处理了之后编译出来的都是签名过的了,系统才算是release版本

我发现我这样处理之后,整个系统的算是全部按照我的要求签名了。


四:其它

网上看到还有另外的签名release办法,但是应该是针对另外的版本的,借用学习一下:


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. make -j4 PRODUCT-product_modul-user dist  


这个怎么跟平时的编译不一样,后面多了两个参数PRODUCT-product_modul-user 和 dist. 编译完成之后回在源码/out/dist/目录内生成个product_modul-target_files开头的zip文件.这就是我们需要进行签名的文件系统.


我的product_modul 是full_gotechcn,后面加“-user”代表的是最终用户版本,关于这个命名以及product_modul等可参考Android——编译系统初始化设置


编译出需要签名的zip压缩包之后,就是利用/security下面的准备的key进行签名了:


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ./build/tools/releasetools/sign_target_files_apks -d /build/target/product/security  out/dist/full_gotechcn-target_files.zip   out/dist/signed_target_files.zip  

签名目标文件 输出成signed_target_files.zip

如果出现某些apk出错,可以通过在full_gotechcn-target_files.zip前面加参数"-e <apkname>=" 来过滤这些apk.

然后再通过image的脚本生成imag的zip文件,这种方式不适用与我目前的工程源码,没有做过多验证!



撰写不易,转载请注明出处http://blog.csdn.net/jscese/article/details/24243171


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 xp电脑显示输入不支持怎么办 月子见风怎么办暴雪将 老氏电视机出现雪花点怎么办 飞利浦电视显示雪花片怎么办 电视无信号出雪花怎么办 电视打开都是雪花没有电视台怎么办 电视视频1无信号怎么办 新买的电视无信号怎么办 卫星有信号没有视频怎么办 户户通没有信号怎么办视频 雪花泥粘衣服上怎么办 遗产按份额处分判决后怎么办 宝马后驱车下雪天怎么办 宝马后驱车路滑怎么办 车子陷入泥地里怎么办 深圳居住证签注过期了怎么办 手机不能播放视频乱码了怎么办 被加密的视频无法观看怎么办 苹果5忘记id密码怎么办 七个月宝宝脾胃不好怎么办 八个月宝宝脾虚怎么办 七个月宝宝脾胃虚怎么办 海岛奇兵点错了怎么办 螳螂的脚断了怎么办 海岛奇兵打不过玩家怎么办 海岛奇兵资源满了怎么办 海岛奇兵杯越来越多打不玩家怎么办 海岛奇兵控杯技巧 杯数太高怎么办 海岛奇兵发现求救信号怎么办 海岛奇兵被打了怎么办 小鱼翅卡喉咙了怎么办 鱼翅卡在喉咙里怎么办 斗鱼身份证被使用怎么办 做的鱼丸太腥了怎么办 做鱼丸太稀了怎么办 斗鱼手机号换了怎么办 斗鱼直播掉帧怎么办 手机一直卡顿点不动怎么办呢 斗鱼直播分值底怎么办 斗鱼6000鱼丸怎么办卡 斗鱼直播没人看怎么办