2012-12-20 92 views
3

我試圖將一個片段添加到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類文件收縮器,優化器,混淆器和預校驗器。 它檢測並刪除未使用的類,字段,方法和屬性。

+0

是的!謝謝!這固定:) –

0

您需要爲您的課程使用不同的路徑。 com.android.settings是android系統的一部分。使用你自己的域名。

+0

com.android.settings是我正在編輯的軟件包。我正在添加一個片段來定製我的ROM上的狀態欄。 –

+0

所以你正在更新/system/app/Settings.apk?你有沒有檢查它包含你的新課程? –

+0

哦,對不起,我沒有仔細閱讀你的問題! –

0

添加到kapep的答案中,您應該知道一些出色的Android功能有時會從XML文件引用中生成錯誤的Java引用,如R.java中的ID和gen /中的其他源代碼。

我不得不使用XML/headers.xml用於連接我的PreferenceActivity和定製PreferenceFragments當這發生在我身上,用「安卓片段」引用後來者(唯一在整個項目中引用)。 Proguard將它們排除在外,因爲沒有gen/*。java引用被正確創建。 Android構建工具基本上使用Eclipse構建後保留的文件,這些不會包含「android:fragment」引用,因此在運行時檢測到cstom類永遠不會被操作系統使用,並且proguard會刪除它們。 我相信一個ADT錯誤可能是這個糟糕參考代的罪魁禍首。

長話短說 - 只要您想調試此問題的根本原因,請在proguard配置上使用「-keep packagename。** {*;}」。如果問題得到解決,您可以嘗試更新ADT,清理項目以重新觸發創建/創建,以及不進行包裝。如果仍然失敗,只需保留-keep指令並不要再考慮它。

相關問題