内部类中的方法被proguard剥离

时间:2014-04-20 10:07:22

标签: java android android-ndk java-native-interface proguard

我目前正在开发一个Android项目,我正在使用Android NDK在C中进行一些计算。

只要我没有运行proguard,我的应用程序就可以正常工作,但是当我这样做时,一个方法“reportProgress”被proguard剥离了。该方法是扩展AsyncTask

的私有内部类的一部分
private class CalculateTask extends AsyncTask

我通过对CalculateTask实例的引用来调用我的本机代码。然后,本机代码使用JNI中的以下代码

调用此类中的成员
jclass taskClass = (*env)->GetObjectClass(env, task);
jmethodID reportProgressMid = (*env)->GetMethodID(env, taskClass, "reportProgress", "(Ljava/lang/String;I)Z");

其中task是对CalculateTask实例的引用。我很难告诉proguard不要剥离

public boolean reportProgress(String, int)

方法,仅通过JNI调用。

到目前为止,我采取了以下方法,其中没有一种方法可以解决问题:

保持全班:

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask

只保留上述方法:

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask {
    public boolean reportProgress(java.lang.String,int);
}

或者这个:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask {
    public boolean reportProgress(java.lang.String,int);
}

使用注释(重复使用Google AdMob注释):

-keep class MYPACKAGENAME.CalculateScreen$CalculateTask {
    @com.google.android.gms.common.annotation.KeepName <methods>;
}

或者这个:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask {
    @com.google.android.gms.common.annotation.KeepName <methods>;
}

我的proguard配置基于Android SDK分发的“优化”,名为proguard-android-optimize.txt。

请注意,proguard是通过Gradle运行的,我确保清除并重新运行proguard任务。

1 个答案:

答案 0 :(得分:1)

您的第二个和第三个配置适用于这种情况:

-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask {
    public boolean reportProgress(java.lang.String,int);
}

您应该检查拼写错误的类名和方法名。您还应该检查方法是否真的公开。

您可以验证该方法是否保留在bin/proguard/seeds.txt

您还可以使用javap检查已编译的输入类和已处理的输出类。