2012-12-31 2 views
2

코드에서 일부 리플렉션을 사용하는 상당히 큰 프로젝트가 있습니다. 다음과 같은 충돌의 원인이되는 코드의 라인 : 356 행 :Proguard.cfg에 누락 된 클래스/메서드 문제를 해결하는 방법

다른 파일의
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; 

하고 항목 중 하나입니다

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인가 클래스 Item에서 파생 된 여러 잠재적 클래스.

dump.txt 등을 살펴보면 proguard.cfg의 특정 지시문으로 돌아갈 수없는 많은 요소가 있습니다. 나는 같은 것을 원하는 실현

+ 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을 위해 : dump.txt에서

-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라는 클래스 이름 만 시도해 봤습니다.

답변

2

proguard/.. dump.txt 및 특히 mapping.txt를 조사하여이 문제를 해결할 수있었습니다. 거기에서 나는 나의 수업의 일부가 지명 된 방법을 이해했다. 내가 무슨 일이 있었는지 이해하면

-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 

, 그것은 어렵지 않았다 : 그래서 내 proguard.cfg에 다음을 추가했다. 나는 이것이 이것을 힘들게 다른 사람에게 도움이되기를 바랍니다. 저는 커뮤니티와 스택 오버 플로우의 가용성이 생명의 은인이라고 말합니다!

관련 문제