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 和所有内容。谁能帮我?谢谢。

4

3 回答 3

3

我猜错误消息是正确的,您的课程不在 apk 中。尝试将您的文件/包添加到proguard.flags文件中。

如果您的代码中没有引用该文件, Proguard可能会删除该文件,而只是作为 xml 文件中的文本。

ProGuard 是一个免费的 Java 类文件收缩器、优化器、混淆器和预验证器。它检测并删除未使用的类、字段、方法和属性。

于 2012-12-20T20:38:00.727 回答
1

添加到 kapep 的答案中,您应该知道一些前沿的 Android 功能有时会从 XML 文件引用中生成错误的 java 引用,例如 R.java 中的 ID 和 gen/ 中的其他源。

当我使用 xml/headers.xml 来连接我的 PreferenceActivity 和自定义 PreferenceFragments 时,我遇到了这种情况,其中“ android:fragment ”引用了后面的那些(整个项目中的唯一引用)。Proguard 只是将它们排除在外,因为没有正确创建 gen/*.java 引用。Android 构建工具基本上使用 Eclipse 构建后保留的文件,这些似乎不包括“android:fragment”引用,因此在运行时检测到自定义类永远不会被操作系统使用,proguard 只是删除它们。我相信 ADT 错误可能是导致这种不良参考生成的罪魁祸首。

长话短说——只要你想调试这个问题的根本原因,就在 proguard 配置上使用“-keep packagename.** { *; }”。如果它得到解决,您可以尝试更新 ADT,清理项目以重新触发 gen/ 创建,并在没有 -keep 的情况下打包。如果仍然失败,只需离开 -keep 指令,不要再考虑它。

于 2014-01-19T04:47:21.847 回答
0

您需要为您的课程使用不同的路径。com.android.settings 是 android 系统的一部分。使用您拥有的域。

于 2012-12-20T20:15:29.480 回答