3

最近、EclipseAndroidプロジェクトでProGuardをアクティブにしました。外部ライブラリと動的に参照されるクラスをproguard.cfgに追加した後、apkをビルドするときにエラーが発生しません。ただし、インストールしたアプリを起動しようとすると、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オプションを試しました。-dontoptimizeを使用すると、アプリはエラーなしで起動します。それでも、この特定のエラーの正確な原因は興味深いでしょう。

4

4 に答える 4

1

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

さて、あなたが説明するようなランタイムエラーが発生した後、私はそれの「縮小」部分をあきらめました。行を追加しました

-dontshrink

proguard.cfgに

ファイルusage.txtを調べることで、コードから削除されたルーチンを確認できます。私のプロジェクトでは常に欠落していると言って嬉しいです。つまり、コードは難読化されていますが、何も削除されていません。現在、ランタイムエラーは発生していません。

于 2011-01-17T10:55:19.247 に答える
1

私は偶然に可能な解決策に出くわしました。私の場合は完全に機能するので、これは元の問題の解決策です。今日、最初は機能しなかった@Overrideアノテーションを使用してコードを実装しました。幸いなことに、他の誰かがすでに同じ問題と簡単なEclipse関連の解決策を持っていました: 'プロジェクトをEclipseにインポートした後、'スーパークラスメソッドをオーバーライドする必要があります'エラー

さて、以前は常にJavaレベル1.5を使用していたのであれば、1.6に設定したので、-dontoptimizeオプションを指定せずにProGuardを再試行してみませんか。傷つけない...

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

于 2011-03-02T14:09:26.470 に答える
0

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

于 2011-02-06T22:18:37.457 に答える
0

OPと同様の問題があり、-allowaccessmodificationを設定したproguard configオプションになり、これを削除すると問題が解決しました。

于 2011-08-17T10:05:27.243 に答える