zoukankan      html  css  js  c++  java
  • 为你的APK进行数字签名

    摘要: 我们需要为 APK进行数字签名,这样才能发布到 Google Play商店。解决方法很简单,使用 Java的keytool命令创建证书并在 Gradle构建文件的 signingConfigs块中使用就可以办到。下面让我们看看详细讨论。本文选自《巧用Gradle构建Android应用》。

      所有 Android包(APK)文件在部署之前都需要被数字签名,Android使用一个已有的密钥签发调试用的 APK。你可以使用 Java提供的 keytool命令来查看。
    默认情况下,调试用的密钥存储库在你的用户目录下的 .Android子目录下面。默认的名字叫作 debug.keystore,并且其密码是 Android。下面示例显示了怎么列举默认的证书。

      示例. 列举调试密钥库(Mac OS x)

    > cd ~/.android
    > keytool -list -keystore debug.keystore 
    Enter keystore password: ("android") 
    
    Keystore type: JKS 
    Keystore provider: SUN 
    
    Your keystore contains 1 entry 
    
    androiddebugkey,Feb 9, 2013, PrivateKeyEntry, 
    Certificate fingerprint (SHA1): 
    B7:39:B5:80:BE:A0:0D:6C:84:4F:A1:1F:4B:A1:00:14:12:25:DA:14
    

      密钥库的类型是 JKS,其代表(很自然的)Java KeyStore,用于公钥和私钥。Java提供另一种类型叫作 JCEKS(Java Cryptography Extensions KeyStore),其可以被用于共享密钥,但是没有被 Android应用程序使用。
      这个密钥库中有一个自签名的证书,别名为 Androiddebugkey,当 APK被部署到连接的设备或者模拟器上时,其被用于签名调试用的 APK。
      为了重设调试用的密钥库,简单地删除 debug.keystore文件,下次部署 app时会重新创建。
    你不能部署一个发布版本的 app除非你对其签名了,意味着生成一个发布用的密钥。这也需要使用 keytool工具。一次很简单的运行如下所示。

      示例. 生成发布密钥

    keytool -genkey -v -keystore myapp.keystore -alias my_alias
     -keyalg RSA -keysize 2048 -validity 10000 (all on one line) 
    Enter keystore password: (probably shouldn't use use "password") 
    Re-enter new password: (but if you did, type it again) 
    What is your first and last name?
     [Unknown]: Ken Kousen 
    What is the name of your organizational unit? 
     [Unknown]: 
    What is the name of your organization? 
     [Unknown]: Kousen IT, Inc. 
    What is the name of your City or Locality?
    
    What is the name of your State or Province?
    
    
    What is the two-letter country code for this unit? 
    
    Is CN=Ken Kousen, OU=Unknown, O="Kousen IT, Inc.", L=Marlborough, 
     ST=CT, C=US correct? 
    
    Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA)
      with a validity of 10,000 days for: CN=Ken Kousen, OU=Unknown, 
      O="Kousen IT, Inc.", L=Marlborough, ST=CT, C=US 
    Enter key password for <my_alias>
           (RETURN if same as keystore password): 
    [Storing myapp.keystore]
    
    
    What is the two-letter country code for this unit?  
    
    Is CN=Ken Kousen, OU=Unknown, O="Kousen IT, Inc.", L=Marlborough, 
     ST=CT, C=US correct? 
    
    
    Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) 
    with a validity of 10,000 days for: CN=Ken Kousen, OU=Unknown, 
    O="Kousen IT, Inc.", L=Marlborough, ST=CT, C=US 
    Enter key password for <my_alias> 
           (RETURN if same as keystore password): 
    [Storing myapp.keystore] 
    

      RSA算法被用于生成公私钥对,大小为 2KB,使用 SHA256进行签名,10 000(27年多)天有效期。
      你现在可以使用 jarsigner和 zipalign工具来为你的 APK签名了,但是让 Gradle来做会更容易。
      添加 signingConfigs块作为 Android闭包的一个子块,如下所示。

      示例. 在模块构建文件中的signingConfis块

    android { 
        // ... other sections ... 
        signingConfigs { 
           release { 
               keyAlias 'my_alias' 
               keyPassword 'password' 
               storeFile file('/Users/kousen/keystores/myapp.keystore')
               storePassword 'password' 
            } 
        } 
    }
    

      你可能不想将密码硬编码在构建文件中。幸运的是,你可以把它们放到 gradle.properties文件中,或者从命令行指定。
      从 DSL文档中,signingConfigs块委托给一个 SigningConfig的类,其包含四个常用的属性:

    • keyAlias:当签发一个特定的密钥时在 keytool中被使用。
    • keyPassword:在签发过程中使用的一个特定密钥的密码。
    • storeFile:包含密钥和证书的磁盘文件,由 keytool生成。
    • storePassword:密钥库文件自身使用的密码。 还有一个 storeType属性(默认为 JKS, 如示例 2-29所示),但是这个属性很少使用。 为了使用新的配置,添加一个 signingConfig属性到 release构建类型。

    示例. 在发布构建中使用签名配置

    android { 
         //其他段
    
    buildTypes { 
       release { 
               //其他设置
               signingConfig signingConfigs.release 
           } 
         } 
    } 
    

      当你在 Gradle中调用 assembleRelease任务的时候,构建为在 app/build/outpu/apk目录下生成一个发布版本的 APK。

      示例. 运行assembleRelease任务

    > ./gradlew assembleRelease 
    :app:preBuild UP-TO-DATE 
    :app:preReleaseBuild UP-TO-DATE 
    //...太多任务
    :app:zipalignRelease UP-TO-DATE 
    :app:assembleRelease UP-TO-DATE 
    
    BUILD SUCCESSFUL 
    
    kousen at krakatoa in ~/Documents/AndroIDstudio/MyAndroidApp 
    > ls -l app/build/outputs/apk 
    total 12088
    -rw-r--r--1 kousen staff 1275604 Aug 24 15:05 app-debug.apk
    -rw-r--r--1 kousen staff 1275481 Aug 26 21:04 app-release.apk 
    

      注意——这很重要— —不要丢失密钥库。如果丢了,你将不能发布任何关于你的 app的更新,因为所有的版本都必须要用同样的密钥签名。 
      本文选自《巧用Gradle构建Android应用》,点此链接可在博文视点官网查看。
                          图片描述
      想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                           图片描述

  • 相关阅读:
    java中的线程是如何工作的。
    springcloud 负载均衡之 ribbon。
    eureka 集群的实现方式?
    eureka的简单介绍,eureka单节点版的实现?eureka的自我保护?eureka的AP性,和CP性?
    docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
    关于自动化测试框架的思想和考虑
    Web应用程序压力测试步骤
    自动化测试工具的选择
    软件测试用例的认识误区
    如何评估软件产品的质量?
  • 原文地址:https://www.cnblogs.com/broadview/p/6293756.html
Copyright © 2011-2022 走看看