Android 开发小贴士
-
应用编译时报错:Unable to merge dex
可能原因: 包引用重复 、方法数超限或者几个库之间有重复代码块(特别是在整理module时容易犯)。
解决办法:
app的build.gradle 中
// 1. 添加配置
defaultConfig {
......
multiDexEnabled true
}
// 2. 清除缓存,重启Android Studio
Invalidate Caches/Restart
获取.apk的MD5、签名公钥等
2.1 keytool 获取文件的SHA256等信息,但是无法获取 MD5
2.2
命令行获取MD5信息
// cmd输入此
keytool -list -v -keystore /***/yiqi.jks | openssl dgst -md5
// 输入密钥库口令即可
但是经确认,复制一个同样的.jks文件,获取的md5值就改变了,所以你在网路搜到的此类方式是错误的。
2.3 代码获取
/**
* 获取签名MD5值
*
* @param context
* @return
*/
public static String getMD5(Context context) {
String res = "";
ArrayList<String> mlist = getSignInfo(context, MD5);
if (mlist != null && mlist.size() != 0) {
res = mlist.get(0);
}
return res;
}
/**
* 返回一个签名的对应类型的字符串
*
* @param context
* @param type
* @return 因为一个安装包可以被多个签名文件签名,所以返回一个签名信息的list
*/
public static ArrayList<String> getSignInfo(Context context, String type) {
if (context == null || type == null) {
return null;
}
String packageName = context.getPackageName();
if (packageName == null) {
return null;
}
if (mSignMap.get(type) != null) {
return mSignMap.get(type);
}
ArrayList<String> mList = new ArrayList<String>();
try {
Signature[] signs = getSignatures(context, packageName);
for (Signature sig : signs) {
String tmp = "error!";
if (MD5.equals(type)) {
tmp = getSignatureByteString(sig, MD5);
} else if (SHA1.equals(type)) {
tmp = getSignatureByteString(sig, SHA1);
} else if (SHA256.equals(type)) {
tmp = getSignatureByteString(sig, SHA256);
}
mList.add(tmp);
}
} catch (Exception e) {
Log.e("e", e.getMessage());
}
mSignMap.put(type, mList);
return mList;
}
2.4 jadx 获取(同时也可获取到签名公钥)
可参阅文末 "延伸阅读"的第8篇文章。
总结:第3、4种获取的MD5值是完全一致的。