Допустим, у меня есть это Java-приложение:
package com.site;
public class MyAppBase {}
package com.site.free;
import com.site.MyAppBase;
public class MyApp extends MyAppBase {}
package com.site.pro;
import com.site.MyAppBase;
public class MyApp extends MyAppBase {}
package com.site;
public class Edition
{
public static final int FREE = 1;
public static final int PRO = 2;
private static final int EDITION = PRO;
public static boolean is(final int edition)
{
return (EDITION == edition);
}
}
package com.site;
public class EditionFactory
{
public static MyAppBase get_app()
{
MyAppBase ret = null;
if (Edition.is(Edition.FREE))
ret = new com.site.free.MyApp();
else if (Edition.is(Edition.PRO))
ret = new com.site.pro.MyApp();
return ret;
}
}
Теперь любая комбинация конфигурации ProGuard, которую я пытаюсь избавиться от невыбранной версии (в данном случае это БЕСПЛАТНО), не работает.
Под «избавлением» я подразумеваю исчезновение фактического класса (а также из вызывающего кода).
Другими словами, такой вызов:
final MyAppBase app = EditionFactory.get_app();
.. в настоящее время переводится после ProGuarding на это:
if (a.a(1))
localObject5 = new c(); // <<< FREE
else if (a.a(2))
localObject5 = new d(); // <<< PRO
.. в то время как я бы хотел, чтобы это было переведено на это:
localObject5 = new d(); // <<< PRO only in the code (as set at Edition.EDITION)
Итог (помимо того факта, что ProGuard ВЕЛИКОЛЕПЕН!!), я не могу заставить его "видеть насквозь" и понимать что Edition.is() — это логическая функция, возвращающая константу, которая позволяет удалить некоторые классы.
Я пробовал такие конфигурации, как:
-keep,allowshrinking,allowoptimization public class * extends com.site.MyAppBase
-optimizationpasses 10
.. ничего не работает.
С другой стороны, если я ссылаюсь на Edition.EDITION и сравниваю его со встроенным (то есть без каких-либо «прокси-функций»), компилятор Java (v1.6) обнаруживает его и удаляет всю ссылку на невыбранный выпуск/класс.
Это приводит к тому, что ProGuard удаляет/уменьшает неиспользуемый класс, и это здорово.
Единственная проблема здесь связана с поддержанием — я был бы рад сохранить возможность использовать стиль EditionFactory.