這個炒雞簡單
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 對應不同的渠道包