android - Proguard、Android 和抽象类实例化

标签 android abstract-class proguard

“抽象类实例化,”你说。 “不可能!”

这是我的代码:

public static AbstractFoo getAbstractFoo(Context context) {
    try {
        Class<?> klass = Class
                .forName("com.bat.baz.FooBar");
        Constructor<?> constructor = klass.getDeclaredConstructor(
                String.class, String.class);
        constructor.setAccessible(true);

        AbstractFoo foo = (AbstractFoo) constructor.newInstance(
                "1", "2");
        return foo;
    } catch (ClassNotFoundException e) {
        // Ignore
    } catch (NoSuchMethodException e) {
        throw new InflateException(
                "No matching constructor");
    } catch (IllegalAccessException e) {
        throw new InflateException("Could not create foo", e);
    } catch (InvocationTargetException e) {
        throw new InflateException("Could not create foo", e);
    } catch (InstantiationException e) {
        throw new InflateException("Could not create foo", e);
    }
    return null;
}

com.bat.baz.FooBar 是一个扩展了 AbstractFoo 的私有(private)类。如果没有 Proguard,这段代码可以在我的 Android 设备上运行。有了它,它会在 NoSuchMethodException try/catch 上失败。

我继续向我的 Proguard 配置文件中添加语句,例如

-keep public abstract class  AbstractFoo
{public *;protected *; private *;} 

但这并不能解决问题。我怎样才能让 Proguard 接受这是实例化 AbstractFoo 对象的有效方法?至少,如果它在没有 Proguard 的情况下也能正常工作,那么它应该可以在有它的情况下工作。

最佳答案

ProGuard 正在从代码中删除构造函数,因为它似乎未被使用。 ProGuard 无法检测到正在通过反射调用构造函数。因此,您必须明确保留它:

-keepclassmembers class com.bat.baz.FooBar {
  <init>(java.lang.String, java.lang.String);
}

请注意,在 ProGuard 的帮助论坛上,您可能更有机会提出此类问题。

关于android - Proguard、Android 和抽象类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4053646/

相关文章:

android - 以编程方式更改单个 ActionBar 菜单项的 TextColor/Background

c++ - 抽象类和继承 C++

java - 这段Java代码是什么意思?

Java 编译器不会优化静态最终字符串。为什么?

android - 如何使用 Android Studio 混淆 Proguard

java - Android 应用程序在 Play 商店发布后崩溃?

android - 具有背景属性的自定义 TextView XML Drawable

java - 使用 Bundle.class 抑制 TooManyMethodsFoundException

android - 如何在android的webview中调试javascript

Scala:抽象类构造函数参数与 Trait val 成员?