6

ICS (4.0.3 - レベル 15) をターゲットとする最初のアプリをコーディングしています。私はアクションバーを手に入れましたが、それらは素晴らしいと思います. でもフラグメントは初めてなので、好きかどうかまだわかりません。私が現在取り組んでいるアプリは、画面上の要件がかなり非動的であるため、フラグメントは必要ありません。標準アクティビティは正常に機能しています。ただし、PreferencFragment と Headers で PreferenceActivity を使用する必要があることが大きな問題です。設定定義 xml ファイルへの古い形式のアクティビティは廃止されました。そこで、Google の力を借りて、プリファレンス表示にプリファレンス フラグメントを使用することを学びました。(ちなみに、ヘッダーの表示をスキップする方法を見つけた人はいますか?私は学習経験のために 2 つを使用しました。単一のフラグメント クラスを指す 1 つで十分でした。

私は約3日前までエミュレーターを使用しており、すべてが機能していました。テストをデバイスに移動すると、ヘッダー (PreferenceActivity クラス) を表示する設定画面を取得できました。しかし、ヘッダー (PreferencesFragment クラスを呼び出します) を選択すると、「申し訳ありませんが、アプリが停止しました」というメッセージが表示されました。エミュレーターに戻ると、すべてが正常に機能していました。APK を生成するときに Proguard を使用していたことに気づきました。 . すべてのビューは、設定アクティビティを除いて標準アクティビティによって駆動されたので、ほとんどすべてが機能しました. Proguard をオフにすると、設定を含むすべてが機能しました. 私の Crittercism クラッシュ レポートでは、Proguard がオンのときに生成されたエラーはクラスが見つかりません. クラスインラインの PreferenceFragment クラスが見つかりません。

たとえば、ヘッダーを使用して

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

インライン クラス SettingsFragment は、デバイスで実行されている Android OS によって検出されません。

Proguard をオフにして APK を再インストールすると、上記のヘッダーが正常に機能します。Proguard の有無にかかわらず、PreferenceActivity クラス FragmentPreferences が常に検出され、ヘッダーが表示されます。表示されたヘッダーの選択時(SettingsFragmentの呼び出し時)に失敗する...

-dontoptimize と -dontshrink を試しましたが、私のアプリは 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 設定を知っている人はいますか? また、この問題が通常のフラグメントの使用にも及ぶ場合、それらの設定は何ですか?

4

2 に答える 2

5

を使用-keep class your.package.goes.here.** { *; }して、コードではなくレイアウトやその他のリソースによって参照されるフラグメントを含め、ProGuard が独自のクラスを削除しないようにします。

私は ProGuard の専門家ではないので、これは「ビュイックでハエをたたく」かもしれないことに注意してくださいPreferenceFragments

于 2012-07-20T17:16:07.957 に答える
3

proguard-project.txtを次のように変更します。

-keep public class * extends android.preference.Preference
-keep public class * extends android.preference.PreferenceFragment
-keep public class * extends android.preference.PreferenceActivity
于 2014-08-19T06:29:58.600 に答える