Proguard, Android и создание абстрактных классов - PullRequest
2 голосов
/ 29 октября 2010

"Абстрактный экземпляр класса", говорите вы.«Невозможно!»

Вот мой код:

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.Без Proguard этот код работает на моем устройстве Android.При этом происходит сбой при попытке / ловле NoSuchMethodException.

Я продолжаю добавлять операторы в файл конфигурации Proguard, например

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

, но это не решает проблему.Как я могу заставить Proguard признать, что это правильный способ создания экземпляра объекта AbstractFoo?По крайней мере, если он работает без Proguard, он должен работать с ним.

Ответы [ 2 ]

7 голосов
/ 31 октября 2010

ProGuard удаляет конструктор из кода, потому что он не используется.ProGuard не может обнаружить, что конструктор вызывается отражением.Итак, вы должны сохранить это явно:

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

Обратите внимание, что у вас могут быть больше шансов с такими вопросами на справочном форуме ProGuard.

0 голосов
/ 30 октября 2010

Вы также добавляете операторы для сохранения содержимого в FooBar?

Вы можете использовать "dexdump" или "dexlist", чтобы увидеть список классов и методов, которые фактически генерируются в файле .dex.Сравнение того, что вы получаете с Proguard и без, может быть осветительным.

...