1

これは私にとって謎です。この状況をデバッグする方法がわかりません:

私が抱えている問題は、「PreferenceFragment」クラスの内部にあります。設定ヘッダーを使用して、従来の「設定」インターフェイスを開発しました。

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
<header 
    android:fragment="debut.telebox.Config$PrefSystemeFragment"
    android:icon="@drawable/ic_action_prefsysteme"
    android:title="Paramètres Système"
    android:summary="Paramètres système"
    />
<header 
    android:fragment="debut.telebox.Config$PrefChainesFragment"
    android:icon="@drawable/ic_action_preffavoris"
    android:title="Paramètres pour les chaînes"
    android:summary="Favoris"
    />
<header 
    android:fragment="debut.telebox.Config$PrefAproposFragment"
    android:icon="@drawable/icon"
    android:title="A propos"
    android:summary="A propos de TeleBox"
    />

PreferenceActivityは次のとおりです。

public class Config extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
}

@Override
public void onDestroy() {
    super.onDestroy();
    ...
}

@Override
public void onBuildHeaders(List<Header> target) {
    loadHeadersFromResource(R.layout.prefentete, target);
    }

public static class PrefSystemeFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
}

Eclipseを使用してテストデバイス(Android4.0.4ではXoomとNexusS)でこのアプリを直接実行すると、問題はありません。パラメーターの読み取りと書き込みができます。

しかし、アプリをエクスポートしてからデバイスで実行すると、ランタイムエラーが発生します:

05-17 17:30:12.680: E/AndroidRuntime(6391):     at dalvik.system.NativeStart.main(Native Method)
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment debut.telebox.Config$PrefSystemeFragment: make sure class name exists, is public, and has an empty constructor that is public
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Fragment.instantiate(Fragment.java:581)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1117)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1150)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:551)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at debut.telebox.Config.onCreate(Unknown Source)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Activity.performCreate(Activity.java:4465)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-17 17:30:12.680: E/AndroidRuntime(6391):     ... 11 more
05-17 17:30:12.680: E/AndroidRuntime(6391): Caused by: java.lang.ClassNotFoundException: debut.telebox.Config$PrefSystemeFragment
05-17 17:30:12.680: E/AndroidRuntime(6391):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
05-17 17:30:12.680: E/AndroidRuntime(6391):     at android.app.Fragment.instantiate(Fragment.java:571)
05-17 17:30:12.680: E/AndroidRuntime(6391):     ... 18 more
05-17 17:30:12.680: W/ActivityManager(161):   Force finishing activity debut.telebox/.Config
05-17 17:30:12.690: W/ActivityManager(161):   Force finishing activity debut.telebox/.TeleBox

残念ながら、アプリが機能していないことを確認せずに、GooglePlayにアプリをアップロードしました...

4

3 に答える 3

6

エクスポート時にではなくデバッグモードで動作する場合は、ProGuardがクラス名を壊すために何かを行った可能性があります。proguard-project.txtプロジェクトのファイルに次の行を追加します。

-keep class debut.telebox.** { *; }

それが役立つかどうかを確認します。

PreferenceFragmentそうでない場合は、静的内部クラスを使用するのではなく、クラスを個別のパブリックJavaクラスに移動して、それが役立つかどうかを確認してください。

于 2012-05-17T16:39:27.883 に答える
0

で修正しました-keep class android.support.v4.** { *; }

于 2013-01-10T04:17:13.423 に答える
0

コメントを追加できないので、CommonsWareの回答に追加したいと思います。これは、クラスがJavaファイルで参照されていない場合に発生することに気づきました。これは、Proguardのデフォルトの動作では、スペース最適化のために参照されていないクラスを削除するためです。

OPの元の問題とまったく同じ問題がありました。ヘッダーファイルを使用して、PreferenceActivityをPreferenceFragmentのカスタム拡張機能とインターフェイスさせ、デバッグ中に機能し、SignedビルドでClassNotFoundExceptionを実行しました。どうやら、ADTの生成されたソースはandroid:fragment参照を考慮に入れていません(しかし、繰り返しになりますが、2013年8月以降ADTを更新していません)

うまくいった解決策は、まさにCommonsWareが提案したものでした。

-keep problematicpackage.** { *; }

「problematicpackage」は、カスタムフラグメントを宣言したパッケージです。** {*; }式には、-keep"directive"のすべての内容が含まれます。

ただし、注意すべき点が1つあります。この「ディレクティブ」を使用して、このパッケージを乱用、圧縮、または最適化することはできません。メタパッケージやスーパー著作権については、フェイルプルーフであるはずの何かで眠りを失うことについてはあまり気にしませんが、そのような機能が必要な場合は、Proguardのマニュアルを注意深く読むことをお勧めします。

于 2014-01-19T04:34:49.773 に答える