【问题标题】:PerferenceActivity with PreferenceFragment fails on device with proguard okay without proguard带有 PreferenceFragment 的 PerferenceActivity 在带有 proguard 的设备上失败,没有 proguard 没问题
【发布时间】:2012-07-20 17:13:40
【问题描述】:

我正在编写我的第一个针对 ICS(4.0.3 - 15 级)的应用程序。我得到了动作条,我认为它们很棒。但我是第一次尝试碎片,我仍然不确定我是否喜欢它们。我目前正在开发的应用程序不需要片段,因为它对屏幕的要求非常不稳定。标准活动运行良好。然而,最大的问题是我必须将 PreferenceActivity 与 PreferencFragment 和 Headers 一起使用。直接到首选项定义 xml 文件的活动的旧形式已被折旧。所以我学会了通过谷歌的力量使用偏好片段来显示偏好。 (顺便说一句,有没有人想出如何跳过显示标题。我使用了两个来获得学习经验。一个指向单个片段类就足够了。但是必须用一个标题进行双重选择看起来很糟糕.. .)

直到大约 3 天前,我一直在使用模拟器,一切正常。当我将测试转移到设备上时,我可以获得显示标题的首选项屏幕(PreferenceActivity 类)。但是,当我选择一个标头(调用 PreferencesFragment 类)时,我收到“抱歉您的应用已停止”消息。回到模拟器上,一切正常。我终于明白,当我生成我的 APK 时我正在使用 Proguard . 由于除了我的设置活动之外,所有视图都是由标准活动驱动的,因此大多数一切正常。当我关闭 Proguard 时,一切正常,包括设置。在我的 Crittercism 崩溃报告中,Proguard 开启时生成的错误是找不到类。该类找不到的是内联的 PreferenceFragment 类。

例如,使用标题

android:fragment="com.mycompany.projectname.FragmentPreferences$SettingsFragment" 

设备上运行的 Android 操作系统找不到内联类 SettingsFragment。

关闭 Proguard 并重新安装 APK,上述标头工作正常。无论有没有 Proguard,总能找到 PreferenceActivity 类 FragmentPreferences 并显示标题。选择显示的标题时失败(调用 SettingsFragment)...

我尝试了 -dontoptimize 和 -dontshrink,但我的应用仍然无法与 Proguard 一起使用。我的 Proguard 设置是标准的;即,当我使用 Eclipse 向导(ADT R20 - 最新和最好的)创建新应用程序时生成。以下是我尝试运行的设置:

在项目属性中:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

target=Google Inc.:Google APIs:15

In proguard-project:

-keepattributes SourceFile, LineNumberTable

-dontshrink

-dontoptimize

所有标准活动(无片段)都可以在基本设置下正常工作。添加 -dont 是为了将 Proguard 限制为仅进行混淆处理。调用内联片段类时,设置仍然会爆炸。

目前我正在生成关闭 Proguard 的 APK。当我准备好开始生产时,我想重新打开它。

(顺便说一句,我将 PreferenceFragment 类移到了外部类中,但在调用 Proguard 时它们仍然不起作用。)

我在这里输入了足够多的东西,但仍然没有问我的问题。好的,我将关闭这个问题:

有人知道使共享首选项片段类可见所需的正确 Proguard 设置吗?如果这个问题延伸到常规片段使用,这些设置是什么?

【问题讨论】:

    标签: android android-fragments proguard android-preferences


    【解决方案1】:

    我会使用-keep class your.package.goes.here.** { *; },以确保 ProGuard 不会删除您自己的任何类,包括布局或其他资源而不是代码引用的片段。

    请注意,我不是 ProGuard 专家,所以这可能是“用别克拍苍蝇”,但它对我有用,包括我的 PreferenceFragments

    【讨论】:

    • 我会试一试。会让你知道。虽然我更喜欢用霰弹枪对付蟑螂。德州人等等。
    • 采纳了您的建议并使用了别克。工作得很好。我什至删除了 -donts,所以它现在可以优化和缩小。
    • @HowardHodson:我现在有了对付蟑螂的新武器。好在身边! :-)
    【解决方案2】:

    将您的 proguard-project.txt 更改为

    -keep public class * extends android.preference.Preference
    -keep public class * extends android.preference.PreferenceFragment
    -keep public class * extends android.preference.PreferenceActivity
    

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2014-02-02
      • 2019-02-13
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多