这个炒鸡简单
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 对应不同的渠道包