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

这类似于 Paul Lammertsma 发布的答案。另请查看 ProGuard Eric Lafortune 的作者在以下位置的回答:如何抑制来自 ProGuard 的“也许这是程序方法”警告

您可以通过在配置中明确提及该方法来避免它:

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

或者,您可以隐藏类的注释:

-dontnote com.foo.MyClass

于 2014-02-06T19:56:18.210 回答
4

问题出在我正在使用的一个库项目中,并且proguard.cfgProguard 没有检查该项目中的项目。

通过将以下几行添加到我自己的项目proguard.cfg中,我能够使通知消失:

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