【问题标题】:Int switch error when inject code generator with switch case in java code在 Java 代码中使用 switch case 注入代码生成器时出现 Int 开关错误
【发布时间】:2021-11-14 17:06:09
【问题描述】:

原因:java.lang.AssertionError 在 com.android.tools.r8.ir.code.IntSwitch.valid(IntSwitch.java:67) 在 com.android.tools.r8.ir.code.IntSwitch.(IntSwitch.java:35) 在 com.android.tools.r8.ir.conversion.IRBuilder.createSwitch(IRBuilder.java:1922) 在 com.android.tools.r8.ir.conversion.IRBuilder.addSwitch(IRBuilder.java:1886) 在 com.android.tools.r8.cf.code.CfSwitch.buildIR(CfSwitch.java:101) 在 com.android.tools.r8.ir.conversion.CfSourceCode.build(CfSourceCode.java:581) 原因:com.android.builder.dexing.DexArchiveBuilderException: dexing 时出错。

java 示例

 public IFactory getInjectMap(String var1) {
          byte var2 = -1;
          switch(var1.hashCode()) {
          case 2011670744:
             if (var1.equals("xxx.xxx.xxx.xxx")) {
                var2 = 0;
             }
             break;
          case -1047643106:
             if (var1.equals("xxx.xxx.xxx.xxx")) {
                var2 = 1;
             }
             break;
          }
    
          switch(var2) {
          case 0:
             var2 = (byte)(new xxxxFactory());
             break;
          case 1:
             var2 = (byte)(new xxxxFactory());
             break;
          default:
             var2 = (byte)null;
          }
    
          return var2;
       }
    }

【问题讨论】:

  • 分享你的代码
  • @YaqoobBhatti 我只是修复它谢谢
  • 您使用的反编译器似乎存在根本缺陷,因为它无法识别在第二个 switch 中初始化的变量必须具有与第一个甚至插入中使用的变量不同的类型基于这个错误的假设,从引用类型到 byte 的无意义强制转换。除此之外,这似乎是对字符串的切换,反编译器无法识别。结论是你应该显示实际的字节码,而不是这个反编译器的结果。

标签: android dex java-bytecode-asm android-r8


【解决方案1】:

assertion error you hit 验证lookupswitch 指令中的值是有序的,如mandated by the JVM specification。这表明生成的字节码不符合规范。此代码是否在 JVM 上运行?

这也报告为https://issuetracker.google.com/200284898#comment6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多