web-dev-qa-db-ja.com

ProGuardを使用してすべてのメソッドをクラスに保持する方法

ProGuardを使用してAndroidアプリケーションを最適化します。ただし、Androidインストルメンテーションテストでは、すべてのメンバーを保持するためにいくつかの(すべてではない)クラスが必要です。さまざまな方法を試しました。アプローチ、最後は:

-keepclassmembers public class com.mycompany.myclass {
    *;
}

しかし、驚くべきことに、私はまだ得ます

Java.lang.NoSuchMethodError: com.mycompany.myclass.<init>

ここでの苦痛な部分は、2つのコンストラクターがあり、1つにはかなりの数のパラメーターがあることです。

クラスを完全に変更せず、ProGuardの影響を受けないようにするための正しい構文を知っている人はいますか?

18
Martin

さて、告白の時間です。問題は睾丸です。 -keepclassmembersは正しいです。チームメイトがコードを壊し、コンストラクターが本当にそこになかったために問題が発生しました。

クラス全体が最適化されるという変更がある場合は、kharlesが提案したように-keepを使用する必要がありますが、すべてのメソッドを所定の位置に維持するには{*;}が必要です。

{*;}はテスト専用であることに注意してください。生産には、よりきめ細かいアプローチを使用する必要があります。

私は同じ問題を抱えている人のために質問を続けます。

20
Martin

試してみてください

-keep public class com.mycompany.myclass

(keepを使用し、{*;}は使用しない)

0
kharles