Android Studio 默认keystore 以及自定义keystore

关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述Android Studio 默认keystore 以及自定义keystore相关的知识,希望能为你提供帮助。
我们使用Android  Studio 运行或测试我们的app   它使用一个默认的debug.keystore进行签名。
这个默认签名(keystore)是不需要密码的,它的默认位置在  $HOME/.android/debug.keystore,如果不存在Android studio会自动创建它。
例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。再我们正式发布项目的时候是不能使用debug.keystore的。
 
官方地址:  https://developer.android.com/studio/publish/app-signing.html
 
下面我们来介绍如何使用Android Studio创建一个新的keystore,并发布我们的apk
第一步: Build ---> > Generate Signed APK

Android Studio 默认keystore 以及自定义keystore

文章图片

 
【Android Studio 默认keystore 以及自定义keystore】第二步:Create New
Android Studio 默认keystore 以及自定义keystore

文章图片

 
第三步:填写相关信息,里面内容什么含义自行Google
Android Studio 默认keystore 以及自定义keystore

文章图片

 
第四步:输入密码
Android Studio 默认keystore 以及自定义keystore

文章图片

 
第五步:选择发布app的路径默认即可 选择release方式发布
Android Studio 默认keystore 以及自定义keystore

文章图片

OK,发布成功,可以到文件夹下面找到发布的apk
 
下面我们来配置如何在debug的时候使用我们自定义的keystore。
第一步:还是要新建一个keystore,就用上面的也可以。
第二步:在项目上右键  Open Module Settings.然后看图就可以了,选择路径,把密码填上,该填的都填好。
Android Studio 默认keystore 以及自定义keystore

文章图片

 
第三步:分别选择debug和release 都设置为刚才填进去的keystore。
Android Studio 默认keystore 以及自定义keystore

文章图片

点击OK即可,然后查看APP的配置文件应该是这样的。
Android Studio 默认keystore 以及自定义keystore

文章图片

 
 
[html]  view plain  copy  
  1. android  {   
  2.         signingConfigs  {   
  3.                 android_studio_app  {   
  4.                         keyAlias  ‘androidstudioapp‘   
  5.                         keyPassword  ‘mypassword‘   
  6.                         storeFile  file(‘D:/Android/keystore/android_studio_app.jks‘)   
  7.                         storePassword  ‘mypassword‘   
  8.                 }   
  9.         }   
  10.         compileSdkVersion  23   
  11.         buildToolsVersion  "23.0.1"   
  12.         defaultConfig  {   
  13.                 applicationId  "com.example.administrator.myapplication"   
  14.                 minSdkVersion  15   
  15.                 targetSdkVersion  23   
  16.                 versionCode  1   
  17.                 versionName  "1.0"   
  18.         }   
  19.         buildTypes  {   
  20.                 release  {   
  21.                         minifyEnabled  false   
  22.                         proguardFiles  getDefaultProguardFile(‘proguard-android.txt‘),  ‘proguard-rules.pro‘   
  23.                         signingConfig  signingConfigs.android_studio_app   
  24.                 }   
  25.                 debug  {   
  26.                         signingConfig  signingConfigs.android_studio_app   
  27.                 }   
  28.         }   
  29. }   



 
下面讲解如何测试apk是否使用了我们创建的keystore
第一步:  keytool -list -v -keystore   xxx.keystore 
通过工具查看sha1的值.,例如  5C:93:68:2C:E3:2B:00:F1:D6:11:0F:46:08:93:32:1D:FD:6E:60:CC
第二步:在APP内部通过代码的方式获取sha1 两者一比较即可。
 
[cpp]  view plain  copy  
  1. import  android.content.pm.PackageInfo;    
  2. import  android.content.pm.PackageManager;    
  3. import  android.content.pm.Signature;    
  4. import  java.io.ByteArrayInputStream;    
  5. import  java.io.InputStream;    
  6. import  java.security.MessageDigest;    
  7. import  java.security.NoSuchAlgorithmException;    
  8. import  java.security.cert.CertificateEncodingException;    
  9. import  java.security.cert.CertificateFactory;    
  10. import  java.security.cert.X509Certificate;    



 
 
[java]  view plain  copy  
    1. //这个是获取SHA1的方法   
    2. public  static  String  getCertificateSHA1Fingerprint(Context  context)  {   
    3.         //获取包管理器   
    4.         PackageManager  pm  =  context.getPackageManager();    
    5.         //获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,   
    6.         //在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。   
    7.         String  packageName  =  context.getPackageName();    
    8.         //返回包括在包中的签名信息   
    9.         int  flags  =  PackageManager.GET_SIGNATURES;    
    10.         PackageInfo  packageInfo  =  null;    
    11.         try  {   
    12.                 //获得包的所有内容信息类   
    13.                 packageInfo  =  pm.getPackageInfo(packageName,  flags);    
    14.         }  catch  (PackageManager.NameNotFoundException  e)  {   
    15.                 e.printStackTrace();    
    16.         }   
    17.         //签名信息   
    18.         Signature[]  signatures  =  packageInfo.signatures;    
    19.         byte[]  cert  =  signatures[0].toByteArray();    
    20.         //将签名转换为字节数组流   
    21.         InputStream  input  =  new  ByteArrayInputStream(cert);    
    22.         //证书工厂类,这个类实现了出厂合格证算法的功能   
    23.         CertificateFactory  cf  =  null;    
    24.         try  {   
    25.                 cf  =  CertificateFactory.getInstance("X509");    
    26.         }  catch  (Exception  e)  {   
    27.                 e.printStackTrace();    
    28.         }   
    29.         //X509证书,X.509是一种非常通用的证书格式   
    30.         X509Certificate  c  =  null;    
    31.         try  {   
    32.                 c  =  (X509Certificate)  cf.generateCertificate(input);    
    33.         }  catch  (Exception  e)  {   
    34.                 e.printStackTrace();    
    35.         }   
    36.         String  hexString  =  null;    
    37.         try  {   
    38.                 //加密算法的类,这里的参数可以使MD4,MD5等加密算法   
    39.                 MessageDigest  md  =  MessageDigest.getInstance("SHA1");    
    40.                 //获得公钥   
    41.                 byte[]  publicKey  =  md.digest(c.getEncoded());    
    42.                 //字节到十六进制的格式转换   
    43.                 hexString  =  byte2HexFormatted(publicKey);    
    44.         }  catch  (NoSuchAlgorithmException  e1)  {   
    45.                 e1.printStackTrace();    
    46.         }  catch  (CertificateEncodingException  e)  {   
    47.                 e.printStackTrace();    
    48.         }   
    49.         return  hexString;    
    50. }   
    51. //这里是将获取到得编码进行16进制转换   
    52. private  static  String  byte2HexFormatted(byte[]  arr)  {   
    53.         StringBuilder  str  =  new  StringBuilder(arr.length  *  2);    
    54.         for  (int  i  =  0;   i  <   arr.length;   i++)  {   
    55.                 String  h  =  Integer.toHexString(arr[i]);    
    56.                 int  l  =  h.length();    
    57.                 if  (l  ==  1)   
    58.                         h  =  "0"  +  h;    
    59.                 if  (l  >   2)   
    60.                         h  =  h.substring(l  -  2,  l);    
    61.                 str.append(h.toUpperCase());    
    62.                 if  (i  <   (arr.length  -  1))   
    63.                         str.append(‘:‘);    
    64.         }   
    65.         return  str.toString();    
    66. }   

    推荐阅读