2014-07-12 31 views
0

如何防止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; 
} 

proguard的经过:

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不再有类声明?这不会使代码在语法上不正确吗?

帮助...

回答

0

这是您的反编译器,它会产生语法错误的代码。你可以尝试一个不同的反编译器。

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