【问题标题】:How to correct missing class/method issue with Proguard.cfg如何使用 Proguard.cfg 纠正缺失的类/方法问题
【发布时间】:2012-12-31 05:54:19
【问题描述】:

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

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文件的一部分打开proguard???

对此,我认为我需要添加以下内容:

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

等...但是 ProGuard 抱怨这些类是未知的...?那么项目中已有的类应该如何在proguard.cfg中注明。 ???我也单独尝试了类名 TaskViewHolder。

【问题讨论】:

    标签: java android proguard method-missing


    【解决方案1】:

    我可以通过查看 proguard/.. dump.txt 尤其是 mapping.txt 来解决这个问题。 从那里我明白了我的一些课程是如何命名的。所以我在我的 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 的可用性可以挽救生命!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多