2013-05-30 31 views
3

我剛剛發現ProGuard刪除了一個.wait()調用,我用它來同步線程,這導致了一個導致一天快樂調試的競爭狀態:)無論如何...Proguard吃了我的Object.wait()

我跟蹤它到下面這段ProGuard的配置:

-assumenosideeffects public class android.util.Log { 
    <methods>; 
} 

我想了解爲什麼發生這種情況。我不知道爲什麼假設刪除Log類沒有副作用導致刪除不同的類/對象上的.wait()。

我看到ProGuard optimization also remove #wait() calls其中Eric解釋說可能會發生這樣的事情。但是,他沒有解釋爲什麼。

此外,我找到了示例如何在這裏刪除日誌(http://proguard.sourceforge.net/index.html#manual/examples.html)。所以,我可以替換這段配置的proguard(但它不是這個問題的重點)。

+0

我可以問你一個問題......你爲什麼使用ProGuard?爲了什麼? –

+0

@AdamStelmaszczyk:主要是代碼混淆。但是,除了整體應用程序混淆之外,日誌刪除還不錯。你爲什麼要問? –

+0

因爲我覺得這不值得花時間。檢查由ProGuard生成的代碼(反編譯apk)。您會看到您可以輕鬆閱讀「混淆」版本。您可以使用簡單的'boolean DEBUG = false'標誌刪除日誌。我扔掉了ProGuard,因爲它給了更多的問題而不是好處。 –

回答

4

您的原始配置與Log(顯式或繼承)的所有方法相匹配,包括Object#wait()。它告訴ProGuard wait()方法沒有副作用,並且可以在不損害程序的情況下將其移除。你已經注意到這顯然不是真的。對於-assumenosideeffects,你應該總是明確列出可以安全刪除的方法。

+0

這是否意味着配置「;」如果它在任何類上定義,都保證會同步化? –

+0

是的,它將刪除應用程序代碼中的所有wait(),notify()和notifyAll()調用,這很可能會破壞同步。 –

+0

如果在類中定義(我的情況),是否考慮返回錯誤?看起來好像它不是一個界面 - 它只是要求麻煩。 –