Android开发完打包好的apk如果被别人盗取可能会存在被反编译重打包的风险,那么我们如何来保护我们辛苦开发出来的程序不被别人盗取重打包呢,这里我们通过签名文件入手,因为打包时候是需要签名的,别人盗取后如果重打包也是需要签名的,那么如果重打包的签名跟我们原本打包的签名不一样,就可以阻止他使用该apk。
我们要在首页MainActivity里来判断重打包的签名文件是否与原签名文件一致:
/**
* 获取签名文件的第一个签名值
* @param packageName 应用包名
* @return
*/
public int getSignature(String packageName){
PackageManager packageManager = this.getPackageManager();
PackageInfo packageInfo = null;
int sign = 0;
try {
packageInfo = packageManager.getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
Signature[] signatures = packageInfo.signatures;
sign = signatures[0].hashCode();
} catch (PackageManager.NameNotFoundException e) {
sign = 0;
e.printStackTrace();
}
return sign;
}
签名文件的获取是在app的build.gradle文件里配置的
android {
compileSdkVersion 30
buildToolsVersion "30.0.0"
//配置签名文件信息
signingConfigs {
release {
keyAlias 'xxx.keystore'
keyPassword '123'
storeFile file('D:/xxx.jks')
storePassword '123'
}
}
……
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过签名校验防止重打包
Log.d("tag","getSignature:" + getSignature("com.wjy.project.mylearntest"));
//987654321这里是随便写的,实际的值是上面log getSignature("com.wjy.project.mylearntest")输出的值
if (getSignature("com.wjy.project.mylearntest") != 987654321){
Toast.makeText(this,"app被重新打包",Toast.LENGTH_SHORT).show();
//这里可以写使应用程序退出或杀死应用程序的代码,这样可以保护我们的apk不被重新打包
}
}
这样,通过签名文件的校验,如果不匹配就可以退出应该程序来防止重打包了。