Не удается создать экземпляр фрагмента настроек
Я пытаюсь добавить фрагмент в приложение "Настройки Android", чтобы настроить ROM, над которым я работаю. Это ошибка, которую я получаю, когда она принудительно закрывается в соответствии с logcat.
E/AndroidRuntime(31496): FATAL EXCEPTION: main
E/AndroidRuntime(31496): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.pcf.RomSettings: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(31496): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
E/AndroidRuntime(31496): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
E/AndroidRuntime(31496): at android.app.ActivityThread.access$600(ActivityThread.java:150)
E/AndroidRuntime(31496): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
E/AndroidRuntime(31496): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(31496): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(31496): at android.app.ActivityThread.main(ActivityThread.java:5193)
E/AndroidRuntime(31496): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31496): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(31496): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
E/AndroidRuntime(31496): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
E/AndroidRuntime(31496): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(31496): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.settings.pcf.RomSettings: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(31496): at android.app.Fragment.instantiate(Fragment.java:592)
E/AndroidRuntime(31496): at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1138)
E/AndroidRuntime(31496): at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1154)
E/AndroidRuntime(31496): at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:539)
E/AndroidRuntime(31496): at com.android.settings.Settings.onCreate(Settings.java:152)
E/AndroidRuntime(31496): at android.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime(31496): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime(31496): at E/AndroidRuntime(31496): ... 11 more
E/AndroidRuntime(31496): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.settings.pcf.RomSettings" on path: /system/app/Settings.apk
E/AndroidRuntime(31496): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
E/AndroidRuntime(31496): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime(31496): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime(31496): at android.app.Fragment.instantiate(Fragment.java:582)
E/AndroidRuntime(31496): ... 18 more
Класс публичный и все. Я уверен, что имя правильно. Вот ссылка на мой Github с файлом: https://github.com/konstantinkeller/android_packages_apps_Settings/blob/jb4.2.1/src/com/android/settings/pcf/RomSettings.java
Вот и весь пакет. Вы можете проверить XML и все также. Может кто-нибудь мне помочь? Благодарю.
3 ответа
Я думаю, что сообщение об ошибке правильно, и ваш класс просто не в apk. Попробуйте добавить свой файл / пакет в файл proguard.flags.
Proguard, вероятно, удалил файл, если он не указан в вашем коде, а только как текст в XML-файлах.
ProGuard - это бесплатный инструмент для сжатия файлов класса Java, оптимизатор, обфускатор и предварительный анализатор. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты.
Добавляя к ответу Капепа, вы должны знать, что некоторые передовые функции Android иногда обеспечивают плохую генерацию java-ссылок из ссылок на XML-файлы, такие как идентификаторы в R.java и других источниках в gen/.
Это произошло со мной, когда я использовал xml / headers.xml для сопряжения моих PreferenceActivity и пользовательских PreferenceFragments, причем "android: фрагмент" ссылается на более поздние (ТОЛЬКО ссылка в проекте ENTIRE). Proguard просто исключил их, так как ни одна ссылка gen/*. Java не создавалась должным образом. Инструменты сборки Android в основном используют файлы, сохраненные после сборки Eclipse, и они НЕ ВИДЯТ ВКЛЮЧЕНИЯ ссылок "android: фрагмент", поэтому обнаруживаются, что классы cstom никогда не используются ОС во время выполнения, а proguard просто удаляет их. Я считаю, что ошибка ADT может быть виновником этого плохого ссылочного поколения.
Короче говоря - используйте "-keep packagename.** { *; }" в конфигурации Proguard всякий раз, когда вы хотите отладить причину этой проблемы. Если это решится, вы можете попробовать обновить ADT, очистить проект, чтобы повторно запустить gen / creation, и упаковать без -keep. Если это не помогло, просто оставьте директиву -keep и никогда больше не думайте об этом.
Вам нужно использовать другой путь для ваших классов. com.android.settings является частью системы Android. Используйте свой домен.