gpt4 book ai didi

java - 如何使用 Proguard.cfg 更正缺失的类/方法问题

转载 作者:行者123 更新时间:2023-11-30 09:28:18 24 4
gpt4 key购买 nike

我有一个相当大的项目,在代码中使用了一些反射。导致以下崩溃的代码行:

W/System.err(22122): java.lang.NoSuchMethodException: <init> [class com.DynaZu.Tracker.cd]
W/System.err(22122): at java.lang.Class.getConstructorOrMethod(Class.java:460)
W/System.err(22122): at java.lang.Class.getDeclaredConstructor(Class.java:588)
W/System.err(22122): at com.DynaZu.Tracker.ItemAdapter.getView(SourceFile:356)
W/System.err(22122): at android.widget.AbsListView.obtainView(AbsListView.java:2267)

是 SourceFile:356 行:

try {
itemViewHolder = mViewHolderClass.getDeclaredConstructor(item.getClass())
.newInstance(item);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

文件中的其他地方:

Class<? extends ItemViewHolder> mViewHolderClass;

并且该项目是所有派生自类 Item 的几个潜在类之一。

当我查看 dump.txt 等...时,我看到了很多东西,但我无法完全转回 proguard.cfg 的特定指令。来自 dump.txt:

 + Methodref [com/DynaZu/Tracker/cd.<init> (Ljava/lang/String;)V]
+ Methodref [com/DynaZu/Tracker/cd.a ()Ljava/lang/String;]
+ Methodref [com/DynaZu/Tracker/cd.equals (Ljava/lang/Object;)Z]
+ Methodref [com/DynaZu/Tracker/cd.h ()J]
+ Methodref [com/DynaZu/Tracker/cd.o ()Ljava/lang/String;]
+ Methodref [com/DynaZu/Tracker/cd.p ()Lcom/DynaZu/Tracker/cd;]
+ Methodref [com/DynaZu/Tracker/cd.q ()F]
+ Methodref [com/DynaZu/Tracker/ce.a (J)Lcom/DynaZu/Tracker/cd;]
+ Methodref [com/DynaZu/Tracker/ce.a (Lcom/DynaZu/Tracker/cd;)V]
+ InterfaceMethodref [com/DynaZu/Tracker/ac.a (IILcom/DynaZu/Tracker/cd;ZZ)V]
+ NameAndType [<init> (Lcom/DynaZu/Tracker/cd;)V]
+ NameAndType [a (IILcom/DynaZu/Tracker/cd;ZZ)V]
+ NameAndType [a (J)Lcom/DynaZu/Tracker/cd;]
+ NameAndType [a (Lcom/DynaZu/Tracker/cd;)V]
+ NameAndType [a Lcom/DynaZu/Tracker/cd;]
+ NameAndType [b (Lcom/DynaZu/Tracker/cd;I)V]
+ NameAndType [c Lcom/DynaZu/Tracker/cd;]
+ NameAndType [p ()Lcom/DynaZu/Tracker/cd;]
+ Utf8 [()Lcom/DynaZu/Tracker/cd;]

对于 proguard.cfg,我意识到我想要这样的东西:

-keepclassmembers class * extends Item
-keep class * extends Item

任何建议都会有所帮助。例如,有没有办法为一个 java 文件或这个 java 文件的一部分打开混淆器???

考虑到这一点,我认为我需要添加如下内容:

-keepclassmembers class com.DynaZu.Tracker.TaskViewHolder
{
<init>(com.DynaZu.Tracker.Task);
}

等等...但是 ProGuard 提示这些类是未知的...?那么proguard.cfg中应该如何标注项目中已有的类。 ???我还单独尝试了类名 TaskViewHolder。

最佳答案

我能够通过查看 proguard/.. dump.txt 尤其是 mapping.txt 来解决这个问题。从那里我明白了我的一些类(class)是如何命名的。所以我将以下内容添加到我的 proguard.cfg 中:

-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder$TaskViewHolder
{
<init>(com.DynaZu.Tracker.Task);
}
-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder$ProjectViewHolder
{
<init>(com.DynaZu.Tracker.Project);
}
-keepclassmembers class com.DynaZu.Tracker.ItemViewHolder
{
<init>(com.DynaZu.Tracker.Item);
}
-keep class com.DynaZu.Tracker.Item
-keep class com.DynaZu.Tracker.Task
-keep class com.DynaZu.Tracker.Project

一旦我理解了发生了什么,就不难了。我希望这可以帮助其他人解决这个困难。我不得不说,拥有社区和 Stack Overflow 的可用性是救命稻草!

关于java - 如何使用 Proguard.cfg 更正缺失的类/方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097997/

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