web-dev-qa-db-ja.com

Proguardはライブラリの構成ファイルを無視します

私は今数日間本当に奇妙な問題に直面しています...

メインモジュールとライブラリモジュールの2つのモジュールを持つGradleアプリがあります。

  • 両方のモジュールで、正しいproguard-rules.proファイルパスを宣言しました
  • 両方の.gradleファイルでminifyEnabledがtrueになっています

これが最初の問題です。ライブラリでminifyEnabledがfalseであっても、難読化されます。それはまったく効果がなく、メインモジュールの設定に依存しているようです。私は今からプロガードを使用していますが、そのような行動を一度も経験したことがありません。

また、ライブラリのproguard-rules.proは完全に無視されているようです。そこで宣言した内容は関係なく、使用されず、結果は常に同じです(結果を表示するために常に逆コンパイルされます)。デフォルト設定では難読化されています。

無効なプロガードファイル名を使用してファイルが変更されているかどうかを確認しましたが、実際には間違った名前のエラーがあり、プロガードファイルの構文エラーについても不平を言っています...

「runProguard」の代わりに「minifyEnabled」を使用することも推奨されているため、Android Studioの更新に何らかの関係があるのか​​わかりません。

ライブラリのproguard-rules.proも使用するようにproguardを管理するにはどうすればよいですか?

編集:

問題を明確にするためのサンプルプロジェクトを作成しました

enter image description here

ライブラリのプロガード構成

enter image description here

私のライブラリのグラドル:

enter image description here

そして最後にresult私はいつも得ます。 proguard configで何を除外/含めるかは関係ありません

enter image description here

ご覧のとおり、プロガードルールはメインモジュールで非常にうまく機能します。すべきことを行います。しかし、それは私のライブラリを常に完全に難読化します...

また、ライブラリのアクティビティが完全に削除されましたが、これはまったく発生しません。

28

驚くべきことに、エリックの答えは私にとっても実際に働いています!

もちろん、エリックは彼が何を言っているか知っていますが、私は今日この投稿を見つけるまで、1年以上の間、幸運なしにこれをGradleで自動的に行うきれいな方法を見つけようとしました。

私は他のいくつかのSOスレッドを組み合わせて、このソリューションが動作するようになりました。これは単純化することもできます。ステップ1〜4はオプションですが、今のところは見えません。傷ついた.

  1. http://sourceforge.net/projects/proguard/files/proguard/5.2/ からProguard 5.2をダウンロードします
  2. 解凍して.../Android-sdk/tools/proguard5.2
  3. 名前を変更.../Android-sdk/tools/proguard〜.../Android-sdk/tools/proguard4.7
  4. ln -s .../Android-sdk/tools/proguard5.2 .../Android-sdk/tools/proguard
  5. コピーAndroid-sdk/tools/proguard/examples/library.proライブラリプロジェクトフォルダーに名前を変更してproguard-library.pro
  6. 編集proguard-library.proとコメントアウト-injars-outjars-libraryjars、および-printmapping行。
  7. ライブラリのbuild.gradle含めるファイル:

    defaultConfig {
      minifyEnabled true
      shrinkResources true
      proguardFiles 'proguard-library.pro'
      consumerProguardFiles 'proguard-library-consumer.pro'
    }
    

    これを微調整して、リリースビルドとデバッグビルドの動作を変えることができます。

  8. proguard-library-consumer.pro

    # include in this file any rules you want applied to a
    # consumer of this library when it proguards itself.
    
    -dontwarn junit.**
    -dontwarn org.junit.**
    
    # Make crash call-stacks debuggable.
    -keepnames class ** { *; }
    -keepattributes SourceFile,LineNumberTable
    
8
swooby

私のために働いた唯一のことは、私のライブラリで両方のオプションを定義することです:

release {
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
consumerProguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
5
Asaf Pinhassi

ライブラリモジュールで以下を使用して解決しました。

proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
consumerProguardFiles 'lib_proguard-rules.pro'
0
Ali Bagheri