2012-05-17 44 views
1

這對我來說是一個謎。我不知道如何調試這樣的情況:

我的問題是「PreferenceFragment」類中。我developped與偏好頭一個經典的 「設置」 界面:

<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和Nexus S的下的Android 4.0.4)與Eclipse,我沒有問題:我能夠讀取和寫入參數。

但是,當我出口的應用程序,然後在設備上運行它,我得到的運行時錯誤:

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 

不幸的是,我上傳了我在谷歌Play應用程式沒有看到這是不工作...

回答

5

如果它工作在調試模式,而不是在出口時,ProGuard的可能做了一些裂傷你的類名。以下行添加到您的proguard-project.txt文件在您的項目:

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

,看看有沒有什麼幫助。

如果沒有,只動PreferenceFragment類爲單獨的公共Java類,而不是使用靜態內部類,並看看是否有幫助。

+0

它的工作..謝謝。 – Sush

0

-keep class android.support.v4.** { *; }

0

固定它,因爲我不能添加評論,我想補充到CommonsWare答案我才注意到這發生在類不是基於java文件中引用,作爲Proguard的默認行爲是刪除未引用的類以進行空間優化。

我的問題與OP的原始問題完全相同 - 使用頭文件將我的PreferenceActivity與PreferenceFragment的自定義擴展接口連接,在調試時工作,在簽名構建時使用ClassNotFoundException。顯然,ADT的產生源用不了安卓帳戶片段引用(但話又說回來,我沒有因爲AUG '13更新ADT)

奏效正是CommonsWare提出的解決方案:

-keep problematicpackage.** { *; } 

「problematicpackage」是我宣佈我的自定義片段的包。 ** {*; }表達式包含-keep「指令」中的所有內容。

但有一點需要注意:你可能沒有拿到這個包含了這個「指令」的混淆,壓縮或優化。我真的不那麼在意元包裝或超copyrighting因爲失去我失眠的東西,應該是failproof,但如果你需要這樣的功能,我建議要仔細閱讀說明書Proguard的。