首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NoClassDefFoundError防护活性

NoClassDefFoundError防护活性
EN

Stack Overflow用户
提问于 2015-05-11 18:06:46
回答 1查看 869关注 0票数 1

我用Proguard来混淆我的Android应用程序。除了一个Activity之外,一切都很完美。

代码语言:javascript
复制
java.lang.NoClassDefFoundError: com.myapp.android.MediaActivity

当我不使用Proguard时,Activity就正常工作了。我只有在使用Proguard时才会遇到这个问题。

我的Activity是在AndroidManifest上声明的,我所有的其他Activity都很好,我只在这个特定的Activity上有问题。

下面是我的Proguard配置:

代码语言:javascript
复制
-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>;
}

正如您所看到的,我还添加了这个特定的行来尝试使它工作,但它不是:

代码语言:javascript
复制
-keep class com.myapp.android.MediaActivity { *; }

编辑:这里是MediaActivity的导入:

代码语言:javascript
复制
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;

有人知道为什么会发生这种情况吗?我该如何解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 18:41:41

谢谢安东尼奥给我指明了正确的方向。我的Activity正在实现一个接口PlacesCallbacks (没有原因)

代码语言:javascript
复制
public interface PlacesCallbacks{
    void onPlaceSelected(long quadKey, short zoomLevel);
    void onPlaceSelected(Place place);
}

但是,这个Interface没有在这个Activity中使用,我的应用程序中的任何地方都没有使用,实现的方法都是空的。

所以我猜Proguard删除了这个Interface,因为它在任何地方都没有使用,但是它是在我的Activity中实现的。

我所要做的就是删除Interface

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30174638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档