2011-01-17 15 views
3

私は最近、ProGuard for my Eclipse Androidプロジェクトを有効にしました。 proguard.cfgに外部のlibsと動的に参照されるクラスを追加した後、私はapkを構築するときに何のエラーも受け取りません。私はインストールされたアプリを起動しようとするとNoSuchMethodErrorが表示されます。Android:Proguard NoSuchMethodError

主なアクティビティのonCreateメソッドで呼び出される特定のメソッドに絞りました。物事を単純化するために、ここではクラスとメソッドがどのように見えるかだ(私は多くのコードを残し、私はこれはそれを説明するべきだと思います):次のように

public class TestMain extends TabActivity implements OnSharedPreferenceChangeListener{ 
    ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     testMethod(); 
    } 
} 

のtestMethod()が定義されています

private void testMethod() { 
    int charsLeft = maxPostMessageLength - someEditText.length(); 
    ... 
} 

「someEditText.length()」部分を削除すると、アプリが起動します。ですから、私が見る方法では、見つけられないメソッドはEditText.length()メソッドです。私は削除のtestMethodから「someEditText.length()」とのonCreateメソッドに直接それを入れたときに不思議なことに、しかし、アプリも起動します:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     test = someEditText.length(); 
     testMethod(); 
    } 

は、誰もが、私はこのエラーを取り除くことができます方法を知っていますし、なぜ私はonCreateメソッドで直接someEditText.length()を呼び出すことができますが、onCreateメソッドによって呼び出されるメソッドでは呼び出せませんか? Proguardを使わないと、アプリはうまく動作します。

編集: 私はproguard.cfgで-dontshrink、-dontobfuscate、および-dontoptimzieオプションを試しました。 -dontptimizeを指定すると、アプリはエラーなしで起動します。 しかし、この特定のエラーの原因となるのは興味深いでしょう。

答えて

1

私は誤って解決策を見つけました。さて、私の場合は完全に機能するので、これは元の問題の解決策です。 今日は、@Overrideアノテーションでいくつかのコードを実装しましたが、最初は動作しませんでした。私はいつも-dontoptimizeせずに、なぜ再びProGuardのを試してみて、前のJavaレベル1.5を使用していた場合、私は、よく、考えて、今 'Must Override a Superclass Method' Errors after importing a project into Eclipse

:幸いにも、他の誰かがすでに同じ問題と簡単なのEclipse関連のソリューションを持っていました私は1.6に設定しました。傷つけることはできません...

これで、アプリが起動し、メソッドでEditText.length()が呼び出されたときに、私は奇妙なエラーが発生しないと言います。

1

Proguardのドキュメントには、「ProGuardツールは、未使用のコードを削除してクラスの名前を変更することでコードを縮小、最適化、難読化します」と誇らしげに述べています。

私はあなたのようにランタイムエラーが発生した後に、その「縮む」部分をあきらめました。私は、ルーチンは、ファイルusage.txtを検査することで、あなたのコードから削除されているあなたが見ることができるproguard.cfg

にライン

-dontshrink 

を追加しました。 私のプロジェクトでは、コードが不明瞭だが、何も削除されていないことを意味しています。私は今、ランタイムエラーが発生しません。

+0

私にこれを指摘してくれてありがとう。私は-dontshrinkオプションを試しましたが、エラーはまだ同じです。ただし、-dontoptimizeを指定すると、アプリはエラーなしで起動します。私はそれに応じて私の質問を編集しました。 – Manuel

0

メソッドが副作用を持たないという結論に至った場合、オプティマイザはメソッド呼び出しとメソッドを削除することがあります。しかし、一貫性のないコードを作成することはありません。このような問題は認識していません。 ProGuardの最新バージョンでそれが維持されているかどうかを確認する必要があります。それ以外の場合は、ProGuardサイトでバグレポートを提出してください。問題の例を示してください。

0

私はOPと同様の問題を抱えていましたが、私はこの問題を解決するためにproallow設定オプションを設定しました。

関連する問題