这个炒鸡简单

demo撸上

    //获取你重新自身的安装包位置 一般在/data/app/包名/xxx.apk
    public static String getApkPath(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_META_DATA);
            ApplicationInfo applicationInfo = packageInfo.applicationInfo;
            return applicationInfo.publicSourceDir; // 获取当前apk包的绝对路径
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }

    //获取hash值 整个apk的 注意 这里代码不太严谨 demo随便敲的 跑通就行了
    public static String getHash(Context context) {
        MessageDigest msgDigest;
        String apkPath = getApkPath(context);

        FileInputStream fis = null;
        try {
            msgDigest = MessageDigest.getInstance("SHA-1");
            byte[] bytes = new byte[1024];
            int byteCount;
            fis = new FileInputStream(new File(apkPath));
            while ((byteCount = fis.read(bytes)) > 0) {
                msgDigest.update(bytes, 0, byteCount);
            }
            BigInteger bi = new BigInteger(1, msgDigest.digest());
            return bi.toString(16).toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "";
    }

代码就这些了 每次发布软件 签名后 获取apk的hash保存到服务器 然后
app通过getHash方法获取hash和服务器保存的比对 如果不正确就自动退出什么的 爱咋地咋地

这个校验可以放到ndk里面写 免得被反编译删除校验就没用了
注意 获取hash之后不要动apk文件了 不要做任何修改(一键打渠道包工具什么的) 否则会导致apk文件hash改变

如果需要渠道包 可以后台存多个hash 对应不同的渠道包

标签: none

添加新评论