запутывание с помощью proguard vs. java.lang.reflect.Proxy - PullRequest
0 голосов
/ 27 апреля 2011

Я использую для отладки материал java.lang.reflect.Proxy, чтобы иметь универсальный способ реализации всех возможных интерфейсов ... но, кажется, трудно заставить его работать с proguard.Есть предложения?

THX -Marco

public class DebugLogListenerFactory {

public static IAirplaneListenerAll createStreamHandle(ICAirplane plane) {
    DebugLogListenerHandler handler = new DebugLogListenerHandler(plane);
    IAirplaneListenerAll proxy = (IAirplaneListenerAll) Proxy
            .newProxyInstance(IAirplaneListenerAll.class.getClassLoader(),
                    new Class[] { IAirplaneListenerAll.class }, handler);

    plane.addListener(proxy);
    return proxy;
}

private static class DebugLogListenerHandler implements InvocationHandler {


    private final Level levDef = Level.FINE;


    public DebugLogListenerHandler() {
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("invoked" + method);
        String methodName = method.getName();
        String msg = methodName + ": ";
        if (args != null) {
            boolean first = true;
            for (Object o : args) {
                if (first) {
                    first = false;
                } else {
                    msg += " ,";
                }
                msg += o.toString();
            }
        }
        CDebug.getLog().log(levDef, msg);
        return null;
    }
}

}

1 Ответ

0 голосов
/ 27 апреля 2011

Самое простое решение, вероятно, состоит в том, чтобы избежать сокращения / оптимизации / запутывания интерфейса и его методов:

-keep interface some.package.IAirplaneListenerAll {
  <methods>;
}

Вы можете разрешить сжатие:

-keep,allowshrinking interface some.package.IAirplaneListenerAll {
  <methods>;
}

Если InvocationHandler может работать с обфусцированными именами методов, вы также можете разрешить запутывание:

-keep,allowshrinking,allowobfuscation interface some.package.IAirplaneListenerAll {
  <methods>;
}
...