proguardを使用するときに特定のパッケージパスを保持/除外するにはどうすればよいですか?


110

ProGuardから一部のファイルパスを除外したい。例com.myapp.customcomponents

これどうやってするの?このディレクトリにあるすべてのカスタムコンポーネントファイルに-keepフラグを付けるのは嫌です。

私は以下を試しましたが、うまくいきません:

-keep public class com.myapp.customcomponents.*

回答:


241

機能しない方法を指定しません。構成により、すべてのパブリッククラスの名前が指定したパッケージに保持されます。

-keep public class com.myapp.customcomponents.*

次の構成では、指定したパッケージとそのサブパッケージ内のすべてのパブリッククラスの名前が保持されます。

-keep public class com.myapp.customcomponents.**

次の構成では、すべてのパブリック/保護されたクラス/フィールド/メソッドの名前が、指定されたパッケージとそのサブパッケージに保持されます。

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
ダブルアスタリスク(**)がコンパイルされなくなりました(Android Studio 4.0)
Daniel

Android Studio 4.xでは、ダブルアスタリスク(**)に対して「未解決のクラス名」などのエラーが表示されますが、期待どおりに機能します。
Mahmudul Hasan Shohag

55

ProGuard構成の下部に次の行を追加します。

-keep class com.facebook.** { *; }

それに応じてパッケージ名を置き換えます。ここで、パッケージcom.facebookはProGuardから除外されます。


13
なぜキープし、一緒に使用しない
Jongz Puangput 2015

@Jongz Puangput、私が正しい場合-アプリがcom.facebookパッケージを使用しない場合、ビルド時に「構成は不明なクラスを参照しています...」という注記が表示されます。-dontwarnこのメモを無効にします。
Yura Shinkarev

14
どういう{ *; }意味ですか?
Muhammad Babar

15
@MuhammadBabar iは、すべてのスコープのすべてのメンバー、メソッド、クラス、つまりすべてを意味します!
Omar El Don

1

-keep class com.myapp.customcomponents.** { *; }処理からパスを除外する方法として、多くの人が推奨しているようです。こちらをご覧ください:

  1. proguardからパッケージを除外する
  2. Proguardにパッケージを完全に無視させる
  3. ディレクトリが難読化されないようにする

このソリューションの問題は、コードが壊れる可能性がある難読化のレベルがまだ発生していることです。マッピングの印刷でマッピングを確認できます。

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

私が選択したソリューションは、2ステップのプロセスです。まず、injarsフィルターを使用して、処理するパッケージパスを選択します。他のパッケージパスをライブラリとして追加することができます。

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

次に、処理されたjarを元のjarとマージしますが、スキップされたパスのみをマージします。

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

結果は、処理されたパッケージパスとスキップされたパスの組み合わせであるマージされたjarです。誰かが特定のパスの処理を完全にスキップする方法を提供できる場合(私が見つけていない)、この演習は無効です。


1

Android Studio 4.0を使用して私のために働いたのは:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

他の回答で二重アスタリスク(**)が機能しませんでした。また、R8で上記の構成を試しましたが、正常に動作します。


この答えは私が思う最新の答えです。ありがとうございました。
Gogo-the-Cat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.