سؤال

"تجريدي فئة ،" أنت تقول. "غير ممكن!"

هذا هو الكود الخاص بي:

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 الخاص بي. مع ذلك ، يفشل في محاولة/catch nosuchmethodexception.

أواصل إضافة عبارات إلى ملف التكوين الخاص بي مثل

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

لكن هذا لا يحل المشكلة. كيف يمكنني الحصول على Proguard لقبول أن هذه طريقة صالحة لتشكيل كائن AbstractFoo؟ على الأقل ، إذا كان يعمل بدون بروغ ، فيجب أن يعمل معها.

هل كانت مفيدة؟

المحلول

يقوم Proguard بإزالة المنشئ من الكود ، لأنه يبدو غير مستخدم. لا يمكن لـ Proguard اكتشاف أن المنشئ يتم استدعاؤه بواسطة التفكير. لذلك ، عليك أن تبقيه بشكل صريح:

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

يرجى ملاحظة أنه قد يكون لديك فرص أفضل مع أسئلة مثل هذه في منتدى مساعدة بروغوارد.

نصائح أخرى

هل تضيف أيضًا عبارات للحفاظ على الأشياء في Foobar؟

يمكنك استخدام "DexDump" أو "DexList" لمعرفة قائمة الفئات والأساليب التي يتم إنشاؤها بالفعل في ملف .Dex. يمكن أن تكون مقارنة ما تحصل عليه وبدون بروغار يضيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top