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へのリンクは次のとおりです。

それがパッケージ全体です。XML とすべてを確認することもできます。誰でも私を助けることができますか?ありがとう。

4

3 に答える 3

1

kapep の回答に加えて、R.java の ID や gen/.

これは、xml/headers.xml を使用して PreferenceActivity とカスタム PreferenceFragments をインターフェースし、「android:fragment」が後のものを参照しているときに発生しました (プロジェクト全体での唯一の参照)。gen/*.java 参照が適切に作成されていないため、Proguard はそれらを除外しました。Android ビルド ツールは基本的に、Eclipse ビルド後に保持されたファイルを使用します。これらのファイルには「android:fragment」参照が含まれているようには見えないため、カスタム クラスは実行時に OS によって使用されないことが検出され、proguard はそれらを削除するだけです。この不適切な参照生成の原因は、ADT のバグである可能性があります。

簡単に言えば、この問題の根本原因をデバッグしたいときはいつでも、プロガード構成で「-keep packagename.** { *; }」を使用してください。問題が解決した場合は、ADT を更新するか、プロジェクトをクリーンアップして生成/作成を再トリガーし、-keep を使用せずにパッケージ化してみてください。それでも失敗する場合は、-keep ディレクティブをそのままにして、二度と考えないでください。

于 2014-01-19T04:47:21.847 に答える