Android 开发小贴士

发布于:2023-09-15 ⋅ 阅读:(178) ⋅ 点赞:(0)

Android 开发小贴士

  1. 应用编译时报错:Unable to merge dex

    可能原因: 包引用重复 、方法数超限或者几个库之间有重复代码块(特别是在整理module时容易犯)。

    解决办法:
    app的build.gradle 中

// 1. 添加配置
defaultConfig {
	......
	multiDexEnabled true
}

// 2. 清除缓存,重启Android Studio
Invalidate Caches/Restart
  1. 获取.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值是完全一致的。

延伸阅读
  1. Android 开发中不可不知的技巧
  2. 《Android 经验分享》周刊第 1 期
  3. 10 条提升 Android 性能的建议
  4. Unable to merge dex
  5. 获取Android签名MD5的方式
  6. Android 应用获取签名MD5
  7. jks获取公钥私钥
  8. APP 备案公钥、签名 MD5获取方法。(推荐)

网站公告

今日签到

点亮在社区的每一天
去签到