web-dev-qa-db-ja.com

Proguardの警告「リソース[META-INF / MANIFEST.MF]を書き込めません(Zipエントリの複製)」

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フォルダーから削除し、プロジェクトライブラリとして追加し、両方のモジュールへの依存関係を追加しました。それは何も解決しませんでした、警告は持続し、私は理由を理解していません。

これらの警告は何の影響もありませんが、クリーンビルドはハッピービルドです。

36
Ricardo Amaral

おそらく「proguard.cfg」の問題です。 「-injar」が含まれていますか?プロジェクトに別のプロジェクトがライブラリとして含まれている場合、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 Duplicate Definition

これを修正するには、サードパーティのライブラリを別のディレクトリ、私の場合は「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フォルダーを削除する)。

47

build.gradlepackagingOptionsexcludeを使用しましたが、同じ問題があります。

これを使用して修正できます。

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'
}

pickFirstexcludeに置き換えます。

3
Wooseong Kim

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

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

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

このライブラリをライブラリまたはそれが内部に存在する他のフォルダから削除するようにしてください

0
Varun Bhatia

私が見つけた最良の解決策は、-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にはコピーされません。

0
user1499147