Pregunta

"instanciación de la clase abstracta", dice usted. "¡Imposible!"

Aquí está mi código:

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 es una clase privada que se extiende AbstractFoo. Sin Proguard, este código se ejecuta en el dispositivo Android. Con él, se produce un error en la NoSuchMethodException try / catch.

continúo agregar instrucciones a mi archivo de configuración Proguard como

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

Pero eso no resuelve el problema. ¿Cómo puedo obtener Proguard para aceptar que esta es una forma válida de una instancia del objeto AbstractFoo? Al menos, si funciona sin Proguard, se debe trabajar con él.

¿Fue útil?

Solución

ProGuard está quitando el constructor del código, ya que parece no utilizado. ProGuard no puede detectar que el constructor está siendo llamado por la reflexión. Por lo tanto, usted tiene que mantener explícitamente:

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

Tenga en cuenta que es posible que tenga mejores posibilidades con preguntas como estas en el foro de ayuda de ProGuard.

Otros consejos

¿Usted también agregar instrucciones para mantener las cosas en FooBar?

Se puede usar "dexdump" o "dexlist" para ver la lista de clases y métodos que realmente se generan en el archivo .dex. La comparación de lo que se obtiene con y sin Proguard podría ser esclarecedor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top