3

リフレクションを使用して、AndroidアプリケーションのターゲットAPIレベルの外にあるメソッドを呼び出しています。

try {
    Method m = Class.forName("android.content.Context")
            .getDeclaredMethod("getExternalCacheDir");
    Object result = m.invoke(this);
    if (result instanceof File) {
        Log.v("MyApp", "external cache: "
                + ((File) result).getAbsolutePath());
        cacheDirectory = (File) result;
    } else {
        Log.v("MyApp", "non-file cache: " + result);
    }
} catch (Exception e) {
    // ...
}

Proguardを使用すれば、問題なくこれを最適化できますが、次のように警告されます。

Note: com.example.MyApp accesses a declared method 'getExternalCacheDir()' dynamically
      Maybe this is library method 'android.content.Context { java.io.File getExternalCacheDir(); }'
      Maybe this is library method 'android.content.ContextWrapper { java.io.File getExternalCacheDir(); }'
      Maybe this is library method 'android.test.mock.MockContext { java.io.File getExternalCacheDir(); }'
Note: there were 1 accesses to class members by means of introspection.
      You should consider explicitly keeping the mentioned class members
      (using '-keep' or '-keepclassmembers').

これは実際の問題ですか、それともProguardが潜在的な問題を通知しているだけですか?

4

2 に答える 2

5

これは、PaulLammertsmaが投稿した回答に似ています。また、ProGuardの作者であるEricLafortuneの回答もご覧ください。ProGuardからの「多分これはプログラムメソッドです」という警告を抑制する方法

構成でメソッドを明示的に言及することで、これを回避できます。

-keep class com.foo.OtherClass { com.foo.OtherClass getInstance(); }

または、クラスのメモを非表示にすることもできます。

-dontnote com.foo.MyClass

于 2014-02-06T19:56:18.210 に答える
4

問題は私が使用していたライブラリプロジェクトにあり、proguard.cfgそのプロジェクトのプロジェクトはProguardによって検査されていませんでした。

自分のプロジェクトに次の行を追加するproguard.cfgことで、通知を非表示にすることができました。

-keep class android.content.Context {
    public java.io.File getExternalCacheDir();
}
于 2012-04-18T15:39:50.247 に答える