zoukankan      html  css  js  c++  java
  • Android——编译release版签名系统

    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):
    
     
    
        The following commands were used to generate the test key pairs:  
          
          development/tools/make_key testkey  '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
          development/tools/make_key platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
          development/tools/make_key shared   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
          development/tools/make_key media    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'  
          
        The following standard test keys are currently included:  
          
        testkey -- a generic key for packages that do not otherwise specify a key.  
        platform -- a test key for packages that are part of the core platform.  
        shared -- a test key for things that are shared in the home/contacts process.  
        media -- a test key for packages that are part of the media/download system.  
          
        These test keys are used strictly in development, and should never be assumed  
        to convey any sort of validity.  When $BUILD_SECURE=true, the code should not  
        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中定义变量:
    
     
    
     
    
        DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey  
    
    
    在主makefile文件里面:
    
     
    
     
    
        ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)  
        BUILD_VERSION_TAGS += release-keys  
    
    这样的话默认的所有签名将会使用releasekey。
    
     修改完之后就要编译了,如果上面的这些key在制作的时候输入了password就会出现如下错误:
    
      
    
        Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
            at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
            at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
            at com.android.signapk.SignApk.main(SignApk.java:531)  
        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  
        make: *** 正在等待未完成的任务....  
        Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
            at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
            at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
            at com.android.signapk.SignApk.main(SignApk.java:531)  
        make: *** [out/target/product/gotechcn/obj/APPS/Calculator_intermediates/package.apk] 错误 1  
        Warning: AndroidManifest.xml already defines minSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.  
        Warning: AndroidManifest.xml already defines targetSdkVersion (in http://schemas.android.com/apk/res/android); using existing value in manifest.  
         'out/target/common/obj/APPS/Calendar_intermediates/classes.dex' as 'classes.dex'...  
        Enter password for build/target/product/security/releasekey.pk8 (password will not be hidden): java.lang.NullPointerException  
            at com.android.signapk.SignApk.decryptPrivateKey(SignApk.java:142)  
            at com.android.signapk.SignApk.readPrivateKey(SignApk.java:166)  
            at com.android.signapk.SignApk.main(SignApk.java:531)  
        make: *** [out/target/product/gotechcn/obj/APPS/Calendar_intermediates/package.apk] 错误 1  
        ^Cmake: *** [out/target/product/gotechcn/obj/APPS/BasicDreams_intermediates/package.apk] 错误 130  
    
     
    
    我在网上找到了合理的解释:
    
    其实会出现这个错误的最根本的原因是多线程的问题。在编译的时候为了加速一般都会执行make -jxxx,这样本来需要手动输入密码的时候,由于其它线程的运行,就会导致影响当前的输入终端,所以就会导致密码无法输入的情况!
    
    再编译完成之后也可以在build.prop中查看到变量:
    
     
    
        ro.build.tags=release-keys  
    
    
    这样处理了之后编译出来的都是签名过的了,系统才算是release版本
    
    我发现我这样处理之后,整个系统的算是全部按照我的要求签名了。
    
     
    四:其它
    
    网上看到还有另外的签名release办法,但是应该是针对另外的版本的,借用学习一下: 
    
     
    
        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进行签名了:
    
      
    
        ./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文件,这种方式不适用与我目前的工程源码,没有做过多验证
  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/5242642.html
Copyright © 2011-2022 走看看