我們知道一般情況下Activity的子類是不能混淆的,但是呢這句話說(shuō)的不完全。確切的說(shuō)應(yīng)該是在Manifest文件中注冊(cè)的Activity是不能混淆的。因?yàn)镸anifest文件中要寫(xiě)一個(gè)Activity的class的路徑的字符串。如果原始的類被混淆了,而字符串沒(méi)有修改,那么Android系統(tǒng)在做安全驗(yàn)證的時(shí)候就會(huì)找不到Activity,那么就沒(méi)辦法通過(guò)安全驗(yàn)證。但是設(shè)想一下如果我們的繼承關(guān)系是這個(gè)樣子的:
MainActivity--->BaseActivity ---->Activity
那么試問(wèn),這個(gè)BaseActivity是不是可以混淆,經(jīng)過(guò)驗(yàn)證這個(gè)是可以混淆的。因?yàn)锽aseActivity 不需要在Manifest文件中注冊(cè),而MainActivity需要。那么我們變通一下。把這個(gè)繼承鏈加長(zhǎng)
a--->MainActivity--->BaseActivity ---->Activity
這個(gè)時(shí)候,a 類的實(shí)現(xiàn)是這個(gè)樣子的:
public class a extends MainActivity {
}
其實(shí)a里面啥也沒(méi)有,就是個(gè)占位符,這個(gè)a并不是混淆生成的,而是我們本來(lái)就把這個(gè)類命名為a。并且在Manifest文件里面我們就注冊(cè)這個(gè)a類。那么試問(wèn)這個(gè)時(shí)候,MainActivity 和 BaseActivity是不是就可以參與混淆。而這個(gè)時(shí)候我們的所有業(yè)務(wù)依然在MainActivity里面實(shí)現(xiàn),a僅僅是個(gè)看起來(lái)像是混淆名字的占位符而已。。。。
其他需要在Manifest中注冊(cè)的文件同理,比如service或application...
做個(gè)記錄。原文http://www.itdecent.cn/p/3606f006ea7b