gpt4 book ai didi

java - 内部类中的方法被 proguard 剥离

转载 作者:行者123 更新时间:2023-12-01 13:07:13 28 4
gpt4 key购买 nike

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

只要我不运行 proguard,我的应用程序就可以正常工作,但是当我运行时,“reportProgress”方法会被 proguard 剥夺。该方法是扩展 AsyncTask 的私有(private)内部类的一部分

private class CalculateTask extends AsyncTask

我通过对CalculateTask 实例的引用来调用我的 native 代码。然后 native 代码调用此类中的成员,在 JNI 中使用以下代码

jclass taskClass = (*env)->GetObjectClass(env, task);
jmethodID reportProgressMid = (*env)->GetMethodID(env, taskClass, "reportProgress", "(Ljava/lang/String;I)Z");

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

public boolean reportProgress(String, int)

方法,仅通过JNI调用。

到目前为止,我已经采取了以下方法,但没有一个成功:

保留整个类(class):

-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发布的“optimize”,名为proguard-android-optimize.txt。

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

最佳答案

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

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

您应该检查类名和方法名是否有拼写错误。您还应该检查该方法是否确实是公共(public)的。

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

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

关于java - 内部类中的方法被 proguard 剥离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180872/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com