2015-10-17 93 views
1

花了幾個小時,無法防止應用程序在混淆後崩潰。也搜索四周無濟於事。如果有人能給我一個正確的方向提示,我會很感激。 崩潰開始的位置getView得到(來源不明)Proguard混淆在getView中崩潰應用程序

E/AndroidRuntime: FATAL EXCEPTION: main 
E/AndroidRuntime: android.content.res.Resources$NotFoundException: Resource ID #0x0 
E/AndroidRuntime:  at android.content.res.Resources.getValue(Resources.java:1019) 
E/AndroidRuntime:  at android.content.res.Resources.getDrawable(Resources.java:663) 
E/AndroidRuntime:  at a.getDrawable(Unknown Source) 
E/AndroidRuntime:  at android.support.v7.internal.widget.TintManager.getDrawable(Unknown Source) 
E/AndroidRuntime:  at android.support.v7.internal.widget.TintManager.getDrawable(Unknown Source) 
E/AndroidRuntime:  at android.support.v7.widget.AppCompatImageHelper.setImageResource(Unknown Source) 
E/AndroidRuntime:  at android.support.v7.widget.AppCompatImageView.setImageResource(Unknown Source) 
E/AndroidRuntime:  at roncada.skyweather.DropZoneAdapter.getView(Unknown Source) 
E/AndroidRuntime:  at android.widget.AbsListView.obtainView(AbsListView.java:2222) 
E/AndroidRuntime:  at android.widget.ListView.makeAndAddView(ListView.java:1774) 

在那裏開始的代碼:

@Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     DropZoneAdapter adapter = new DropZoneAdapter(getActivity(), DZS); 
     getListView().setAdapter(adapter); 

    } //end postexecute 

然後在適配器:

類DropZoneAdapter擴展ArrayAdapter {

public DropZoneAdapter(Context context, ArrayList<DropZoneFragment.DZ_Row> sites) { 
    super(context, R.layout.row_layout, sites); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 

它打破了convertView。

這裏是我的proguard的規則:

-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
#-keepattributes *Annotation* 
-keep class android.support.v4.internal.** { *; } 
-keep interface android.support.v4.internal.** { *; } 
-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class android.support.v7.widget.** { *; } 
-keep interface android.support.v7.widget.** { *; } 
-keep class android.support.v7.internal.** { *; } 
-keep interface android.support.v7.internal.** { *; } 
-keep public class * extends android.app.Activity 
#-keep public class * extends android.support.v7.app.AppCompatActivity; 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-dontwarn android.support.** 
-dontwarn com.google.common.** 
-dontwarn org.apache.http.** 
-dontwarn android.net.http.AndroidHttpClient 
-dontwarn com.google.android.gms.** 

希望得到任何幫助。謝謝。

回答

0

您應該保護您的Fragment免於混淆。

-keep public class * extends android.app.Fragment 
+0

我嘗試過,但沒有運氣。我相信它必須按照Fragment從Activity獲取上下文的方式進行,但無法弄清楚。 –

+0

@WalterRoncada,發佈你的'convertView'方法,這樣我們就可以看到'Context'是如何被使用的 – JBirdVegas

+1

代碼中存在一個bug,如果條件是傳遞0而不是R.id.int。我不得不使用proguard的mapping.txt來追蹤它。感謝您試圖提供幫助,從某種意義上說,它有助於回顧convertView。 –

0

試試這個讓資源ID:

# Keep resource files ID 
-keepclassmembers class **.R$* { 
    public static <fields>; 
} 
+0

也嘗試了你的建議,但崩潰錯誤是一樣的。 –