2012-05-17 3 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 и 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 

К сожалению, я загрузил мое приложение на Google Play, не видя, что он не работает ...

ответ

5

Если он работает в режиме отладки, а не при экспорте, ProGuard, возможно, сделал что-то, чтобы убрать ваше имя класса. Добавьте следующую строку в файл proguard-project.txt в проекте:

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

и посмотреть, если это помогает.

Если нет, просто переместите классы PreferenceFragment в отдельные общедоступные классы Java, вместо использования статических внутренних классов и посмотрите, поможет ли это.

+0

Это сработало .. Спасибо. – Sush

0

Поскольку я не могу комментировать, я хотел бы добавить к CommonsWare ответ, что я заметил, это происходит, когда классы не ссылаются на ява файлы, так как поведение Proguard по умолчанию является удалить классы без ссылок для оптимизации пространства.

У меня была такая же проблема, как и у оригинала OP - с использованием файла заголовков для интерфейса my PreferenceActivity с пользовательскими расширениями PreferenceFragment, работающих при отладке и ClassNotFoundException'ing в Signed build. По-видимому, генерируется источником АТД не принимает андроида: фрагмент ссылки в аккаунте (но опять же, я не обновлять ADT с августа '13)

решение, которое работало было именно то, что CommonsWare предложил:

-keep problematicpackage.** { *; } 

«problematicpackage» - это пакет, в котором я объявлял свои пользовательские фрагменты. ** {*; } выражение включает все его содержимое в -keep «директива».

Одно замечание: ВЫ НЕ МОЖЕТЕ ПОЛУЧИТЬ ЭТОТ ПАКЕТ, ОБОГАЩЕННЫЙ, СЖАТЫЙ ИЛИ ОПТИМИЗИРОВАННЫЙ с этой «директивой». Мне не очень-то нравится мета-упаковка или супер-авторское право, чтобы потерять сон над чем-то, что должно быть неустойчивым, но если вам нужны такие функции, я бы посоветовал внимательно прочитать руководство Proguard.

Смежные вопросы