我目前正在开发一个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任务。
答案 0 :(得分:1)
您的第二个和第三个配置适用于这种情况:
-keepclassmembers class MYPACKAGENAME.CalculateScreen$CalculateTask {
public boolean reportProgress(java.lang.String,int);
}
您应该检查拼写错误的类名和方法名。您还应该检查方法是否真的公开。
您可以验证该方法是否保留在bin/proguard/seeds.txt
。
您还可以使用javap
检查已编译的输入类和已处理的输出类。