首页 > 解决方案 > 如何在android的运行时获取.aar符号(或HashKey)

问题描述

是否有可能aar签入(或HashKeyruntime

我将以下代码用于apk文件并且它有效,但不适用于aar文件

  PackageInfo info;
        try {
            info = Payment.this.getPackageManager().getPackageInfo(contex.getPackageName(), PackageManager.GET_SIGNATURES);
            Toast.makeText(Payment.this, contex.getPackageName(), Toast.LENGTH_LONG).show();
            for (Signature signature : info.signatures) {
                MessageDigest md;
                md = MessageDigest.getInstance("SHA1");
                md.update(signature.toByteArray());
                String something = new String(Base64.encode(md.digest(), 0));
                Log.e("hash key", something);
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

getPackageName()方法得到apk packagename因为这个我会得到apk标志不是aar

标签: androidsignaar

解决方案


获取上下文并将其传递给 getSign 方法

public static String getSign(Context context, String algorithm) throws CertificateException, NoSuchAlgorithmException, PackageManager.NameNotFoundException {

        PackageManager packageManager = context.getPackageManager();
        String packageName = context.getPackageName();
        int flags = PackageManager.GET_SIGNATURES;
        PackageInfo packageInfo = null;
        try {
            packageInfo = packageManager.getPackageInfo(packageName, flags);
        } catch (PackageManager.NameNotFoundException e) {
            throw e;
        }
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();
        InputStream input = new ByteArrayInputStream(cert);
        CertificateFactory certificateFactory = null;
        try {
            certificateFactory = CertificateFactory.getInstance("X509");
        } catch (CertificateException e) {
            throw e;
        }
        X509Certificate certificate = null;

        try {
            certificate = (X509Certificate) certificateFactory.generateCertificate(input);
        } catch (CertificateException e) {
            throw e;
        }
        String hexString = null;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
            byte[] publicKey = messageDigest.digest(certificate.getEncoded());
            hexString = byte2HexFormatted(publicKey);
        } catch (NoSuchAlgorithmException e1) {
            throw e1;
        } catch (CertificateEncodingException e) {
            throw e;
        }
        return hexString;
    }

    private static String byte2HexFormatted(byte[] arr) {

        StringBuilder stringBuilder = new StringBuilder(arr.length * 2);
        for (int i = 0; i < arr.length; i++) {
            String hexString = Integer.toHexString(arr[i]);
            int l = hexString.length();
            if (l == 1) hexString = "0" + hexString;
            if (l > 2) hexString = hexString.substring(l - 2, l);
            stringBuilder.append(hexString.toUpperCase());

        }
        return stringBuilder.toString();
    }

样本:

   Context context = MyLibApp.getContext();

            String sha1Sign = null;
            try {
                sha1Sign = AppSigner.getSign(context, "SHA1");
            } catch (CertificateException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
   Assert.assertNotNull(sha1Sign);

推荐阅读