Proguard混淆在getView中崩溃应用程序
问题描述:
花了几个小时,无法防止应用程序在混淆后崩溃。也搜索四周无济于事。如果有人能给我一个正确的方向提示,我会很感激。 崩溃开始的位置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.**
希望得到任何帮助。谢谢。
答
您应该保护您的Fragment
免于混淆。
-keep public class * extends android.app.Fragment
答
试试这个让资源ID:
# Keep resource files ID
-keepclassmembers class **.R$* {
public static <fields>;
}
+0
也尝试了你的建议,但崩溃错误是一样的。 –
我尝试过,但没有运气。我相信它必须按照Fragment从Activity获取上下文的方式进行,但无法弄清楚。 –
@WalterRoncada,发布你的'convertView'方法,这样我们就可以看到'Context'是如何被使用的 – JBirdVegas
代码中存在一个bug,如果条件是传递0而不是R.id.int。我不得不使用proguard的mapping.txt来追踪它。感谢您试图提供帮助,从某种意义上说,它有助于回顾convertView。 –