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值是完全一致的。
延伸阅读
- Android 开发中不可不知的技巧
- 《Android 经验分享》周刊第 1 期
- 10 条提升 Android 性能的建议
- Unable to merge dex
- 获取Android签名MD5的方式
- Android 应用获取签名MD5
- jks获取公钥私钥
- APP 备案公钥、签名 MD5获取方法。(推荐)