Android——编译release版签名系统

转载 2016年08月30日 14:38:36

http://blog.csdn.net/jscese/article/details/24243171

 

    在我的第一篇博客里面http://blog.csdn.net/jscese/article/details/12184513#comments,有提到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):

 

  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中定义变量:

 

 

  1. DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey  


在主makefile文件里面:

 

 

  1. ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)  
  2. BUILD_VERSION_TAGS += release-keys  

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

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

  

  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中查看到变量:

 

  1. ro.build.tags=release-keys  


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

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

 

四:其它

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

 

  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等可参考http://blog.csdn.net/jscese/article/details/23931159

 

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

  

  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文件,这种方式不适用与我目前的工程源码,没有做过多验证!

android 添加系统权限 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

  • 2014年07月26日 11:38
  • 118KB
  • 下载

Android通过签名判断是否系统编译的apk

Android平台编译用到的签名公私钥文件存在以下目录: build/target/product/security 里面包含四对公私钥...
  • xiao19850123
  • xiao19850123
  • 2014年06月12日 11:35
  • 1542

Android学习笔记之编译系统(三)添加product

上面说了如何让厂商定义的apk编译到system.img中? 总结:对于product来说,有三部分东西是要包含的。 第一种就是基础子项目,所有的product都要包含。比如adbd,管理adb进程,...
  • hailushijie
  • hailushijie
  • 2013年03月08日 00:54
  • 4913

让Android Studio支持系统签名(证书)

有时候,我们开发的apk需要用到系统权限,需要在AndroidManifest.xml中添加共享系统进程属性: android:sharedUserId="android.uid.system"...
  • u010164190
  • u010164190
  • 2016年07月15日 13:01
  • 1286

编译Android源码过程中遇到的问题

编译Android源码的过程参考Android官网介绍: 1、下载Android源码的步骤:https://source.android.com/source/downloading.html ...
  • tanlon_0308
  • tanlon_0308
  • 2015年04月28日 18:00
  • 988

如何把应用程序app编译进android系统

把常用的应用程序编译到img文件中,就成了系统的一部分,用户不必自己安装,当然也卸载不了;  同时也可以删减系统自带的应用程序,精简系统;  1.\build\target\product 目...
  • jdsjlzx
  • jdsjlzx
  • 2014年03月25日 17:05
  • 8479

编译android4.4源代码出现的问题及解决

0 由于编译uboot和kernel都比较顺利,因此不做描述 1 /bin/bash:bios:未找到命令解决:sudo apt-get install bison 2 cannot find f...
  • pillarzheng
  • pillarzheng
  • 2016年11月16日 09:23
  • 871

Android 驱动开发系列五

这一篇将说到 如何为JNI接口(Frameworks层)添加对应的service访问服务   在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件...
  • brantyou
  • brantyou
  • 2013年04月11日 14:47
  • 5239

将自己的应用程序编译进Android操作系统作为系统应用启动

转:http://blog.csdn.net/jdsjlzx/article/details/22077735  把常用的应用程序编译到img文件中,就成了系统的一部分,用户不必自己安装,当然也卸...
  • zhaoqi2617
  • zhaoqi2617
  • 2016年10月26日 15:11
  • 1167

基于Ubuntu14.04的RK3288_PopMetal Android开发环境搭建过程小记

折腾了快一周,终于完成基于Ubuntu14.04(谷歌要求为64位)的PopMetal Android 开发环境的搭建,并完成烧录和部分测试,搭建环境是window7 64位主机和wmware里装U...
  • sinat_26600745
  • sinat_26600745
  • 2015年07月26日 21:46
  • 1858
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android——编译release版签名系统
举报原因:
原因补充:

(最多只允许输入30个字)