2016-04-24 21 views
0

我的Android項目和我的Java應用程序服務器項目中有一些共享代碼。在服務器項目中,我忽略了一些toString()日誌記錄方法,這在Android項目中並不需要。然後,我使用ProGuard優化了我的Android項目中的代碼。但是當我反編譯生成的APKclasses.dextoString()方法仍然存在。如果我不刪除它,它可能仍然是一個易於逆向工程的缺陷。
我試過-assumenosideeffects選項,但它不起作用。有沒有辦法通過編輯ProGuard配置或Android項目配置來刪除這些toString()方法?如何使用Proguard或其他工具刪除未使用的重寫的toString()方法?

回答

0

編號Proguard不會刪除引用它的代碼。

您最好的選擇是「強制」編譯器刪除行: 使用BuildConfig.DEBUG或自定義常量並將調用包裝在其中。

如果編譯器找到一個計算結果爲false的常量表達式,它可能會刪除嵌套代碼。

+0

該代碼由web和Android共享,構建代碼時沒有'BuildConfig.DEBUG'可用。你也不能在方法周圍放置一個'if',只能放置內容。這就是說,一個'super.toString()'調用對於逆向工程來說不是什麼問題。 – TWiStErRob

+0

是的,這就是爲什麼我說「或一個自定義」常量,是的:你不能包裝一個方法在一個if,因此我說「調用」就像'如果(INDEBUG)日誌(myObj.toString())' –

1

沒有簡單的使用檢測,任何Object.toString都可以調用你的類的toString。

馬克每個照明toString用自己的編譯時註釋,像

@DevelopOnly 
@Override 
public String toString() { ... 

,然後使用註解處理器(APT),以去除方法。 有很多很好的例子。

收集AbstractProcessor中的類並使用ASM或另一個庫刪除方法。

相關問題