android - 如何在android的运行时获取.aar符号(或HashKey)
问题描述
是否有可能aar
签入(或HashKey
)runtime
?
我将以下代码用于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
解决方案
获取上下文并将其传递给 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);
推荐阅读
- java - 在 main 退出后,恶魔线程继续运行并且有一些非守护线程仍在运行?
- computer-vision - 给定校正图像的视差图,如何计算真实深度?
- r - 从 emmeans 中的成对对比中提取概率
- html - 有没有办法将元素锁定在其容器的左右边缘,使其伸展以填充该容器?
- scala - 为什么scala允许从recoverWith返回
- php - PHP - 以 15 为增量计数,但最大为 45
- sql - Postgres中多个数组的平均值
- php - Laravel 5.5 使用除 ENV 之外的其他电子邮件设置发送电子邮件
- java - LinkedList 中的节点(整数索引)
- php - WooCommerce - 在结帐时显示最终运输选择