如何防止proguard修改我的方法中的字段

时间:2014-07-12 02:41:11

标签: java proguard

如何阻止proguard修改方法中的字段名称?

我知道我们可以使用-keep-keepclassmembers等等,但这些似乎只保留成员名称,而不是内部使用的变量。

以下是发生的事情:

在:

private static URL getPluginImageURL(Object plugin, String name) throws Exception {
    // try to work with 'plugin' as with OSGI BundleContext
    try {
        Class<?> BundleClass = Class.forName("org.osgi.framework.Bundle"); //$NON-NLS-1$
        Class<?> BundleContextClass = Class.forName("org.osgi.framework.BundleContext"); //$NON-NLS-1$
        if (BundleContextClass.isAssignableFrom(plugin.getClass())) {
            Method getBundleMethod = BundleContextClass.getMethod("getBundle", new Class[0]); //$NON-NLS-1$
            Object bundle = getBundleMethod.invoke(plugin, new Object[0]);
            //
            Class<?> PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$
            Constructor<?> pathConstructor = PathClass.getConstructor(new Class[]{String.class});
            Object path = pathConstructor.newInstance(new Object[]{name});
            //
            Class<?> IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$
            Class<?> PlatformClass = Class.forName("org.eclipse.core.runtime.Platform"); //$NON-NLS-1$
            Method findMethod = PlatformClass.getMethod("find", new Class[]{BundleClass, IPathClass}); //$NON-NLS-1$
            return (URL) findMethod.invoke(null, new Object[]{bundle, path});
        }
    } catch (Throwable e) {
        // Ignore any exceptions
    }
    // else work with 'plugin' as with usual Eclipse plugin
    {
        Class<?> PluginClass = Class.forName("org.eclipse.core.runtime.Plugin"); //$NON-NLS-1$
        if (PluginClass.isAssignableFrom(plugin.getClass())) {
            //
            Class<?> PathClass = Class.forName("org.eclipse.core.runtime.Path"); //$NON-NLS-1$
            Constructor<?> pathConstructor = PathClass.getConstructor(new Class[]{String.class});
            Object path = pathConstructor.newInstance(new Object[]{name});
            //
            Class<?> IPathClass = Class.forName("org.eclipse.core.runtime.IPath"); //$NON-NLS-1$
            Method findMethod = PluginClass.getMethod("find", new Class[]{IPathClass}); //$NON-NLS-1$
            return (URL) findMethod.invoke(plugin, new Object[]{path});
        }
    }
    return null;
}

毕业后:

private static URL getPluginImageURL(Object plugin, String name)
throws Exception
{
try
{
  localClass1 = Class.forName("org.osgi.framework.Bundle");
  localClass2 = Class.forName("org.osgi.framework.BundleContext");
  if (localClass2.isAssignableFrom(plugin.getClass())) {
    localObject1 = localClass2.getMethod("getBundle", new Class[0]);
    localObject2 = ((Method)localObject1).invoke(plugin, new Object[0]);

    localClass3 = Class.forName("org.eclipse.core.runtime.Path");
    localObject3 = localClass3.getConstructor(new Class[] { String.class });
    Object localObject4 = ((Constructor)localObject3).newInstance(new Object[] { name });

    Class localClass4 = Class.forName("org.eclipse.core.runtime.IPath");
    Class localClass5 = Class.forName("org.eclipse.core.runtime.Platform");
    Method localMethod = localClass5.getMethod("find", new Class[] { localClass1, localClass4 });
    return (URL)localMethod.invoke(null, new Object[] { localObject2, localObject4 });
  }
}
catch (Throwable localThrowable)
{
  Class localClass2;
  Object localObject1;
  Object localObject2;
  Class localClass3;
  Object localObject3;
  Class localClass1 = Class.forName("org.eclipse.core.runtime.Plugin");
  if (localClass1.isAssignableFrom(plugin.getClass()))
  {
    localClass2 = Class.forName("org.eclipse.core.runtime.Path");
    localObject1 = localClass2.getConstructor(new Class[] { String.class });
    localObject2 = ((Constructor)localObject1).newInstance(new Object[] { name });

    localClass3 = Class.forName("org.eclipse.core.runtime.IPath");
    localObject3 = localClass1.getMethod("find", new Class[] { localClass3 });
    return (URL)((Method)localObject3).invoke(plugin, new Object[] { localObject2 });
  }
}
return null;

}

请注意localObject1localObject2不再有类声明?这不会使代码在语法上不正确吗?

...帮助

1 个答案:

答案 0 :(得分:0)

你的反编译器会产生语法错误的代码。你可以试试一个不同的反编译器。

ProGuard确实删除了本地变量名称,因为它们只是可选的调试信息。虚拟机不需要它们。