【问题标题】:Modify class in jar: android build failed修改jar中的类:android build failed
【发布时间】:2015-08-13 19:13:28
【问题描述】:

我想在 Cordova 的 Barcode Scanner 插件的 jar 文件中更改一些内容,即 CaptureActivity class 中的 RESULT_DISPLAY_DURATION_MS

我使用终端解压缩了它(我在 Mac 上)。

然后,使用ClassEditor,我查找了 CaptureActivity 类,并更改了值。 接下来,我使用 jar cfv samenameasoriginal.jar * 重新归档它。 然后,我将原来的 jar 文件替换为新的。

问题是,当我尝试使用 ionic 构建它时,我得到一长串错误,其中包含:

意外的顶级异常: com.android.dx.cf.iface.ParseException:属性长度错误;预期的 长度 00000002 ... ...解析时 com/google/zxing/client/android/CaptureActivity.class

我注意到新的 jar 文件比原来的大 7 kb,虽然我只是将数字 1500 更改为 9500,所以这有点奇怪。

谁能帮帮我?上网查了一下,一无所获……

【问题讨论】:

  • 你为什么要这样做?
  • 当条码扫描器扫描代码时,它会在不到 2 秒的时间内显示“找到 URL”或“找到文本”之类的消息。我想消除这种延迟,因为在我的应用程序中,扫描速度快是关键。我首先尝试更改插件的 .java 文件,但这并没有让我更进一步:stackoverflow.com/questions/31965298/…
  • 为什么不扩展您正在使用的类并更改它们的代码?行为?既然可以使用 OOP,为什么还要破解 jar?
  • 我是新手。这将如何运作?我在 github.com 上 fork 了它,更改了代码,然后安装了我的 fork,但没有用。请参阅我之前评论中的网址。
  • 我认为您使用 jd.benow.ca 并反编译为 java 文件并在 eclipse 中创建一个新项目并从中创建一个自定义。

标签: java android jar


【解决方案1】:

从类中扩展并调整值:

public class CustomCaptureActivity extends CaptureActivity {

    RESULT_DISPLAY_DURATION_MS = 9500; // wheras 9500 is your custom value
}

现在使用您的自定义类,而不是调用CaptureActivity

如果RESULT_DISPLAY_DURATION_MS 是只读的:将使用此变量的方法复制并粘贴到您的自定义类中,并用您自己的类中定义的新常量替换该变量。只要CaptureActivity 不是final,这有望为您解决问题。

【讨论】:

    【解决方案2】:

    我认为问题在于,当您创建 JAR 时,有一些链接可能与文件的旧版本相关(由于优化原因)并且一切都崩溃了。

    不确定,但我认为是这个原因。

    因此,您可以使用或使用装饰器设计模式(如果可能的话,更好的主意)子类化您需要更改的类(https://en.wikipedia.org/wiki/Decorator_pattern),而不是更改文件,或者您可以使用反射直接修改图书馆。

    这里有一个如何更改私有 final 字段的示例。你可以做类似的事情:

    import java.lang.reflect.*;
    
    public class EverythingIsTrue {
         static void setFinalStatic(Field field, Object newValue) throws Exception {
             field.setAccessible(true);
    
             Field modifiersField = Field.class.getDeclaredField("modifiers");
             modifiersField.setAccessible(true);
             modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    
             field.set(null, newValue);
         }
    
         public static void main(String args[]) throws Exception {      
             setFinalStatic(Boolean.class.getField("FALSE"), true);
    
             System.out.format("Everything is %s", false); // "Everything is true"
         }
    }
    

    【讨论】:

      【解决方案3】:

      正确的答案是,您的某些 jar 文件无法编译。您应该进入项目中的构建路径(设置所有依赖路径)文件,并查看您的依赖项。

      如果您只是导入一些 jar 文件,您可以尝试删除它们并一次添加一个。这将帮助您确定是哪一个导致了错误。

      就我而言,我就是这样做的,当我导入最后一个时,应用程序已编译。所以我认为真正的问题是我一次导入了太多。但现在一切正常。

      【讨论】:

        猜你喜欢
        • 2014-10-31
        • 2018-10-27
        • 2022-12-02
        • 2019-03-20
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2015-02-10
        • 2019-09-04
        相关资源
        最近更新 更多