我们知道一般情况下Activity的子类是不能混淆的,但是呢这句话说的不完全。确切的说应该是在Manifest文件中注册的Activity是不能混淆的。因为Manifest文件中要写一个Activity的class的路径的字符串。如果原始的类被混淆了,而字符串没有修改,那么Android系统在做安全验证的时候就会找不到Activity,那么就没办法通过安全验证。但是设想一下如果我们的继承关系是这个样子的:
MainActivity--->BaseActivity ---->Activity
那么试问,这个BaseActivity是不是可以混淆,经过验证这个是可以混淆的。因为BaseActivity 不需要在Manifest文件中注册,而MainActivity需要。那么我们变通一下。把这个继承链加长
a--->MainActivity--->BaseActivity ---->Activity
这个时候,a 类的实现是这个样子的:
public class a extends MainActivity {
}
其实a里面啥也没有,就是个占位符,这个a并不是混淆生成的,而是我们本来就把这个类命名为a。并且在Manifest文件里面我们就注册这个a类。那么试问这个时候,MainActivity 和 BaseActivity是不是就可以参与混淆。而这个时候我们的所有业务依然在MainActivity里面实现,a仅仅是个看起来像是混淆名字的占位符而已。。。。
其他需要在Manifest中注册的文件同理,比如service或application...
网友评论