2012-05-17 4 views
1

이것은 나를위한 수수께끼입니다. 이 상황을 디버깅하는 방법을 모르겠습니다.

문제는 "PreferenceFragment"클래스 안에 있습니다.

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 
<header 
    android:fragment="debut.telebox.Config$PrefSystemeFragment" 
    android:icon="@drawable/ic_action_prefsysteme" 
    android:title="Paramètres Système" 
    android:summary="Paramètres système" 
    /> 
<header 
    android:fragment="debut.telebox.Config$PrefChainesFragment" 
    android:icon="@drawable/ic_action_preffavoris" 
    android:title="Paramètres pour les chaînes" 
    android:summary="Favoris" 
    /> 
<header 
    android:fragment="debut.telebox.Config$PrefAproposFragment" 
    android:icon="@drawable/icon" 
    android:title="A propos" 
    android:summary="A propos de TeleBox" 
    /> 

PreferenceActivity를은 다음과 같습니다 :

public class Config extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    ... 
} 

@Override 
public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.layout.prefentete, target); 
    } 

public static class PrefSystemeFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
} 

내가 테스트 장치에 직접 응용 프로그램을 실행 (Xoom의 넥서스 S 안드로이드에서 나는 기본 헤더와 고전적인 "설정"인터페이스 경제력 4.0.4) 이클립스에서는 아무런 문제가 없다 : 매개 변수를 읽고 쓸 수있다.

05-17 17:30:12.680: E/AndroidRuntime(6391):  at dalvik.system.NativeStart.main(Native Method) 
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment debut.telebox.Config$PrefSystemeFragment: make sure class name exists, is public, and has an empty constructor that is public 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.app.Fragment.instantiate(Fragment.java:581) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1117) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1150) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:551) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at debut.telebox.Config.onCreate(Unknown Source) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.app.Activity.performCreate(Activity.java:4465) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  ... 11 more 
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: java.lang.ClassNotFoundException: debut.telebox.Config$PrefSystemeFragment 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  at android.app.Fragment.instantiate(Fragment.java:571) 
05-17 17:30:12.680: E/AndroidRuntime(6391):  ... 18 more 
05-17 17:30:12.680: W/ActivityManager(161): Force finishing activity debut.telebox/.Config 
05-17 17:30:12.690: W/ActivityManager(161): Force finishing activity debut.telebox/.TeleBox 

불행하게도, 나는 구글에 내 응용 프로그램이 작동하지 않는 것을 보지 않고 플레이 업로드 ... : 나는 응용 프로그램을 내 보낸 다음 장치에서 실행하면

는하지만, 런타임 오류

답변

5

디버그 모드에서 작동하고 내 보내지 않은 경우 ProGuard가 클래스 이름을 변경하는 작업을 수행했을 수 있습니다.

-keep class debut.telebox.** { *; } 

을하고 도움이되는지 확인 : 프로젝트에 proguard-project.txt 파일에 다음 줄을 추가합니다.

그렇지 않다면, 정적 내부 클래스를 사용하는 대신 PreferenceFragment 클래스를 별도의 공용 Java 클래스로 옮기고 이것이 도움이되는지 확인하십시오.

+0

감사합니다. 감사합니다. – Sush

0

은 내가 설명을 추가 할 수 없기 때문에, 나는이 Proguard와의 기본 동작에 그대로 클래스, 자바 파일에서 참조하지 않을 때 발생주의 CommonsWare 응답에 추가 할 -keep class android.support.v4.** { *; }

0

으로 고정 공간 최적화를 위해 참조되지 않은 클래스를 제거합니다.

OP의 원래 것과 똑같은 문제가있었습니다. 헤더 파일을 사용하여 PreferenceFctment의 사용자 지정 확장과 디버깅하는 동안 작업하고 Signed 빌드에서 ClassNotFoundException'ing을 사용하여 내 PreferenceActivity를 인터페이스했습니다.

CommonsWare 제안 정확히 있었다 일이 솔루션을 계정의 조각 참조 (그러나 다시, 나는 팔월 '13 년부터 ADT를 업데이트하지 않은 경우) : 분명히, ADT의 생성 된 소스 안드로이드을지지 않습니다

-keep problematicpackage.** { *; } 

"problematicpackage"는 내 사용자 정의 조각을 선언 한 패키지입니다. ** {*; } 표현식은 -keep 지시문에있는 모든 내용을 포함합니다.

한 가지 유의 사항 : 이 포장재를 포장하거나, 압축하거나, 최적화하지 말 것 ""이 "지침". 나는 메타 패키징이나 슈퍼 저작권에 대해별로 신경 쓰지 않아서 불감증에 빠질 수있는 무언가에 잠을 자지는 못하지만 그런 기능이 필요한 경우 Proguard 매뉴얼을주의 깊게 읽는 것이 좋습니다.

관련 문제