5

ProGuard が、スレッドを同期するために使用した .wait() 呼び出しを削除したことを発見しました。これにより、競合状態が発生し、楽しいデバッグの 1 日が始まりました :) とにかく...

私はそれを次のプロガード構成の部分まで追跡しました:

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

なぜこれが起こったのかを理解したい。Log クラスの削除に副作用がないと仮定すると、別のクラス/オブジェクトで .wait() が削除される理由がわかりません。

ProGuard の最適化では #wait() 呼び出しも削除されるのを見ましたが、Eric はそのようなことが起こる可能性があると説明しています。しかし、彼はその理由を説明していません。

また、ここでログを削除する方法の例を見つけました ( http://proguard.sourceforge.net/index.html#manual/examples.html )。したがって、この構成のプロガードを置き換えることができます(ただし、それはこの質問のポイントではありません)。

4

1 に答える 1

5

元の構成は、Object#wait() を含む Log (明示的または継承) のすべてのメソッドと一致します。これは、wait() メソッドに副作用がなく、プログラムに害を与えることなく削除できることを ProGuard に伝えます。お気づきのように、これは明らかに真実ではありません。-assumenosideeffects を使用すると、安全に削除できるメソッドを常に明示的にリストする必要があります。

于 2013-06-02T14:27:45.300 に答える