2012-07-20 33 views
4

我正在編寫我的第一個應用程序定位ICS(4.0.3 - 15級)。我得到了Action Bar,我覺得他們很棒。但是我第一次嘗試片段,而且我還不確定我是否喜歡他們。我目前正在使用的應用程序不需要片段,因爲它對屏幕要求非常不靈活。標準活動工作正常。大但是,我必須使用PreferencencFragment和Headers PreferenceActivity。直接到首選定義xml文件的舊形式的活動已折舊。所以我學會了使用偏好片段來強制Google顯示偏好。 (順便說一下,有沒有人想過如何跳過顯示標題,我用了兩個來獲得學習體驗,一個指向一個片段類就足夠了,但是看起來只用一個標題就可以加倍選擇。 )PerferenceActivity與PreferenceFragment失敗的設備與proguard沒有proguard好吧

我一直在使用模擬器的東西,直到大約3天前,一切工作。當我將測試移到設備上時,我可以看到顯示標題的首選項屏幕(PreferenceActivity類)。但是,當我選擇一個標題(它調用PreferencesFragment類)時,我收到了「sorry your app stopped」消息。回到模擬器,一切正常。由於所有的視圖都是由標準活動驅動的,除了我的設置活動以外,大多數情況都起作用了,當我關閉Proguard時,一切都運行正常,包括Settings在我的Crittercism崩潰報告中,Proguard打開時產生的錯誤是class not found。沒有發現是內聯PreferenceFragment類。

例如,使用報頭

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

直列類SettingsFragment不被發現在設備上運行的Android操作系統。

關閉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設置?如果這個問題擴展到常規片段使用,這些設置是什麼?

回答

5

我會使用-keep class your.package.goes.here.** { *; },以確保ProGuard不會擺脫您自己的任何類,包括由佈局或其他資源引用的片段而不是代碼。

請注意,我不是ProGuard的專家,所以這可能是「用別克拍一隻蒼蠅」,但它適用於我,包括我的PreferenceFragments

+0

我給它一個鏡頭。會讓你知道。雖然我更喜歡在蟑螂上使用獵槍。德克薩斯人等等。 – 2012-07-20 18:17:45

+0

與您的建議,並使用別克。工作很好。我甚至刪除了-nts,因此它現在正在優化和縮小任何可能的東西。 – 2012-07-20 18:31:56

+0

@霍華德霍德森:我現在有了一種對付蟑螂的新武器。善良周圍! :-) – CommonsWare 2012-07-20 20:51:58

1

更改您的proguard的-project.txt作爲

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