14

ADT を 16 から 18 に更新して以来 (Proguard を 4.6 から 4.8 に更新する必要がありました)、Proguard は非常に奇妙な動作をしています (一貫性がありませんか?)。

このような最新の問題は、署名済み (リリース) APK をエクスポートしようとすると、次のエラーが表示されることです。

Proguard returned with error code 1. See console
Warning: com.bta.LibProj2: can't find referenced class com.bta.R$string
Warning: com.bta.MyDlg1: can't find referenced class com.bta.R$string
Warning: com.bta.MyMenu: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$attr
Warning: com.bta.R: can't find referenced class com.bta.R$drawable
Warning: com.bta.R: can't find referenced class com.bta.R$menu
Warning: com.bta.R: can't find referenced class com.bta.R$string
Warning: com.bta.myapp.MyAppActivity$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$ELicenseResponse: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback
Warning: com.bta.myapp.MyAppActivity$MyLicenseCheckerCallback$1: can't find referenced class com.bta.myapp.MyAppActivity
Warning: com.bta.myapp.R$array: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$layout: can't find referenced class com.bta.myapp.R
Warning: com.bta.myapp.R$xml: can't find referenced class com.bta.myapp.R
Warning: there were 49 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').
java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:321)
    at proguard.ProGuard.initialize(ProGuard.java:212)
    at proguard.ProGuard.execute(ProGuard.java:87)
    at proguard.ProGuard.main(ProGuard.java:493)

proguard.cfgに追加するよう推奨されていること-libraryjarsに気付きましたが、以前はこれを行う必要がありませんでした (そして、コードを変更したわけではなく、Proguard を 4.6 から 4.8 に更新しただけでした)。これは、開発環境の構成に何か問題があることを示唆していますか?

また、Proguard のトラブルシューティング セクションで参照されているクラスが見つからないことを確認しました。これは、ライブラリを介して指定することを忘れたり無視したりすることを指します-libraryjars(これは認めます) が、ライブラリを指定したことはなく、以前は常に機能していました! 何が変わったのですか?

私のproguard.cfgファイルBTWは次で始まります:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

何が起こっているのか分かりますか?Proguard が私に苦労を与え始めたのはなぜですか? (私は 1 年以上の間、非常にスムーズにそれを使っていました) システム構成に欠けている基本的なものはありますか?

ところで、使用しているライブラリをすべて-libraryjars行で指定して追加しようとしましたが、Proguard の動作は悪化するだけでした。上記で引用したエラー ログが表示されずに失敗します。

4

3 に答える 3

15

問題が解決しました。ここSOで手がかりをたくさん探した後、私はついにProguardの開発者自身によるこのヒントを見つけました:

-dontwarn scala.**

「scala」を含むものは使用しておらず、scala とは何かわかりません。しかし、それは私自身のアプリケーションパッケージ-dontwarnに配置するという考えを私に与えました:

-dontwarn com.bta.**

それはトリックをしました。

記録として、このヒントを見つけるきっかけとなった検索フレーズは、proguard admob "can't find referenced class"でした。

PS Proguardの提案You may need to specify additional library jars (using '-libraryjars')は正しい方向にさえありませんでした...

更新:署名付き APK の作成は許可されて-dontwarn com.bta.**いますが、起動しようとするとすぐにクラッシュしました:

ClassNotFoundException: com.bta.myapp.MyAppActivity in loader dalvik.system.PathClassLoader[/data/app/com.bta.myapp.myapp-1.apk]. 

なんて悪夢だ。

更新 2: -dontwarn com.bta.**包括的すぎることが判明しました。私はそれを次のように変更しました:

-dontwarn com.bta.myapp.MyAppActivity.R**

そして今、すべてが何事もなく順調に進んでいます。 なんて悪夢だ。

時間を節約できるはずのツールのデバッグにあまりにも多くの時間を費やした後、問題の原因を発見しました。これは、Android SDK ツールのバグです。r17 で解決されたと文書化されていますが、私は今日 (2012 年 6 月 18 日) の最新のものを使用していますが、解決されていません! (コメント24を参照)。コメント 25には、実際の開発を進めるための回避策も記載されています。

複雑なシステムでは、バグはつきものです。しかし、Proguard も、Proguard に入力をフィードするビルド ツールも有用なエラー メッセージを提供できなかったという事実 (実際、それらは正反対でした) は、Google が推奨するAndroid 開発ツールの「方法論」に何かが壊れていることを示唆しています。

于 2012-06-13T04:45:23.737 に答える
1

まず、Proguard が何を伝えているかを調べます。

Warning: com.bta.LibProj2: can't find referenced class com.bta.R$string
Warning: com.bta.MyDlg1: can't find referenced class com.bta.R$string

com.bta.R$string が見つかりません。なぜだめですか?com.bta.R$string はありますか? ソースコードではなく、この時点ではソースは気にしません。.class ファイルはありますか? ファイルシステムにある場合、Proguard 構成ファイルで実際に参照されていますか? それがどのように含まれるべきかを知っていることを確認してください。com.bta.R$string を参照しているのは何ですか? おそらく、それを理解するために javap を使用することになるでしょう。

この場合に使用するより良い大ハンマーは、警告をオフにすることではなく (警告は実際に何か重要なことについて警告しているため)、次のように、欠落している com.bta クラスを保持するように Proguard に指示することです。

-keep class com.bta.**

ライブラリ jar について考えるという推奨事項は、単なる推奨事項です。これは明らかにプロガードの一般的な設定ミスであるため、人々をその方向に向けるためにメモを追加することは完全に合理的です。それはあなたの問題を解決しませんでしたが、それは有用なアドバイスではないという意味ではありません.

ところで、使用しているライブラリをすべて -libraryjars 行で指定して追加しようとしましたが、Proguard の動作は悪化するだけでした。上記で引用したエラー ログが表示されずに失敗します。

おそらく、これらの -libraryjars エントリが必要です。問題を悪化させることはありません。N 個の問題がある (-libraryjars を指定しない) 構成から、N - 1 個の問題がある構成になりました。N - 1 ソリューションを修正します。もしあれば、どのようなエラーが発生しますか?エラーがない場合、警告をオンに戻すとどうなりますか?

専門家のみ: 実際には -libraryjars エントリがなくても便利な構成を使用できますが、Proguard がコードで何を行っているかを完全に理解する必要があります。そして、私の頭の中で、なぜこれをやりたいのか、パフォーマンス以外の理由は考えられません.

于 2012-06-15T21:40:50.900 に答える
1

SDK と ADT の最新の更新後に同様の問題が発生し、最終的にプロジェクトを最初からチェックアウトする必要がありました。プロジェクトの新しいコピーをチェックアウトしてみて、それが機能するかどうかを確認してください。

于 2012-06-12T23:45:28.520 に答える