2015-05-11 2 views
1

Я использую Proguard для обфускации моего приложения для Android. Все работает отлично, за исключением одного Activity.NoClassDefFoundError Proguard Activity

java.lang.NoClassDefFoundError: com.myapp.android.MediaActivity 

Когда я не пользуюсь Proguard, Activity работает нормально. У меня есть только эта проблема при использовании Proguard.

Мой Activity объявлен на AndroidManifest, и все мои остальные Activity работают нормально, у меня есть проблема только на этом.

Вот мой Proguard конфигурации:

-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 

-keep class com.myapp.android.MediaActivity { *; } 

-keep public class * extends android.app.Activity 
-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 

-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keepclassmembers class * { 
    @android.webkit.JavascriptInterface <methods>; 
} 

# Also keep - Enumerations. Keep the special static 
# methods that are required in enumeration classes. 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 


# keep setters in Views so that animations can still work. 
# see http://proguard.sourceforge.net/manual/examples.html#beans 
-keepclassmembers public class * extends android.view.View { 
    void set*(***); 
    *** get*(); 
} 

# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

Как вы можете видеть, я также добавить эту конкретную линию, чтобы попытаться заставить его работать, но это не так:

-keep class com.myapp.android.MediaActivity { *; } 

EDIT: Вот импорт в MediaActivity:

import android.annotation.TargetApi; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.TextView; 

import com.myapp.android.fragment.places.FragmentSupportPlacesBase; 
import com.myapp.android.fragment.grid.BaseCursorGridFragmentSupport; 
import com.myapp.android.fragment.grid.SupportScreenShotCursorGridFragment; 
import com.myapp.android.fragment.grid.SupportTimelineCursorGridFragment; 
import com.myapp.android.model.Place; 
import com.myapp.android.model.SelectedInfo; 

import java.util.ArrayList; 
import java.util.List; 

Кто-нибудь, как любые идеи, почему это происходит, и как я могу это исправить?

+1

Можете ли вы разместить импорт «MediaActivity»? Возможно, проблема в том, что Proguard запутывает некоторые из этих классов. – antonio

+0

Я добавил импорт в вопрос. Возможно, вы правы, но многие мои действия используют этот тип импорта. Фрагменты, объекты модели, панель инструментов, довольно простые вещи ... – Andros

ответ

0

Спасибо antonio за то, что указали мне в правильном направлении. Мой Activity был реализует интерфейс PlacesCallbacks (без причины)

public interface PlacesCallbacks{ 
    void onPlaceSelected(long quadKey, short zoomLevel); 
    void onPlaceSelected(Place place); 
} 

Однако это Interface не был использован в этом Activity, и ни где-нибудь в моем приложении, и способ, реализуемый были оставлены пустыми.

Поэтому я предполагаю, что Proguard удаляет это Interface, потому что он нигде не использовался, но он был реализован в моем Activity.

Все, что мне нужно было сделать, это удалить Interface.

+0

интересный - вы говорите, что он удалил Activity только потому, что в нем был неиспользуемый 'интерфейс'? –

+0

Я не думаю, что он удалил Activity, но интерфейс, потому что он нигде не использовался, даже если он был реализован в этом Activity. И я думаю, что это сбой, потому что впоследствии он не смог найти Интерфейс в этом Управлении. Я не уверен на 100%, что это то, что происходит, а просто теория. – Andros

+0

Не имеет смысла для меня, потому что ошибка говорит, что активность не может быть найдена. Интересная причуда. –