最近,我遇到了一些问题,人们使用一个名为 Gamecih 的 root 用户应用程序作弊。Gamecih 让用户在运行时暂停游戏并更改变量。
如果我混淆我的代码,虽然作弊者很难知道在运行时要更改哪些变量,但我也担心它可能会导致其他一些问题。
我使用 Java 的 Serializable 接口序列化游戏对象,然后将它们写入文件。现在假设我正在序列化“Player”类的一个对象。它被序列化并保存到文件中。然后用户使用 Proguard 实现下载更新。Proguard 将重命名类和类成员名称。尝试读取已保存的 Player 对象时,这不会导致重大错误吗?
如果我还没有启动我的游戏,这不会是一个问题。但是现在有些玩家在同一个保存的游戏(这是一个 RPG)上玩了几个月。如果他们下载了更新并不得不从头开始,他们会非常生气。
我知道我可以指示 Proguard 不要混淆某些类,但我真正需要混淆的是 Player 类。
澄清:假设我有以下简单的未混淆类:
public class Player {
private int gold;
private String name;
//Lots more.
public Player(String name)
{
this.name = name;
}
public int getGold() {
return gold;
}
public void setGold(int gold) {
this.gold = gold;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
播放器被创建、序列化并保存到文件中。在我实现混淆器之后,它可能看起来像这样:
public class Axynasf {
private int akdmakn;
private String anxcmjna;
public Axynasf(String adna)
{
anxcmjna=adna;
}
public int getAkdmakn() {
return akdmakn;
}
public void setAkdmakn(int akdmakn) {
this.akdmakn = akdmakn;
}
public String getAnxcmjna() {
return anxcmjna;
}
public void setAnxcmjna(String anxcmjna) {
this.anxcmjna = anxcmjna;
}
}
想象一下,我现在发布了一个更新,而一个拥有未混淆版本 Player 的播放器下载了该更新。当尝试读取该对象时,会有不同的成员名称和不同的类名称。我很可能会得到 ClassCastException 或类似的东西。