我们使用Android Studio 运行或测试我们的app  它使用一个默认的debug.keystore进行签名。

这个默认签名(keystore)是不需要密码的,它的默认位置在 $HOME/.android/debug.keystore,如果不存在Android studio会自动创建它。

例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。再我们正式发布项目的时候是不能使用debug.keystore的。

有时候debug模式下我们需要使用自己的keystore来进行签名,比如在使用第三方SDK时候需要提交我们应用包名以及签名来获取APPKEY,那么测试环境下我不希望每次都需要手动签名导出APK来进行测试,这里面我们可以使用【storeFile file】来指定我们自己的keystore AS编译后就使用我们指定的keystore进行签名,避免每次手动签名打包方便我们调试。


 

官方地址: https://developer.android.com/studio/publish/app-signing.html


下面我们来介绍如何使用Android Studio创建一个新的keystore,并发布我们的apk

1 创建keystore

 

1.1 Build --->> Generate Signed APK

Android Studio 默认keystore 以及自定义keystore使用


 

1.2 Create New

Android Studio 默认keystore 以及自定义keystore使用


1.3 填写相关信息,里面内容什么含义自行Google

Android Studio 默认keystore 以及自定义keystore使用


1.4 输入密码

Android Studio 默认keystore 以及自定义keystore使用


1.5 选择发布app的路径默认即可 选择release或者debug方式发布

Android Studio 默认keystore 以及自定义keystore使用

OK,发布成功,可以到文件夹下面找到发布的apk


2 使用自定义keystore

 

 

下面我们来配置如何在debug的时候使用我们自定义的keystore。

2.1 还是要新建一个keystore,就用上面的也可以。

2.2 在项目上右键 Open Module Settings.然后看图就可以了,选择路径,把密码填上,该填的都填好。

Android Studio 默认keystore 以及自定义keystore使用

 

2.3 分别选择debug和release 都设置为刚才填进去的keystore。

Android Studio 默认keystore 以及自定义keystore使用


点击OK即可,然后查看APP的配置文件应该是这样的。

Android Studio 默认keystore 以及自定义keystore使用


 

  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.  
    }

3 验证是否使用自定义keystore

 

 

下面讲解如何测试apk是否使用了我们创建的keystore

3.1 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

3.2 在APP内部通过代码的方式获取sha1 两者一比较即可。


 

  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.  
    }


原文地址




相关文章: