kotlin 编码中,拼接的字符串没法进行加密
项目使用kotlin编码,反编译之后,发现一旦使用拼接的字符串,如"this is a $it" 或者 "abc"+"bcd",等。就没办法进行字符串加密。反编译apk之后。发现这些字符串仍然存在。编译之后,kotlin会将这些字符串转化为StringBuilder的形式。导致Stringfog没有生效。反编译之后还是原始字符串。大家有遇到这个问题么?怎么解决呢?
我最近也碰到这个问题,排查半天发现是集成项目编译的JDK版本问题。新建项目默认为JavaVersion.VERSION_11,改为JavaVersion.VERSION_1_8就正常了,记得同时要改kotlinOptions中的jvmTarget。至于这是什么原因就不清楚了
通过javap -c -v对比两个版本的字节码发现在JAVA8和JAVA11(字符串还带有\u0001)中字符串存放在Constant pool,但是在获取的时候有所不同:
JAVA8 -> 通过ldc指令直接获取常量池中的字符串 JAVA11 -> 通过invokedynamic调用BootstrapMethods中的java/lang/invoke/StringConcatFactory.makeConcatWithConstants方法(此方法是在JAVA9中改善StringBuilder拼接问题)
造成ASM在visitMethodInsn()方法中无法找到java/lang/StringBuilder的调用,以及visitLdcInsn()方法中无法找到常量的获取。因此只能在visitInvokeDynamicInsn()方法中处理makeConcatWithConstants