【问题标题】:How to prevent proguard from modifying the fields in my method如何防止proguard修改我的方法中的字段
【发布时间】:2014-07-12 02:41:10
【问题描述】:

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

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

事情是这样的:

之前:

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

帮助...

【问题讨论】:

    标签: java proguard


    【解决方案1】:

    是您的反编译器产生了语法错误的代码。你可以试试不同的反编译器。

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

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2013-12-11
      • 2015-04-02
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多