38

IntelliJ を使用し、デバッグ モードで Proguard を実行していますが、次のような警告を取り除くことができないようです。

ProGuard: [MyApplication] Warning: can't write resource [META-INF/MANIFEST.MF] 
(Duplicate zip entry [android-support-v13.jar:META-INF/MANIFEST.MF])

このプロジェクトにはいくつかのモジュールandroid-support-v13.jarがあり、そのうちの 2 つで使用されています。それが問題だと思ったので、そのライブラリを libs フォルダーから削除し、プロジェクト ライブラリとして追加し、両方のモジュールに依存関係を追加しました。それは何も解決しませんでした。警告は持続し、その理由がわかりません。

これらの警告が何にも影響しないことはわかっていますが、クリーン ビルドはハッピー ビルドです。

4

5 に答える 5

49

おそらく「proguard.cfg」の問題です。「-injars」は含まれていますか?プロジェクトに別のプロジェクトがライブラリとして含まれている場合、jar は 2 回処理される可能性があります。「proguard.cfg」を投稿していただけますか?

http://proguard.sourceforge.net/index.html#manual/troubleshooting.htmlからの抜粋:

入力 jar には、同じ名前の複数のリソース ファイルが含まれています。ProGuard は、以前に使用された名前のファイルをスキップして、通常どおりリソース ファイルのコピーを続行します。繰り返しになりますが、警告は何らかの問題を示している可能性があるため、重複を削除することをお勧めします。これを行う便利な方法は、入力 jar にフィルターを指定することです。これらの警告をオフにするオプションはありません。

オプション1:

「-injars」を投稿できないため、「android-support-v13.jar」または「android-support-v13.jar」も含むプロジェクトに含まれるライブラリが含まれているかどうかを確認してください。

IntelliJ IDEA 内で Ant を使用してビルドしていると仮定すると、-injars、-outjars、または -libraryjars オプションを追加してはなりません。Ant スクリプトが既にそれを行っています。

オプション #2:

警告は無害ですが、クリーン ビルドはハッピー ビルドであるため、次のことを試してください。

http://web.archive.org/web/20160206204259/http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-cant-write-resource-meta-infmanifest-mf/

https://gist.github.com/paulpv/4439012

オプション #3:

(!META-INF/MANIFEST.MF)各「-injars」コマンドの後に含める

-injars library.jar(!META-INF/MANIFEST.MF)

オプション #4: Android Proguard 重複定義

サードパーティのライブラリを別のディレクトリ (私の場合は「lib」) に移動することでこれを修正しました。その後追加

-injars lib/jmdns.jar 

proguard.cfg ファイルに。

オプション 5: Android - Proguard 重複 zip エントリ エラー

Proguard 構成ファイルに次の行が含まれている場合は、それを削除します。

-injars bin/classes

オプション #6: proguard を使用した Android 難読化アプリは、ライブラリ jar を難読化し続けます。

Proguard にライブラリ jar をそのまま残す別の方法を見つけたのは、パッケージ名を保持するように依頼することでした。

-keep class javax.** { *; } -クラスの組織を維持** { *; } - クラス twitter4j.** { *; を保持します。}

オプション #7:

hereに似た奇妙な解決策(srcフォルダーのMETA-INFフォルダーを削除する)。

于 2013-05-16T11:54:18.117 に答える
4

で使用packagingOptionsexcludeましたがbuild.gradle、あなたと同じ問題を抱えています。

これを使えば直せます。

packagingOptions { 
    pickFirst 'META-INF/services/javax.annotation.processing.Processor'
    pickFirst 'META-INF/DEPENDENCIES.txt'
    pickFirst 'META-INF/DEPENDENCIES'
    pickFirst 'META-INF/LICENSE.txt'
    pickFirst 'META-INF/LICENSE'
    pickFirst 'META-INF/NOTICE.txt'
    pickFirst 'META-INF/NOTICE'
    pickFirst 'META-INF/LGPL2.1'
}

に置き換えpickFirstますexclude

于 2014-07-24T06:53:56.333 に答える
0

jar を直接含めてサポート ライブラリを参照しないでください。これを行うと、ビルド システムはその複数のバージョンを区別できず、このタイプのエラーが発生します。その Maven 座標を参照してインクルードします。

dependencies { compile 'com.android.support:support-v13:XXX' } ここで、XXX は、コンパイル対象の API に基づく適切なバージョン番号です。プロジェクト構造 > (モジュール) > 依存関係 > + ボタン > ライブラリ依存関係の UI を介してこの依存関係を含めると、適切なバージョン番号を選択するのに役立ちます。

jar をラングリングする代わりに、Maven 座標を介して他の依存関係を含めると便利な場合もあります。同じライブラリ依存関係 UI には、ライブラリを見つけるのに役立つ検索機能があります。

このライブラリをlibsまたは内部に存在していた他のフォルダーから必ず削除してください

于 2016-01-09T10:03:57.490 に答える
0

私が見つけた最善の解決策は、-obfuscate ターゲットを /tools/ant/build.xml からプロジェクトの custom_rules.xml にコピーすることでした。次に、変更する必要がある唯一のブロックは次のとおりです。

<pathconvert property="project.all.classes.value" refid="project.all.classes.path">
    <firstmatchmapper>
         <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"(!META-INF/MANIFEST.MF)'/>
         <identitymapper/>
    </firstmatchmapper>
</pathconvert>

追加されるビットは(!META-INF/MANIFEST.MF). これにより、最終的な APK にコピーされないすべてのマニフェスト ファイルが除外されます。

于 2013-11-20T10:34:58.213 に答える