2011-07-16 49 views
3

我想使用ProGuard來混淆Spring Web應用程序。我想保留類和方法名稱,特別是用作spring bean的名稱。ProGuard混淆變量命名,如何避免本地和參數前綴?

但ProGuard的重命名局部變量local[class name],例如,如果我有一個User對象時,它重命名局部變量localUser。它還將方法參數重命名爲param[Class name],例如,如果我有一個用戶參數,混淆方法中的變量名變爲paramUser。所以被混淆的代碼變得非常可讀。

我想阻止使用本地和參數前綴和類名稱的ProGuard。例如,我希望它使用x1而不是localUser。我檢查了配置選項,但我無法找到如何做到這一點。

+0

我大量使用ProGuard;但是當我檢查了混淆的類時,所有混淆的名稱都被系統地重命名爲1或2個字母(不管它們的上下文是什麼)。我還沒有看到你描述的那種命名方案的證據,這導致我認爲它們可能是你指定的某個配置選項導致它的原因。 –

+0

我保留了一些類和方法的名稱。這就是爲什麼一些類和方法的名稱不會轉換爲b等 –

+0

你有沒有設法完全混淆你的應用程序,因爲我面臨着我的web應用程序的彈簧配置惡夢.. – Genjuro

回答

5

ProGuard manual > Troubleshooting>後加工>變量名稱不被混淆

如果局部變量和參數混淆的 代碼的名字意外的意見不看模糊的,因爲他們懷疑類似的 名他們的類型,這可能是因爲您使用的反編譯器正在使用這些名稱。 ProGuard的混淆步驟 會完全刪除原始名稱,除非您明確將LocalVariableTable或LocalVariableTypeTable屬性保留爲 。

+0

謝謝你的澄清。 –

1

變量x1不放棄任何比paramUser更多信息,考慮到觀看代碼如下:

public void foo(User x1) 
{ 
    ... 
} 

除非你的方法是很長,也不會爲任何人閱讀難方法來記住它是User類型的參數,這就是paramUser所說的全部。是的,可讀性有一點差異,但我個人並不認爲值得擔心 - 如果有人投入足夠的時間來反編譯代碼,那麼這樣一個非常小的差異將不可能阻止它們。如果類名也被混淆了,那麼IMO會有更大的區別。

+0

你是對的,但我只是想讓它看起來更難讀。你知道更好的Spring bean混淆解決方案嗎?我的意思是混淆了類和方法名稱,而沒有進入Spring應用程序配置噩夢。 –

+0

@Serkan:我不知道更好的解決方案,但是如果你的Spring配置是XML的話,我希望自動修改它以使用Proguard提供的新混淆名稱是可行的。 –

+0

proguard以不尊重導致反射崩潰的java bean慣例的方式混淆了getters和setter。排除每一個春天的豆子都是愚蠢的,特別是當很多層次大量使用彈簧注射時 – Genjuro

0

您所描述的命名機制看起來像由Java編譯器跳過LocalVariableTable(請參閱javac -g:var)時由JD重新生成的名稱。對我而言,這不是ProGuard的缺陷。

爲了使您的應用程序的更有效的混淆,

  • 試圖取代「保護」的「私有」每一個可能時間:ProGuard的將短名稱替換類,方法和字段名,
  • 嘗試在您的代碼中使用匿名類,
  • 並嘗試在大量類中拆分您的算法以複雜化對執行流的理解。